爱简收旧衣按件回收前端代码仓库
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

847 lines
22 KiB

1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
5 days ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
1 week ago
  1. <template>
  2. <view class="container">
  3. <!-- 顶部导航 -->
  4. <view class="nav-bar" :style="{height: (statusBarHeight + 88) + 'rpx', paddingTop: statusBarHeight + 'px'}">
  5. <view class="back" @tap="goBack">
  6. <uni-icons type="left" size="20"></uni-icons>
  7. </view>
  8. <text class="title">{{ orderId }}</text>
  9. </view>
  10. <!-- 内容区域 -->
  11. <view class="content">
  12. <!-- 回收流程卡片 -->
  13. <view class="card process-card">
  14. <view class="card-title">回收流程</view>
  15. <view class="process-steps">
  16. <view
  17. v-for="(step, index) in processSteps"
  18. :key="index"
  19. class="step-item"
  20. :class="{ cancel: currentStep === 0 && index === 1 }"
  21. >
  22. <image :src="step.icon" mode="aspectFit" class="step-icon"></image>
  23. <view
  24. class="step-label"
  25. :class="{
  26. active: currentStep === index + 1,
  27. cancel: currentStep === 0 && index === 1
  28. }"
  29. >
  30. <view class="step-label-inner">
  31. <text class="step-num">{{ ['①','②','③','④'][index] }}</text>
  32. <text class="step-text">{{ step.text }}</text>
  33. </view>
  34. </view>
  35. </view>
  36. </view>
  37. <view class="process-divider"></view>
  38. <!-- 状态信息 -->
  39. <view class="status-info" v-if="currentStatus">
  40. <image class="status-icon" :src="currentStatus.icon" mode="aspectFit"></image>
  41. <view class="status-detail">
  42. <text class="status-text" v-if="currentStep === 0">已取消本次预约</text>
  43. <text class="status-text" v-else>{{ currentStatus.text }}</text>
  44. <text class="status-time">{{ currentStatus.time }}</text>
  45. </view>
  46. </view>
  47. <!-- 取消后提示语 -->
  48. <view v-if="currentStep === 0" class="cancel-tip">期待您下次的支持共同为地球减少碳排放出一份力</view>
  49. <!-- 物流公司仅currentStep为12时显示 -->
  50. <view class="express-info" v-if="currentStep !== 0 && currentStep < 3">
  51. <text class="express-label">物流公司</text>
  52. <view class="express-row">
  53. <text class="express-value">{{ expressCompany }}{{ expressNo }}</text>
  54. <text class="express-copy" @tap="copyExpressNo">复制</text>
  55. </view>
  56. </view>
  57. <view class="info-divider" v-if="currentStep !== 0 && currentStep < 4"></view>
  58. <!-- 地址信息仅非取消和非结款时显示 -->
  59. <view class="pickup-info" v-if="currentStep !== 0 && currentStep < 4">
  60. <view class="info-item" @tap="viewAddress">
  61. <text class="label">取件地址</text>
  62. <view class="value">
  63. <text class="text">{{ address }}</text>
  64. <!-- <text class="arrow">></text> -->
  65. </view>
  66. </view>
  67. <view class="info-item">
  68. <text class="label">{{ timeLabel }}</text>
  69. <view class="value">
  70. <text class="text">{{ appointmentTime }}</text>
  71. <!-- <text class="arrow">></text> -->
  72. </view>
  73. </view>
  74. </view>
  75. </view>
  76. <!-- 订单详情卡片 -->
  77. <view class="order-detail-card">
  78. <text class="order-title">订单详情</text>
  79. <view class="order-row">
  80. <text class="order-label">订单编号</text>
  81. <text class="order-value">{{ orderId }}</text>
  82. </view>
  83. <view class="order-divider"></view>
  84. <template v-if="currentStep < 3">
  85. <view class="order-row">
  86. <text class="order-label">预估回收</text>
  87. <text class="order-value order-highlight">¥ {{ estimatePrice }}</text>
  88. </view>
  89. </template>
  90. <template v-else-if="currentStep === 4">
  91. <view class="order-row">
  92. <text class="order-label">合格结算</text>
  93. <text class="order-value order-highlight">¥ {{ finalPrice }}</text>
  94. </view>
  95. <view class="order-row">
  96. <text class="order-label">运费扣除</text>
  97. <text class="order-value">¥ 0</text>
  98. </view>
  99. <view class="order-row">
  100. <text class="order-label">结算金额</text>
  101. <text class="order-value order-highlight">¥ {{ finalPrice }}</text>
  102. </view>
  103. </template>
  104. <view class="order-divider"></view>
  105. <view class="goods-list">
  106. <view class="goods-item" v-for="(item, index) in clothesList" :key="index">
  107. <image class="goods-img" :src="item.image" mode="aspectFit"></image>
  108. <view class="goods-info">
  109. <text class="goods-name">{{ item.name }}</text>
  110. <text class="goods-desc">{{ item.description }}</text>
  111. <view class="goods-meta">
  112. <text class="goods-price">¥ {{ item.price }}<text class="goods-unit"> /</text></text>
  113. <text class="goods-count">x{{ item.count }}</text>
  114. </view>
  115. </view>
  116. <text class="goods-total">¥{{ item.total }}</text>
  117. </view>
  118. </view>
  119. </view>
  120. <!-- 质检结果卡片仅结款状态显示 -->
  121. <view class="order-detail-card" v-if="currentStep === 4">
  122. <text class="order-title">质检结果</text>
  123. <view class="order-row"><text class="order-label">质检数量</text><text class="order-value">9 </text></view>
  124. <view class="order-row"><text class="order-label">质检合格</text><text class="order-value">7 </text></view>
  125. <view class="order-row"><text class="order-label">质量问题</text><text class="order-value">2 </text></view>
  126. <view class="order-row"><text class="order-label">不可回收</text><text class="order-value">0 </text></view>
  127. <view class="order-row"><text class="order-label">订单重量</text><text class="order-value">2.85 kg</text></view>
  128. <view class="order-divider"></view>
  129. <view class="report-btn" @tap="viewReport">点此查看质检报告详情</view>
  130. </view>
  131. <!-- 详细信息卡片仅结款状态显示 -->
  132. <view class="order-detail-card detail-info-card" v-if="currentStep === 4">
  133. <text class="order-title">详细信息</text>
  134. <view class="order-row">
  135. <text class="order-label">预约时间</text>
  136. <text class="order-value">2025-03-20 11:00~12:00</text>
  137. </view>
  138. <view class="order-row">
  139. <text class="order-label">取件地址</text>
  140. <text class="order-value">{{ address }}</text>
  141. </view>
  142. </view>
  143. </view>
  144. <!-- 底部按钮仅待取件时显示 -->
  145. <view class="bottom-btns" v-if="currentStatus.text === '【待取件】快递员正在赶来'">
  146. <button class="btn cancel-btn" @tap="showCancelModal = true">取消订单</button>
  147. <button class="btn contact-btn" @tap="contactCourier">联系快递员</button>
  148. </view>
  149. <!-- 取消订单弹窗 -->
  150. <view v-if="showCancelModal" class="modal-mask">
  151. <view class="modal-box">
  152. <view class="modal-title">取消订单</view>
  153. <view class="modal-content">确认要取消订单吗</view>
  154. <view class="modal-actions">
  155. <button class="modal-btn modal-cancel" @tap="showCancelModal = false">取消</button>
  156. <button class="modal-btn modal-confirm" @tap="confirmCancelOrder">确认</button>
  157. </view>
  158. </view>
  159. </view>
  160. </view>
  161. </template>
  162. <script>
  163. import pullRefreshMixin from '@/pages/mixins/pullRefreshMixin.js'
  164. export default {
  165. mixins: [pullRefreshMixin],
  166. data() {
  167. return {
  168. orderId: 'RE82738127861525',
  169. currentStep: 2, // 当前进行到第几步
  170. processSteps: [
  171. { text: '在线预约', icon: '/static/home/① 在线预约.png' },
  172. { text: '快递上门', icon: '/static/home/② 快递上门.png' },
  173. { text: '透明质检', icon: '/static/home/③ 透明质检.png' },
  174. { text: '现金打款', icon: '/static/home/④ 现金打款.png' }
  175. ],
  176. address: '海南省海口市秀英区秀英街道5单元',
  177. appointmentTime: '周四 11:00~13:00',
  178. estimatePrice: '73.6-75.8',
  179. finalPrice: '73.6',
  180. clothesList: [
  181. {
  182. name: '羽绒服',
  183. description: '允许脏破烂,160码以上',
  184. price: 8,
  185. count: 8,
  186. total: 64,
  187. image: '/static/home/羽绒服.png'
  188. },
  189. {
  190. name: '品牌羽绒服',
  191. description: '允许脏破烂,160码以上',
  192. price: 10,
  193. count: 1,
  194. total: 10,
  195. image: '/static/home/品牌羽绒服.png'
  196. }
  197. ],
  198. currentStatus: {
  199. text: '【待取件】快递员正在赶来',
  200. time: '2025-04-20 11:00~13:00',
  201. icon: '/static/delivery-person.png'
  202. },
  203. hasReport: false,
  204. reportTime: '',
  205. showEditButton: true,
  206. expressCompany: '德邦物流',
  207. expressNo: 'DPK202534653715',
  208. showCancelModal: false,
  209. statusBarHeight: 0,
  210. }
  211. },
  212. computed: {
  213. timeLabel() {
  214. // 根据状态返回不同的时间标签
  215. if (this.currentStep === 4) {
  216. return '回收到账时间'
  217. } else if (this.currentStep === 3) {
  218. return '质检完成时间'
  219. } else {
  220. return '上门时间'
  221. }
  222. },
  223. showEstimate() {
  224. return this.currentStep < 3
  225. }
  226. },
  227. methods: {
  228. async onRefresh() {
  229. // 模拟刷新数据
  230. await new Promise(resolve => setTimeout(resolve, 1000))
  231. uni.stopPullRefresh()
  232. },
  233. goBack() {
  234. uni.navigateBack()
  235. },
  236. showMore() {
  237. // 显示更多选项
  238. },
  239. onShare() {
  240. // 分享功能
  241. },
  242. viewAddress() {
  243. // 查看完整地址
  244. },
  245. viewReport() {
  246. if(this.currentStatus.text.includes("已结款") ){
  247. // 查看质检报告
  248. uni.navigateTo({
  249. url: '/pages/component/inspection?status=qualified'
  250. })
  251. }else {
  252. // 查看质检报告
  253. uni.navigateTo({
  254. url: '/pages/component/inspection?status=unqualified'
  255. })
  256. }
  257. },
  258. editOrder() {
  259. // 修改订单
  260. },
  261. // 更新订单状态
  262. updateOrderStatus(status) {
  263. switch(status) {
  264. case 'cancelled':
  265. this.currentStep = 0
  266. this.currentStatus = {
  267. text: '已取消',
  268. time: '',
  269. icon: '/static/cancelled.png'
  270. }
  271. this.showEditButton = false
  272. break
  273. case 'processing':
  274. this.currentStep = 2
  275. this.currentStatus = {
  276. text: '【待取件】快递员正在赶来',
  277. time: '2025-04-20 11:00~13:00',
  278. icon: '/static/delivery-person.png'
  279. }
  280. break
  281. case 'collected':
  282. this.currentStep = 2
  283. this.currentStatus = {
  284. text: '【已取件】快递员正在送至质检',
  285. time: '2025-04-30 11:42',
  286. icon: '/static/collected-truck.png'
  287. }
  288. this.showEditButton = false
  289. break
  290. case 'inspecting':
  291. this.currentStep = 3
  292. this.currentStatus = {
  293. text: '【质检中】质检员正在质检',
  294. time: '2025-04-20 11:00',
  295. icon: '/static/inspector.png'
  296. }
  297. this.showEditButton = false
  298. break
  299. case 'pending_payment':
  300. this.currentStep = 4
  301. this.currentStatus = {
  302. text: '【待结款】待平台确认结款项',
  303. time: '2025-04-20 12:00',
  304. icon: '/static/payment.png'
  305. }
  306. this.hasReport = true
  307. this.reportTime = '2025-03-20 11:40'
  308. this.showEditButton = false
  309. break
  310. case 'completed':
  311. this.currentStep = 4
  312. this.currentStatus = {
  313. text: '【已结款】平台已结款至账户',
  314. time: '2025-04-20 12:01',
  315. icon: '/static/completed.png'
  316. }
  317. this.hasReport = true
  318. this.reportTime = '2025-03-20 11:40'
  319. this.showEditButton = false
  320. break
  321. }
  322. },
  323. copyExpressNo() {
  324. uni.setClipboardData({
  325. data: this.expressCompany + this.expressNo,
  326. success: () => {
  327. uni.showToast({ title: '已复制', icon: 'none' });
  328. }
  329. });
  330. },
  331. confirmCancelOrder() {
  332. this.showCancelModal = false;
  333. // 模拟取消动作
  334. this.currentStep = 0;
  335. this.currentStatus = {
  336. text: '已取消',
  337. time: this.getNowTime(),
  338. icon: '/static/cancelled.png'
  339. };
  340. // uni.showToast({ title: '订单已取消', icon: 'none' });
  341. },
  342. getNowTime() {
  343. const now = new Date();
  344. const y = now.getFullYear();
  345. const m = (now.getMonth() + 1).toString().padStart(2, '0');
  346. const d = now.getDate().toString().padStart(2, '0');
  347. const h = now.getHours().toString().padStart(2, '0');
  348. const min = now.getMinutes().toString().padStart(2, '0');
  349. return `${y}-${m}-${d} ${h}:${min}`;
  350. },
  351. contactCourier() {
  352. // 联系快递员逻辑
  353. uni.showToast({ title: '已联系快递员', icon: 'none' });
  354. }
  355. },
  356. onLoad(options) {
  357. // 接收上一页传来的订单状态
  358. if (options.status) {
  359. this.updateOrderStatus(options.status)
  360. }
  361. this.orderId = options.id
  362. this.statusBarHeight = uni.getSystemInfoSync().statusBarHeight
  363. }
  364. }
  365. </script>
  366. <style scoped lang="scss">
  367. .container {
  368. min-height: 100vh;
  369. background: #f4f4f4;
  370. padding-bottom: 120rpx;
  371. }
  372. .card {
  373. background: linear-gradient(180deg, #fffbe6 0%, #fff 90%);
  374. border-radius: 28rpx;
  375. margin: 24rpx 24rpx 0 24rpx;
  376. box-shadow: 0 8rpx 24rpx rgba(255, 156, 0, 0.03);
  377. padding: 40rpx 32rpx;
  378. }
  379. .nav-bar {
  380. display: flex;
  381. align-items: center;
  382. height: 88rpx;
  383. background: #fff;
  384. padding: 0 30rpx;
  385. .back {
  386. padding: 20rpx;
  387. margin-left: -20rpx;
  388. }
  389. .title {
  390. flex: 1;
  391. text-align: center;
  392. font-size: 34rpx;
  393. font-weight: 500;
  394. }
  395. .right-btns {
  396. display: flex;
  397. align-items: center;
  398. gap: 30rpx;
  399. .more, .target {
  400. font-size: 40rpx;
  401. color: #333;
  402. }
  403. }
  404. }
  405. .card-title, .card-header .title {
  406. font-size: 32rpx;
  407. font-weight: bold;
  408. color: #222;
  409. margin-bottom: 24rpx;
  410. }
  411. .process-card {
  412. background: linear-gradient(180deg, #fffbe6 0%, #fff 35%);
  413. border-radius: 32rpx;
  414. box-shadow: 0 4rpx 16rpx rgba(255, 156, 0, 0.04);
  415. padding: 40rpx 32rpx 32rpx 32rpx;
  416. margin: 24rpx;
  417. }
  418. .card-title {
  419. font-size: 32rpx;
  420. font-weight: bold;
  421. color: #222;
  422. margin-bottom: 24rpx;
  423. text-align: left;
  424. }
  425. .process-steps {
  426. display: flex;
  427. justify-content: space-between;
  428. align-items: flex-start;
  429. margin-bottom: 12rpx;
  430. gap: 18rpx;
  431. }
  432. .step-item {
  433. width: 150%;
  434. height: 150rpx;
  435. background: #fff8ea;
  436. border-radius: 20rpx;
  437. display: flex;
  438. flex-direction: column;
  439. align-items: center;
  440. box-shadow: 0 2rpx 8rpx rgba(255, 156, 0, 0.04);
  441. overflow: hidden;
  442. position: relative;
  443. }
  444. .step-item.cancel {
  445. background: linear-gradient(180deg, #fff0f3 0%, #ffd6df 100%) !important;
  446. }
  447. .step-icon {
  448. width: 86rpx;
  449. height: 86rpx;
  450. margin: 16rpx 0 0 0;
  451. flex-shrink: 0;
  452. }
  453. .step-label {
  454. width: 100%;
  455. height: 44rpx;
  456. background: transparent;
  457. position: absolute;
  458. left: 0;
  459. bottom: 0;
  460. border-radius: 0 0 16rpx 16rpx;
  461. display: flex;
  462. align-items: center;
  463. justify-content: center;
  464. transition: background 0.2s;
  465. overflow: hidden;
  466. }
  467. .step-label.active {
  468. background: linear-gradient(90deg, #ffd01e 0%, #ff8917 100%);
  469. }
  470. .step-label.cancel {
  471. background: linear-gradient(to right, #ff8e8e 0%, #ff5e5e 100%) !important;
  472. }
  473. .step-label.cancel .step-num,
  474. .step-label.cancel .step-text {
  475. color: #fff !important;
  476. }
  477. .step-label-inner {
  478. width: 100%;
  479. height: 100%;
  480. display: flex;
  481. flex-direction: row;
  482. // align-items: center;
  483. justify-content: center;
  484. white-space: nowrap;
  485. }
  486. .step-num,
  487. .step-text {
  488. font-family: PingFang SC;
  489. font-weight: 400;
  490. font-size: 11px;
  491. letter-spacing: 0%;
  492. line-height: 48rpx;
  493. margin: 0;
  494. padding: 0;
  495. color: #9b9b9b;
  496. }
  497. .step-num {
  498. margin-right: 6rpx;
  499. display: flex;
  500. justify-content: center;
  501. align-items: center;
  502. }
  503. .step-label.active .step-num,
  504. .step-label.active .step-text {
  505. font-family: PingFang SC;
  506. font-weight: 500;
  507. font-size: 11px;
  508. letter-spacing: 0%;
  509. color: #fff;
  510. }
  511. .process-divider {
  512. width: 100%;
  513. height: 0;
  514. border-bottom: 1rpx dashed #e6e6e6;
  515. margin: 20rpx 0 0 0;
  516. }
  517. .status-info {
  518. display: flex;
  519. align-items: center;
  520. margin: 24rpx 0;
  521. background: #fafafa;
  522. border-radius: 16rpx;
  523. padding: 16rpx;
  524. }
  525. .status-icon {
  526. width: 60rpx;
  527. height: 60rpx;
  528. margin-right: 16rpx;
  529. }
  530. .status-text {
  531. font-size: 28rpx;
  532. color: #222;
  533. font-weight: bold;
  534. }
  535. .status-time {
  536. font-size: 24rpx;
  537. color: #999;
  538. margin-top: 4rpx;
  539. }
  540. .pickup-info .info-item {
  541. display: flex;
  542. // justify-content: space-between;
  543. flex-direction: column;
  544. // align-items: center;
  545. padding: 18rpx 0;
  546. border-bottom: 1px solid #f0f0f0;
  547. margin: 20rpx 0 20rpx 0;
  548. }
  549. .pickup-info .info-item:last-child {
  550. border-bottom: none;
  551. }
  552. .label {
  553. color: #999;
  554. font-size: 26rpx;
  555. }
  556. .value {
  557. color: #222;
  558. font-size: 26rpx;
  559. display: flex;
  560. align-items: center;
  561. }
  562. .value .arrow {
  563. color: #bbb;
  564. margin-left: 8rpx;
  565. }
  566. .order-detail-card {
  567. background: linear-gradient(to bottom, #fff6e3 0%, #fff 20%);
  568. border-radius: 36rpx;
  569. box-shadow: 0 8rpx 32rpx rgba(255, 156, 0, 0.08);
  570. padding: 40rpx 36rpx 32rpx 36rpx;
  571. margin: 24rpx;
  572. margin-bottom: 164rpx;
  573. }
  574. .order-title {
  575. font-size: 36rpx;
  576. font-weight: bold;
  577. color: #222;
  578. margin-bottom: 32rpx;
  579. text-align: left;
  580. display: block;
  581. }
  582. .order-row {
  583. display: flex;
  584. // justify-content: space-between;
  585. align-items: center;
  586. margin-bottom: 18rpx;
  587. }
  588. .order-label {
  589. color: #bcbcbc;
  590. font-size: 26rpx;
  591. margin: 20rpx 0 20rpx 0;
  592. }
  593. .order-value {
  594. color: #222;
  595. font-size: 28rpx;
  596. margin-left: 30rpx;
  597. font-weight: 500;
  598. }
  599. .order-highlight {
  600. color: #ff9c00;
  601. font-size: 30rpx;
  602. font-weight: bold;
  603. }
  604. .order-divider {
  605. width: 100%;
  606. height: 1rpx;
  607. background: #f0f0f0;
  608. margin: 18rpx 0;
  609. }
  610. .goods-list {
  611. margin-top: 10rpx;
  612. display: flex;
  613. flex-direction: column;
  614. gap: 18rpx;
  615. }
  616. .goods-item {
  617. background: #fff;
  618. border-radius: 24rpx;
  619. display: flex;
  620. align-items: center;
  621. padding: 24rpx 20rpx;
  622. box-shadow: 0 2rpx 8rpx rgba(255, 156, 0, 0.04);
  623. position: relative;
  624. }
  625. .goods-img {
  626. width: 90rpx;
  627. height: 90rpx;
  628. border-radius: 18rpx;
  629. margin-right: 20rpx;
  630. // background: #fffbe6;
  631. flex-shrink: 0;
  632. }
  633. .goods-info {
  634. flex: 1;
  635. display: flex;
  636. flex-direction: column;
  637. justify-content: center;
  638. }
  639. .goods-name {
  640. font-size: 30rpx;
  641. color: #222;
  642. font-weight: bold;
  643. margin-bottom: 6rpx;
  644. }
  645. .goods-desc {
  646. font-size: 24rpx;
  647. color: #bcbcbc;
  648. margin-bottom: 10rpx;
  649. }
  650. .goods-meta {
  651. display: flex;
  652. align-items: center;
  653. gap: 10rpx;
  654. }
  655. .goods-price {
  656. color: #ff9c00;
  657. font-size: 26rpx;
  658. font-weight: bold;
  659. }
  660. .goods-unit {
  661. color: #bcbcbc;
  662. font-size: 22rpx;
  663. font-weight: normal;
  664. }
  665. .goods-count {
  666. color: #bcbcbc;
  667. font-size: 24rpx;
  668. margin-left: 8rpx;
  669. }
  670. .goods-total {
  671. color: #222;
  672. font-size: 30rpx;
  673. font-weight: bold;
  674. margin-left: 18rpx;
  675. flex-shrink: 0;
  676. }
  677. .bottom-btns {
  678. position: fixed;
  679. left: 0;
  680. right: 0;
  681. bottom: 30rpx;
  682. z-index: 10;
  683. background: #fff;
  684. display: flex;
  685. justify-content: space-between;
  686. align-items: center;
  687. padding: 24rpx 24rpx calc(env(safe-area-inset-bottom) + 12rpx) 24rpx;
  688. box-shadow: 0 -2rpx 8rpx rgba(255, 156, 0, 0.04);
  689. border-radius: 24rpx 24rpx 0 0;
  690. gap: 24rpx;
  691. }
  692. .btn {
  693. flex: 1;
  694. height: 78rpx;
  695. font-size: 32rpx;
  696. font-weight: bold;
  697. border-radius: 44rpx;
  698. margin: 0;
  699. padding: 0;
  700. }
  701. .cancel-btn {
  702. color: #ff9c00;
  703. background: #fff0d2;
  704. border: 2rpx solid #ffd01e;
  705. }
  706. .contact-btn {
  707. color: #fff;
  708. background: linear-gradient(90deg, #ffd01e 0%, #ff8917 100%);
  709. border: none;
  710. }
  711. .express-info {
  712. // border: 1rpx solid #ffdca8;
  713. border-radius: 12rpx;
  714. // padding: 18rpx 20rpx 10rpx 20rpx;
  715. margin-bottom: 12rpx;
  716. margin-top: 8rpx;
  717. background: #fff;
  718. position: relative;
  719. }
  720. .express-label {
  721. color: #bcbcbc;
  722. font-size: 24rpx;
  723. margin-bottom: 8rpx;
  724. display: block;
  725. }
  726. .express-row {
  727. display: flex;
  728. justify-content: space-between;
  729. align-items: center;
  730. }
  731. .express-value {
  732. color: #222;
  733. font-size: 28rpx;
  734. font-weight: 500;
  735. word-break: break-all;
  736. }
  737. .express-copy {
  738. color: #ff9c00;
  739. font-size: 26rpx;
  740. font-weight: 500;
  741. margin-left: 16rpx;
  742. }
  743. .modal-mask {
  744. position: fixed;
  745. left: 0; right: 0; top: 0; bottom: 0;
  746. background: rgba(0,0,0,0.35);
  747. z-index: 999;
  748. display: flex;
  749. align-items: center;
  750. justify-content: center;
  751. }
  752. .modal-box {
  753. width: 560rpx;
  754. background: #fff;
  755. border-radius: 32rpx;
  756. box-shadow: 0 8rpx 32rpx rgba(0,0,0,0.08);
  757. padding: 56rpx 0 0 0;
  758. display: flex;
  759. flex-direction: column;
  760. align-items: center;
  761. }
  762. .modal-title {
  763. font-size: 36rpx;
  764. font-weight: bold;
  765. color: #222;
  766. text-align: center;
  767. margin-bottom: 18rpx;
  768. }
  769. .modal-content {
  770. font-size: 28rpx;
  771. color: #222;
  772. text-align: center;
  773. margin-bottom: 48rpx;
  774. }
  775. .modal-actions {
  776. width: 100%;
  777. display: flex;
  778. border-top: 1rpx solid #f0f0f0;
  779. height: 100rpx;
  780. }
  781. .modal-btn {
  782. flex: 1;
  783. border: none;
  784. outline: none;
  785. background: none;
  786. font-size: 32rpx;
  787. font-weight: 500;
  788. border-radius: 0 0 0 32rpx;
  789. height: 100rpx;
  790. line-height: 100rpx;
  791. }
  792. .modal-cancel {
  793. color: #999;
  794. background: #fff;
  795. border-bottom-left-radius: 32rpx;
  796. }
  797. .modal-confirm {
  798. color: #ff9c00;
  799. background: #fff;
  800. border-bottom-right-radius: 32rpx;
  801. }
  802. .cancel-tip {
  803. color: #bcbcbc;
  804. font-size: 26rpx;
  805. text-align: center;
  806. margin: 24rpx 0 0 0;
  807. }
  808. .info-divider {
  809. width: 100%;
  810. height: 1rpx;
  811. background: #f0f0f0;
  812. margin: 0;
  813. }
  814. .report-btn {
  815. width: 100%;
  816. margin: 24rpx 0 0 0;
  817. padding: 0;
  818. height: 80rpx;
  819. line-height: 80rpx;
  820. text-align: center;
  821. color: #ff9c00;
  822. background: #fff;
  823. border: 2rpx solid #ffd01e;
  824. border-radius: 44rpx;
  825. font-size: 28rpx;
  826. font-weight: bold;
  827. }
  828. .detail-info-card {
  829. margin-bottom: 48rpx;
  830. }
  831. </style>