index.vue 25 KB

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