detail.vue 22 KB

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