query.vue 14 KB

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