detail.vue 25 KB

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