order_details.vue 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475
  1. <template>
  2. <view>
  3. <view class="order-details">
  4. <view class="header-bg"></view>
  5. <view class="main">
  6. <view class="header">
  7. <view class="item" v-if="orderDetail.order_status == 0">
  8. <view class="white lg m-b-10">等待买家付款</view>
  9. <view class="white sm flex" v-if="cancelTime > 0">支付剩余 <u-count-down separator="zh"
  10. :timestamp="cancelTime" separator-color="#fff" color="#fff" :separator-size="26"
  11. :font-size="26" bg-color="transparent" @end="getOrderDetailFun"></u-count-down> 自动关闭
  12. </view>
  13. </view>
  14. <view class="item" v-if="orderDetail.order_status == 1">
  15. <view class="white lg m-b-10">等待商家发货</view>
  16. <view class="white sm">您的商品正在打包中,请耐心等待…</view>
  17. </view>
  18. <view class="item" v-if="orderDetail.order_status == 2">
  19. <view class="white lg m-b-10">已发货</view>
  20. <view class="white sm">您的商品正在路中,请耐心等待…</view>
  21. </view>
  22. <view class="item" v-if="orderDetail.order_status == 3">
  23. <view class="white lg m-b-10">已完成</view>
  24. <view class="white sm">商品已签收,期待再次购买!</view>
  25. </view>
  26. <view class="item" v-if="orderDetail.order_status == 4">
  27. <view class="white lg m-b-10">订单已关闭</view>
  28. <!-- <view class="white sm">原因:超时未支付</view> -->
  29. </view>
  30. </view>
  31. <view class="address-wrap flex contain">
  32. <image class="icon-md m-r-20" src="/static/images/icon_address.png"></image>
  33. <view class="address">
  34. <view>
  35. <text class="name md m-r-10">{{orderDetail.consignee}}</text>
  36. <text class="phone md">{{orderDetail.mobile}}</text>
  37. <view class="area sm m-t-10 lighter">{{orderDetail.delivery_address}}</view>
  38. </view>
  39. </view>
  40. </view>
  41. <view class="order-info contain" v-if="team.status_text">
  42. <view class="item flex" style="align-items: flex-start;">
  43. <view class="title">拼购状态</view>
  44. <view class="bt">{{team.status_text}}</view>
  45. </view>
  46. </view>
  47. <view class="goods contain">
  48. <view class="m-l-20">
  49. <shop-title :shop="orderDetail.shop"></shop-title>
  50. </view>
  51. <order-goods :team="team" :link="true" :isJumpGoods="true" :list="orderDetail.order_goods"></order-goods>
  52. </view>
  53. <!-- 虚拟发货内容 -->
  54. <template v-if="orderDetail.delivery_content">
  55. <view class="order-info contain" @click="copy(orderDetail.delivery_content)">
  56. <view class="item">
  57. <view class="black" style="word-break: break-all;">{{orderDetail.delivery_content || '无'}}</view>
  58. <view class="flex row-right m-t-30">
  59. <view class="copy-btn">复制</view>
  60. </view>
  61. </view>
  62. </view>
  63. </template>
  64. <view class="price contain">
  65. <view class="flex row-between">
  66. <view>商品金额</view>
  67. <view class="black">
  68. <price-format :price="orderDetail.goods_price"></price-format>
  69. </view>
  70. </view>
  71. <view class="flex row-between">
  72. <view>运费</view>
  73. <view class="black">+
  74. <price-format :price="orderDetail.shipping_price"></price-format>
  75. </view>
  76. </view>
  77. <view v-if="orderDetail.discount_amount != 0" class="flex row-between">
  78. <view>优惠券</view>
  79. <view class="primary">-
  80. <price-format :price="orderDetail.discount_amount"></price-format>
  81. </view>
  82. </view>
  83. <view v-if="orderDetail.member_amount" class="flex row-between">
  84. <view>会员抵扣</view>
  85. <view class="primary">-
  86. <price-format :price="orderDetail.member_amount"></price-format>
  87. </view>
  88. </view>
  89. <view class="flex row-right">
  90. <view class="lighter">实付金额:</view>
  91. <view class="primary xl">
  92. <price-format weight="500" :first-size="34" :second-size="34"
  93. :price="orderDetail.order_amount"></price-format>
  94. </view>
  95. </view>
  96. </view>
  97. <view class="order-info contain">
  98. <view class="item flex" style="align-items: flex-start;">
  99. <view class="title">买家留言</view>
  100. <view class="black">{{orderDetail.user_remark || '无'}}</view>
  101. </view>
  102. </view>
  103. <view class="order-info contain">
  104. <view class="item flex">
  105. <view class="title">订单编号</view>
  106. <view class="black">{{orderDetail.order_sn}}</view>
  107. </view>
  108. <view class="item flex">
  109. <view class="title">订单类型</view>
  110. <view class="black">{{orderDetail.order_type}}</view>
  111. </view>
  112. <view class="item flex">
  113. <view class="title">支付方式</view>
  114. <view class="black">{{orderDetail.pay_way}}</view>
  115. </view>
  116. <view class="item flex">
  117. <view class="title">下单时间</view>
  118. <view class="black">{{orderDetail.create_time}}</view>
  119. </view>
  120. <view v-if="orderDetail.pay_time" class="item flex">
  121. <view class="title">付款时间</view>
  122. <view class="black">{{orderDetail.pay_time}}</view>
  123. </view>
  124. <view v-if="orderDetail.shipping_time" class="item flex">
  125. <view class="title">发货时间</view>
  126. <view class="black">{{orderDetail.shipping_time }}</view>
  127. </view>
  128. <view v-if="orderDetail.confirm_take_time" class="item flex">
  129. <view class="title">成交时间</view>
  130. <view class="black">{{orderDetail.confirm_take_time }}</view>
  131. </view>
  132. <view v-if="orderDetail.cancel_time" class="item flex">
  133. <view class="title">关闭时间</view>
  134. <view class="black">{{orderDetail.cancel_time}}</view>
  135. </view>
  136. </view>
  137. <view class="footer bg-white flex fixed row-right"
  138. v-if="orderDetail.cancel_btn || orderDetail.delivery_btn || orderDetail.take_btn || orderDetail.del_btn || orderDetail.pay_btn || orderDetail.view_invoice_btn || orderDetail.save_invoice_btn">
  139. <!-- 左侧更多 -->
  140. <!-- <view class="more">
  141. <view class="flex" v-if="orderDetail.view_invoice_btn || orderDetail.save_invoice_btn" @click="moreStatus=!moreStatus">
  142. <text class="m-r-10">更多</text>
  143. <u-icon name="arrow-up" size="22"></u-icon>
  144. </view>
  145. <view class="more-container bg-white" v-show="moreStatus">
  146. <navigator v-if="orderDetail.view_invoice_btn" hover-class="none"
  147. :url="'/bundle/pages/invoice_detail/invoice_detail?id=' + orderDetail.id">
  148. <view class="more-item" >查看发票</view>
  149. </navigator>
  150. <navigator v-if="orderDetail.save_invoice_btn" hover-class="none"
  151. :url="'/bundle/pages/invoice/invoice?shop_id=' + orderDetail.shop.id + '&order_id=' + orderDetail.id + '&type=' + invoiceType">
  152. <view class="more-item">申请开票</view>
  153. </navigator>
  154. </view>
  155. </view> -->
  156. <!-- 右侧订单操作按钮组 -->
  157. <view class="flex">
  158. <view v-if="orderDetail.cancel_btn">
  159. <button size="sm" class="plain br60" hover-class="none" @tap="cancelOrder">取消订单</button>
  160. </view>
  161. <navigator v-if="orderDetail.view_invoice_btn && orderDetail.shop.open_invoice" hover-class="none" class="m-l-20"
  162. :url="'/bundle/pages/invoice_detail/invoice_detail?id=' + orderDetail.id">
  163. <button size="sm" class="plain br60" hover-class="none">查看发票</button>
  164. </navigator>
  165. <navigator v-if="orderDetail.save_invoice_btn && orderDetail.shop.open_invoice" hover-class="none" class="m-l-20"
  166. :url="'/bundle/pages/invoice/invoice?shop_id=' + orderDetail.shop.id + '&order_id=' + orderDetail.id + '&type=' + invoiceType">
  167. <button size="sm" class="plain br60" hover-class="none">申请开票</button>
  168. </navigator>
  169. <navigator v-if="orderDetail.delivery_btn" hover-class="none" class="m-l-20"
  170. :url="'/bundle/pages/goods_logistics/goods_logistics?id=' + orderDetail.id">
  171. <button size="sm" class="plain br60" hover-class="none">查看物流</button>
  172. </navigator>
  173. <view v-if="orderDetail.take_btn" class="m-l-20">
  174. <button size="sm" class="plain br60 primary red" hover-class="none"
  175. @tap.stop="comfirmOrder">确认收货</button>
  176. </view>
  177. <view v-if="orderDetail.del_btn" class="m-l-20">
  178. <button size="sm" class="plain br60" hover-class="none" @tap="delOrder">删除订单</button>
  179. </view>
  180. <view class="m-l-20" v-if="orderDetail.pay_btn">
  181. <button size="sm" class="bg-primary br60 white" @tap="payNow">立即付款</button>
  182. </view>
  183. </view>
  184. </view>
  185. </view>
  186. </view>
  187. <loading-view v-if="isFirstLoading"></loading-view>
  188. <order-dialog ref="orderDialog" :orderId="orderDetail.id" :type="type" @confirm="confirmDialog"></order-dialog>
  189. <loading-view v-if="showLoading" background-color="transparent" :size="50"></loading-view>
  190. <float-tab></float-tab>
  191. </view>
  192. </template>
  193. <script>
  194. import {
  195. getOrderDetail,
  196. cancelOrder,
  197. delOrder,
  198. confirmOrder
  199. } from '@/api/order';
  200. import {
  201. copy
  202. } from "@/utils/tools.js"
  203. import { invoiceType } from "@/utils/type.js"
  204. export default {
  205. data() {
  206. return {
  207. orderDetail: {
  208. shop: {}
  209. },
  210. team: {},
  211. isFirstLoading: true,
  212. type: 0,
  213. cancelTime: 0,
  214. showCancel: "",
  215. showLoading: false,
  216. moreStatus: false, // 更多
  217. invoiceType: invoiceType['ORDERDETAILADD']
  218. };
  219. },
  220. onLoad: function(options) {
  221. const {
  222. id
  223. } = this.$Route.query;
  224. this.id = id;
  225. },
  226. onShow() {
  227. this.moreStatus = false;
  228. this.getOrderDetailFun();
  229. },
  230. methods: {
  231. async confirmDialog() {
  232. const { type, id } = this
  233. let res = null
  234. switch (type) {
  235. case 0:
  236. res = await cancelOrder(id);
  237. break;
  238. case 1:
  239. res = await delOrder(id);
  240. break;
  241. case 2:
  242. res = await confirmOrder(id);
  243. break;
  244. }
  245. if(res.code == 1) {
  246. uni.$emit("refreshorder")
  247. if ([0, 2].includes(type)) {
  248. this.getOrderDetailFun();
  249. } else if (type == 1) {
  250. setTimeout(() => {
  251. uni.navigateBack()
  252. }, 2000)
  253. }
  254. }
  255. },
  256. // 打开弹窗
  257. dialogOpen() {
  258. this.$refs.orderDialog.open()
  259. },
  260. // 删除订单
  261. delOrder() {
  262. this.type = 1
  263. this.$nextTick(() => {
  264. this.dialogOpen();
  265. });
  266. },
  267. // 确认订单
  268. comfirmOrder() {
  269. this.type = 2
  270. this.$nextTick(() => {
  271. this.dialogOpen();
  272. });
  273. },
  274. // 取消订单
  275. cancelOrder() {
  276. this.type = 0
  277. this.$nextTick(() => {
  278. this.dialogOpen();
  279. });
  280. },
  281. // 支付
  282. payNow() {
  283. uni.$on('payment', params => {
  284. setTimeout(() => {
  285. if (params.result) {
  286. this.$toast({ title: "支付成功" })
  287. this.getOrderDetailFun();
  288. uni.$emit("refreshorder")
  289. uni.$off("payment")
  290. } else {
  291. this.$toast({ title: "支付失败" })
  292. }
  293. }, 500)
  294. })
  295. uni.navigateTo({
  296. url: `/pages/payment/payment?from=${'order'}&order_id=${this.id}`
  297. })
  298. },
  299. // 请求订单详情
  300. getOrderDetailFun() {
  301. getOrderDetail(this.id).then(res => {
  302. console.log(res)
  303. if (res.code == 1) {
  304. this.cancelTime = res.data.order_cancel_time - Date.now() / 1000;
  305. this.orderDetail = res.data
  306. this.team = res.data.team || {}
  307. this.$nextTick(() => {
  308. this.isFirstLoading = false
  309. });
  310. } else {
  311. setTimeout(() => uni.navigateBack(), 1500)
  312. }
  313. });
  314. },
  315. // 复制内容
  316. copy(content) {
  317. copy(content)
  318. }
  319. },
  320. computed: {
  321. }
  322. };
  323. </script>
  324. <style lang="scss">
  325. .bt {
  326. width: 100%;
  327. text-align: right;
  328. }
  329. .order-details {
  330. position: relative;
  331. padding-bottom: calc(120rpx + env(safe-area-inset-bottom));
  332. }
  333. .order-details .header-bg {
  334. position: absolute;
  335. top: 0;
  336. width: 100%;
  337. height: 200rpx;
  338. background-color: $-color-primary;
  339. z-index: 0;
  340. }
  341. .order-details .goods .status {
  342. height: 88rpx;
  343. padding: 0 20rpx;
  344. }
  345. .order-details .main {
  346. position: relative;
  347. z-index: 1;
  348. }
  349. .order-details .contain {
  350. margin: 0 20rpx 20rpx;
  351. border-radius: 14rpx;
  352. background-color: #fff;
  353. }
  354. .order-details .header {
  355. padding: 24rpx 40rpx;
  356. box-sizing: border-box;
  357. }
  358. .order-details .img-line {
  359. height: 1.5px;
  360. width: 100%;
  361. display: block;
  362. }
  363. .order-details .address-wrap {
  364. height: 164rpx;
  365. padding: 0 24rpx;
  366. }
  367. .order-details .order-info {
  368. padding: 12rpx 0;
  369. }
  370. .order-details .order-info .item {
  371. padding: 12rpx 24rpx;
  372. }
  373. .order-details .order-info .copy-btn {
  374. font-size: 24rpx;
  375. padding: 6rpx 18rpx;
  376. border-radius: 8rpx;
  377. color: $-color-primary;
  378. background: rgba($color: $-color-primary, $alpha: .1);
  379. }
  380. .order-details .order-info .item .title {
  381. width: 180rpx;
  382. flex: none;
  383. }
  384. .order-details .price>view {
  385. height: 60rpx;
  386. padding: 0 24rpx;
  387. }
  388. .order-details .footer {
  389. position: fixed;
  390. bottom: 0;
  391. left: 0;
  392. right: 0;
  393. height: 100rpx;
  394. padding: 0 24rpx;
  395. box-sizing: content-box;
  396. padding-bottom: env(safe-area-inset-bottom);
  397. }
  398. .footer .plain {
  399. border: 1px solid #BBBBBB;
  400. }
  401. .footer .plain.red {
  402. border: 1px solid $-color-primary;
  403. }
  404. .tips-dialog {
  405. height: 230rpx;
  406. width: 100%;
  407. }
  408. .order-details .invite-btn {
  409. background: linear-gradient(270deg, #FF2C3C 0%, #F95F2F 100%);
  410. margin: 30rpx 26rpx 40rpx;
  411. }
  412. // 点击更多
  413. .more {
  414. position: relative;
  415. .more-container {
  416. width: 200rpx;
  417. bottom: 70rpx;
  418. left: -20rpx;
  419. position: absolute;
  420. border: 1px solid #e9e9e9;
  421. .more-item {
  422. padding: 10rpx 20rpx;
  423. text-align: center;
  424. border-top: 1px solid #e9e9e9;
  425. }
  426. .more-item:first-child {
  427. border-top: 0;
  428. }
  429. }
  430. }
  431. </style>