detail.vue 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625
  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.repairRegisterVo" :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. {{ detailData.RepairComment.comment }}
  181. </DescriptionsItem>
  182. <DescriptionsItem label="评分">
  183. {{ detailData.RepairComment.starRank }}
  184. </DescriptionsItem>
  185. </Descriptions>
  186. <Descriptions title="备注" :column="3">
  187. <DescriptionsItem label="备注内容">
  188. {{ detailData.repairerVo?.remark }}
  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. 1: ['检测登记'],
  373. 2: ['报价'],
  374. 3: ['修改报价'],
  375. 4: ['付款登记'],
  376. 5: ['备件出库'],
  377. 6: ['添加备件', '完成维修'],
  378. 7: ['备件回收'],
  379. 8: ['测试登记'],
  380. 9: ['付款登记'],
  381. 10: ['发货登记'],
  382. };
  383. let butTypeShow = {
  384. 0: ['work_orderTakers'],
  385. 1: ['maintenance_testing'],
  386. 2: ['work_quotedPrice'],
  387. 3: ['work_setPrice'],
  388. 4: ['work_payments'],
  389. 5: ['repairspares_out'],
  390. 6: ['maintenance_add', 'maintenance_finish'],
  391. 7: ['repairspares_in'],
  392. 8: ['repair_test'],
  393. 9: ['work_payments'],
  394. 10: ['work_dispatched'],
  395. }
  396. stepList.value = stepRes;
  397. let res = await detail({ repairId: repairId.value });
  398. detailData.value = res;
  399. let butListjh = [];
  400. if(stepRes[0] && stepRes[0].haveButton == 1 && res.repairerVo.status != undefined){
  401. butTypeList[res.repairerVo.status] && butTypeList[res.repairerVo.status].map((ele, index) =>{
  402. let butKey = butTypeShow[res.repairerVo.status][index]
  403. if(getCheckPerm(butKey)){
  404. butListjh.push(ele)
  405. }
  406. })
  407. }
  408. butList.value = butListjh
  409. let countItem = {
  410. id: 3,
  411. price: null,
  412. name: '',
  413. count: '合计(元)',
  414. total: 0,
  415. };
  416. dataSource = res.priceList.map((ele) => {
  417. let price = ele.discount == 1?ele.priceDiscount:ele.price
  418. let elePrice = countItem.total + parseFloat(price) * ele.count
  419. countItem.total = elePrice;
  420. return {
  421. // ...ele,
  422. count: ele.count,
  423. name: ele.name,
  424. price: price,
  425. id: ele.laborId,
  426. total: (price * ele.count).toFixed(2),
  427. };
  428. });
  429. priceTotal.value = countItem.total?.toFixed(2)
  430. countItem.total = res.repairerVo.warrantyType == 0?'0.00':priceTotal.value
  431. let addItemList = [countItem]
  432. if(res.repairerVo.warrantyType == 0){
  433. addItemList.unshift({
  434. id: 4,
  435. price: null,
  436. name: '保内维修',
  437. count: '',
  438. total: '-'+priceTotal.value,
  439. })
  440. }
  441. if (countItem.total && res.priceList.length) {
  442. setTableData(cloneDeep([...dataSource, ...addItemList]));
  443. }
  444. }
  445. function goBack() {
  446. router.go(-1);
  447. }
  448. function handleBut(item) {
  449. console.log('handleBut', item, stepList.value[0].repairStatus);
  450. let status = detailData.value.repairerVo.status;
  451. let record = {
  452. repairId:repairId || detailData.value.orderReceivingVo?.repairId,
  453. cameraSnCode: detailData.value.repairerVo?.cameraSnCode,
  454. cameraType: detailData.value.repairerVo?.cameraType,
  455. status:status,
  456. payAmount:0,
  457. };
  458. if(status == 9 || status == 4){
  459. record.payAmount = priceTotal.value
  460. }
  461. let openList = {
  462. 0: openTakingOrders, //检测登记
  463. 1: openCheckModal, //检测登记
  464. 2: openQuoteModal, //报价
  465. 3: openQuoteModal, //修改报价
  466. 4: openPayLogModal, //付款登记
  467. 5: openPartsModal, //备件出库
  468. 7: openPartsModal, //备件回收
  469. 8: openReviewModal, //测试登记
  470. 9: openPayLogModal, //付款登记
  471. 10: openDeliveryModal, //发货登记
  472. 61: openAddModal, //添加备件
  473. 62: openOutModal, //完成维修
  474. };
  475. if(status == 6){
  476. openList[item == '添加备件'?61:62](true, {
  477. ...record,
  478. repairManName: detailData.value.repairRegisterVo?.sysUserName,
  479. });
  480. }else{
  481. openList[status](true, {
  482. ...record,
  483. repairManName: detailData.value.repairRegisterVo?.sysUserName,
  484. });
  485. }
  486. }
  487. function handleSubmit() {
  488. createMessage.success(t('common.optSuccess'));
  489. }
  490. function reload() {
  491. getData();
  492. }
  493. function dowmFile(type){
  494. let name = type==0?'报价单':'维修工单'
  495. createConfirm({
  496. iconType: 'warning',
  497. title: () => h('span', t('common.reminder')),
  498. content: () => h('span', `是否导出${name}`),
  499. onOk: async () => {
  500. console.log('repairId')
  501. let apiData = {
  502. repairId:repairId.value,
  503. name:repairId.value + name,
  504. type,
  505. }
  506. console.log('apiData',apiData)
  507. await detailDownExport(apiData);
  508. },
  509. });
  510. }
  511. const [registerParts, { openModal: openPartsModal }] = useModal();
  512. const [registerReview, { openModal: openReviewModal }] = useModal();
  513. const [registerRecovery, { openModal }] = useModal();
  514. const [registerCheck, { openModal:openCheckModal }] = useModal();
  515. const [registerQuote, { openModal: openQuoteModal }] = useModal();
  516. const [registerPayLog, { openModal: openPayLogModal }] = useModal();
  517. const [registerDelivery, { openModal: openDeliveryModal }] = useModal();
  518. const [registerTakingOrders, { openModal: openTakingOrders }] = useModal();
  519. const [registerRemarks, { openModal: openRemarksModal }] = useModal();
  520. // const [registerRecovery, { openModal }] = useModal();
  521. const [registerOut, { openModal: openOutModal }] = useModal();
  522. const [registerAdd, { openModal: openAddModal }] = useModal();
  523. const [registerTable, { setTableData }] = useTable({
  524. dataSource: dataSource,
  525. columns,
  526. showSummary: true,
  527. showIndexColumn: false,
  528. rowKey: 'id',
  529. pagination: false,
  530. bordered: true,
  531. canResize: false,
  532. });
  533. return {
  534. repairId,
  535. registerParts,
  536. registerReview,
  537. registerRecovery,
  538. registerQuote,
  539. registerPayLog,
  540. registerDelivery,
  541. registerTakingOrders,
  542. registerRemarks,
  543. registerOut,
  544. registerCheck,
  545. registerAdd,
  546. registerTable,
  547. handleSubmit,
  548. goBack,
  549. handleBut,
  550. reload,
  551. detailData,
  552. butList,
  553. dataSource,
  554. stepList,
  555. dowmFile,
  556. t,
  557. };
  558. },
  559. });
  560. </script>
  561. <style lang="less" scoped>
  562. .detailPage {
  563. margin: 20px;
  564. padding: 20px;
  565. background-color: #fff;
  566. .topButton {
  567. text-align: right;
  568. }
  569. .htmlText{
  570. overflow: hidden;
  571. text-overflow: ellipsis;
  572. width: 100%;
  573. display: -webkit-box;
  574. -webkit-box-orient: vertical;
  575. -webkit-line-clamp: 3;
  576. word-break: break-all;
  577. }
  578. .content {
  579. width: 100%;
  580. display: flex;
  581. justify-content: space-between;
  582. &_right {
  583. width: 400px;
  584. padding: 40px 20px;
  585. .timeItem{
  586. .ant-image-img{
  587. width: 100%;
  588. height: 100%;
  589. }
  590. }
  591. }
  592. &_left {
  593. width: calc(100% - 400px);
  594. }
  595. }
  596. .bottom_but {
  597. text-align: center;
  598. button {
  599. margin: 20px;
  600. }
  601. }
  602. .link{
  603. color:cornflowerblue;
  604. cursor: pointer;
  605. }
  606. }
  607. </style>
  608. <style lang="less">
  609. .detailPage {
  610. .ellipsis {
  611. // .ant-descriptions-item-container{
  612. // overflow: hidden;
  613. // white-space: nowrap;
  614. // text-overflow: ellipsis;
  615. // }
  616. }
  617. .ant-image-img{
  618. width: 100%;
  619. height: 100%;
  620. object-fit: cover;
  621. }
  622. }
  623. </style>