detail.vue 24 KB

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