query.vue 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582
  1. <template>
  2. <PageWrapper contentBackground>
  3. <template #footer>
  4. <a-tabs v-model:activeKey="tableType" @change="changeTable">
  5. <a-tab-pane :key="null" :tab="t('routes.spares.tableType.-1')" />
  6. <a-tab-pane :key="0" :tab="t('routes.spares.tableType.0')" />
  7. <a-tab-pane :key="10" :tab="t('routes.spares.tableType.10')" />
  8. <a-tab-pane :key="20" :tab="t('routes.spares.tableType.20')" />
  9. <a-tab-pane :key="30" :tab="t('routes.spares.tableType.30')" />
  10. <a-tab-pane :key="40" :tab="t('routes.spares.tableType.40')" />
  11. <a-tab-pane :key="41" :tab="t('routes.spares.tableType.41')" />
  12. <a-tab-pane :key="50" :tab="t('routes.spares.tableType.50')" />
  13. <a-tab-pane :key="60" :tab="t('routes.spares.tableType.60')" />
  14. <a-tab-pane :key="70" :tab="t('routes.spares.tableType.70')" />
  15. <a-tab-pane :key="80" :tab="t('routes.spares.tableType.80')" />
  16. <a-tab-pane :key="82" :tab="t('routes.spares.tableType.82')" />
  17. <a-tab-pane :key="90" :tab="t('routes.spares.tableType.90')" />
  18. <a-tab-pane :key="100" :tab="t('routes.spares.tableType.100')" /> </a-tabs
  19. ></template>
  20. <div class="desc-wrap-BasicTable">
  21. <BasicTable @register="registerTable" v-show="tableType == null">
  22. <template #action="{ record }">
  23. <TableAction
  24. stopButtonPropagation
  25. :actions="[
  26. {
  27. label: '详情',
  28. ifShow: getCheckPerm('work_detail'),
  29. onClick: handleDetail.bind(null, record),
  30. },
  31. ]"
  32. />
  33. </template>
  34. </BasicTable>
  35. <BasicTable @register="registerTable1" v-show="tableType != null">
  36. <template #action="{ record }">
  37. <TableAction
  38. stopButtonPropagation
  39. :actions="[
  40. {
  41. label: '详情',
  42. ifShow: getCheckPerm('work_detail'),
  43. onClick: handleDetail.bind(null, record),
  44. },
  45. ]"
  46. />
  47. </template>
  48. </BasicTable>
  49. <recoveryModal @update="reload" @register="registerRecovery" />
  50. <!-- ifShow: getCheckPerm('device-out') && !Boolean(record.outType), -->
  51. </div>
  52. </PageWrapper>
  53. </template>
  54. <script lang="ts">
  55. import { defineComponent, onMounted, ref, onActivated } from 'vue';
  56. import { PageWrapper } from '/@/components/Page';
  57. import {
  58. BasicTable,
  59. useTable,
  60. TableAction,
  61. BasicColumn,
  62. TableImg,
  63. FormProps,
  64. } from '/@/components/Table';
  65. import { Tabs } from 'ant-design-vue';
  66. import { operateSceneList } from '/@/api/operate';
  67. import { useI18n } from '/@/hooks/web/useI18n';
  68. import { usePermissionStore } from '/@/store/modules/permission';
  69. import recoveryModal from './recoveryModal.vue';
  70. import { useModal } from '/@/components/Modal';
  71. import { useRouter } from 'vue-router';
  72. import { queryList, faultAllList, getByRoleType } from '/@/api/spares';
  73. export default defineComponent({
  74. name: '工单查询',
  75. components: {
  76. BasicTable,
  77. TableAction,
  78. TableImg,
  79. recoveryModal,
  80. PageWrapper,
  81. [Tabs.name]: Tabs,
  82. [Tabs.TabPane.name]: Tabs.TabPane,
  83. },
  84. setup() {
  85. const { t } = useI18n();
  86. const permissionStore = usePermissionStore();
  87. const router = useRouter();
  88. const { getCheckPerm } = permissionStore;
  89. const tableType = ref<Recordable>(null); //0看看 、1看见、2深时
  90. onMounted(() => {
  91. // console.log(router.currentRoute.value.params.id);
  92. });
  93. const getSchemas = (status) => {
  94. return [
  95. {
  96. field: 'receiverType',
  97. component: 'Select',
  98. label: '报修方式',
  99. colProps: {
  100. span: 7,
  101. },
  102. componentProps: {
  103. options: [
  104. {
  105. label: '后台录单',
  106. value: 0,
  107. key: '0',
  108. },
  109. {
  110. label: '公众号报修',
  111. value: 1,
  112. key: '1',
  113. },
  114. ],
  115. },
  116. },
  117. {
  118. field: 'cameraType',
  119. component: 'Select',
  120. label: t('routes.device.deviceType'),
  121. colProps: {
  122. span: 7,
  123. },
  124. componentProps: {
  125. options: [
  126. {
  127. label: t('routes.device.type.1'),
  128. value: 0,
  129. key: '0',
  130. },
  131. {
  132. label: t('routes.device.type.2'),
  133. value: 1,
  134. key: '1',
  135. },
  136. {
  137. label: t('routes.device.type.3'),
  138. value: 2,
  139. key: '2',
  140. },
  141. ],
  142. },
  143. },
  144. {
  145. field: 'cameraSnCode',
  146. component: 'Input',
  147. label: 'SN码',
  148. colProps: {
  149. span: 7,
  150. },
  151. },
  152. {
  153. field: 'companyName',
  154. component: 'Input',
  155. label: '客户名称',
  156. colProps: {
  157. span: 7,
  158. },
  159. },
  160. {
  161. field: 'warrantyType',
  162. component: 'Select',
  163. label: '保修类型',
  164. colProps: {
  165. span: 7,
  166. },
  167. componentProps: {
  168. options: [
  169. {
  170. label: '保内维修',
  171. value: 0,
  172. key: '0',
  173. },
  174. {
  175. label: '保内转保外',
  176. value: 1,
  177. key: '1',
  178. },
  179. {
  180. label: '保外维修',
  181. value: 2,
  182. key: '2',
  183. },
  184. {
  185. label: '保外转保内',
  186. value: 3,
  187. key: '3',
  188. },
  189. ],
  190. },
  191. },
  192. {
  193. field: 'faultId',
  194. component: 'ApiSelect',
  195. label: '故障类型',
  196. componentProps: {
  197. maxLength: 50,
  198. api: faultAllList,
  199. numberToString: true,
  200. labelField: 'faultMsg',
  201. valueField: 'faultId',
  202. immediate: true,
  203. },
  204. colProps: {
  205. span: 7,
  206. },
  207. },
  208. {
  209. field: 'saleId',
  210. label: '售后工程师',
  211. component: 'ApiSelect',
  212. componentProps: {
  213. api: getByRoleType,
  214. numberToString: true,
  215. labelField: 'nickName',
  216. valueField: 'id',
  217. immediate: true,
  218. params: {
  219. roleType: 2,
  220. },
  221. },
  222. colProps: {
  223. span: 7,
  224. },
  225. },
  226. {
  227. field: 'repairManId',
  228. label: '维修工程师',
  229. component: 'ApiSelect',
  230. componentProps: {
  231. api: getByRoleType,
  232. numberToString: true,
  233. labelField: 'nickName',
  234. valueField: 'id',
  235. immediate: true,
  236. params: {
  237. roleType: 3,
  238. },
  239. },
  240. colProps: {
  241. span: 7,
  242. },
  243. },
  244. {
  245. field: 'status',
  246. component: 'Select',
  247. label: '工单状态',
  248. ifShow: Boolean(status),
  249. colProps: {
  250. span: 7,
  251. },
  252. componentProps: {
  253. options: [
  254. {
  255. label: '待接单',
  256. value: 0,
  257. key: '0',
  258. },
  259. {
  260. label: '待检测',
  261. value: 10,
  262. key: '1',
  263. },
  264. {
  265. label: '待报价',
  266. value: 20,
  267. key: '2',
  268. },
  269. {
  270. label: '待确认',
  271. value: 30,
  272. key: '3',
  273. },
  274. {
  275. label: '已取消',
  276. value: 40,
  277. key: '4',
  278. },
  279. {
  280. label: '待发件',
  281. value: 41,
  282. key: '41',
  283. },
  284. {
  285. label: '待备料',
  286. value: 50,
  287. key: '5',
  288. },
  289. {
  290. label: '维修中',
  291. value: 60,
  292. key: '6',
  293. },
  294. {
  295. label: '待测试',
  296. value: 70,
  297. key: '7',
  298. },
  299. {
  300. label: '待支付',
  301. value: 80,
  302. key: '8',
  303. },
  304. {
  305. label: '待核账',
  306. value: 82,
  307. key: '82',
  308. },
  309. {
  310. label: '待回收',
  311. value: 90,
  312. key: '9',
  313. },
  314. {
  315. label: '待发货',
  316. value: 100,
  317. key: '10',
  318. },
  319. {
  320. label: '已发货',
  321. value: 110,
  322. key: '11',
  323. },
  324. ],
  325. },
  326. },
  327. {
  328. field: 'payStatus',
  329. component: 'Select',
  330. ifShow: Boolean(status),
  331. label: '支付状态',
  332. colProps: {
  333. span: 7,
  334. },
  335. componentProps: {
  336. options: [
  337. {
  338. label: '待支付',
  339. value: 0,
  340. key: '0',
  341. },
  342. {
  343. label: '已支付',
  344. value: 1,
  345. key: '1',
  346. },
  347. ],
  348. },
  349. },
  350. {
  351. field: 'commentStatus',
  352. component: 'Select',
  353. ifShow: Boolean(status),
  354. label: '评价状态',
  355. colProps: {
  356. span: 7,
  357. },
  358. componentProps: {
  359. options: [
  360. {
  361. label: '未评论',
  362. value: 0,
  363. key: '0',
  364. },
  365. {
  366. label: '已评论',
  367. value: 1,
  368. key: '1',
  369. },
  370. ],
  371. },
  372. },
  373. {
  374. field: 'repairId',
  375. component: 'Input',
  376. label: '工单号',
  377. colProps: {
  378. xl: 7,
  379. xxl: 7,
  380. },
  381. },
  382. {
  383. field: 'timeList',
  384. label: '报修日期',
  385. component: 'RangePicker',
  386. componentProps: {
  387. maxLength: 100,
  388. format: 'YYYY-MM-DD',
  389. valueFormat: 'YYYY-MM-DD',
  390. showTime: true,
  391. },
  392. colProps: {
  393. span: 7,
  394. },
  395. },
  396. ];
  397. };
  398. const columns: BasicColumn[] = [
  399. {
  400. title: '报修日期',
  401. dataIndex: 'createTime',
  402. width: 180,
  403. },
  404. {
  405. title: '客户名称',
  406. dataIndex: 'companyName',
  407. width: 80,
  408. // customRender: ({ record }) => {
  409. // return t(`routes.equity.operation.${record.operationType || 0}`);
  410. // },
  411. },
  412. {
  413. title: '产品类型',
  414. dataIndex: 'cameraType',
  415. width: 80,
  416. customRender: ({ record }) => {
  417. return t(`routes.scene.tableType.${record.cameraType}`);
  418. },
  419. },
  420. {
  421. title: '产品SN码',
  422. dataIndex: 'cameraSnCode',
  423. width: 100,
  424. },
  425. {
  426. title: '报修方式',
  427. dataIndex: 'receiverType',
  428. width: 100,
  429. customRender: ({ record }) => {
  430. return record.receiverType == 0 ? '系统录单' : '公众号报修';
  431. },
  432. },
  433. {
  434. title: '保修类型',
  435. dataIndex: 'warrantyType',
  436. width: 100,
  437. customRender: ({ record }) => {
  438. return t(`routes.spares.warrantyType.${record.warrantyType}`);
  439. },
  440. },
  441. {
  442. title: '售后工程师',
  443. dataIndex: 'saleName',
  444. width: 100,
  445. },
  446. {
  447. title: '接单日期',
  448. dataIndex: 'orderReceivingTime',
  449. width: 150,
  450. },
  451. {
  452. title: '故障分析',
  453. dataIndex: 'checkResult',
  454. width: 100,
  455. },
  456. {
  457. title: '维修工程师',
  458. dataIndex: 'repairManName',
  459. width: 100,
  460. },
  461. {
  462. title: '维修完成日期',
  463. dataIndex: 'repairOverTime',
  464. width: 150,
  465. },
  466. {
  467. title: '状态',
  468. dataIndex: 'status',
  469. width: 100,
  470. customRender: ({ record }) => {
  471. return t(`routes.spares.tableType.${record.status || 0}`);
  472. },
  473. },
  474. {
  475. title: '维修单号',
  476. dataIndex: 'repairId',
  477. width: 180,
  478. },
  479. {
  480. title: t('common.operating'),
  481. dataIndex: 'action',
  482. slots: { customRender: 'action' },
  483. ifShow: true,
  484. fixed: 'right',
  485. flag: 'ACTION',
  486. width: 120,
  487. },
  488. ];
  489. const searchForm: Partial<FormProps> = {
  490. labelWidth: 120,
  491. autoAdvancedLine: 1,
  492. actionColOptions: {
  493. span: 24,
  494. },
  495. schemas: getSchemas(true),
  496. };
  497. const searchForm1: Partial<FormProps> = {
  498. labelWidth: 120,
  499. autoAdvancedLine: 1,
  500. actionColOptions: {
  501. span: 24,
  502. },
  503. schemas: getSchemas(false),
  504. };
  505. const [registerRecovery, { openModal }] = useModal();
  506. const [registerTable, { reload: reload0 }] = useTable({
  507. api: queryList,
  508. columns: columns,
  509. useSearchForm: true,
  510. // searchInfo: { status: tableType },
  511. formConfig: searchForm,
  512. showTableSetting: true,
  513. showIndexColumn: false,
  514. fetchSetting: {
  515. pageField: 'pageNum',
  516. sizeField: 'pageSize',
  517. listField: 'list',
  518. totalField: 'total',
  519. },
  520. canResize: false,
  521. });
  522. const [registerTable1, { reload: reload1 }] = useTable({
  523. api: queryList,
  524. columns: columns,
  525. useSearchForm: true,
  526. searchInfo: { status: tableType },
  527. formConfig: searchForm1,
  528. showTableSetting: true,
  529. showIndexColumn: false,
  530. fetchSetting: {
  531. pageField: 'pageNum',
  532. sizeField: 'pageSize',
  533. listField: 'list',
  534. totalField: 'total',
  535. },
  536. canResize: false,
  537. });
  538. onActivated(() => {
  539. reload();
  540. });
  541. const reload = () => {
  542. reload1();
  543. reload0();
  544. };
  545. async function handleDetail(record: Recordable) {
  546. console.log('record', record);
  547. router.push({ path: `detail/${record.repairId || '20230215174919387'}` });
  548. }
  549. async function handleRecover(record: Recordable) {
  550. openModal(true, {
  551. ...record,
  552. });
  553. }
  554. function changeTable(val: string) {
  555. tableType.value = val;
  556. reload();
  557. }
  558. return {
  559. registerTable,
  560. registerTable1,
  561. reload,
  562. t,
  563. tableType,
  564. changeTable,
  565. getCheckPerm,
  566. handleDetail,
  567. handleRecover,
  568. registerRecovery,
  569. };
  570. },
  571. });
  572. </script>
  573. <style lang="less" scoped>
  574. .desc-wrap-BasicTable {
  575. background-color: #f0f2f5;
  576. .vben-basic-table-form-container {
  577. padding: 0;
  578. }
  579. }
  580. </style>