followedList.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399
  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:
  67. getCheckPerm('work_mark') &&
  68. record.status > 80 &&
  69. record.warrantyType != 0 &&
  70. record.warrantyType != 3 &&
  71. record.payAmount != 0 &&
  72. record.invoiceStatus == 0,
  73. onClick: handleInvoice.bind(null, record),
  74. },
  75. {
  76. label: '签收',
  77. ifShow: getCheckPerm('work_mark') && record.status == 110,
  78. onClick: handleSignFor.bind(null, record),
  79. },
  80. ]"
  81. />
  82. </template>
  83. </BasicTable>
  84. <recoveryModal @update="reload" @register="registerRecovery" />
  85. <remarksModal @update="reload" @register="registerRemarks" />
  86. <takingOrdersModel @update="reload" @register="registerTakingOrders" />
  87. <quoteModel @update="reload" @register="registerQuote" />
  88. <deliveryModal @update="reload" @register="registerDelivery" />
  89. <payLogModal @update="reload" @register="registerPayLog" />
  90. <confirmPriceModal @update="reload" @register="registerConfirmPrice" />
  91. <invoiceModal @update="reload" @register="registerInvoice" />
  92. <signForModel @update="reload" @register="registerSignFor" />
  93. <!-- ifShow: getCheckPerm('device-out') && !Boolean(record.outType), -->
  94. </div>
  95. </PageWrapper>
  96. </template>
  97. <script lang="ts">
  98. import { defineComponent, onMounted, onActivated, ref } from 'vue';
  99. import { PageWrapper } from '/@/components/Page';
  100. import {
  101. BasicTable,
  102. useTable,
  103. TableAction,
  104. BasicColumn,
  105. TableImg,
  106. FormProps,
  107. } from '/@/components/Table';
  108. import { Tabs } from 'ant-design-vue';
  109. import { operateSceneList } from '/@/api/operate';
  110. import { useI18n } from '/@/hooks/web/useI18n';
  111. import { usePermissionStore } from '/@/store/modules/permission';
  112. import recoveryModal from './recoveryModal.vue';
  113. import quoteModel from './quoteModel.vue';
  114. import deliveryModal from './deliveryModal.vue';
  115. import payLogModal from './payLogModal.vue';
  116. import invoiceModal from './invoiceModal.vue';
  117. import takingOrdersModel from './takingOrdersModel.vue';
  118. import remarksModal from '../spares/remarksModal.vue';
  119. import confirmPriceModal from './confirmPriceModal.vue';
  120. import signForModel from './signForModel.vue';
  121. import { useModal } from '/@/components/Modal';
  122. import { useRouter } from 'vue-router';
  123. import { saleOrderList } from '/@/api/spares';
  124. export default defineComponent({
  125. name: '工单跟进',
  126. components: {
  127. BasicTable,
  128. TableAction,
  129. TableImg,
  130. recoveryModal,
  131. takingOrdersModel,
  132. remarksModal,
  133. deliveryModal,
  134. payLogModal,
  135. confirmPriceModal,
  136. quoteModel,
  137. signForModel,
  138. invoiceModal,
  139. PageWrapper,
  140. [Tabs.name]: Tabs,
  141. [Tabs.TabPane.name]: Tabs.TabPane,
  142. },
  143. setup() {
  144. const { t } = useI18n();
  145. const permissionStore = usePermissionStore();
  146. const router = useRouter();
  147. const { getCheckPerm } = permissionStore;
  148. const tableType = ref<Recordable>(0); //0看看 、1看见、2深时
  149. onMounted(() => {
  150. console.log(1);
  151. });
  152. const columns = (val: boolean) => {
  153. return [
  154. {
  155. title: '报修日期',
  156. dataIndex: 'createTime',
  157. width: 180,
  158. },
  159. {
  160. title: '客户名称',
  161. dataIndex: 'companyName',
  162. width: 100,
  163. },
  164. {
  165. title: '产品类型',
  166. dataIndex: 'cameraType',
  167. width: 100,
  168. customRender: ({ record }) => {
  169. return t(`routes.scene.tableType.${record.cameraType}`);
  170. },
  171. },
  172. {
  173. title: '产品SN码',
  174. dataIndex: 'cameraSnCode',
  175. width: 120,
  176. },
  177. {
  178. title: '故障描述',
  179. dataIndex: 'faultMsg',
  180. width: 100,
  181. },
  182. {
  183. title: '送修方式',
  184. dataIndex: 'sendType',
  185. width: 100,
  186. customRender: ({ record }) => {
  187. return record.sendType == 0 ? '前台送修' : '快递寄送';
  188. },
  189. },
  190. {
  191. title: '快递单号',
  192. dataIndex: 'sendTrackingNum',
  193. width: 150,
  194. },
  195. {
  196. title: '状态',
  197. dataIndex: 'status',
  198. width: 100,
  199. customRender: ({ record }) => {
  200. return t(`routes.spares.tableType.${record.status || 0}`);
  201. },
  202. },
  203. {
  204. title: '工单号',
  205. dataIndex: 'repairId',
  206. width: 150,
  207. },
  208. {
  209. title: '需要开票',
  210. dataIndex: 'invoiceStatus',
  211. width: 80,
  212. customRender: ({ record }) => {
  213. return record.invoiceStatus == 0 ? '否' : '是';
  214. },
  215. },
  216. {
  217. title: '签收',
  218. dataIndex: 'trackingImg',
  219. width: 80,
  220. ifShow: val,
  221. customRender: ({ record }) => {
  222. return record.trackingImg && record.trackingImg.length > 0 ? '是' : '否';
  223. },
  224. },
  225. {
  226. title: t('common.operating'),
  227. dataIndex: 'action',
  228. slots: { customRender: 'action' },
  229. ifShow: true,
  230. fixed: 'right',
  231. flag: 'ACTION',
  232. width: 240,
  233. },
  234. ];
  235. };
  236. const searchForm: Partial<FormProps> = {
  237. labelWidth: 120,
  238. autoAdvancedLine: 1,
  239. actionColOptions: {
  240. span: 24,
  241. },
  242. schemas: [
  243. {
  244. field: 'companyName',
  245. component: 'Input',
  246. label: '客户名称',
  247. colProps: {
  248. xl: 7,
  249. xxl: 7,
  250. },
  251. },
  252. {
  253. field: 'cameraSnCode',
  254. component: 'Input',
  255. label: t('routes.device.snCode'),
  256. colProps: {
  257. xl: 7,
  258. xxl: 7,
  259. },
  260. },
  261. {
  262. field: 'trackingNum',
  263. component: 'Input',
  264. label: '快递单号',
  265. colProps: {
  266. xl: 7,
  267. xxl: 7,
  268. },
  269. },
  270. {
  271. field: 'repairId',
  272. component: 'Input',
  273. label: '工单号',
  274. colProps: {
  275. xl: 7,
  276. xxl: 7,
  277. },
  278. },
  279. {
  280. field: 'timeList',
  281. label: '报修日期',
  282. component: 'RangePicker',
  283. componentProps: {
  284. maxLength: 100,
  285. format: 'YYYY-MM-DD',
  286. valueFormat: 'YYYY-MM-DD',
  287. showTime: true,
  288. },
  289. colProps: {
  290. xl: 7,
  291. xxl: 7,
  292. },
  293. },
  294. ],
  295. };
  296. const [registerRecovery, { openModal }] = useModal();
  297. const [registerQuote, { openModal: openQuoteModal }] = useModal();
  298. const [registerConfirmPrice, { openModal: openConfirmPriceModal }] = useModal();
  299. const [registerPayLog, { openModal: openPayLogModal }] = useModal();
  300. const [registerDelivery, { openModal: openDeliveryModal }] = useModal();
  301. const [registerTakingOrders, { openModal: openTakingOrders }] = useModal();
  302. const [registerRemarks, { openModal: openRemarksModal }] = useModal();
  303. const [registerSignFor, { openModal: openSignForModal }] = useModal();
  304. const [registerInvoice, { openModal: openInvoiceModal }] = useModal();
  305. const [registerTable, { reload, setColumns }] = useTable({
  306. api: saleOrderList,
  307. columns: columns(false),
  308. useSearchForm: true,
  309. searchInfo: { statusParam: tableType },
  310. formConfig: searchForm,
  311. showTableSetting: true,
  312. showIndexColumn: false,
  313. fetchSetting: {
  314. pageField: 'pageNum',
  315. sizeField: 'pageSize',
  316. listField: 'list',
  317. totalField: 'total',
  318. },
  319. canResize: false,
  320. });
  321. async function handleDetail(record: Recordable) {
  322. console.log('record', record);
  323. router.push({ path: `detail/${record.repairId || '20230215174919387'}` });
  324. }
  325. async function handleRecover(record: Recordable) {
  326. openTakingOrders(true, {
  327. ...record,
  328. });
  329. }
  330. function handleRemarks(record: Recordable) {
  331. openRemarksModal(true, record);
  332. }
  333. function handleInvoice(record: Recordable) {
  334. openInvoiceModal(true, record);
  335. }
  336. function handleSignFor(record: string) {
  337. openSignForModal(true, record);
  338. }
  339. function handlePayLog(record: Recordable) {
  340. openPayLogModal(true, record);
  341. }
  342. function handleConfirmPrice(record: Recordable) {
  343. openConfirmPriceModal(true, record);
  344. }
  345. function handleDelivery(record: Recordable) {
  346. openDeliveryModal(true, record);
  347. }
  348. function handleOrder() {
  349. openModal(true, {});
  350. }
  351. function handleQuote(record: Recordable) {
  352. openQuoteModal(true, record);
  353. }
  354. function changeTable(val: string) {
  355. tableType.value = val;
  356. setColumns(columns(val == 2));
  357. reload();
  358. }
  359. onActivated(() => {
  360. reload();
  361. });
  362. return {
  363. registerTable,
  364. reload,
  365. t,
  366. tableType,
  367. registerRemarks,
  368. registerPayLog,
  369. registerInvoice,
  370. registerSignFor,
  371. registerDelivery,
  372. registerConfirmPrice,
  373. changeTable,
  374. handleOrder,
  375. getCheckPerm,
  376. handleDetail,
  377. handleQuote,
  378. registerTakingOrders,
  379. handleRecover,
  380. handleConfirmPrice,
  381. handlePayLog,
  382. handleDelivery,
  383. handleRemarks,
  384. handleInvoice,
  385. registerQuote,
  386. handleSignFor,
  387. registerRecovery,
  388. };
  389. },
  390. });
  391. </script>
  392. <style lang="less" scoped>
  393. .desc-wrap-BasicTable {
  394. background-color: #f0f2f5;
  395. .vben-basic-table-form-container {
  396. padding: 0;
  397. }
  398. }
  399. </style>