orderDetails.vue 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824
  1. <script>
  2. import { getPointOrderInfo, confirmReceipt, cancelReturn, orderLogisticsNo } from '@/api/pointOrder'
  3. import ImageItem from "@/components/swiper/components/image.vue";
  4. export default {
  5. name: "orderDetails",
  6. components: { ImageItem },
  7. data() {
  8. return {
  9. orderInfo: {},
  10. afterSaleInfo: {},
  11. productInfo: {},
  12. refundType: '',
  13. // 图片加载状态
  14. imageErrorMap: {},
  15. // 设备信息
  16. deviceInfo: uni.getSystemInfoSync(),
  17. show: false,
  18. title: '',
  19. content: '',
  20. // 物流单号弹窗
  21. showLogistics: false,
  22. logisticsNumber: '',
  23. // 售后弹窗
  24. afterSalesShow: false,
  25. receiptStatus: 'received', // 收货状态:notReceived(未收到货), received(已收到货)
  26. afterSalesType: 'exchange' // 售后类型:refund(退货), exchange(换货)
  27. }
  28. },
  29. onLoad(options) {
  30. this.orderNo = options.orderNo;
  31. this.getOrderInfo();
  32. },
  33. onReady() {
  34. // 初始获取数据
  35. // 这里可以添加获取订单详情的逻辑
  36. },
  37. computed: {
  38. // 判断是否为有底部安全区域的设备
  39. hasSafeArea() {
  40. const safeArea = this.deviceInfo.safeArea
  41. return safeArea && safeArea.bottom < this.deviceInfo.screenHeight
  42. }
  43. },
  44. methods: {
  45. getImageUrl(imagePath) {
  46. if (!imagePath) return '';
  47. const publicUrl = this.$globalData?.publicUrl || '';
  48. return publicUrl + imagePath;
  49. },
  50. // 处理图片加载失败
  51. handleImageError(productId) {
  52. this.$set(this.imageErrorMap, productId, true);
  53. },
  54. // 重置图片加载状态
  55. resetImageError(productId) {
  56. this.$set(this.imageErrorMap, productId, false);
  57. },
  58. //获取订单详情
  59. async getOrderInfo() {
  60. const res = await getPointOrderInfo({
  61. orderNo: this.orderNo,
  62. //openId: uni.getStorageSync('wx_copenid')
  63. })
  64. let { afterSaleInfo, orderInfo, productInfo } = res.data.data;
  65. let skuspecStr = '';
  66. try {
  67. const skuspec = productInfo?.skuSpec;
  68. if (skuspec && skuspec !== 'undefined' && skuspec !== 'null') {
  69. const parsedSpec = JSON.parse(skuspec);
  70. if (Array.isArray(parsedSpec)) {
  71. skuspecStr = parsedSpec.map(t => t?.specValue).filter(Boolean).toString();
  72. }
  73. }
  74. } catch (error) {
  75. console.error('解析 skuspec 失败:', error);
  76. }
  77. this.productInfo = {
  78. ...productInfo,
  79. skuSpec: skuspecStr
  80. };
  81. this.afterSaleInfo = afterSaleInfo;
  82. this.orderInfo = orderInfo;
  83. },
  84. orderTitle(info) {
  85. let orderTitleName = ''
  86. if (this.orderInfo.orderStatus == 4) {
  87. orderTitleName = this.afterSaleInfo?.afterSaleStatusName
  88. } else {
  89. orderTitleName = this.orderInfo.orderStatusName
  90. }
  91. return orderTitleName
  92. },
  93. // 处理退货操作
  94. handleRefund(val) {
  95. this.refundType = val;
  96. if (val === 'receipt') {
  97. this.title = '确认收货';
  98. this.content = '为了保障您的权益,请收到商品确认无误后再确认收货'
  99. }
  100. if (val === 'cancel') {
  101. this.title = '取消申请';
  102. this.content = '您确认取消发出的申请么'
  103. }
  104. this.show = true;
  105. },
  106. // 确认收货 取消申请接口对接
  107. confirmReceive() {
  108. var _this = this;
  109. let apiUrl = this.refundType === 'receipt' ? confirmReceipt : this.refundType === 'cancel' ? cancelReturn : '';
  110. apiUrl({
  111. orderId: _this.orderInfo.id
  112. }).then(res => {
  113. if (res.data.code == 200) {
  114. _this.show = false;
  115. _this.getOrderInfo();
  116. }
  117. })
  118. },
  119. // 提交物流单号
  120. submitLogistics() {
  121. var _this = this;
  122. orderLogisticsNo({
  123. orderId: _this.orderInfo.id,
  124. logisticsNo: _this.logisticsNumber
  125. }).then(res => {
  126. if (res.data.code == 200) {
  127. _this.showLogistics = false;
  128. _this.logisticsNumber = '';
  129. _this.getOrderInfo();
  130. }
  131. })
  132. },
  133. // 填写物流单号
  134. handleLogistics() {
  135. this.showLogistics = true;
  136. },
  137. // 打开售后弹窗
  138. handleAfterSales() {
  139. this.afterSalesShow = true;
  140. },
  141. // 售后下一步
  142. nextStep() {
  143. console.log('售后下一步:', {
  144. receiptStatus: this.receiptStatus,
  145. afterSalesType: this.afterSalesType
  146. });
  147. // 这里可以调用售后API
  148. //订单状态(0:待付款 1:待发货 2:待收货 3:已收货 4:售后中 11:取消订单)
  149. if (this.receiptStatus == "received" && this.afterSalesType == "exchange") {
  150. uni.navigateTo({
  151. url: `/points/productDetails/applyExchange?afterSalesType=${this.afterSalesType}&receiptStatus=${this.receiptStatus}&orderNo=${this.orderInfo.orderNo}&orderId=${this.orderInfo.id}&orderStatus=${this.orderInfo.orderStatus}`
  152. });
  153. this.afterSalesShow = false
  154. return
  155. }
  156. uni.navigateTo({
  157. url: `/points/productDetails/applyRefund?afterSalesType=${this.afterSalesType}&receiptStatus=${this.receiptStatus}&orderNo=${this.orderInfo.orderNo}&orderId=${this.orderInfo.id}&orderStatus=${this.orderInfo.orderStatus}`
  158. });
  159. this.afterSalesShow = false
  160. },
  161. //获取售后时间
  162. getafterTime() {
  163. let date = new Date("2026-04-22 09:38:54");
  164. date.setDate(date.getDate() + 10); // 直接在“日期”上加10
  165. return this.formatDate(date);
  166. },
  167. formatDate(date) {
  168. const y = date.getFullYear();
  169. const m = (date.getMonth() + 1).toString().padStart(2, '0');
  170. const d = date.getDate().toString().padStart(2, '0');
  171. return `${y}-${m}-${d}`;
  172. },
  173. }
  174. }
  175. </script>
  176. <template>
  177. <view class="order-details">
  178. <!-- 顶部标题 -->
  179. <view class="header">
  180. <text class="header-title">{{ orderTitle() }}</text>
  181. </view>
  182. <!-- 商品信息 -->
  183. <view class="product-info">
  184. <view class="product-image">
  185. <view v-if="!imageErrorMap[productInfo.productId]" class="product-image">
  186. <ImageItem :src="getImageUrl(productInfo.skuImage)" @image-error="handleImageError(productInfo.productId)" />
  187. </view>
  188. <view v-else
  189. style="display: flex; flex-direction: column; align-items: center; justify-content: center; height: 120rpx; background-color: #f5f5f5; border-radius: 8rpx;">
  190. <uni-icons type="image" size="54rpx" color="#999" @click="resetImageError(productInfo.productId)"></uni-icons>
  191. <text style="font-size: 20rpx; color: #999; margin-top: 13rpx;">加载失败</text>
  192. </view>
  193. </view>
  194. <view class="product-details">
  195. <text class="product-name">{{ productInfo.productName }}</text>
  196. <text class="product-spec">已选 {{ productInfo.skuSpec }}</text>
  197. <text class="product-price" v-if="productInfo.paymentType == 1">{{ orderInfo.pointsUsed }}积分</text>
  198. <text class="product-price" v-if="productInfo.paymentType == 2">¥{{ orderInfo.totalAmount }}</text>
  199. <text class="product-price" v-if="productInfo.paymentType == 3">¥{{ orderInfo.totalAmount }}+{{
  200. orderInfo.pointsUsed }}积分</text>
  201. </view>
  202. </view>
  203. <!-- 订单信息 -->
  204. <view class="order-info">
  205. <view class="info-item">
  206. <text class="info-label">下单时间</text>
  207. <text class="info-value">{{ orderInfo.createTime || '--' }}</text>
  208. </view>
  209. <view class="info-item">
  210. <text class="info-label">发货时间</text>
  211. <text class="info-value">{{ orderInfo.deliveryTime || '--' }}</text>
  212. </view>
  213. <view class="info-item">
  214. <text class="info-label">订单号</text>
  215. <text class="info-value">{{ orderInfo.orderNo || '--' }}</text>
  216. </view>
  217. <view class="info-item">
  218. <text class="info-label">物流单号</text>
  219. <text class="info-value">{{ orderInfo.logisticsNo || '--' }}</text>
  220. </view>
  221. <view class="info-item">
  222. <text class="info-label">收件人</text>
  223. <text class="info-value">{{ orderInfo.receiverName || '--' }}</text>
  224. </view>
  225. <view class="info-item">
  226. <text class="info-label">联系电话</text>
  227. <text class="info-value">{{ orderInfo.receiverPhone || '--' }}</text>
  228. </view>
  229. <view class="info-item">
  230. <text class="info-label">收件地址</text>
  231. <text class="info-value">{{ orderInfo.addressName || '--' }}</text>
  232. </view>
  233. </view>
  234. <!-- 退货信息 -->
  235. <view class="refund-info" v-if="afterSaleInfo !== null && afterSaleInfo.afterSaleType == 1">
  236. <view class="info-item">
  237. <text class="info-label">退货原因</text>
  238. <text class="info-value">{{ afterSaleInfo.applyReason }}</text>
  239. </view>
  240. <view class="info-item" v-if="[0, 2, 3].includes(afterSaleInfo.afterSaleStatus)">
  241. <text class="info-label">申请时间</text>
  242. <text class="info-value">{{ afterSaleInfo.createTime }}</text>
  243. </view>
  244. <view class="info-item" v-if="afterSaleInfo.afterSaleStatus == 1">
  245. <text class="info-label">退款时间</text>
  246. <text class="info-value">{{ afterSaleInfo.refund_time }}</text>
  247. </view>
  248. <view class="info-item" v-if="[1, 3].includes(afterSaleInfo.afterSaleStatus)">
  249. <text class="info-label">物流单号</text>
  250. <text class="info-value">{{ afterSaleInfo.logisticsNo }}</text>
  251. </view>
  252. <view class="info-item" v-if="afterSaleInfo.afterSaleStatus == 1">
  253. <text class="info-label">退款成功</text>
  254. <text class="info-value" v-if="productInfo.paymentType == 1">{{ orderInfo.pointsUsed }}积分</text>
  255. <text class="info-value" v-if="productInfo.paymentType == 2">¥{{ orderInfo.totalAmount }}</text>
  256. <text class="info-value" v-if="productInfo.paymentType == 3">¥{{ orderInfo.totalAmount }}+{{
  257. orderInfo.pointsUsed }}积分</text>
  258. </view>
  259. </view>
  260. <!-- 换货信息 -->
  261. <view class="refund-info" v-if="afterSaleInfo !== null && afterSaleInfo.afterSaleType == 2">
  262. <view class="info-item">
  263. <text class="info-label">退货原因</text>
  264. <text class="info-value">{{ afterSaleInfo.applyReason }}</text>
  265. </view>
  266. <view class="info-item" v-if="[0, 2, 3, 4].includes(afterSaleInfo.afterSaleStatus)">
  267. <text class="info-label">申请时间</text>
  268. <text class="info-value">{{ afterSaleInfo.createTime }}</text>
  269. </view>
  270. <view class="info-item" v-if="[3].includes(afterSaleInfo.afterSaleStatus)">
  271. <text class="info-label">物流单号</text>
  272. <text class="info-value">{{ afterSaleInfo.logisticsNo }}</text>
  273. </view>
  274. </view>
  275. <!-- 未收到货 -->
  276. <view class="refund-info" v-if="afterSaleInfo !== null && afterSaleInfo.afterSaleType == 3">
  277. <view class="info-item">
  278. <text class="info-label">退货原因</text>
  279. <text class="info-value">{{ afterSaleInfo.applyReason }}</text>
  280. </view>
  281. <view class="info-item" v-if="afterSaleInfo.afterSaleStatus == 0">
  282. <text class="info-label">申请时间</text>
  283. <text class="info-value">{{ afterSaleInfo.createTime }}</text>
  284. </view>
  285. <view class="info-item" v-if="afterSaleInfo.afterSaleStatus == 1">
  286. <text class="info-label">退款时间</text>
  287. <text class="info-value">{{ afterSaleInfo.refund_time }}</text>
  288. </view>
  289. <view class="info-item" v-if="afterSaleInfo.afterSaleStatus == 1">
  290. <text class="info-label">退款成功</text>
  291. <text class="info-value" v-if="productInfo.paymentType == 1">{{ orderInfo.pointsUsed }}积分</text>
  292. <text class="info-value" v-if="productInfo.paymentType == 2">¥{{ orderInfo.totalAmount }}</text>
  293. <text class="info-value" v-if="productInfo.paymentType == 3">¥{{ orderInfo.totalAmount }}+{{
  294. orderInfo.pointsUsed }}积分</text>
  295. </view>
  296. </view>
  297. <!-- 操作按钮 -->
  298. <view class="action-buttons" :class="{ 'safe-area': hasSafeArea }" v-if="orderInfo.orderStatus == 2">
  299. <button class="detail-button" @click="handleAfterSales" v-if="afterSaleInfo == null">退款\售后</button>
  300. <button class="action-button" @click="handleRefund('receipt')">确认收货</button>
  301. </view>
  302. <view class="action-buttons" :class="{ 'safe-area': hasSafeArea }"
  303. v-if="orderInfo.orderStatus == 4 && afterSaleInfo !== null && ([0, 2].includes(afterSaleInfo.afterSaleStatus))">
  304. <button class="action-button" @click="handleRefund('cancel')">取消申请</button>
  305. <button class="action-button" @click="handleLogistics" v-if="afterSaleInfo.afterSaleStatus == 2">填写物流单号</button>
  306. </view>
  307. <!-- 弹出层 -->
  308. <u-modal :show="show" :title="title" :content='content' :show-cancel="false">
  309. <view slot="default" class="modal-content">
  310. <text class="modal-text">{{ content }}</text>
  311. </view>
  312. <view slot="confirmButton" class="modal-footer">
  313. <button class="modal-cancel" @click="show = false">取消</button>
  314. <button class="modal-confirm" @click="confirmReceive">确认收货</button>
  315. </view>
  316. </u-modal>
  317. <!-- 填写物流单号 -->
  318. <u-popup :show="showLogistics" mode="bottom" @close="showLogistics = false" round="20rpx">
  319. <view class="logistics-popup">
  320. <!-- 标题 -->
  321. <view class="popup-header">
  322. <text class="popup-title">填写物流单号</text>
  323. <text class="popup-close" @click="showLogistics = false">取消</text>
  324. </view>
  325. <!-- 输入框 -->
  326. <view class="popup-content">
  327. <u--textarea v-model="logisticsNumber" placeholder="请输入物流单号" border="surround" :border-radius="10"
  328. class="logistics-input"></u--textarea>
  329. </view>
  330. <!-- 提交按钮 -->
  331. <view class="popup-footer">
  332. <button class="submit-button" @click="submitLogistics">提交</button>
  333. </view>
  334. </view>
  335. </u-popup>
  336. <!-- 售后 -->
  337. <u-popup :show="afterSalesShow" mode="bottom" @close="afterSalesShow = false" round="20rpx">
  338. <view class="after-sales-popup">
  339. <!-- 标题 -->
  340. <view class="popup-header">
  341. <text class="popup-title">请选择售后商品</text>
  342. <text class="popup-close" @click="afterSalesShow = false">×</text>
  343. </view>
  344. <!-- 收货状态选择 -->
  345. <view class="popup-section">
  346. <text class="section-title">请选择收货状态</text>
  347. <view class="option-group">
  348. <button class="option-button" :class="{ active: receiptStatus === 'notReceived' }"
  349. @click="receiptStatus = 'notReceived'">未收到货</button>
  350. <button class="option-button" :class="{ active: receiptStatus === 'received' }"
  351. @click="receiptStatus = 'received'">已收到货</button>
  352. </view>
  353. </view>
  354. <!-- 售后类型选择 -->
  355. <view class="popup-section" v-if="receiptStatus === 'received'">
  356. <text class="section-title">请选择售后类型</text>
  357. <view class="option-group">
  358. <button class="option-button" :class="{ active: afterSalesType === 'refund' }"
  359. @click="afterSalesType = 'refund'">退货</button>
  360. <button class="option-button" :class="{ active: afterSalesType === 'exchange' }"
  361. @click="afterSalesType = 'exchange'">换货</button>
  362. </view>
  363. </view>
  364. <!-- 商品选择 -->
  365. <view class="popup-section">
  366. <text class="section-title">
  367. 请选择商品
  368. <text v-if="receiptStatus === 'received'" class="time-limit">({{ getafterTime() }} 24时之前可申请)</text>
  369. </text>
  370. <view class="product-item">
  371. <view class="product-image">
  372. <view v-if="!imageErrorMap[productInfo.productId]" class="product-image">
  373. <ImageItem :src="getImageUrl(productInfo.skuImage)"
  374. @image-error="handleImageError(productInfo.productId)" />
  375. </view>
  376. <view v-else
  377. style="display: flex; flex-direction: column; align-items: center; justify-content: center; height: 100rpx; background-color: #f5f5f5; border-radius: 8rpx;">
  378. <uni-icons type="image" size="44rpx" color="#999"
  379. @click="resetImageError(productInfo.productId)"></uni-icons>
  380. <text style="font-size: 20rpx; color: #999; margin-top: 3rpx;">加载失败</text>
  381. </view>
  382. </view>
  383. <view class="product-details">
  384. <text class="product-name">{{ productInfo.productName }}</text>
  385. <text class="product-spec">已选: {{ productInfo.skuSpec }}</text>
  386. </view>
  387. </view>
  388. </view>
  389. <!-- 下一步按钮 -->
  390. <view class="popup-footer">
  391. <button class="next-button" @click="nextStep">下一步</button>
  392. </view>
  393. </view>
  394. </u-popup>
  395. </view>
  396. </template>
  397. <style scoped lang="scss">
  398. .order-details {
  399. width: 750rpx;
  400. min-height: 100vh;
  401. background-image: url("@/static/points/orderBg.png");
  402. background-size: 100%;
  403. background-repeat: no-repeat;
  404. background-color: #F5F8F8;
  405. padding-top: 54rpx;
  406. ::v-deep .u-modal {
  407. .u-modal__title {
  408. background: #E8FFFD;
  409. height: 92rpx;
  410. padding: 0;
  411. font-family: PingFang SC, PingFang SC;
  412. font-weight: bold;
  413. font-size: 32rpx;
  414. color: #000000;
  415. line-height: 92rpx;
  416. }
  417. .u-modal__content,
  418. .u-modal__button-group--confirm-button {
  419. padding: 0;
  420. }
  421. }
  422. // 模态框样式
  423. .modal-content {
  424. padding: 40rpx 32rpx;
  425. text-align: center;
  426. .modal-text {
  427. font-family: PingFang SC, PingFang SC;
  428. font-weight: 500;
  429. font-size: 28rpx;
  430. color: #333333;
  431. line-height: 39rpx;
  432. }
  433. }
  434. .modal-footer {
  435. border-top: 1rpx solid #EEEEEE;
  436. display: flex;
  437. justify-content: center;
  438. padding: 24rpx 58rpx;
  439. button {
  440. width: 225rpx;
  441. height: 68rpx;
  442. border-radius: 60rpx;
  443. font-size: 28rpx;
  444. text-align: center;
  445. line-height: 68rpx;
  446. margin: 0 20rpx;
  447. padding: 0;
  448. }
  449. .modal-cancel {
  450. border: 1rpx solid #999999;
  451. color: #333333;
  452. }
  453. .modal-confirm {
  454. background: linear-gradient(78deg, #1AD8CF 0%, #21C8C0 100%);
  455. color: #FFFFFF;
  456. }
  457. }
  458. .header {
  459. width: 100%;
  460. margin-bottom: 38rpx;
  461. text-align: center;
  462. .header-title {
  463. font-family: PingFang SC, PingFang SC;
  464. font-weight: 500;
  465. font-size: 36rpx;
  466. color: #FFFFFF;
  467. line-height: 40rpx;
  468. }
  469. }
  470. .product-info {
  471. width: 686rpx;
  472. height: 168rpx;
  473. background: #FFFFFF;
  474. border-radius: 16rpx;
  475. margin: 0 auto 24rpx;
  476. padding: 24rpx;
  477. display: flex;
  478. .product-image {
  479. width: 120rpx;
  480. height: 120rpx;
  481. margin-right: 24rpx;
  482. image {
  483. width: 100%;
  484. height: 100%;
  485. }
  486. }
  487. .product-details {
  488. flex: 1;
  489. .product-name {
  490. font-family: PingFang SC, PingFang SC;
  491. font-weight: bold;
  492. font-size: 28rpx;
  493. line-height: 28rpx;
  494. color: #333333;
  495. margin-bottom: 24rpx;
  496. display: block;
  497. }
  498. .product-spec {
  499. font-family: PingFang SC, PingFang SC;
  500. font-size: 26rpx;
  501. line-height: 26rpx;
  502. color: #999999;
  503. margin-bottom: 2rpx;
  504. display: block;
  505. }
  506. .product-price {
  507. font-family: PingFang SC, PingFang SC;
  508. font-weight: bold;
  509. line-height: 26rpx;
  510. font-size: 26rpx;
  511. color: #333333;
  512. }
  513. }
  514. }
  515. .order-info,
  516. .refund-info {
  517. width: 686rpx;
  518. background-color: #FFFFFF;
  519. border-radius: 16rpx;
  520. margin: 0 auto 24rpx;
  521. padding: 26rpx 24rpx;
  522. .info-item {
  523. display: flex;
  524. justify-content: space-between;
  525. align-items: flex-start;
  526. margin-bottom: 22rpx;
  527. &:last-child {
  528. margin-bottom: 0;
  529. }
  530. .info-label {
  531. font-family: PingFang SC, PingFang SC;
  532. font-weight: 400;
  533. font-size: 26rpx;
  534. color: #666666;
  535. }
  536. .info-value {
  537. flex: 1;
  538. font-family: PingFang SC, PingFang SC;
  539. font-weight: 400;
  540. font-size: 26rpx;
  541. color: #2F3437;
  542. text-align: right;
  543. }
  544. }
  545. }
  546. .action-buttons {
  547. width: 750rpx;
  548. background: #FFFFFF;
  549. position: fixed;
  550. bottom: 0;
  551. left: 0;
  552. padding: 20rpx 32rpx;
  553. display: flex;
  554. justify-content: flex-end;
  555. // 正常手机的高度
  556. height: auto;
  557. min-height: 100rpx;
  558. // 有安全区域的设备的高度
  559. &.safe-area {
  560. height: 164rpx;
  561. }
  562. .detail-button {
  563. padding: 0 30rpx;
  564. height: 56rpx;
  565. border-radius: 98rpx;
  566. font-size: 26rpx;
  567. color: #999999;
  568. text-align: center;
  569. line-height: 53rpx;
  570. border: 2rpx solid #999999;
  571. margin: 0;
  572. }
  573. .action-button {
  574. padding: 0 30rpx;
  575. height: 56rpx;
  576. background: #03C1B8;
  577. border-radius: 98rpx;
  578. font-size: 26rpx;
  579. color: #FFFFFF;
  580. text-align: center;
  581. line-height: 56rpx;
  582. margin: 0 0 0 20rpx;
  583. }
  584. }
  585. // 物流单号弹出框样式
  586. .logistics-popup {
  587. width: 100%;
  588. padding: 40rpx;
  589. background: #F5F8F8;
  590. border-radius: 32rpx 32rpx 0 0;
  591. .popup-header {
  592. display: flex;
  593. justify-content: space-between;
  594. align-items: center;
  595. margin-bottom: 32rpx;
  596. .popup-title {
  597. font-size: 40rpx;
  598. font-weight: bold;
  599. color: #333333;
  600. background-image: url("@/static/points/logisticspopu.png");
  601. background-repeat: no-repeat;
  602. background-position: 20rpx 40rpx;
  603. }
  604. .popup-close {
  605. font-size: 28rpx;
  606. color: #999999;
  607. }
  608. }
  609. .popup-content {
  610. margin-bottom: 32rpx;
  611. .logistics-input {
  612. width: 100%;
  613. height: 180rpx;
  614. padding: 20rpx;
  615. font-size: 28rpx;
  616. background: #F8F8F8;
  617. border-radius: 16rpx;
  618. border: 1rpx solid #DCDCDC;
  619. }
  620. }
  621. .popup-footer {
  622. .submit-button {
  623. width: 100%;
  624. height: 80rpx;
  625. background: linear-gradient(78deg, #1AD8CF 0%, #21C8C0 100%);
  626. border-radius: 40rpx;
  627. font-size: 32rpx;
  628. color: #FFFFFF;
  629. text-align: center;
  630. line-height: 80rpx;
  631. margin: 0;
  632. padding: 0;
  633. }
  634. }
  635. }
  636. // 售后弹出框样式
  637. .after-sales-popup {
  638. width: 100%;
  639. background: #F8F8F8;
  640. border-radius: 32rpx 32rpx 0 0;
  641. .popup-header {
  642. display: flex;
  643. justify-content: space-between;
  644. align-items: center;
  645. height: 92rpx;
  646. padding: 0 32rpx;
  647. .popup-title {
  648. width: 100%;
  649. text-align: center;
  650. font-size: 32rpx;
  651. font-weight: bold;
  652. color: #333333;
  653. }
  654. .popup-close {
  655. font-size: 32rpx;
  656. color: #999999;
  657. }
  658. }
  659. .popup-section {
  660. width: 686rpx;
  661. min-height: 202rpx;
  662. background: #FFFFFF;
  663. border-radius: 16rpx;
  664. margin: 0 auto 24rpx;
  665. padding: 24rpx;
  666. .section-title {
  667. font-family: PingFang SC, PingFang SC;
  668. font-weight: bold;
  669. font-size: 28rpx;
  670. color: #333333;
  671. display: block;
  672. margin-bottom: 24rpx;
  673. .time-limit {
  674. font-size: 24rpx;
  675. color: #f53e54;
  676. font-weight: normal;
  677. }
  678. }
  679. .option-group {
  680. display: flex;
  681. justify-content: space-between;
  682. .option-button {
  683. flex: 1;
  684. height: 72rpx;
  685. border-radius: 38rpx;
  686. font-size: 28rpx;
  687. color: #333333;
  688. background: #F0F0F0;
  689. border-color: #F0F0F0;
  690. text-align: center;
  691. line-height: 72rpx;
  692. margin: 0 10rpx;
  693. padding: 0;
  694. &.active {
  695. background: #1AD8CF;
  696. border-color: #1AD8CF;
  697. color: #FFFFFF;
  698. }
  699. }
  700. }
  701. .product-item {
  702. display: flex;
  703. padding: 20rpx;
  704. background-color: #F5F8F8;
  705. border-radius: 10rpx;
  706. .product-image {
  707. width: 100rpx;
  708. height: 100rpx;
  709. margin-right: 20rpx;
  710. image {
  711. width: 100%;
  712. height: 100%;
  713. border-radius: 10rpx;
  714. }
  715. }
  716. .product-details {
  717. flex: 1;
  718. .product-name {
  719. font-size: 28rpx;
  720. color: #333333;
  721. margin-bottom: 10rpx;
  722. display: block;
  723. }
  724. .product-spec {
  725. font-size: 24rpx;
  726. color: #999999;
  727. display: block;
  728. }
  729. }
  730. }
  731. }
  732. .popup-footer {
  733. width: 750rpx;
  734. height: 124rpx;
  735. background: #FFFFFF;
  736. padding: 20rpx 40rpx;
  737. .next-button {
  738. width: 100%;
  739. height: 80rpx;
  740. background: linear-gradient(78deg, #1AD8CF 0%, #21C8C0 100%);
  741. border-radius: 40rpx;
  742. font-size: 32rpx;
  743. color: #FFFFFF;
  744. text-align: center;
  745. line-height: 80rpx;
  746. margin: 0;
  747. padding: 0;
  748. }
  749. }
  750. }
  751. }
  752. </style>