detail.vue 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789
  1. <template>
  2. <div class="detailPage">
  3. <div class="topButton">
  4. <a-button type="primary" style="margin-right: 20px" @click="enterDialog"> 打印 </a-button>
  5. <a-button type="primary" @click="goBack">
  6. {{ t('common.back') }}
  7. </a-button>
  8. </div>
  9. <div class="content" ref="print" id="print">
  10. <div class="content_left">
  11. <div class="content_left_info">
  12. <Descriptions title="客户信息" :column="3" v-if="detailData.customer">
  13. <DescriptionsItem label="客户名称">
  14. {{ detailData.customer.companyName }}</DescriptionsItem
  15. >
  16. <DescriptionsItem label="联系人">
  17. {{ detailData.customer.customerName }}
  18. </DescriptionsItem>
  19. <DescriptionsItem label="联系电话"> {{ detailData.customer.phone }} </DescriptionsItem>
  20. </Descriptions>
  21. <Descriptions title="发票信息" :column="3" v-if="detailData.repairInvoice">
  22. <DescriptionsItem label="是否开票">
  23. {{ detailData.repairInvoice.repairId ? '是' : '否' }}</DescriptionsItem
  24. >
  25. <DescriptionsItem
  26. v-if="detailData.repairInvoice && detailData.repairInvoice.invoiceHead"
  27. label="发票抬头"
  28. >
  29. {{ detailData.repairInvoice.invoiceHead }}
  30. </DescriptionsItem>
  31. <DescriptionsItem
  32. v-if="detailData.repairInvoice && detailData.repairInvoice.invoiceNum"
  33. label="税号"
  34. >
  35. {{ detailData.repairInvoice.invoiceNum }}
  36. </DescriptionsItem>
  37. </Descriptions>
  38. <Descriptions title="产品及故障信息" :column="3">
  39. <DescriptionsItem label="产品名称" v-if="detailData.repairerVo">
  40. {{ t(`routes.scene.tableType.${detailData.repairerVo.cameraType}`) }}
  41. </DescriptionsItem>
  42. <DescriptionsItem label="产品SN码" v-if="detailData.repairerVo">
  43. {{ detailData.repairerVo.cameraSnCode }}
  44. </DescriptionsItem>
  45. <DescriptionsItem label="保修届满日期">
  46. {{ detailData.repairerVo.warrantyDate }}
  47. </DescriptionsItem>
  48. <DescriptionsItem label="报修日期">
  49. {{ detailData.repairerVo?.createTime }}
  50. </DescriptionsItem>
  51. <DescriptionsItem class="ellipsis" label="送修方式" v-if="detailData.customerAddress">
  52. {{
  53. detailData.customerAddress.sendType == 0
  54. ? '前台送修'
  55. : `快递寄送:${detailData.customerAddress?.sendTrackingNum || '暂无单号'}`
  56. }}
  57. </DescriptionsItem>
  58. <DescriptionsItem label="保修类型">
  59. {{ t(`routes.spares.warrantyType.${detailData.repairerVo.warrantyType}`) }}
  60. </DescriptionsItem>
  61. <DescriptionsItem label="维修单号">
  62. {{ repairId }}
  63. </DescriptionsItem>
  64. <DescriptionsItem label="上次维修单号" :span="2">
  65. {{ detailData.lastRepairId }}
  66. </DescriptionsItem>
  67. <DescriptionsItem label="故障描述" :span="3">
  68. <div>
  69. <p class="htmlText" :title="detailData.repairerVo.faultMsg">{{
  70. detailData.repairerVo.faultMsg
  71. }}</p>
  72. <PreviewGroup>
  73. <Image
  74. :width="80"
  75. :height="80"
  76. v-for="item in detailData.repairerVo.faultImg"
  77. :key="item"
  78. :src="item"
  79. />
  80. </PreviewGroup>
  81. </div>
  82. </DescriptionsItem>
  83. <DescriptionsItem label="机器外观">
  84. <div>
  85. <p class="htmlText" :title="detailData.orderReceivingVo?.orderFaultMsg">{{
  86. detailData.orderReceivingVo?.orderFaultMsg
  87. }}</p>
  88. <PreviewGroup>
  89. <Image
  90. :width="80"
  91. :height="80"
  92. v-for="item in detailData.orderReceivingVo?.orderFaultImg"
  93. :key="item"
  94. :src="item"
  95. />
  96. </PreviewGroup>
  97. </div>
  98. </DescriptionsItem>
  99. <DescriptionsItem label="售后工程师">
  100. {{ detailData.orderReceivingVo?.sysUserName }}
  101. </DescriptionsItem>
  102. <DescriptionsItem label="接单日期">
  103. {{ detailData.orderReceivingVo?.createTime }}
  104. </DescriptionsItem>
  105. <DescriptionsItem label="附件、附带物品">
  106. {{ detailData.orderReceivingVo?.annex }}
  107. </DescriptionsItem>
  108. </Descriptions>
  109. <!-- <Descriptions title="" :column="3">
  110. <DescriptionsItem label="备注内容">
  111. {{ detailData.repairerVo?.remark }}
  112. </DescriptionsItem>
  113. </Descriptions> -->
  114. <Descriptions
  115. v-for="(Voitem, index) in detailData.repairRegisterVoList"
  116. :key="Voitem.createTime"
  117. :column="3"
  118. >
  119. <DescriptionsItem :label="index == '0' ? '检测结果' : '维修登记'">
  120. <div>
  121. <p class="htmlText" :title="Voitem.checkResult">{{ Voitem.checkResult }}</p>
  122. <PreviewGroup>
  123. <Image
  124. style="margin-right: 20px"
  125. :width="80"
  126. :height="80"
  127. v-for="item in Voitem.checkImg"
  128. :key="item"
  129. :src="item"
  130. />
  131. </PreviewGroup>
  132. </div>
  133. </DescriptionsItem>
  134. <DescriptionsItem :label="index == '0' ? '检测日期' : '登记日期'">
  135. {{ Voitem?.createTime }}
  136. </DescriptionsItem>
  137. <DescriptionsItem label="所需备件">
  138. {{ Voitem?.partNamesStr }}
  139. </DescriptionsItem>
  140. </Descriptions>
  141. <Descriptions
  142. title="维修清单"
  143. :column="3"
  144. layout="vertical"
  145. v-show="detailData.repairerVo.status > 30"
  146. >
  147. <DescriptionsItem label="费用明细" :span="3">
  148. <BasicTable @register="registerTable" />
  149. </DescriptionsItem>
  150. </Descriptions>
  151. <Descriptions :column="3">
  152. <DescriptionsItem label="维修工程师">
  153. {{ detailData.repairRegisterVo?.sysUserName }}</DescriptionsItem
  154. >
  155. <DescriptionsItem label="维修完成日期">
  156. {{ detailData.repairRegisterVo?.overTime }}
  157. </DescriptionsItem>
  158. <DescriptionsItem label="维修记录">
  159. {{ detailData.repairRegisterVo?.remark }}
  160. </DescriptionsItem>
  161. <DescriptionsItem label="测试工程师">
  162. {{ detailData.repairTestVo?.sysUserName }}
  163. </DescriptionsItem>
  164. <DescriptionsItem label="测试通过时间" :span="2">
  165. {{ detailData.repairTestVo?.passTime }}
  166. </DescriptionsItem>
  167. <DescriptionsItem label="支付方式" :span="3">
  168. <div v-if="detailData.repairPay">
  169. <p>{{
  170. detailData.repairPay.payType == 1
  171. ? '微信'
  172. : detailData.repairPay.payType == 2
  173. ? '支付宝'
  174. : '银行'
  175. }}</p>
  176. <PreviewGroup>
  177. <Image
  178. :width="80"
  179. :height="80"
  180. v-for="item in detailData.repairPay.payImg"
  181. :key="item"
  182. :src="item"
  183. />
  184. </PreviewGroup>
  185. </div>
  186. </DescriptionsItem>
  187. <DescriptionsItem style="padding-bottom: 16px" label="支付备注" :span="3">
  188. {{ detailData.repairPay?.remark }}
  189. </DescriptionsItem>
  190. <DescriptionsItem label="回单备注" :span="3">
  191. <div v-if="detailData.repairCheckAccount">
  192. <p>{{ detailData.repairCheckAccount.remark }}</p>
  193. <PreviewGroup>
  194. <Image
  195. :width="80"
  196. :height="80"
  197. v-for="item in detailData.repairCheckAccount.checkAccountImg"
  198. :key="item"
  199. :src="item"
  200. />
  201. </PreviewGroup>
  202. </div>
  203. </DescriptionsItem>
  204. <DescriptionsItem label="取回方式" v-if="detailData.customerAddress">
  205. {{
  206. detailData.customerAddress.getType == 0
  207. ? '前台取回'
  208. : `快递寄回 ${detailData.customerAddress?.getTrackingNum || '暂无单号'}`
  209. }}</DescriptionsItem
  210. >
  211. <DescriptionsItem label="收件信息" :span="2" v-if="detailData.customerAddress">
  212. {{ detailData.customerAddress.getAddrName }}
  213. {{ detailData.customerAddress.getAddrPhone }}
  214. {{ detailData.customerAddress.getAddress }}
  215. </DescriptionsItem>
  216. </Descriptions>
  217. <Descriptions title="单据下载" :column="3" v-if="detailData.repairerVo.status > 20">
  218. <DescriptionsItem label="报价单" :span="3" v-if="detailData.repairerVo.status > 20">
  219. <div class="link" @click="dowmFile(0)"> {{ repairId }}报价单.pdf</div>
  220. </DescriptionsItem>
  221. <DescriptionsItem label="维修工单" :span="3" v-if="detailData.repairerVo.status > 70">
  222. <div class="link" @click="dowmFile(1)"> {{ repairId }}维修工单.pdf</div>
  223. </DescriptionsItem>
  224. </Descriptions>
  225. <Descriptions title="客户评价" :column="3" v-if="detailData.repairComment">
  226. <DescriptionsItem label="评价内容">
  227. <div class="htmlText" :title="detailData.repairComment.comment">{{
  228. detailData.repairComment.comment
  229. }}</div>
  230. </DescriptionsItem>
  231. <DescriptionsItem label="评分">
  232. {{ detailData.repairComment.starRank }}分
  233. </DescriptionsItem>
  234. </Descriptions>
  235. <Descriptions title="备注" :column="3">
  236. <DescriptionsItem label="备注内容">
  237. <div class="htmlText" :title="detailData.repairerVo?.remark">{{
  238. detailData.repairerVo?.remark
  239. }}</div>
  240. </DescriptionsItem>
  241. </Descriptions>
  242. </div>
  243. </div>
  244. <div class="content_right">
  245. <Timeline>
  246. <a-timeline>
  247. <timeline-item
  248. v-for="(item, indexs) in stepList"
  249. :color="indexs == 0 ? 'red' : 'green'"
  250. :key="indexs"
  251. >
  252. <div class="timeItem">
  253. <div class="name">
  254. <span>{{ item.title || item.remark }}</span>
  255. </div>
  256. <div class="status" v-if="item.repairLogId">
  257. {{ item.subTitle }} <span>{{ item.createTime }}</span>
  258. </div>
  259. <div class="status" v-else>
  260. {{ item.subTitle }}
  261. </div>
  262. <div class="itemText" v-if="item.customerAddress">{{
  263. item.customerAddress.getType == 0
  264. ? '前台取回'
  265. : `快递寄回 ${item.customerAddress.getTrackingNum}`
  266. }}</div>
  267. <div
  268. class="itemText htmlText"
  269. v-if="item.repairRegisterVo"
  270. :title="item.repairRegisterVo.checkResult"
  271. >检测结论: {{ item.repairRegisterVo.checkResult }}</div
  272. >
  273. <div
  274. class="itemText htmlText"
  275. v-if="item.repairRegisterVo"
  276. :title="item.repairRegisterVo.partNamesStr"
  277. >所需备件: {{ item.repairRegisterVo.partNamesStr }}</div
  278. >
  279. <div
  280. class="itemText htmlText"
  281. v-if="item.orderReceiving"
  282. :title="item.orderReceiving.orderFaultMsg"
  283. >机器外观: {{ item.orderReceiving.orderFaultMsg }}</div
  284. >
  285. <div
  286. class="itemText htmlText"
  287. v-if="item.repairTest?.resultInfo"
  288. :title="item.repairTest?.resultInfo"
  289. >测试描述: {{ item.repairTest.resultInfo }}</div
  290. >
  291. <div
  292. class="itemText htmlText"
  293. v-if="item.remark"
  294. :title="item.remark"
  295. v-html="item.remark"
  296. ></div>
  297. <div class="iamgeList">
  298. <PreviewGroup>
  299. <Image
  300. style="overflow: hidden"
  301. :width="80"
  302. :height="80"
  303. v-for="itemSrc in item.imagesInfo"
  304. :key="itemSrc"
  305. :src="itemSrc"
  306. />
  307. </PreviewGroup>
  308. </div>
  309. </div>
  310. </timeline-item>
  311. </a-timeline>
  312. </Timeline>
  313. </div>
  314. </div>
  315. <div class="bottom_but">
  316. <a-button type="primary" v-for="item in butList" :key="item" @click="handleBut(item)">
  317. {{ item }}
  318. </a-button>
  319. <a-button type="primary" @click="goBack">
  320. {{ t('common.back') }}
  321. </a-button>
  322. </div>
  323. <!-- <recoveryModal @update="reload" @register="registerRecovery" /> -->
  324. <remarksModal @update="reload" @register="registerRemarks" />
  325. <takingOrdersModel @update="reload" @register="registerTakingOrders" />
  326. <quoteModel @update="reload" @register="registerQuote" />
  327. <deliveryModal @update="reload" @register="registerDelivery" />
  328. <payLogModal @update="reload" @register="registerPayLog" />
  329. <payLogU8Modal @update="reload" @register="registerPayU8Log" />
  330. <partsListModal @update="reload" @register="registerParts" />
  331. <checkModel @update="reload" @register="registerCheck" />
  332. <addAccessoryModel @update="reload" @register="registerAdd" />
  333. <outModal @update="reload" @register="registerOut" />
  334. <reviewModal @update="reload" @register="registerReview" />
  335. <AccountListModal @update="reload" @register="registerAccount" />
  336. </div>
  337. </template>
  338. <script lang="ts">
  339. import { defineComponent, ref, onMounted, reactive, h } from 'vue';
  340. import { useI18n } from '/@/hooks/web/useI18n';
  341. import { useRouter } from 'vue-router';
  342. import { useMessage } from '/@/hooks/web/useMessage';
  343. import { detail, process, detailDownExport } from '/@/api/spares';
  344. import { detailResult } from '/@/api/spares/model';
  345. import { useModal } from '/@/components/Modal';
  346. import printJS from 'print-js';
  347. // import recoveryModal from './recoveryModal.vue';//录单
  348. import quoteModel from './quoteModel.vue';
  349. import deliveryModal from './deliveryModal.vue';
  350. import AccountListModal from '../Accounting/ListModal.vue';
  351. import payLogModal from './payLogModal.vue';
  352. import payLogU8Modal from '../U8Sending/ListModal.vue';
  353. import takingOrdersModel from './takingOrdersModel.vue';
  354. import remarksModal from '../spares/remarksModal.vue';
  355. import checkModel from './checkModel.vue';
  356. import partsListModal from './partsListModal.vue';
  357. import outModal from './outModal.vue';
  358. import reviewModal from './reviewModal.vue';
  359. import { cloneDeep } from 'lodash-es';
  360. import addAccessoryModel from './addAccessoryModel.vue';
  361. import { usePermissionStore } from '/@/store/modules/permission';
  362. import { BasicTable, useTable, BasicColumn } from '/@/components/Table';
  363. import { Timeline, TimelineItem, Descriptions, Image } from 'ant-design-vue';
  364. export default defineComponent({
  365. name: 'Detail',
  366. components: {
  367. Image,
  368. BasicTable,
  369. quoteModel,
  370. deliveryModal,
  371. payLogModal,
  372. payLogU8Modal,
  373. takingOrdersModel,
  374. AccountListModal,
  375. remarksModal,
  376. checkModel,
  377. partsListModal,
  378. outModal,
  379. addAccessoryModel,
  380. Descriptions: Descriptions,
  381. DescriptionsItem: Descriptions.Item,
  382. // Timeline: Timeline,
  383. TimelineItem: TimelineItem,
  384. [Timeline.name]: Timeline,
  385. // [Timeline.Item.name]: Timeline.Item,
  386. PreviewGroup: Image.PreviewGroup,
  387. reviewModal,
  388. },
  389. setup(props) {
  390. const router = useRouter();
  391. const { createMessage, createConfirm } = useMessage();
  392. const { t } = useI18n();
  393. const print = ref(null);
  394. const permissionStore = usePermissionStore();
  395. const { getCheckPerm } = permissionStore;
  396. const repairId = ref<string | string[]>(router.currentRoute.value.params.id || '0');
  397. const detailData = ref<detailResult>({
  398. customer: {},
  399. customerAddress: {},
  400. repairerVo: {},
  401. RepairTestVo: {},
  402. repairRegisterVo: {},
  403. orderReceivingVo: {},
  404. repairPay: {},
  405. repairComment: {},
  406. priceList: [],
  407. lastRepairId: '',
  408. repairRegisterVoList: [],
  409. });
  410. const priceTotal = ref(0);
  411. const stepList = ref<any>([]);
  412. const butList = ref<any>([]);
  413. onMounted(() => {
  414. getData();
  415. });
  416. let dataSource = reactive<any>([]);
  417. const columns: BasicColumn[] = [
  418. {
  419. title: '备件名称',
  420. dataIndex: 'name',
  421. width: 150,
  422. },
  423. {
  424. title: '单价(元)',
  425. dataIndex: 'price',
  426. width: 100,
  427. },
  428. {
  429. title: '数量',
  430. dataIndex: 'count',
  431. width: 110,
  432. },
  433. {
  434. title: '小计(元)',
  435. dataIndex: 'total',
  436. width: 140,
  437. },
  438. {
  439. title: '备注',
  440. dataIndex: 'remark',
  441. width: 140,
  442. },
  443. ];
  444. async function enterDialog() {
  445. // const style = '@page { margin:0mm 10mm } .content_left{ width: calc(100% - 400px) !important} .content{width:100% !important} .content_right{width: 400px !important; float: right;}';
  446. // const style =
  447. // '@page {margin:0mm 10mm;width:100%};' +
  448. // ' @media print { .status{ overflow:hidden;text-overflow:ellipsis;white-space:nowrap; }} .content_left_info{ width: calc(100% - 400px) !important} .ant-descriptions{width: 400px !important}'; //打印时去掉眉页眉尾
  449. printJS({
  450. printable: 'print', // 标签元素id
  451. type: 'html',
  452. headerStyle: 'font-weight:400;text-align:center;',
  453. targetStyles: ['*'],
  454. // style: style,
  455. });
  456. }
  457. async function getData() {
  458. const stepRes = await process({ repairId: repairId.value });
  459. let butTypeList = {
  460. 0: ['接单'],
  461. 10: ['检测登记'],
  462. 20: ['报价'],
  463. 30: ['修改报价'],
  464. 40: ['付款登记'],
  465. 41: ['发件登记'],
  466. 50: ['备件出库'],
  467. 60: ['添加备件', '完成维修'],
  468. 70: ['测试登记'],
  469. 80: ['付款登记'],
  470. 82: ['到账登记'],
  471. 90: ['备件回收'],
  472. 91: ['备件回收'],
  473. // 70: ['备件回收'],
  474. // 80: ['测试登记'],
  475. // 90: ['付款登记'],
  476. 100: ['发货登记'],
  477. };
  478. let butTypeShow = {
  479. 0: ['work_orderTakers'],
  480. 10: ['maintenance_testing'],
  481. 20: ['work_quotedPrice'],
  482. 30: ['work_setPrice'],
  483. 40: ['work_payments'],
  484. 41: ['U8Sending_register'],
  485. 50: ['repairspares_out'],
  486. 60: ['maintenance_add', 'maintenance_finish'],
  487. 90: ['repairspares_in'],
  488. 91: ['repairspares_in'],
  489. 70: ['repair_test'],
  490. 80: ['work_payments'],
  491. 82: ['Account_registration'],
  492. 100: ['work_dispatched'],
  493. };
  494. stepList.value = stepRes;
  495. let res = await detail({ repairId: repairId.value });
  496. detailData.value = res;
  497. let butListjh = [];
  498. if (stepRes[0] && res.haveButton == 1 && res.repairerVo.status != undefined) {
  499. butTypeList[res.repairerVo.status] &&
  500. butTypeList[res.repairerVo.status].map((ele, index) => {
  501. let butKey = butTypeShow[res.repairerVo.status][index];
  502. if (getCheckPerm(butKey)) {
  503. butListjh.push(ele);
  504. }
  505. });
  506. }
  507. butList.value = butListjh;
  508. let countItem = {
  509. id: 3,
  510. remark: null,
  511. price: null,
  512. name: '',
  513. count: '合计(元)',
  514. total: 0,
  515. };
  516. let newdataSource = [];
  517. res.priceList.map((ele) => {
  518. let price = ele.discount == 1 ? ele.priceDiscount : ele.price;
  519. let elePrice = countItem.total + parseFloat(price) * ele.count;
  520. countItem.total = elePrice;
  521. newdataSource.push({
  522. // ...ele,
  523. count: ele.count,
  524. name: ele.name,
  525. price: price,
  526. id: ele.laborId,
  527. total: (price * ele.count).toFixed(2),
  528. remark: ele.remark,
  529. });
  530. });
  531. dataSource = newdataSource;
  532. priceTotal.value = countItem.total?.toFixed(2);
  533. countItem.total =
  534. res.repairerVo.warrantyType == 0 || res.repairerVo.warrantyType == 3
  535. ? '0.00'
  536. : priceTotal.value;
  537. let addItemList = [countItem];
  538. if (res.repairerVo.warrantyType == 0 || res.repairerVo.warrantyType == 3) {
  539. addItemList.unshift({
  540. id: 4,
  541. price: null,
  542. name: t(`routes.spares.warrantyType.${res.repairerVo.warrantyType}`),
  543. count: '',
  544. total: '-' + priceTotal.value,
  545. });
  546. }
  547. console.log('newdataSource', newdataSource, dataSource, countItem.total, res.priceList);
  548. if (countItem.total && res.priceList.length) {
  549. setTableData(cloneDeep([...dataSource, ...addItemList]));
  550. }
  551. }
  552. function goBack() {
  553. router.go(-1);
  554. }
  555. function handleBut(item) {
  556. console.log('handleBut', item, stepList.value[0].repairStatus);
  557. let status = detailData.value.repairerVo.status;
  558. let record = {
  559. repairId: repairId.value || detailData.value.orderReceivingVo?.repairId,
  560. cameraSnCode: detailData.value.repairerVo?.cameraSnCode,
  561. cameraType: detailData.value.repairerVo?.cameraType,
  562. status: status,
  563. payAmount: 0,
  564. };
  565. if (status == 80 || status == 40) {
  566. record.payAmount = priceTotal.value;
  567. }
  568. let openList = {
  569. 0: openTakingOrders, //检测登记
  570. 10: openCheckModal, //检测登记
  571. 20: openQuoteModal, //报价
  572. 30: openQuoteModal, //修改报价
  573. 40: openPayLogModal, //付款登记
  574. 41: openPayLogU8Modal, //付款登记
  575. 50: openPartsModal, //备件出库
  576. 90: openPartsModal, //备件回收
  577. 91: openPartsModal, //备件回收
  578. 70: openReviewModal, //测试登记
  579. 80: openPayLogModal, //付款登记
  580. 82: registerAccountModal, //付款登记
  581. 100: openDeliveryModal, //发货登记
  582. 61: openAddModal, //添加备件
  583. 62: openOutModal, //完成维修
  584. };
  585. console.log('detailData.value.repairerVo', detailData.value.repairerVo.warrantyDate);
  586. if (status == 60) {
  587. openList[item == '添加备件' ? 61 : 62](true, {
  588. ...record,
  589. warrantyDate: detailData.value.repairerVo?.warrantyDate,
  590. warrantyType: detailData.value.repairerVo?.warrantyType,
  591. repairManName: detailData.value.repairRegisterVo?.sysUserName,
  592. });
  593. } else {
  594. openList[status](true, {
  595. ...record,
  596. checkResult: detailData.value.repairRegisterVoList?.[0]?.checkResult,
  597. payImgArray: detailData.value.repairPay?.payImg,
  598. warrantyDate: detailData.value.repairerVo?.warrantyDate,
  599. warrantyType: detailData.value.repairerVo?.warrantyType,
  600. payAmount: detailData.value.payAmount,
  601. repairManName: detailData.value.repairRegisterVo?.sysUserName,
  602. });
  603. }
  604. }
  605. function handleSubmit() {
  606. createMessage.success(t('common.optSuccess'));
  607. }
  608. function reload() {
  609. getData();
  610. }
  611. function dowmFile(type) {
  612. let name = type == 0 ? '报价单' : '维修工单';
  613. createConfirm({
  614. iconType: 'warning',
  615. title: () => h('span', t('common.reminder')),
  616. content: () => h('span', `是否导出${name}`),
  617. onOk: async () => {
  618. console.log('repairId');
  619. let apiData = {
  620. repairId: repairId.value,
  621. name: repairId.value + name,
  622. type,
  623. };
  624. console.log('apiData', apiData);
  625. await detailDownExport(apiData);
  626. },
  627. });
  628. }
  629. const [registerParts, { openModal: openPartsModal }] = useModal();
  630. const [registerReview, { openModal: openReviewModal }] = useModal();
  631. const [registerAccount, { openModal: registerAccountModal }] = useModal();
  632. const [registerRecovery, { openModal }] = useModal();
  633. const [registerCheck, { openModal: openCheckModal }] = useModal();
  634. const [registerQuote, { openModal: openQuoteModal }] = useModal();
  635. const [registerPayLog, { openModal: openPayLogModal }] = useModal();
  636. const [registerPayU8Log, { openModal: openPayLogU8Modal }] = useModal();
  637. const [registerDelivery, { openModal: openDeliveryModal }] = useModal();
  638. const [registerTakingOrders, { openModal: openTakingOrders }] = useModal();
  639. const [registerRemarks, { openModal: openRemarksModal }] = useModal();
  640. // const [registerRecovery, { openModal }] = useModal();
  641. const [registerOut, { openModal: openOutModal }] = useModal();
  642. const [registerAdd, { openModal: openAddModal }] = useModal();
  643. const [registerTable, { setTableData }] = useTable({
  644. dataSource: dataSource,
  645. columns,
  646. showSummary: true,
  647. showIndexColumn: false,
  648. rowKey: 'id',
  649. pagination: false,
  650. bordered: true,
  651. canResize: false,
  652. });
  653. return {
  654. repairId,
  655. registerParts,
  656. registerReview,
  657. registerRecovery,
  658. registerQuote,
  659. registerPayLog,
  660. registerPayU8Log,
  661. registerAccount,
  662. registerAccountModal,
  663. registerDelivery,
  664. registerTakingOrders,
  665. registerRemarks,
  666. registerOut,
  667. registerCheck,
  668. registerAdd,
  669. registerTable,
  670. handleSubmit,
  671. goBack,
  672. handleBut,
  673. reload,
  674. detailData,
  675. butList,
  676. dataSource,
  677. stepList,
  678. dowmFile,
  679. t,
  680. enterDialog,
  681. print,
  682. };
  683. },
  684. });
  685. </script>
  686. <style lang="less" scoped>
  687. .detailPage {
  688. margin: 20px;
  689. padding: 20px;
  690. background-color: #fff;
  691. .topButton {
  692. text-align: right;
  693. }
  694. .htmlText {
  695. overflow: hidden;
  696. text-overflow: ellipsis;
  697. width: 100%;
  698. display: -webkit-box;
  699. -webkit-box-orient: vertical;
  700. -webkit-line-clamp: 3;
  701. word-break: break-all;
  702. }
  703. .content {
  704. width: 100%;
  705. display: flex;
  706. justify-content: space-between;
  707. &_right {
  708. width: 400px;
  709. padding: 40px 0px 40px 20px;
  710. .timeItem {
  711. .status {
  712. overflow: hidden;
  713. text-overflow: ellipsis;
  714. white-space: nowrap;
  715. }
  716. .ant-image-img {
  717. width: 100%;
  718. height: 100%;
  719. }
  720. }
  721. }
  722. &_left {
  723. width: calc(100% - 400px);
  724. &_info {
  725. // width: calc(100% - 400px);
  726. }
  727. }
  728. }
  729. .bottom_but {
  730. text-align: center;
  731. button {
  732. margin: 20px;
  733. }
  734. }
  735. .link {
  736. color: cornflowerblue;
  737. cursor: pointer;
  738. }
  739. }
  740. </style>
  741. <style lang="less">
  742. .detailPage {
  743. .ellipsis {
  744. // .ant-descriptions-item-container{
  745. // overflow: hidden;
  746. // white-space: nowrap;
  747. // text-overflow: ellipsis;
  748. // }
  749. }
  750. .ant-image-img {
  751. width: 100%;
  752. height: 100%;
  753. object-fit: cover;
  754. }
  755. .ant-image {
  756. margin-right: 10px;
  757. }
  758. .content {
  759. // .content {
  760. width: 100%;
  761. display: flex;
  762. justify-content: space-between;
  763. &_right {
  764. width: 400px;
  765. padding: 40px 0px 40px 20px;
  766. .timeItem {
  767. .status {
  768. overflow: hidden;
  769. text-overflow: ellipsis;
  770. white-space: nowrap;
  771. }
  772. .ant-image-img {
  773. width: 100%;
  774. height: 100%;
  775. }
  776. }
  777. }
  778. &_left {
  779. width: calc(100% - 400px);
  780. &_info {
  781. // width: calc(100% - 400px);
  782. }
  783. }
  784. }
  785. }
  786. </style>