index.vue 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842
  1. <template>
  2. <view class="list-page-container">
  3. <erp-nav-bar title="订单列表" />
  4. <!-- 当前已选客户 -->
  5. <view class="client-strip" v-if="clientName">
  6. <view class="cs-accent"></view>
  7. <text class="cs-label">当前客户</text>
  8. <text class="cs-divider">·</text>
  9. <text class="cs-name">{{ clientName }}</text>
  10. </view>
  11. <!-- 型号搜索栏 -->
  12. <view class="model-search-bar">
  13. <view class="ms-input-wrap">
  14. <image class="ms-icon" src="https://img.icons8.com/ios/50/999999/search--v1.png" mode="aspectFit">
  15. </image>
  16. <input class="ms-input" v-model="modelNum" placeholder="搜索型号(如:GR-TK9011)" @confirm="onModelSearch"
  17. confirm-type="search" />
  18. <text class="ms-clear" v-if="modelNum" @click="clearModelSearch">×</text>
  19. </view>
  20. </view>
  21. <!-- 2. 分类切换:使用 scroll-view 滚动,彻底释放所有综合状态 -->
  22. <scroll-view scroll-x class="tabs-fixed" :show-scrollbar="false" :scroll-with-animation="true"
  23. :scroll-into-view="'tab-' + currentTab">
  24. <view class="tabs-box">
  25. <view v-for="(tab, index) in tabs" :key="index" :id="'tab-' + index" class="tab-item"
  26. :class="{ active: currentTab === index }" @click="switchTab(index)">
  27. <text class="tab-txt">{{ tab }}</text>
  28. </view>
  29. <!-- 指示器:只负责等宽位移,彻底消除虚影与错位 -->
  30. <view class="indicator-track">
  31. <view class="indicator-bar" :style="{ transform: 'translateX(' + (currentTab * 140) + 'rpx)' }">
  32. <view class="bar-inner"></view>
  33. </view>
  34. </view>
  35. </view>
  36. </scroll-view>
  37. <!-- 3. 固定高度的滚动区 -->
  38. <scroll-view scroll-y class="order-scroll-view" :style="{ height: scrollHeight }" @scrolltolower="onReachEnd"
  39. :refresher-enabled="true" :refresher-triggered="refresherTriggered" @refresherrefresh="onPullDownRefresh"
  40. :show-scrollbar="false">
  41. <view class="order-list-inner">
  42. <view class="order-card" v-for="(item, index) in displayList" :key="index" @click="goDetail(item)">
  43. <view class="card-head">
  44. <view class="card-head-left">
  45. <text class="order-id">单号:{{ item.orderNo }}</text>
  46. <view class="urgent-tag" v-if="item.isUrgent">
  47. <text>加急</text>
  48. </view>
  49. </view>
  50. <view class="status-badge" :class="item.statusType">{{ item.statusName }}</view>
  51. </view>
  52. <view class="card-body">
  53. <view class="model-row" v-for="(model, mIdx) in item.models.slice(0, 2)" :key="mIdx">
  54. <text class="m-type">{{ model.type }}</text>
  55. <text class="m-spec">{{ model.surface }} | {{ model.length }}mm</text>
  56. <text class="m-count">{{ model.count }} 支</text>
  57. </view>
  58. <view class="more-hint" v-if="item.models.length > 2">
  59. <text>查看更多 {{ item.models.length - 2 }} 个型号...</text>
  60. </view>
  61. <view class="total-summary">
  62. <text class="summary-label">共计:</text>
  63. <text class="summary-val">{{ item.models.length }}</text>
  64. <text class="summary-unit">个型号</text>
  65. <view class="summary-split"></view>
  66. <text class="summary-val highlight">{{ item.totalCount }}</text>
  67. <text class="summary-unit">支</text>
  68. </view>
  69. </view>
  70. <view class="card-foot">
  71. <text class="time">{{ item.time }}</text>
  72. <view class="btns">
  73. <view class="btn-view urgency" v-if="!item.isUrgent" @click.stop="doMarkUrgent(item)">加急
  74. </view>
  75. <view class="btn-view primary" @click.stop="goDetail(item)">订单详情</view>
  76. </view>
  77. </view>
  78. </view>
  79. <!-- 加载提示区 -->
  80. <view class="list-status-info" v-if="displayList.length > 0">
  81. <view class="loading-wrap" v-if="loading">
  82. <view class="load-dot"></view><text>排队加载中...</text>
  83. </view>
  84. <view class="nomore-wrap" v-if="noMore">
  85. <text class="nomore-line"></text>
  86. <text class="nomore-text">已加载全部数据</text>
  87. <text class="nomore-line"></text>
  88. </view>
  89. </view>
  90. <!-- 缺省态 -->
  91. <view class="empty-state" v-if="displayList.length === 0 && !loading">
  92. <image src="https://img.icons8.com/clouds/200/open-box.png" mode="aspectFit"></image>
  93. <text>暂无订单记录</text>
  94. </view>
  95. <view class="safe-bottom"></view>
  96. </view>
  97. </scroll-view>
  98. <erp-submit-bar text="选材下单" @click="goCreateOrder" />
  99. <!-- 底部菜单栏 -->
  100. <!-- <erp-tab-bar active="order"></erp-tab-bar> -->
  101. </view>
  102. </template>
  103. <script>
  104. import ErpTabBar from '@/components/erp-tab-bar.vue';
  105. import ErpNavBar from '@/components/erp-nav-bar.vue';
  106. import ErpSubmitBar from '@/components/erp-submit-bar.vue';
  107. import { listMyOrder, listOrderByClientId, markUrgent } from '@/api/erp/order.js';
  108. export default {
  109. components: { ErpTabBar, ErpNavBar, ErpSubmitBar },
  110. data() {
  111. return {
  112. statusBarHeight: 20,
  113. navBarHeight: 44,
  114. tabBarHeight: 50,
  115. currentTab: 0,
  116. loading: false,
  117. noMore: false,
  118. refresherTriggered: false,
  119. pageNum: 1,
  120. tabs: ['全部', '待确认', '已确认', '挤压完成', '生产完成'],
  121. clientId: '',
  122. clientName: '',
  123. modelNum: '',
  124. allOrders: [],
  125. displayList: []
  126. }
  127. },
  128. computed: {
  129. scrollHeight() {
  130. const clientBarH = this.clientName ? 35 : 0;
  131. const searchBarH = 50;
  132. return `calc(100vh - ${this.statusBarHeight + this.navBarHeight + this.tabBarHeight + clientBarH + searchBarH}px)`;
  133. }
  134. },
  135. onLoad(options) {
  136. const winInfo = uni.getWindowInfo ? uni.getWindowInfo() : uni.getSystemInfoSync();
  137. this.statusBarHeight = winInfo.statusBarHeight;
  138. this.tabBarHeight = winInfo.windowWidth / 750 * 110;
  139. if (options.tab) this.currentTab = parseInt(options.tab);
  140. if (options.clientId) this.clientId = options.clientId;
  141. if (options.clientName) this.clientName = decodeURIComponent(options.clientName);
  142. this.refresh();
  143. },
  144. methods: {
  145. goBack() { uni.navigateBack(); },
  146. switchTab(i) { this.currentTab = i; this.refresh(); },
  147. onPullDownRefresh() {
  148. this.refresherTriggered = true;
  149. this.displayList = [];
  150. this.noMore = false;
  151. this.pageNum = 1;
  152. this.loadData().finally(() => {
  153. this.refresherTriggered = false;
  154. });
  155. },
  156. refresh() { this.displayList = []; this.noMore = false; this.pageNum = 1; this.loadData(); },
  157. onModelSearch() { this.refresh(); },
  158. clearModelSearch() { this.modelNum = ''; this.refresh(); },
  159. onReachEnd() { if (!this.loading && !this.noMore) this.loadData(); },
  160. async loadData() {
  161. if (this.loading || this.noMore) return;
  162. this.loading = true;
  163. try {
  164. const params = {
  165. pageNum: this.pageNum,
  166. pageSize: 5
  167. };
  168. if (this.clientId) {
  169. params.clientId = this.clientId;
  170. }
  171. if (this.modelNum) {
  172. params.modelNum = this.modelNum;
  173. }
  174. if (this.currentTab > 0) {
  175. const indexToStatus = [undefined, 0, 1, 2, 3];
  176. params.status = indexToStatus[this.currentTab];
  177. }
  178. const res = this.clientId
  179. ? await listOrderByClientId(params)
  180. : await listMyOrder(params);
  181. const rows = res.rows || [];
  182. const formattedRows = rows.map(item => {
  183. const statusMap = {
  184. 0: { name: '待确认', type: 'pending' },
  185. 1: { name: '已确认', type: 'finish' },
  186. 2: { name: '挤压完成', type: 'exFinished' },
  187. 3: { name: '生产完成', type: 'productionFinish' }
  188. };
  189. const s = statusMap[item.status] || { name: '待确认', type: 'pending' };
  190. return {
  191. orderNo: item.code,
  192. rowId: item.rowId,
  193. status: item.status,
  194. statusName: s.name,
  195. statusType: s.type,
  196. isUrgent: item.urgentFlag === 1,
  197. time: item.createTime,
  198. totalCount: item.totalCount || 0,
  199. models: (item.details || []).map(d => ({
  200. type: d.modelName || d.modelNum || '未知型号',
  201. length: Number(d.length || 0).toFixed(4),
  202. surface: d.surfaceName || '无',
  203. count: d.count || 0
  204. }))
  205. };
  206. });
  207. this.displayList = [...this.displayList, ...formattedRows];
  208. this.pageNum++;
  209. this.noMore = rows.length === 0 || this.displayList.length >= (res.total || 0);
  210. } catch (e) {
  211. console.error('加载订单列表失败', e);
  212. uni.showToast({ title: e || '加载订单列表失败', icon: 'none' });
  213. } finally {
  214. this.loading = false;
  215. }
  216. },
  217. goDetail(item) {
  218. uni.navigateTo({
  219. url: `/pages/order/detail/index?rowId=${item.rowId}`
  220. });
  221. },
  222. async doMarkUrgent(item) {
  223. uni.showModal({
  224. title: '加急确认',
  225. content: '确认将该订单标记为加急吗?',
  226. confirmColor: '#FF6600',
  227. success: async (res) => {
  228. if (!res.confirm) return;
  229. try {
  230. uni.showLoading({ title: '处理中' });
  231. await markUrgent(item.rowId);
  232. uni.hideLoading();
  233. item.isUrgent = true;
  234. uni.showToast({ title: '已标记为加急订单', icon: 'success' });
  235. } catch (e) {
  236. uni.hideLoading();
  237. uni.showToast({ title: e || '操作失败', icon: 'none' });
  238. }
  239. }
  240. });
  241. },
  242. goCreateOrder() {
  243. let url = '/pages/order/index';
  244. if (this.clientId) {
  245. url += `?clientId=${this.clientId}&clientName=${encodeURIComponent(this.clientName)}`;
  246. }
  247. uni.navigateTo({ url });
  248. }
  249. }
  250. }
  251. </script>
  252. <style scoped>
  253. /deep/ ::-webkit-scrollbar {
  254. display: none !important;
  255. width: 0 !important;
  256. height: 0 !important;
  257. -webkit-appearance: none;
  258. background: transparent;
  259. }
  260. .list-page-container {
  261. width: 100vw;
  262. height: 100vh;
  263. background: #f8fafc;
  264. overflow: hidden;
  265. display: flex;
  266. flex-direction: column;
  267. }
  268. /* 2. 选项卡:彻底解决残影红框2并支持 8 档横向滚动 */
  269. .tabs-fixed {
  270. background: #fff;
  271. width: 100%;
  272. flex-shrink: 0;
  273. border-bottom: 1rpx solid #f0f0f0;
  274. white-space: nowrap;
  275. }
  276. .tabs-box {
  277. height: 110rpx;
  278. position: relative;
  279. display: inline-flex;
  280. }
  281. .tab-item {
  282. width: 140rpx;
  283. height: 100%;
  284. display: flex;
  285. align-items: center;
  286. justify-content: center;
  287. flex-shrink: 0;
  288. z-index: 5;
  289. }
  290. .tab-txt {
  291. font-size: 28rpx;
  292. color: #888;
  293. transition: all 0.2s;
  294. }
  295. .tab-item.active .tab-txt {
  296. color: #C1001C;
  297. font-weight: bold;
  298. font-size: 32rpx;
  299. }
  300. /* 指示器轨道:等比平移消除虚影 */
  301. .indicator-track {
  302. position: absolute;
  303. bottom: 10rpx;
  304. left: 0;
  305. width: 100%;
  306. height: 6rpx;
  307. pointer-events: none;
  308. }
  309. .indicator-bar {
  310. width: 140rpx;
  311. height: 100%;
  312. display: flex;
  313. align-items: center;
  314. justify-content: center;
  315. transition: transform 0.3s cubic-bezier(0.18, 0.89, 0.32, 1.28);
  316. }
  317. .bar-inner {
  318. width: 40rpx;
  319. height: 100%;
  320. background: #C1001C;
  321. border-radius: 6rpx;
  322. }
  323. /* 3. 滚动区:解决不可滑动问题 */
  324. .order-scroll-view {
  325. width: 100%;
  326. }
  327. .client-strip {
  328. display: flex;
  329. align-items: center;
  330. padding: 18rpx 32rpx;
  331. background: linear-gradient(180deg, rgba(193, 0, 28, 0.03) 0%, transparent 100%);
  332. }
  333. /* ========== 型号搜索栏 ========== */
  334. .model-search-bar {
  335. background: #fff;
  336. padding: 12rpx 30rpx;
  337. flex-shrink: 0;
  338. }
  339. .ms-input-wrap {
  340. display: flex;
  341. align-items: center;
  342. background: #f5f6f7;
  343. border-radius: 36rpx;
  344. padding: 0 24rpx;
  345. height: 64rpx;
  346. }
  347. .ms-icon {
  348. width: 32rpx;
  349. height: 32rpx;
  350. margin-right: 12rpx;
  351. flex-shrink: 0;
  352. opacity: 0.5;
  353. }
  354. .ms-input {
  355. flex: 1;
  356. font-size: 26rpx;
  357. color: #333;
  358. height: 100%;
  359. }
  360. .ms-clear {
  361. font-size: 32rpx;
  362. color: #ccc;
  363. padding: 0 10rpx;
  364. flex-shrink: 0;
  365. }
  366. .cs-accent {
  367. width: 8rpx;
  368. height: 8rpx;
  369. background: #C1001C;
  370. border-radius: 50%;
  371. margin-right: 14rpx;
  372. flex-shrink: 0;
  373. }
  374. .cs-label {
  375. font-size: 26rpx;
  376. color: #8896A8;
  377. flex-shrink: 0;
  378. }
  379. .cs-divider {
  380. margin: 0 10rpx;
  381. font-size: 22rpx;
  382. color: #CBD2DB;
  383. }
  384. .cs-name {
  385. font-size: 26rpx;
  386. color: #1A1A2E;
  387. font-weight: 500;
  388. overflow: hidden;
  389. text-overflow: ellipsis;
  390. white-space: nowrap;
  391. }
  392. .order-list-inner {
  393. padding: 30rpx;
  394. padding-bottom: 60rpx;
  395. }
  396. .order-card {
  397. background: #fff;
  398. border-radius: 24rpx;
  399. padding: 36rpx;
  400. margin-bottom: 30rpx;
  401. box-shadow: 0 4rpx 20rpx rgba(0, 0, 0, 0.02);
  402. }
  403. .card-head {
  404. display: flex;
  405. justify-content: space-between;
  406. align-items: center;
  407. margin-bottom: 30rpx;
  408. }
  409. .order-id {
  410. font-size: 28rpx;
  411. color: #1a1a1a;
  412. font-weight: bold;
  413. }
  414. .card-head-left {
  415. display: flex;
  416. align-items: center;
  417. gap: 12rpx;
  418. flex: 1;
  419. min-width: 0;
  420. }
  421. .urgent-tag {
  422. display: flex;
  423. align-items: center;
  424. padding: 4rpx 12rpx;
  425. background: linear-gradient(135deg, #FF4D00 0%, #FF8C00 100%);
  426. border-radius: 6rpx;
  427. flex-shrink: 0;
  428. }
  429. .urgent-tag text {
  430. font-size: 20rpx;
  431. color: #fff;
  432. font-weight: 700;
  433. }
  434. .status-badge {
  435. font-size: 20rpx;
  436. padding: 4rpx 16rpx;
  437. border-radius: 8rpx;
  438. }
  439. .status-badge.pending {
  440. background: #FFF7E6;
  441. color: #FF9900;
  442. }
  443. .status-badge.finish {
  444. background: #E6F7FF;
  445. color: #1890FF;
  446. }
  447. .status-badge.exFinished {
  448. background: #E6FFF9;
  449. color: #13C2C2;
  450. }
  451. .status-badge.productionFinish {
  452. background: #EEF2FE;
  453. color: #2F54EB;
  454. }
  455. .card-body {
  456. padding: 24rpx 0;
  457. border-top: 1rpx dashed #f0f0f0;
  458. margin-bottom: 24rpx;
  459. }
  460. .model-row {
  461. display: flex;
  462. align-items: center;
  463. margin-bottom: 12rpx;
  464. font-size: 24rpx;
  465. }
  466. .m-type {
  467. font-size: 28rpx;
  468. font-weight: bold;
  469. color: #333;
  470. flex: 1;
  471. min-width: 0;
  472. overflow: hidden;
  473. text-overflow: ellipsis;
  474. white-space: nowrap;
  475. }
  476. .m-spec {
  477. color: #888;
  478. flex: 1;
  479. min-width: 0;
  480. padding: 0 20rpx;
  481. overflow: hidden;
  482. text-overflow: ellipsis;
  483. white-space: nowrap;
  484. }
  485. .m-count {
  486. color: #555;
  487. width: 100rpx;
  488. flex-shrink: 0;
  489. text-align: right;
  490. font-weight: 500;
  491. }
  492. .more-hint {
  493. padding: 10rpx 0;
  494. font-size: 24rpx;
  495. color: #999;
  496. text-align: center;
  497. background: #fafafa;
  498. border-radius: 8rpx;
  499. margin-bottom: 16rpx;
  500. }
  501. .total-summary {
  502. display: flex;
  503. align-items: center;
  504. justify-content: flex-end;
  505. padding-top: 20rpx;
  506. border-top: 1rpx solid #fafafa;
  507. }
  508. .summary-label {
  509. font-size: 24rpx;
  510. color: #999;
  511. }
  512. .summary-val {
  513. font-size: 32rpx;
  514. font-weight: bold;
  515. color: #333;
  516. margin: 0 4rpx;
  517. }
  518. .summary-val.highlight {
  519. color: #C1001C;
  520. }
  521. .summary-unit {
  522. font-size: 22rpx;
  523. color: #999;
  524. margin-right: 12rpx;
  525. }
  526. .summary-split {
  527. width: 1rpx;
  528. height: 20rpx;
  529. background: #eee;
  530. margin: 0 16rpx;
  531. }
  532. .card-foot {
  533. display: flex;
  534. justify-content: space-between;
  535. align-items: center;
  536. padding-top: 10rpx;
  537. }
  538. .time {
  539. font-size: 24rpx;
  540. color: #bbb;
  541. }
  542. .btns {
  543. display: flex;
  544. gap: 16rpx;
  545. }
  546. .btn-cancel,
  547. .btn-view {
  548. padding: 12rpx 30rpx;
  549. border-radius: 30rpx;
  550. font-size: 24rpx;
  551. }
  552. .btn-cancel {
  553. border: 1rpx solid #ddd;
  554. color: #666;
  555. }
  556. .btn-audit {
  557. border: 1rpx solid #ddd;
  558. color: #C1001C;
  559. padding: 12rpx 20rpx;
  560. border-radius: 30rpx;
  561. font-size: 24rpx;
  562. }
  563. .btn-view.primary {
  564. background: #C1001C;
  565. color: #fff;
  566. }
  567. .btn-view.urgency {
  568. background: #C1001C;
  569. color: #fff;
  570. border: none;
  571. }
  572. .list-status-info {
  573. padding: 40rpx 0;
  574. display: flex;
  575. justify-content: center;
  576. }
  577. .nomore-wrap {
  578. display: flex;
  579. align-items: center;
  580. color: #ccc;
  581. font-size: 24rpx;
  582. }
  583. .nomore-line {
  584. width: 40rpx;
  585. height: 1rpx;
  586. background: #eee;
  587. margin: 0 20rpx;
  588. }
  589. .loading-wrap {
  590. color: #999;
  591. font-size: 24rpx;
  592. display: flex;
  593. align-items: center;
  594. }
  595. .load-dot {
  596. width: 10rpx;
  597. height: 10rpx;
  598. background: #C1001C;
  599. border-radius: 50%;
  600. margin-right: 10rpx;
  601. animation: flash 0.6s infinite alternate;
  602. }
  603. @keyframes flash {
  604. from {
  605. opacity: 0.3;
  606. }
  607. to {
  608. opacity: 1;
  609. }
  610. }
  611. .empty-state {
  612. display: flex;
  613. flex-direction: column;
  614. align-items: center;
  615. padding-top: 200rpx;
  616. color: #bbb;
  617. font-size: 28rpx;
  618. }
  619. .empty-state image {
  620. width: 220rpx;
  621. height: 220rpx;
  622. margin-bottom: 30rpx;
  623. opacity: 0.6;
  624. }
  625. .safe-bottom {
  626. height: 40rpx;
  627. }
  628. /* 审核记录弹窗 */
  629. .overlay {
  630. position: fixed;
  631. top: 0;
  632. left: 0;
  633. right: 0;
  634. bottom: 0;
  635. background: rgba(0, 0, 0, 0.45);
  636. z-index: 1000;
  637. display: flex;
  638. align-items: center;
  639. justify-content: center;
  640. }
  641. .audit-history-modal {
  642. width: 640rpx;
  643. max-height: 70vh;
  644. background: #fff;
  645. border-radius: 24rpx;
  646. overflow: hidden;
  647. display: flex;
  648. flex-direction: column;
  649. }
  650. .modal-head {
  651. display: flex;
  652. justify-content: space-between;
  653. align-items: center;
  654. padding: 30rpx 36rpx;
  655. border-bottom: 1rpx solid #f0f0f0;
  656. flex-shrink: 0;
  657. }
  658. .modal-title {
  659. font-size: 32rpx;
  660. font-weight: bold;
  661. color: #1a1a1a;
  662. }
  663. .modal-close {
  664. font-size: 26rpx;
  665. color: #999;
  666. padding: 8rpx;
  667. }
  668. .modal-body {
  669. flex: 1;
  670. padding: 20rpx 36rpx 36rpx;
  671. max-height: 60vh;
  672. }
  673. .audit-item {
  674. display: flex;
  675. padding: 24rpx 0;
  676. border-left: 2rpx solid #eee;
  677. margin-left: 12rpx;
  678. position: relative;
  679. }
  680. .audit-item:last-child {
  681. border-left-color: transparent;
  682. }
  683. .audit-dot {
  684. width: 16rpx;
  685. height: 16rpx;
  686. border-radius: 50%;
  687. position: absolute;
  688. left: -9rpx;
  689. top: 28rpx;
  690. }
  691. .audit-dot.pass {
  692. background: #52c41a;
  693. }
  694. .audit-dot.reject {
  695. background: #ff4d4f;
  696. }
  697. .audit-content {
  698. margin-left: 30rpx;
  699. flex: 1;
  700. }
  701. .audit-row {
  702. display: flex;
  703. align-items: center;
  704. gap: 16rpx;
  705. margin-bottom: 8rpx;
  706. }
  707. .audit-result {
  708. font-size: 26rpx;
  709. font-weight: bold;
  710. }
  711. .audit-result.pass {
  712. color: #52c41a;
  713. }
  714. .audit-result.reject {
  715. color: #ff4d4f;
  716. }
  717. .audit-auditor {
  718. font-size: 24rpx;
  719. color: #666;
  720. }
  721. .audit-reason {
  722. display: block;
  723. font-size: 24rpx;
  724. color: #ff4d4f;
  725. background: #fff1f0;
  726. padding: 12rpx 16rpx;
  727. border-radius: 8rpx;
  728. margin-bottom: 8rpx;
  729. line-height: 1.5;
  730. }
  731. .audit-time {
  732. display: block;
  733. font-size: 22rpx;
  734. color: #bbb;
  735. margin-top: 4rpx;
  736. }
  737. .audit-empty {
  738. text-align: center;
  739. padding: 60rpx 0;
  740. color: #bbb;
  741. font-size: 28rpx;
  742. }
  743. </style>