index.vue 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975
  1. <template>
  2. <view>
  3. <view class="order-details">
  4. <!-- 给header上与data上加on为退款订单-->
  5. <view class="header" :class="isGoodsReturn ? 'on' : ''">
  6. <view class="picTxt acea-row row-middle">
  7. <!-- <view class="pictrue" v-if="isGoodsReturn == false">
  8. <image :src="orderInfo.statusPic"></image>
  9. </view> -->
  10. <view class="data" :class="isGoodsReturn ? 'on' : ''">
  11. <view class="state">{{ orderInfo.orderStatusMsg }}</view>
  12. <view>{{ orderInfo.createTime }}</view>
  13. </view>
  14. </view>
  15. </view>
  16. <view v-if="!isGoodsReturn" class="pad30">
  17. <view class="nav">
  18. <uni-steps
  19. :current="curOrderStep"
  20. :options="orderSteps"
  21. activeColor="#e9c279"
  22. ></uni-steps>
  23. </view>
  24. <view
  25. v-if="orderInfo.shippingType == 2 && orderInfo.paid"
  26. class="writeOff borRadius14"
  27. >
  28. <view class="title">核销信息</view>
  29. <view class="grayBg">
  30. <view class="pictrue">
  31. <!-- <div class="qrcode" ref="qrcode"></div> -->
  32. <!-- <canvas canvas-id="qrcode" :style="{width: `${qrcodeSize}100%`, height: `${qrcodeSize}100%`}"/> -->
  33. <image :src="codeImg"></image>
  34. </view>
  35. </view>
  36. <view class="gear">
  37. <image src="../../static/images/writeOff.jpg"></image>
  38. </view>
  39. <view class="num">{{ orderInfo.verifyCode }}</view>
  40. <view class="rules" v-if="orderInfo.systemStore">
  41. <view class="item">
  42. <view class="rulesTitle acea-row row-middle">
  43. <text class="iconfont icon-shijian"></text>核销时间
  44. </view>
  45. <view class="info">
  46. 每日:<text class="time">{{
  47. orderInfo.systemStore.dayTime.replace(",", "-")
  48. }}</text>
  49. </view>
  50. </view>
  51. <view class="item">
  52. <view class="rulesTitle acea-row row-middle">
  53. <text class="iconfont icon-shuoming1"></text>使用说明
  54. </view>
  55. <view class="info">可将二维码出示给店员扫描或提供数字核销码</view>
  56. </view>
  57. </view>
  58. </view>
  59. <view v-if="orderInfo.shippingType === 1" class="address borRadius14">
  60. <view class="name"
  61. >{{ orderInfo.realName
  62. }}<text class="phone">{{ orderInfo.userPhone }}</text></view
  63. >
  64. <view>{{ orderInfo.userAddress }}</view>
  65. </view>
  66. <view v-else class="address" style="margin-top: 15rpx">
  67. <view class="name" @tap="makePhone"
  68. >{{ orderInfo.systemStore ? orderInfo.systemStore.name : ""
  69. }}<text class="phone">{{
  70. orderInfo.systemStore ? orderInfo.systemStore.phone : ""
  71. }}</text
  72. ><text class="iconfont icon-tonghua font-color"></text
  73. ></view>
  74. <view>{{
  75. orderInfo.systemStore ? orderInfo.systemStore.detailedAddress : ""
  76. }}</view>
  77. </view>
  78. <orderGoods
  79. :mallType="orderInfo.mallType"
  80. :evaluate="evaluate"
  81. :productType="orderInfo.type"
  82. :orderId="order_id"
  83. :ids="id"
  84. :uniId="uniId"
  85. :cartInfo="cartInfo"
  86. :jump="true"
  87. ></orderGoods>
  88. <!-- <div class="goodCall borRadius14" @click="kefuClick">
  89. <span class="iconfont icon-kefu"></span><span>联系客服</span>
  90. </div> -->
  91. </view>
  92. <view class="pad30">
  93. <view class="nav refund" v-if="orderInfo.refundStatus > 0">
  94. <view class="title">
  95. <image src="/static/images/shuoming.png" mode=""></image>
  96. {{ getRefundStatus() }}
  97. </view>
  98. <view class="con pad30">{{ getRefundReason() }}</view>
  99. </view>
  100. <view class="wrapper borRadius14">
  101. <view class="item acea-row row-between">
  102. <view>订单编号:</view>
  103. <view class="conter acea-row row-middle row-right"
  104. >{{ orderInfo.orderId }}
  105. <!-- #ifndef H5 -->
  106. <text class="copy" @tap="copy">复制</text>
  107. <!-- #endif -->
  108. <!-- #ifdef H5 -->
  109. <text class="copy copy-data" @click="setOrderId">复制</text>
  110. <!-- #endif -->
  111. </view>
  112. </view>
  113. <view class="item acea-row row-between">
  114. <view>下单时间:</view>
  115. <view class="conter">{{ orderInfo.createTime || 0 }}</view>
  116. </view>
  117. <view class="item acea-row row-between">
  118. <view>支付状态:</view>
  119. <view class="conter" v-if="orderInfo.paid">已支付</view>
  120. <view class="conter" v-else>未支付</view>
  121. </view>
  122. <view class="item acea-row row-between">
  123. <view>支付方式:</view>
  124. <view class="conter" v-if="orderInfo.mallType === 0">{{
  125. orderInfo.payTypeStr
  126. }}</view>
  127. <view class="conter" v-else>贝币</view>
  128. </view>
  129. <view class="item acea-row row-between" v-if="orderInfo.mark">
  130. <view>买家留言:</view>
  131. <view class="conter">{{ orderInfo.mark }}</view>
  132. </view>
  133. </view>
  134. <!-- 退款订单详情 "-->
  135. <view v-if="isGoodsReturn" class="wrapper borRadius14">
  136. <view class="item acea-row row-between">
  137. <view>收货人:</view>
  138. <view class="conter">{{ orderInfo.realName }}</view>
  139. </view>
  140. <view class="item acea-row row-between">
  141. <view>联系电话:</view>
  142. <view class="conter">{{ orderInfo.userPhone }}</view>
  143. </view>
  144. <view class="item acea-row row-between">
  145. <view>收货地址:</view>
  146. <view class="conter">{{ orderInfo.userAddress }}</view>
  147. </view>
  148. <view class="item acea-row row-between">
  149. <view>退款快递单号:</view>
  150. <view class="conter">{{ orderInfo.refundExpressNum }}</view>
  151. </view>
  152. </view>
  153. <view v-if="orderInfo.status > 0">
  154. <view
  155. class="wrapper borRadius14"
  156. v-if="orderInfo.deliveryType == 'express'"
  157. >
  158. <view class="item acea-row row-between">
  159. <view>配送方式:</view>
  160. <view class="conter">发货</view>
  161. </view>
  162. <view class="item acea-row row-between">
  163. <view>快递公司:</view>
  164. <view class="conter">{{ orderInfo.deliveryName || "" }}</view>
  165. </view>
  166. <view class="item acea-row row-between">
  167. <view>快递号:</view>
  168. <view class="conter">{{ orderInfo.deliveryId || "" }}</view>
  169. </view>
  170. </view>
  171. <view
  172. class="wrapper borRadius14"
  173. v-else-if="orderInfo.deliveryType == 'send'"
  174. >
  175. <view class="item acea-row row-between">
  176. <view>配送方式:</view>
  177. <view class="conter">送货</view>
  178. </view>
  179. <view class="item acea-row row-between">
  180. <view>配送人姓名:</view>
  181. <view class="conter">{{ orderInfo.deliveryName || "" }}</view>
  182. </view>
  183. <view class="item acea-row row-between">
  184. <view>联系电话:</view>
  185. <view class="conter acea-row row-middle row-right"
  186. >{{ orderInfo.deliveryId || ""
  187. }}<text class="copy" @tap="goTel">拨打</text></view
  188. >
  189. </view>
  190. </view>
  191. <view
  192. class="wrapper borRadius14"
  193. v-else-if="orderInfo.deliveryType == 'fictitious'"
  194. >
  195. <view class="item acea-row row-between">
  196. <view>虚拟发货:</view>
  197. <view class="conter">已发货,请注意查收</view>
  198. </view>
  199. </view>
  200. </view>
  201. <view class="wrapper borRadius14">
  202. <view class="item acea-row row-between">
  203. <view>商品总价:</view>
  204. <view class="conter" v-if="orderInfo.mallType === 0">
  205. ¥{{ orderInfo.proTotalPrice }}
  206. </view>
  207. <view class="conter" v-else>{{ orderInfo.proTotalPrice }}</view>
  208. </view>
  209. <view
  210. class="item acea-row row-between"
  211. v-if="orderInfo.payPostage > 0"
  212. >
  213. <view>运费:</view>
  214. <view class="conter">¥{{ orderInfo.payPostage }}</view>
  215. </view>
  216. <view
  217. class="item acea-row row-between"
  218. v-if="orderInfo.payPostage > 0 && orderInfo?.additionalAmount"
  219. >
  220. <view>附加费:</view>
  221. <view class="conter">¥{{ orderInfo.additionalAmount }}</view>
  222. </view>
  223. <!-- <view class="item acea-row row-between" v-if="orderInfo.couponId">
  224. <view>优惠券抵扣:</view>
  225. <view class="conter">-¥{{ orderInfo.couponPrice }}</view>
  226. </view> -->
  227. <view
  228. class="item acea-row row-between"
  229. v-if="orderInfo.mallType === 0"
  230. >
  231. <view>会员折扣:</view>
  232. <view class="conter">-¥{{ orderInfo.vipLevelDis }}</view>
  233. </view>
  234. <view
  235. v-if="orderInfo.mallType === 0"
  236. class="actualPay acea-row row-right"
  237. >
  238. 实付款:<text class="money font-color">
  239. ¥{{ orderInfo.payPrice }}
  240. </text>
  241. </view>
  242. <view v-else class="actualPay acea-row row-right"
  243. >实付款:<text class="money font-color">
  244. {{ Number(orderInfo.proTotalPrice) }}贝币
  245. </text>
  246. </view>
  247. </view>
  248. <view style="height: 120rpx"></view>
  249. <view
  250. class="footer acea-row row-right row-middle"
  251. v-if="isGoodsReturn == false"
  252. >
  253. <view class="qs-btn" v-if="!orderInfo.paid" @click.stop="cancelOrder"
  254. >取消订单</view
  255. >
  256. <view
  257. class="bnt bg-color"
  258. v-if="!orderInfo.paid"
  259. @tap="pay_open(orderInfo.orderId)"
  260. >立即付款</view
  261. >
  262. <navigator
  263. hover-class="none"
  264. :url="
  265. '/pages/users/goods_return/index?orderId=' + orderInfo.orderId
  266. "
  267. class="bnt cancel"
  268. v-else-if="
  269. orderInfo.paid === true &&
  270. orderInfo.refundStatus === 0 &&
  271. orderInfo.type !== 1 &&
  272. orderInfo.mallType !== 1 &&
  273. type === 'normal'
  274. "
  275. >
  276. 申请退款
  277. </navigator>
  278. <navigator
  279. class="bnt cancel"
  280. v-if="orderInfo.deliveryType == 'express' && orderInfo.status > 0"
  281. hover-class="none"
  282. :url="`/pages/users/goods_logistics/index?orderId=${orderInfo.orderId}`"
  283. >查看物流
  284. </navigator>
  285. <view
  286. class="bnt bg-color"
  287. v-if="orderInfo.status == 1"
  288. @tap="confirmOrder"
  289. >确认收货</view
  290. >
  291. <view class="bnt cancel" v-if="orderInfo.status == 3" @tap="delOrder"
  292. >删除订单</view
  293. >
  294. <view
  295. class="bnt bg-color"
  296. v-if="orderInfo.status == 3 && orderInfo.type !== 1"
  297. @tap="goOrderConfirm"
  298. >再次购买</view
  299. >
  300. </view>
  301. </view>
  302. </view>
  303. <payment
  304. :payMode="payMode"
  305. :showPopup="showPopup"
  306. @payComplete="payComplete"
  307. @close="payClose"
  308. :order_id="pay_order_id"
  309. :totalPrice="totalPrice"
  310. :mallType="orderInfo.mallType"
  311. ></payment>
  312. </view>
  313. </template>
  314. <script setup>
  315. import { ref, reactive, computed } from "vue";
  316. import { useAppStore } from "@/stores/app.js";
  317. import { onLoad, onShow, onHide } from "@dcloudio/uni-app";
  318. import {
  319. getOrderDetail,
  320. orderTake,
  321. orderDel,
  322. orderCancel,
  323. qrcodeApi,
  324. } from "@/api/order.js";
  325. import { openOrderRefundSubscribe } from "@/utils/SubscribeMessage.js";
  326. import payment from "@/components/payment";
  327. import orderGoods from "@/components/orderGoods";
  328. import { toLogin } from "@/libs/login.js";
  329. import { useToast } from "@/hooks/useToast";
  330. import { getPreOrder } from "@/libs/order";
  331. const appStore = useAppStore();
  332. const { Toast } = useToast();
  333. const codeImg = ref("");
  334. const order_id = ref("");
  335. const evaluate = ref(0);
  336. const cartInfo = ref([]);
  337. const orderInfo = reactive({
  338. systemStore: {},
  339. pstatus: {},
  340. });
  341. const system_store = ref({});
  342. const isGoodsReturn = ref(false);
  343. const status = ref({});
  344. const isClose = ref(false);
  345. const payMode = ref([
  346. {
  347. name: "支付宝支付",
  348. icon: "icon-zhifubao",
  349. value: "alipay",
  350. title: "支付宝快捷支付",
  351. payChannel: "appAliPay",
  352. },
  353. {
  354. name: "微信支付",
  355. icon: "icon-wechat",
  356. value: "weixin",
  357. title: "微信快捷支付",
  358. payChannel: "weixinApp",
  359. },
  360. {
  361. name: "余额支付",
  362. icon: "icon-balance",
  363. value: "yue",
  364. title: "可用余额:",
  365. payChannel: "yue",
  366. number: 0,
  367. },
  368. ]);
  369. const showPopup = ref(false);
  370. const pay_order_id = ref("");
  371. const totalPrice = ref("0");
  372. const id = ref(0);
  373. const uniId = ref("");
  374. const type = ref("normal");
  375. function payComplete() {
  376. showPopup.value = false;
  377. pay_order_id.value = "";
  378. getOrderInfo();
  379. }
  380. function openSubcribe(page) {
  381. uni.showLoading({ title: "正在加载" });
  382. openOrderRefundSubscribe()
  383. .then(() => {
  384. uni.hideLoading();
  385. uni.navigateTo({ url: page });
  386. })
  387. .catch(() => {
  388. uni.hideLoading();
  389. });
  390. }
  391. function makePhone() {
  392. uni.makePhoneCall({
  393. phoneNumber: system_store.value.phone,
  394. });
  395. }
  396. function payClose() {
  397. showPopup.value = false;
  398. }
  399. function pay_open() {
  400. showPopup.value = true;
  401. pay_order_id.value = orderInfo.orderId;
  402. totalPrice.value = orderInfo.payPrice;
  403. }
  404. function getRefundStatus() {
  405. const statusMap = {
  406. 1: "商家审核中",
  407. 2: "商家已退款",
  408. 3: "商家退款中",
  409. };
  410. return orderInfo?.refundStatus ? statusMap[orderInfo.refundStatus] : "";
  411. }
  412. function getRefundReason() {
  413. if (orderInfo.refundStatus == 1) {
  414. return "您已成功发起退款申请,请耐心等待商家处理;退款前请与商家协商一致,有助于更好的处理售后问题";
  415. } else if (orderInfo.refundStatus == 2) {
  416. return "退款已成功受理,如商家已寄出商品请尽快退回;感谢您的支持";
  417. } else if (orderInfo?.refundReason) {
  418. return "拒绝原因:" + orderInfo?.refundReason;
  419. }
  420. }
  421. // 订单步骤配置
  422. const orderSteps = ref([
  423. { title: "待付款" },
  424. { title: "待发货" },
  425. { title: "待收货" },
  426. { title: "已完成" },
  427. ]);
  428. // 当前的订单状态
  429. const curOrderStep = computed(() => {
  430. let step = 0;
  431. if (!orderInfo.paid) {
  432. step = 0; // 待付款
  433. } else if (orderInfo.status === 0) {
  434. step = 1; // 待发货
  435. } else if (orderInfo.status === 1) {
  436. step = 2; // 待收货
  437. } else if (orderInfo.status === 2 || orderInfo.status === 3) {
  438. step = 3; // 已完成
  439. }
  440. return step;
  441. });
  442. function getOrderInfo() {
  443. uni.showLoading({ title: "正在加载中" });
  444. getOrderDetail(order_id.value)
  445. .then((res) => {
  446. uni.hideLoading();
  447. Object.assign(orderInfo, res.data);
  448. evaluate.value = res.data.status == 2 ? 2 : 0;
  449. system_store.value = res.data.systemStore;
  450. id.value = res.data.id;
  451. cartInfo.value = res.data.orderInfoList;
  452. if (res.data.refundStatus != 0) isGoodsReturn.value = true;
  453. if (orderInfo.shippingType == 2 && orderInfo.paid)
  454. markCode(res.data.verifyCode);
  455. if (orderInfo.refundStatus > 0) {
  456. // uni.setNavigationBarColor({
  457. // frontColor: "#ffffff",
  458. // backgroundColor: "#666666",
  459. // });
  460. }
  461. })
  462. .catch((err) => {
  463. uni.hideLoading();
  464. Toast({ title: err }, "/pages/users/order_list/index");
  465. });
  466. }
  467. function markCode(text) {
  468. qrcodeApi({
  469. height: "145",
  470. text: text,
  471. width: "145",
  472. }).then((res) => {
  473. codeImg.value = res.data.code;
  474. });
  475. }
  476. // #ifndef H5
  477. function copy() {
  478. uni.setClipboardData({
  479. data: orderInfo.orderId,
  480. });
  481. }
  482. // #endif
  483. function goTel() {
  484. uni.makePhoneCall({
  485. phoneNumber: orderInfo.deliveryId,
  486. });
  487. }
  488. function getOrderStatus() {
  489. let _orderInfo = orderInfo || {},
  490. _status = _orderInfo.pstatus || { type: 0 },
  491. _statusObj = {};
  492. let typeVal = parseInt(_status.type),
  493. delivery_type = _orderInfo.deliveryType,
  494. seckill_id = _orderInfo.seckillId ? parseInt(_orderInfo.seckillId) : 0,
  495. bargain_id = _orderInfo.bargainId ? parseInt(_orderInfo.bargainId) : 0,
  496. combination_id = _orderInfo.combinationId
  497. ? parseInt(_orderInfo.combinationId)
  498. : 0;
  499. _statusObj = {
  500. type: typeVal == 9 ? -9 : typeVal,
  501. class_status: 0,
  502. };
  503. if (typeVal == 1 && combination_id > 0) _statusObj.class_status = 1;
  504. if (typeVal == 2 && delivery_type == "express") _statusObj.class_status = 2;
  505. if (typeVal == 2) _statusObj.class_status = 3;
  506. if (typeVal == 4 || typeVal == 0) _statusObj.class_status = 4;
  507. if (
  508. !seckill_id &&
  509. !bargain_id &&
  510. !combination_id &&
  511. (typeVal == 3 || typeVal == 4)
  512. )
  513. _statusObj.class_status = 5;
  514. status.value = _statusObj;
  515. }
  516. function goJoinPink() {
  517. uni.navigateTo({
  518. url:
  519. "/pages/activity/goods_combination_status/index?id=" + orderInfo.pinkId,
  520. });
  521. }
  522. function goOrderConfirm() {
  523. const params = {
  524. mallType: orderInfo.mallType,
  525. preOrderType: "again",
  526. orderDetails: [{ orderNo: order_id.value }],
  527. };
  528. getPreOrder(params);
  529. }
  530. function confirmOrder() {
  531. uni.showModal({
  532. title: "确认收货",
  533. content: "为保障权益,请收到货确认无误后,再确认收货",
  534. success: function (res) {
  535. if (res.confirm) {
  536. orderTake(id.value)
  537. .then(() => {
  538. Toast({ title: "操作成功", icon: "success" }, function () {
  539. getOrderInfo();
  540. });
  541. })
  542. .catch((err) => {
  543. Toast({ title: err });
  544. });
  545. }
  546. },
  547. });
  548. }
  549. function delOrder() {
  550. orderDel(id.value)
  551. .then(() => {
  552. Toast({ title: "删除成功", icon: "success" }, { tab: 3, url: 1 });
  553. })
  554. .catch((err) => {
  555. Toast({ title: err });
  556. });
  557. }
  558. function cancelOrder() {
  559. uni.showModal({
  560. title: "提示",
  561. content: "确认取消该订单?",
  562. success: function (res) {
  563. if (res.confirm) {
  564. orderCancel(orderInfo.id)
  565. .then(() => {
  566. Toast({ title: "取消成功" });
  567. uni.navigateTo({ url: "/pages/order_list/index" });
  568. })
  569. .catch((err) => {
  570. Toast({ title: err });
  571. getOrderInfo();
  572. });
  573. }
  574. },
  575. });
  576. }
  577. // 生命周期
  578. onLoad((options) => {
  579. type.value =
  580. options.type == undefined || options.type == null ? "normal" : options.type;
  581. if (!options.order_id && !options.uniId) {
  582. Toast({ title: "缺少参数" }, { tab: 3, url: 1 });
  583. return;
  584. }
  585. order_id.value = options.order_id;
  586. });
  587. onShow(() => {
  588. if (appStore.isLogin) {
  589. getOrderInfo();
  590. payMode.value[2].number = appStore.$userInfo.nowMoney;
  591. payMode.value = [...payMode.value];
  592. } else {
  593. toLogin();
  594. }
  595. });
  596. onHide(() => {
  597. isClose.value = true;
  598. });
  599. const setOrderId = () => {
  600. uni.setClipboardData({
  601. data: orderInfo.orderId,
  602. success: function () {
  603. Toast({ title: "复制成功" });
  604. },
  605. });
  606. };
  607. </script>
  608. <style scoped lang="scss">
  609. .order-details {
  610. .header {
  611. height: 250rpx;
  612. padding: 0 30rpx;
  613. background-color: $header-color;
  614. &.on {
  615. background-color: $header-color !important;
  616. }
  617. .picTxt {
  618. height: 150rpx;
  619. .pictrue {
  620. width: 110rpx;
  621. height: 110rpx;
  622. image {
  623. width: 100%;
  624. height: 100%;
  625. }
  626. }
  627. .data {
  628. color: rgba(255, 255, 255, 0.8);
  629. font-size: 24rpx;
  630. margin-left: 27rpx;
  631. &.on {
  632. margin-left: 0;
  633. }
  634. .state {
  635. font-size: 30rpx;
  636. font-weight: bold;
  637. color: #fff;
  638. margin-bottom: 7rpx;
  639. }
  640. .time {
  641. margin-left: 20rpx;
  642. }
  643. }
  644. }
  645. }
  646. .nav {
  647. background-color: #fff;
  648. font-size: 26rpx;
  649. color: #282828;
  650. padding: 27rpx 0;
  651. width: 100%;
  652. border-radius: 14rpx;
  653. margin: -100rpx auto 0 auto;
  654. }
  655. .address {
  656. font-size: 26rpx;
  657. color: #868686;
  658. background-color: #fff;
  659. margin-top: 15rpx;
  660. padding: 30rpx 24rpx;
  661. .name {
  662. font-size: 30rpx;
  663. color: #282828;
  664. margin-bottom: 15rpx;
  665. .phone {
  666. margin-left: 40rpx;
  667. }
  668. .iconfont {
  669. font-size: 34rpx;
  670. margin-left: 10rpx;
  671. }
  672. }
  673. }
  674. .line {
  675. width: 100%;
  676. height: 3rpx;
  677. image {
  678. width: 100%;
  679. height: 100%;
  680. display: block;
  681. }
  682. }
  683. .wrapper {
  684. background-color: #fff;
  685. margin-top: 12rpx;
  686. padding: 30rpx 24rpx;
  687. .item {
  688. font-size: 28rpx;
  689. color: #282828;
  690. & ~ .item {
  691. margin-top: 20rpx;
  692. }
  693. .conter {
  694. color: #868686;
  695. text-align: right;
  696. .copy {
  697. font-size: 20rpx;
  698. color: #333;
  699. border-radius: 20rpx;
  700. border: 1rpx solid #666;
  701. padding: 3rpx 15rpx;
  702. margin-left: 24rpx;
  703. }
  704. }
  705. }
  706. .actualPay {
  707. border-top: 1rpx solid #eee;
  708. margin-top: 30rpx;
  709. padding-top: 30rpx;
  710. .money {
  711. font-weight: bold;
  712. font-size: 30rpx;
  713. }
  714. }
  715. }
  716. .footer {
  717. width: 100%;
  718. height: 100rpx;
  719. position: fixed;
  720. bottom: 0;
  721. left: 0;
  722. background-color: #fff;
  723. padding: 0 30rpx;
  724. box-sizing: border-box;
  725. .bnt {
  726. width: 158rpx;
  727. height: 54rpx;
  728. text-align: center;
  729. line-height: 54rpx;
  730. border-radius: 50rpx;
  731. color: #fff;
  732. font-size: 27rpx;
  733. &.cancel {
  734. color: #aaa;
  735. border: 1rpx solid #ddd;
  736. }
  737. & ~ .bnt {
  738. margin-left: 18rpx;
  739. }
  740. }
  741. }
  742. .writeOff {
  743. background-color: #fff;
  744. margin-top: 15rpx;
  745. padding-bottom: 50rpx;
  746. .title {
  747. font-size: 30rpx;
  748. color: #282828;
  749. height: 87rpx;
  750. border-bottom: 1px solid #f0f0f0;
  751. padding: 0 24rpx;
  752. line-height: 87rpx;
  753. }
  754. .grayBg {
  755. background-color: #f2f5f7;
  756. width: 590rpx;
  757. height: 384rpx;
  758. border-radius: 20rpx 20rpx 0 0;
  759. margin: 50rpx auto 0 auto;
  760. padding-top: 55rpx;
  761. .pictrue {
  762. width: 290rpx;
  763. height: 290rpx;
  764. margin: 0 auto;
  765. image {
  766. width: 100%;
  767. height: 100%;
  768. display: block;
  769. }
  770. }
  771. }
  772. .gear {
  773. width: 590rpx;
  774. height: 30rpx;
  775. margin: 0 auto;
  776. image {
  777. width: 100%;
  778. height: 100%;
  779. display: block;
  780. }
  781. }
  782. .num {
  783. background-color: #f0c34c;
  784. width: 590rpx;
  785. height: 84rpx;
  786. color: #282828;
  787. font-size: 48rpx;
  788. margin: 0 auto;
  789. border-radius: 0 0 20rpx 20rpx;
  790. text-align: center;
  791. padding-top: 4rpx;
  792. }
  793. .rules {
  794. margin: 46rpx 30rpx 0 30rpx;
  795. border-top: 1px solid #f0f0f0;
  796. padding-top: 10rpx;
  797. .item {
  798. margin-top: 20rpx;
  799. .rulesTitle {
  800. font-size: 28rpx;
  801. color: #282828;
  802. .iconfont {
  803. font-size: 30rpx;
  804. color: #333;
  805. margin-right: 8rpx;
  806. margin-top: 5rpx;
  807. }
  808. }
  809. .info {
  810. font-size: 28rpx;
  811. color: #999;
  812. margin-top: 7rpx;
  813. .time {
  814. margin-left: 20rpx;
  815. }
  816. }
  817. }
  818. }
  819. }
  820. .map {
  821. height: 86rpx;
  822. font-size: 30rpx;
  823. color: #282828;
  824. line-height: 86rpx;
  825. border-bottom: 1px solid #f0f0f0;
  826. margin-top: 15rpx;
  827. background-color: #fff;
  828. padding: 0 24rpx;
  829. .place {
  830. font-size: 26rpx;
  831. width: 176rpx;
  832. height: 50rpx;
  833. border-radius: 25rpx;
  834. line-height: 50rpx;
  835. text-align: center;
  836. .iconfont {
  837. font-size: 27rpx;
  838. height: 27rpx;
  839. line-height: 27rpx;
  840. margin: 2rpx 3rpx 0 0;
  841. }
  842. }
  843. }
  844. .refund {
  845. padding: 0 !important;
  846. margin-top: 15rpx;
  847. background-color: #fff;
  848. .title {
  849. display: flex;
  850. align-items: center;
  851. font-size: 30rpx;
  852. color: #333;
  853. height: 86rpx;
  854. border-bottom: 1px solid #f5f5f5;
  855. font-weight: 400;
  856. padding: 0 24rpx;
  857. image {
  858. width: 32rpx;
  859. height: 32rpx;
  860. margin-right: 10rpx;
  861. }
  862. }
  863. .con {
  864. font-size: 25rpx;
  865. color: #666666;
  866. padding: 30rpx 24rpx;
  867. }
  868. }
  869. }
  870. .goodCall {
  871. color: $theme-color;
  872. text-align: center;
  873. width: 100%;
  874. height: 86rpx;
  875. padding: 0 30rpx;
  876. border-bottom: 1rpx solid #eee;
  877. font-size: 30rpx;
  878. line-height: 86rpx;
  879. background: #fff;
  880. .icon-kefu {
  881. font-size: 36rpx;
  882. margin-right: 15rpx;
  883. }
  884. /* #ifdef MP */
  885. button {
  886. display: flex;
  887. align-items: center;
  888. justify-content: center;
  889. height: 86rpx;
  890. font-size: 30rpx;
  891. color: $theme-color;
  892. }
  893. /* #endif */
  894. }
  895. </style>
  896. <style>
  897. .qs-btn {
  898. width: auto;
  899. height: 60rpx;
  900. text-align: center;
  901. line-height: 60rpx;
  902. border-radius: 50rpx;
  903. color: #fff;
  904. font-size: 27rpx;
  905. padding: 0 3%;
  906. color: #aaa;
  907. border: 1px solid #ddd;
  908. margin-right: 20rpx;
  909. }
  910. </style>