detail.vue 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780
  1. <template>
  2. <view class="tour-container">
  3. <uni-nav-bar fixed="true" statusBar="true" left-icon="back" title="待检设备列表" @clickLeft="back" @clickRight="HandlScanCode"></uni-nav-bar>
  4. <view class="tour-wrapper">
  5. <view class="tour_tally-content">
  6. <view class="kd-equipment">
  7. <view class="kd-list-container">
  8. <u-list @scrolltolower="scrolltolower">
  9. <u-list-item v-for="(item, index) in euqiList" :key="index">
  10. <view class="kd-card">
  11. <view class="kd-card-wrapper">
  12. <view class="kd-cell">
  13. <text class="kd-label">工单名称</text>
  14. {{ item.code }}
  15. </view>
  16. <view class="kd-cell">
  17. <text class="kd-label">设备名称</text>
  18. {{ item.name }}
  19. </view>
  20. <view class="kd-cell">
  21. <text class="kd-label">设备型号</text>
  22. {{ item.model }}
  23. </view>
  24. <view class="kd-cell">
  25. <text class="kd-label">固资编号</text>
  26. {{ item.fixCode }}
  27. </view>
  28. <view class="kd-cell">
  29. <text class="kd-label">内部编号</text>
  30. {{ item.codeNumber }}
  31. </view>
  32. <view class="kd-cell">
  33. <text class="kd-label">规则名称</text>
  34. {{ item.planName }}
  35. </view>
  36. <view class="kd-cell">
  37. <text class="kd-label">工单生成时间</text>
  38. {{ item.createTime }}
  39. </view>
  40. <view class="kd-cell">
  41. <text class="kd-label">班次</text>
  42. {{ getCurrentClasses(item.createTime) }}
  43. </view>
  44. <view class="kd-cell">
  45. <text class="kd-label">执行结果</text>
  46. <text class="status-box text-warning" v-if="item.executeStatus === 0">待检</text>
  47. <text class="status-box text-primary" v-else-if="item.executeStatus === 1">已检</text>
  48. <text class="status-box text-danger" v-else-if="item.executeStatus === 2">异常</text>
  49. <text class="status-box text-primary" v-else-if="item.executeStatus === 3">已报修</text>
  50. </view>
  51. </view>
  52. <view class="card-footer">
  53. <button v-if="item.executeStatus == 0" type="primary" class="primary-btn" @click="handleCheck(item)">检查</button>
  54. <template v-if="item.orderStatus && item.orderStatus === 3">
  55. <button type="default" v-if="item.resultStatus === 3" @click="handLbxDetail(item)">报修详情</button>
  56. <button type="default" v-else-if="item.resultStatus === 2" @click="handLbx(item)">报修</button>
  57. </template>
  58. <button type="default" v-if="[0, 2, 3].includes(item.orderStatus) && item.executeStatus != 0" @click="checkDetail(item)">检查详情</button>
  59. </view>
  60. </view>
  61. </u-list-item>
  62. <u-list-item v-if="euqiList.length === 0">
  63. <view class="nodata">暂无数据</view>
  64. </u-list-item>
  65. </u-list>
  66. </view>
  67. </view>
  68. </view>
  69. <uni-popup ref="inputDialog" type="dialog">
  70. <uni-popup-dialog
  71. ref="inputClose"
  72. mode="input"
  73. title="您当前已超出计划完成时间,请填写原因"
  74. placeholder="请输入内容"
  75. :before-close="true"
  76. @close="handleClose"
  77. @confirm="timeoutCauseConfirm"></uni-popup-dialog>
  78. </uni-popup>
  79. </view>
  80. <u-modal :show="modalShow" title="提示" @confirm="modalShow = false">
  81. <view>
  82. 您还有
  83. <text class="text-warning">{{ worksheetInfo.awaitInspectSum }}</text>
  84. 台设备待检,不可报工
  85. </view>
  86. </u-modal>
  87. <Assign ref="assignRef" @success="assignSuccess" />
  88. <!-- <ScanCode @scancodedate="scancodedate"></ScanCode> -->
  89. </view>
  90. </template>
  91. <script>
  92. import Step from '@/components/Step/Step.vue'
  93. import StepItem from '@/components/Step/StepItem.vue'
  94. import PopSparePart from '@/pages/maintenanceWorkorder/components/PopSparePart.vue'
  95. import { getWorkOrderDetail, getDeviceList, startExecuting, signingWork, devicestatistics, deviceListQrCode } from '@/api/myTicket/index.js'
  96. import { getSpareParts } from '@/api/repair'
  97. import { get, post, postJ } from '@/utils/api.js'
  98. import Assign from '@/components/Assign.vue'
  99. import CellInfo from '@/components/CellInfo.vue'
  100. import KdTabs from '@/components/KdTabs.vue'
  101. import ScanCode from '@/components/ScanCode.vue'
  102. export default {
  103. components: {
  104. CellInfo,
  105. KdTabs,
  106. Assign,
  107. ScanCode,
  108. Step,
  109. StepItem,
  110. PopSparePart
  111. },
  112. data() {
  113. return {
  114. type: '',
  115. typeOptions: {
  116. CREATE: '生成工单',
  117. SPARE_PARTS_APPLY: '备品备件申请',
  118. ACCEPTANCE_CHEK: '验收',
  119. WORK_REPORT: '报工'
  120. },
  121. repairInfoLogList: [],
  122. modalShow: false,
  123. active: 0,
  124. typeActive: 0,
  125. statusList: {
  126. 0: '待接收',
  127. 1: '执行中',
  128. 3: '已完成'
  129. },
  130. pageId: '',
  131. planId: '',
  132. workOrderCode: '',
  133. worksheetInfo: {
  134. equiList: [],
  135. workOrder: {}
  136. },
  137. logs: {},
  138. equpStatus: [
  139. // {
  140. // name: '全部',
  141. // value: []
  142. // },
  143. {
  144. name: '全部',
  145. value: -1
  146. },
  147. {
  148. name: '待检',
  149. value: 0
  150. },
  151. {
  152. name: '已检',
  153. value: 1
  154. },
  155. {
  156. name: '异常',
  157. value: 2
  158. }
  159. ],
  160. euqiList: [],
  161. equipPage: 1,
  162. isEnd: false,
  163. cycleOptObj: {
  164. 1: '时/次',
  165. 2: '天/次',
  166. 3: '周/次',
  167. 4: '月/次',
  168. 5: '年/次',
  169. 11: '次/天',
  170. 12: '次/周',
  171. 13: '次/月',
  172. 14: '次/年'
  173. },
  174. barType: 0,
  175. qrContent: null,
  176. chooseTab: false
  177. }
  178. },
  179. async onLoad(options) {
  180. console.log('onLoad--------')
  181. console.log('options------------', options)
  182. // this.workOrderCode = options.workOrderCode
  183. this.deviceId = options.deviceId
  184. this.type = options.type
  185. // this.chooseTab = options.chooseTab
  186. this.getInfo()
  187. // 设备台账跳转详情
  188. // if (options.qrContent) {
  189. // this.qrContent = options.qrContent
  190. // await this.getInfo()
  191. // this.cbScancodedate({
  192. // code: this.qrContent
  193. // })
  194. // }
  195. },
  196. onShow() {
  197. console.log('onShow--------')
  198. this.getInfo()
  199. },
  200. onUnload() {
  201. uni.$off('scancodedate')
  202. },
  203. onHide() {
  204. uni.$off('scancodedate')
  205. },
  206. methods: {
  207. // 获取当前班次
  208. getCurrentClasses(date) {
  209. console.log(new Date(date).getHours())
  210. if (new Date(date).getHours() >= 7 && new Date(date).getHours() < 16) {
  211. return '白班'
  212. } else if (new Date(date).getHours() >= 16 && new Date(date).getHours() < 23) {
  213. return '晚班'
  214. } else {
  215. return '零点班'
  216. }
  217. },
  218. // 备件使用明细
  219. handlbjsymx(title, list) {
  220. this.$refs.PopSparePart.open(title, list)
  221. },
  222. // 跳转备品备件
  223. handlbpbj() {
  224. uni.navigateTo({
  225. url: `/pages/maintenanceWorkorder/sparepart/sparepartList?id=${this.pageId}`
  226. })
  227. },
  228. getCount() {
  229. devicestatistics({ planId: this.planId }).then(data => {
  230. this.equpStatus = this.equpStatus.map(item => {
  231. switch (item.name) {
  232. case '全部':
  233. return { ...item, count: data.total }
  234. case '待检':
  235. return { ...item, count: data.isInspectedNum }
  236. case '已检':
  237. return { ...item, count: data.checkedNum }
  238. case '异常':
  239. return { ...item, count: data.abnormalNum }
  240. }
  241. })
  242. })
  243. },
  244. // 扫码枪扫码
  245. cbScancodedate(data) {
  246. this.Scancodedate(data.code)
  247. },
  248. // 相机扫码
  249. HandlScanCode() {
  250. let _this = this
  251. uni.scanCode({
  252. onlyFromCamera: true,
  253. success: function (res) {
  254. _this.Scancodedate(res.result)
  255. }
  256. })
  257. },
  258. Scancodedate(code) {
  259. let _this = this
  260. if (this.worksheetInfo.status.code === 0) {
  261. uni.showModal({
  262. title: '提示',
  263. content: '工单未开启执行,不可进行巡点检操作,请先点击“开始执行”!',
  264. confirmText: '开始执行', //这块是确定按钮的文字
  265. cancelText: '取消', //这块是取消的文字
  266. success: function (res) {
  267. if (res.confirm) {
  268. _this.handleExecute() // 执行确认后的操作
  269. } else {
  270. // 执行取消后的操作
  271. }
  272. }
  273. })
  274. return
  275. }
  276. this.qrContent = code.trim()
  277. this.barType = this.setBarType(this.qrContent)
  278. _this.getData()
  279. },
  280. // 设置barType
  281. setBarType(val) {
  282. let index = val.indexOf('@_@')
  283. let result = 0
  284. if (index !== -1) {
  285. let item = val.substr(index + 3, 1)
  286. if (item) {
  287. result = Number(item)
  288. }
  289. }
  290. return result
  291. },
  292. // 根据条码请求设备数据
  293. getData() {
  294. let par = {
  295. barType: this.barType,
  296. qrContent: this.qrContent
  297. }
  298. uni.showLoading({
  299. title: '加载中',
  300. mask: true
  301. })
  302. postJ(this.apiUrl + '/scan/getAssetInfo', par)
  303. .then(res => {
  304. let data = res.data
  305. this.matchEquipment(data)
  306. })
  307. .finally(() => {
  308. uni.hideLoading()
  309. })
  310. },
  311. matchEquipment(data) {
  312. let par = {
  313. assetCode: data.assetCode,
  314. workOrderId: this.worksheetInfo.id
  315. }
  316. console.log('par', par)
  317. post(this.apiUrl + '/workOrder/scanMatching', par).then(res => {
  318. let data = res.data
  319. if (!data) {
  320. uni.showModal({
  321. title: '提示',
  322. content: '本工单中,无此设备!',
  323. confirmText: '好的', //这块是确定按钮的文字
  324. showCancel: false,
  325. success: function (res) {
  326. if (res.confirm) {
  327. // 执行确认后的操作
  328. } else {
  329. // 执行取消后的操作
  330. }
  331. }
  332. })
  333. } else {
  334. // 未报工
  335. if (this.worksheetInfo.status.code === 1) {
  336. this.handleCheck(data)
  337. }
  338. // 已报工
  339. if (this.worksheetInfo.status.code === 3) {
  340. this.checkDetail(data)
  341. }
  342. }
  343. })
  344. },
  345. handleAssign() {
  346. console.log(this.worksheetInfo)
  347. this.$refs.assignRef.open(this.worksheetInfo.id)
  348. },
  349. assignSuccess() {
  350. this.back()
  351. },
  352. // 报工
  353. handleReport() {
  354. if (this.worksheetInfo.finishNum !== this.worksheetInfo.total) {
  355. uni.showToast({
  356. title: '请完成巡检设备检查',
  357. icon: 'none'
  358. })
  359. } else {
  360. if (new Date(this.worksheetInfo.acceptTime).getTime() + this.worksheetInfo.duration * 60 * 1000 < new Date().getTime()) {
  361. this.$refs.inputDialog.open()
  362. return
  363. }
  364. this._report()
  365. }
  366. },
  367. handleClose() {
  368. this.$refs.inputDialog.close()
  369. },
  370. timeoutCauseConfirm(value) {
  371. if (!value) {
  372. uni.showToast({
  373. title: '请输入超时原因',
  374. icon: 'none'
  375. })
  376. return
  377. }
  378. this.$refs.inputDialog.close()
  379. this._report(value)
  380. },
  381. _report(timeoutCause = '') {
  382. signingWork({ id: this.pageId, timeoutCause: timeoutCause }).then(() => {
  383. uni.showToast({
  384. icon: 'success',
  385. title: '操作成功!',
  386. duration: 2000
  387. })
  388. this.getInfo()
  389. })
  390. // post(
  391. // this.apiUrl + '/workOrder/reportWork',
  392. // {
  393. // workOrderId: this.pageId,
  394. // timeoutCause
  395. // },
  396. // true,
  397. // false
  398. // )
  399. // .then(res => {
  400. // let _this = this
  401. // if (res?.success) {
  402. // let data = res.data
  403. // if (data.length) {
  404. // uni.showModal({
  405. // title: '提示',
  406. // content: `有${data.length}台设备被标记为缺陷,是否要报修?`,
  407. // cancelText: '取消', // 取消按钮的文字
  408. // confirmText: '报修', // 确认按钮的文字
  409. // showCancel: true, // 是否显示取消按钮,默认为 true
  410. // success: res => {
  411. // if (res.confirm) {
  412. // if (data.length > 1) {
  413. // uni.navigateTo({
  414. // url: `/pages/tour_tally/detail/detail?workOrderCode=${this.workOrderCode}&id=${this.pageId}&chooseTab=true`
  415. // })
  416. // } else {
  417. // uni.navigateTo({
  418. // url: `/pages/repair/repair/index?source=5&workOrderCode=${this.workOrderCode}&equiCode=${data[0].equiCode}&equiId=${data[0].equiId}&workOrderId=${this.pageId}&equiName=${data[0].equiName}&equiModel=${data[0].equiModel}&equiLocation=${data[0].equiLocation}`
  419. // })
  420. // }
  421. // } else {
  422. // _this.getInfo()
  423. // }
  424. // }
  425. // })
  426. // } else {
  427. // uni.showToast({
  428. // icon: 'success',
  429. // title: '操作成功!',
  430. // duration: 2000
  431. // })
  432. // this.getInfo()
  433. // }
  434. // }
  435. // /* if (res?.success) {
  436. // uni.showToast({
  437. // icon: "success",
  438. // title: "操作成功!",
  439. // duration: 2000,
  440. // });
  441. // this.getInfo();
  442. // } */
  443. // })
  444. // .catch(res => {
  445. // if (res.code === '4444') {
  446. // this.$refs.inputDialog.open()
  447. // } else if (res.code === '5555') {
  448. // this.modalShow = true
  449. // // uni.showModal({
  450. // // title: '提示',
  451. // // content: `您还有 ${this.worksheetInfo.awaitInspectSum} 台设备待检,不可报工`,
  452. // // success: function (res) {},
  453. // // showCancel: false
  454. // // })
  455. // }
  456. // })
  457. },
  458. // 执行工单
  459. handleExecute() {
  460. startExecuting({ id: this.pageId }).then(() => {
  461. uni.showToast({
  462. icon: 'success',
  463. title: '操作成功!',
  464. duration: 2000
  465. })
  466. this.getInfo()
  467. })
  468. // post(this.apiUrl + '/workOrder/execute', {
  469. // workOrderCode: this.workOrderCode
  470. // }).then(res => {
  471. // if (res?.success) {
  472. // uni.showToast({
  473. // icon: 'success',
  474. // title: '操作成功!',
  475. // duration: 2000
  476. // })
  477. // this.getInfo()
  478. // }
  479. // })
  480. },
  481. //巡点检设备加载更多
  482. scrolltolower() {
  483. // if (this.isEnd) return
  484. // this.equipPage++
  485. // this.getEquipList()
  486. },
  487. // 巡点检设备列表
  488. getEquipList() {
  489. const params = {
  490. planId: this.planId,
  491. status: this.equpStatus[this.typeActive].value,
  492. pageNum: 1,
  493. size: 9999
  494. }
  495. getDeviceList(params).then(data => {
  496. if (this.equipPage === 1) {
  497. this.euqiList = data.list
  498. } else {
  499. this.euqiList.push(...data.list)
  500. }
  501. this.isEnd = this.euqiList.length >= data.count
  502. })
  503. // post(this.apiUrl + `/workOrder/getEquipmentListApp?page=${this.equipPage}&size=10`, params, true).then(res => {
  504. // if (res?.success) {
  505. // if (this.equipPage === 1) {
  506. // this.euqiList = res.data.records
  507. // } else {
  508. // this.euqiList.push(...res.data.records)
  509. // }
  510. // this.isEnd = this.euqiList.length >= res.data.total
  511. // }
  512. // })
  513. },
  514. handleTabChange(value) {
  515. if (value === 1) {
  516. this.typeChange(0)
  517. }
  518. },
  519. finishTime(start, end) {
  520. if (!end) return ''
  521. let dur = new Date(end).getTime() - new Date(start).getTime()
  522. return Math.ceil(dur / 1000 / 60) + '分钟'
  523. },
  524. // 设备状态切换
  525. typeChange(type) {
  526. this.typeActive = type
  527. this.equipPage = 1
  528. this.getEquipList()
  529. },
  530. handleCheck({ id }) {
  531. // uni.navigateTo({
  532. // url: `/pages/tour_tally/check/index?id=${id}&equiName=${equiName}&equiCode=${equiCode}&workOrderId=${this.pageId}&workOrderCode=${this.workOrderCode}`
  533. // })
  534. uni.navigateTo({
  535. url: `/pages/tour_tally/check/index?id=${id}`
  536. })
  537. },
  538. checkDetail({ id }) {
  539. uni.navigateTo({
  540. url: `/pages/tour_tally/check/detail?id=${id}`
  541. })
  542. },
  543. getInfo() {
  544. console.log('this.deviceId----')
  545. console.log(this.deviceId)
  546. console.log('this.type----')
  547. console.log(this.type)
  548. deviceListQrCode({ type: this.type, deviceId: this.deviceId }).then(data => {
  549. console.log('data--------------123----')
  550. console.log(data)
  551. this.euqiList = data
  552. })
  553. },
  554. // 报修
  555. handLbx(item) {
  556. console.log('item', item)
  557. uni.navigateTo({
  558. url: `/pages/repair/repair/index?source=5&workOrderCode=${this.workOrderCode}&equiCode=${item.equiCode}&equiId=${item.equiId}&workOrderId=${this.pageId}&equiName=${item.equiName}&equiModel=${item.equiModel}&equiLocation=${item.equiLocation}`
  559. })
  560. },
  561. // 报修详情
  562. handLbxDetail(item) {
  563. uni.navigateTo({
  564. url: `/pages/repair/detail/detail?id=${item.repairId}`
  565. })
  566. }
  567. }
  568. }
  569. </script>
  570. <style lang="scss" scoped>
  571. @import '@/components/submitted.scss';
  572. .list-cell {
  573. display: flex;
  574. align-items: center;
  575. justify-content: space-between;
  576. color: $uni-text-color-grey;
  577. padding: 5rpx 20rpx;
  578. }
  579. .font-sm {
  580. font-size: $uni-font-size-sm;
  581. }
  582. .font-text {
  583. color: $uni-text-color;
  584. }
  585. .btn-execute {
  586. background-color: $j-primary-border-green;
  587. width: 450rpx;
  588. margin-top: 5vh;
  589. }
  590. .btn-reassignment {
  591. color: $uni-color-primary;
  592. background-color: transparent;
  593. border: none;
  594. box-shadow: none;
  595. &::after {
  596. display: none;
  597. }
  598. }
  599. .tour-container {
  600. position: fixed;
  601. top: 0;
  602. bottom: 0;
  603. width: 100vw;
  604. display: flex;
  605. flex-direction: column;
  606. /deep/.u-popup {
  607. flex: none !important;
  608. }
  609. }
  610. .tour-wrapper {
  611. position: relative;
  612. flex: 1;
  613. }
  614. .tour_tally-content {
  615. padding-top: 40rpx;
  616. box-sizing: border-box;
  617. // height: calc(100vh - 88rpx);
  618. position: absolute;
  619. top: 0;
  620. bottom: 0;
  621. left: 0;
  622. right: 0;
  623. display: flex;
  624. flex-direction: column;
  625. }
  626. .kd-cell {
  627. min-height: 90rpx;
  628. border-bottom: 1px dashed #dadada;
  629. display: flex;
  630. align-items: center;
  631. .kd-label {
  632. display: inline-block;
  633. width: 7em;
  634. font-weight: bold;
  635. }
  636. .kd-content {
  637. flex: 1;
  638. word-break: break-all;
  639. }
  640. }
  641. .kd-baseInfo {
  642. padding: 0 32rpx;
  643. font-size: 28rpx;
  644. }
  645. .kd-equipment {
  646. flex: 1;
  647. display: flex;
  648. flex-direction: column;
  649. overflow: hidden;
  650. .kd-type-box {
  651. text-align: center;
  652. padding: 26rpx 0;
  653. view {
  654. position: relative;
  655. display: inline-block;
  656. width: 120rpx;
  657. padding: 4rpx 0;
  658. color: #747474;
  659. margin: 0 20rpx;
  660. background-color: rgba(215, 215, 215, 0.5);
  661. &.type—active {
  662. background-color: #1e7f35;
  663. color: #fff;
  664. }
  665. .count {
  666. position: absolute;
  667. top: -9px;
  668. right: -9px;
  669. width: 18px;
  670. height: 18px;
  671. border-radius: 50%;
  672. font-size: 12px;
  673. background-color: red;
  674. color: #fff;
  675. }
  676. }
  677. }
  678. .kd-list-container {
  679. flex: 1;
  680. display: flex;
  681. flex-direction: column;
  682. overflow: hidden;
  683. padding: 12rpx 18rpx;
  684. background-color: $page-bg;
  685. .u-list {
  686. flex: 1;
  687. height: 100% !important;
  688. }
  689. .nodata {
  690. font-size: 40rpx;
  691. text-align: center;
  692. padding-top: 30rpx;
  693. }
  694. }
  695. }
  696. .btn-sparepart {
  697. width: 450rpx;
  698. margin-top: 20rpx;
  699. }
  700. .spare-parts {
  701. flex: 1;
  702. overflow: hidden;
  703. }
  704. .kd-card {
  705. background-color: #fff;
  706. margin-bottom: 20rpx;
  707. padding: 8rpx 0;
  708. font-size: 28rpx;
  709. word-break: break-all;
  710. .kd-card-wrapper {
  711. padding: 0 30rpx;
  712. border-bottom: 1px solid #dadada;
  713. }
  714. .kd-cell {
  715. line-height: 60rpx;
  716. }
  717. .kd-cell:last-of-type {
  718. border-bottom: none;
  719. }
  720. .status-box {
  721. margin-right: 16rpx;
  722. }
  723. .card-footer {
  724. display: flex;
  725. justify-content: flex-end;
  726. align-items: center;
  727. padding: 8rpx 0 20rpx;
  728. button {
  729. width: 180rpx;
  730. height: 56rpx;
  731. line-height: 56rpx;
  732. font-size: 28rpx;
  733. margin: 0 8rpx;
  734. }
  735. .primary-btn {
  736. background-color: $j-primary-border-green;
  737. }
  738. }
  739. }
  740. </style>