followedList.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367
  1. <template>
  2. <PageWrapper contentBackground>
  3. <template #footer>
  4. <a-tabs v-model:activeKey="tableType" @change="changeTable">
  5. <a-tab-pane :key="0" :tab="t('routes.spares.tableType.0')" />
  6. <a-tab-pane :key="1" :tab="t('routes.spares.tableType.21')" />
  7. <a-tab-pane :key="2" :tab="t('routes.spares.tableType.23')" /> </a-tabs
  8. ></template>
  9. <div class="desc-wrap-BasicTable">
  10. <BasicTable @register="registerTable">
  11. <template #toolbar>
  12. <a-button type="primary" @click="handleOrder" v-if="getCheckPerm('work_Add')">
  13. 录单</a-button
  14. >
  15. </template>
  16. <template #action="{ record }">
  17. <TableAction
  18. stopButtonPropagation
  19. :actions="[
  20. {
  21. label: '详情',
  22. ifShow: getCheckPerm('work_detail'),
  23. onClick: handleDetail.bind(null, record),
  24. },
  25. {
  26. label: '接单',
  27. ifShow: getCheckPerm('work_orderTakers') && record.status == 0,
  28. onClick: handleRecover.bind(null, record),
  29. },
  30. {
  31. label: '报价',
  32. ifShow: getCheckPerm('work_quotedPrice') && record.status == 20,
  33. onClick: handleQuote.bind(null, record),
  34. },
  35. {
  36. label: '修改报价',
  37. ifShow: getCheckPerm('work_setPrice') && record.status == 30,
  38. onClick: handleQuote.bind(null, record),
  39. },
  40. {
  41. label: '确认报价',
  42. ifShow:
  43. getCheckPerm('work_confirmPrice') &&
  44. record.status == 30 &&
  45. record.receiverType == 0,
  46. onClick: handleConfirmPrice.bind(null, record),
  47. },
  48. {
  49. label: '付款登记',
  50. ifShow:
  51. getCheckPerm('work_payments') && (record.status == 80 || record.status == 40),
  52. onClick: handlePayLog.bind(null, record),
  53. },
  54. {
  55. label: '发货登记',
  56. ifShow: getCheckPerm('work_dispatched') && record.status == 100,
  57. onClick: handleDelivery.bind(null, record),
  58. },
  59. {
  60. label: '备注',
  61. ifShow: getCheckPerm('work_mark'),
  62. onClick: handleRemarks.bind(null, record),
  63. },
  64. {
  65. label: '开票信息',
  66. ifShow: getCheckPerm('work_mark') && record.status > 80 && record.warrantyType != 0 && record.warrantyType != 3 && record.payAmount != 0 && record.invoiceStatus == 0,
  67. onClick: handleInvoice.bind(null, record),
  68. },
  69. ]"
  70. />
  71. </template>
  72. </BasicTable>
  73. <recoveryModal @update="reload" @register="registerRecovery" />
  74. <remarksModal @update="reload" @register="registerRemarks" />
  75. <takingOrdersModel @update="reload" @register="registerTakingOrders" />
  76. <quoteModel @update="reload" @register="registerQuote" />
  77. <deliveryModal @update="reload" @register="registerDelivery" />
  78. <payLogModal @update="reload" @register="registerPayLog" />
  79. <confirmPriceModal @update="reload" @register="registerConfirmPrice" />
  80. <invoiceModal @update="reload" @register="registerInvoice" />
  81. <!-- ifShow: getCheckPerm('device-out') && !Boolean(record.outType), -->
  82. </div>
  83. </PageWrapper>
  84. </template>
  85. <script lang="ts">
  86. import { defineComponent, onMounted, onActivated, ref } from 'vue';
  87. import { PageWrapper } from '/@/components/Page';
  88. import {
  89. BasicTable,
  90. useTable,
  91. TableAction,
  92. BasicColumn,
  93. TableImg,
  94. FormProps,
  95. } from '/@/components/Table';
  96. import { Tabs } from 'ant-design-vue';
  97. import { operateSceneList } from '/@/api/operate';
  98. import { useI18n } from '/@/hooks/web/useI18n';
  99. import { usePermissionStore } from '/@/store/modules/permission';
  100. import recoveryModal from './recoveryModal.vue';
  101. import quoteModel from './quoteModel.vue';
  102. import deliveryModal from './deliveryModal.vue';
  103. import payLogModal from './payLogModal.vue';
  104. import invoiceModal from './invoiceModal.vue';
  105. import takingOrdersModel from './takingOrdersModel.vue';
  106. import remarksModal from '../spares/remarksModal.vue';
  107. import confirmPriceModal from './confirmPriceModal.vue';
  108. import { useModal } from '/@/components/Modal';
  109. import { useRouter } from 'vue-router';
  110. import { saleOrderList } from '/@/api/spares';
  111. export default defineComponent({
  112. name: '工单跟进',
  113. components: {
  114. BasicTable,
  115. TableAction,
  116. TableImg,
  117. recoveryModal,
  118. takingOrdersModel,
  119. remarksModal,
  120. deliveryModal,
  121. payLogModal,
  122. confirmPriceModal,
  123. quoteModel,
  124. invoiceModal,
  125. PageWrapper,
  126. [Tabs.name]: Tabs,
  127. [Tabs.TabPane.name]: Tabs.TabPane,
  128. },
  129. setup() {
  130. const { t } = useI18n();
  131. const permissionStore = usePermissionStore();
  132. const router = useRouter();
  133. const { getCheckPerm } = permissionStore;
  134. const tableType = ref<Recordable>(0); //0看看 、1看见、2深时
  135. onMounted(() => {
  136. console.log(1);
  137. });
  138. const columns: BasicColumn[] = [
  139. {
  140. title: '报修日期',
  141. dataIndex: 'createTime',
  142. width: 180,
  143. },
  144. {
  145. title: '客户名称',
  146. dataIndex: 'companyName',
  147. width: 100,
  148. },
  149. {
  150. title: '产品类型',
  151. dataIndex: 'cameraType',
  152. width: 100,
  153. customRender: ({ record }) => {
  154. return t(`routes.scene.tableType.${record.cameraType}`);
  155. },
  156. },
  157. {
  158. title: '产品SN码',
  159. dataIndex: 'cameraSnCode',
  160. width: 120,
  161. },
  162. {
  163. title: '故障描述',
  164. dataIndex: 'faultMsg',
  165. width: 100,
  166. },
  167. {
  168. title: '送修方式',
  169. dataIndex: 'sendType',
  170. width: 100,
  171. customRender: ({ record }) => {
  172. return record.sendType == 0 ? '前台送修' : '快递寄送';
  173. },
  174. },
  175. {
  176. title: '快递单号',
  177. dataIndex: 'sendTrackingNum',
  178. width: 150,
  179. },
  180. {
  181. title: '状态',
  182. dataIndex: 'status',
  183. width: 100,
  184. customRender: ({ record }) => {
  185. return t(`routes.spares.tableType.${record.status || 0}`);
  186. },
  187. },
  188. {
  189. title: '工单号',
  190. dataIndex: 'repairId',
  191. width: 150,
  192. },
  193. {
  194. title: '需要开票',
  195. dataIndex: 'invoiceStatus',
  196. width: 80,
  197. customRender: ({ record }) => {
  198. return record.invoiceStatus == 0 ? '否' : '是';
  199. },
  200. },
  201. {
  202. title: t('common.operating'),
  203. dataIndex: 'action',
  204. slots: { customRender: 'action' },
  205. ifShow: true,
  206. fixed: 'right',
  207. flag: 'ACTION',
  208. width: 240,
  209. },
  210. ];
  211. const searchForm: Partial<FormProps> = {
  212. labelWidth: 120,
  213. autoAdvancedLine: 1,
  214. actionColOptions: {
  215. span: 24,
  216. },
  217. schemas: [
  218. {
  219. field: 'companyName',
  220. component: 'Input',
  221. label: '客户名称',
  222. colProps: {
  223. xl: 7,
  224. xxl: 7,
  225. },
  226. },
  227. {
  228. field: 'cameraSnCode',
  229. component: 'Input',
  230. label: t('routes.device.snCode'),
  231. colProps: {
  232. xl: 7,
  233. xxl: 7,
  234. },
  235. },
  236. {
  237. field: 'trackingNum',
  238. component: 'Input',
  239. label: '快递单号',
  240. colProps: {
  241. xl: 7,
  242. xxl: 7,
  243. },
  244. },
  245. {
  246. field: 'repairId',
  247. component: 'Input',
  248. label: '工单号',
  249. colProps: {
  250. xl: 7,
  251. xxl: 7,
  252. },
  253. },
  254. {
  255. field: 'timeList',
  256. label: '报修日期',
  257. component: 'RangePicker',
  258. componentProps: {
  259. maxLength: 100,
  260. format: 'YYYY-MM-DD',
  261. valueFormat: 'YYYY-MM-DD',
  262. showTime: true,
  263. },
  264. colProps: {
  265. xl: 7,
  266. xxl: 7,
  267. },
  268. },
  269. ],
  270. };
  271. const [registerRecovery, { openModal }] = useModal();
  272. const [registerQuote, { openModal: openQuoteModal }] = useModal();
  273. const [registerConfirmPrice, { openModal: openConfirmPriceModal }] = useModal();
  274. const [registerPayLog, { openModal: openPayLogModal }] = useModal();
  275. const [registerDelivery, { openModal: openDeliveryModal }] = useModal();
  276. const [registerTakingOrders, { openModal: openTakingOrders }] = useModal();
  277. const [registerRemarks, { openModal: openRemarksModal }] = useModal();
  278. const [registerInvoice, { openModal: openInvoiceModal }] = useModal();
  279. const [registerTable, { reload }] = useTable({
  280. api: saleOrderList,
  281. columns: columns,
  282. useSearchForm: true,
  283. searchInfo: { statusParam: tableType },
  284. formConfig: searchForm,
  285. showTableSetting: true,
  286. showIndexColumn: false,
  287. fetchSetting: {
  288. pageField: 'pageNum',
  289. sizeField: 'pageSize',
  290. listField: 'list',
  291. totalField: 'total',
  292. },
  293. canResize: false,
  294. });
  295. async function handleDetail(record: Recordable) {
  296. console.log('record', record);
  297. router.push({ path: `detail/${record.repairId || '20230215174919387'}` });
  298. }
  299. async function handleRecover(record: Recordable) {
  300. openTakingOrders(true, {
  301. ...record,
  302. });
  303. }
  304. function handleRemarks(record: Recordable) {
  305. openRemarksModal(true, record);
  306. }
  307. function handleInvoice(record: Recordable) {
  308. openInvoiceModal(true, record);
  309. }
  310. function handlePayLog(record: Recordable) {
  311. openPayLogModal(true, record);
  312. }
  313. function handleConfirmPrice(record: Recordable) {
  314. openConfirmPriceModal(true, record);
  315. }
  316. function handleDelivery(record: Recordable) {
  317. openDeliveryModal(true, record);
  318. }
  319. function handleOrder() {
  320. openModal(true, {});
  321. }
  322. function handleQuote(record: Recordable) {
  323. openQuoteModal(true, record);
  324. }
  325. function changeTable(val: string) {
  326. tableType.value = val;
  327. reload();
  328. }
  329. onActivated(() => {
  330. reload();
  331. });
  332. return {
  333. registerTable,
  334. reload,
  335. t,
  336. tableType,
  337. registerRemarks,
  338. registerPayLog,
  339. registerInvoice,
  340. registerDelivery,
  341. registerConfirmPrice,
  342. changeTable,
  343. handleOrder,
  344. getCheckPerm,
  345. handleDetail,
  346. handleQuote,
  347. registerTakingOrders,
  348. handleRecover,
  349. handleConfirmPrice,
  350. handlePayLog,
  351. handleDelivery,
  352. handleRemarks,
  353. handleInvoice,
  354. registerQuote,
  355. registerRecovery,
  356. };
  357. },
  358. });
  359. </script>
  360. <style lang="less" scoped>
  361. .desc-wrap-BasicTable {
  362. background-color: #f0f2f5;
  363. .vben-basic-table-form-container {
  364. padding: 0;
  365. }
  366. }
  367. </style>