goods_logistics.vue 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  1. <template>
  2. <view>
  3. <view class="goods-logistics p-t-20">
  4. <view class="header flex bg-white">
  5. <view class="goods m-r-20">
  6. <image class="goods-img" :src="order.image"></image>
  7. <view class="count xs white br60">共{{order.count}}件商品</view>
  8. </view>
  9. <view class="info sm">
  10. <view class="bold lg">{{order.tips}}</view>
  11. <view class="black m-t-10 m-b-10">物流公司:{{order.shipping_name}}</view>
  12. <view class="row">
  13. <text class="black">快递单号:{{order.invoice_no}}</text>
  14. <text class="primary m-l-20" @tap="onCopy">复制</text>
  15. </view>
  16. </view>
  17. </view>
  18. <view class="main m-t-20 bg-white column">
  19. <!-- 物流时间轴 -->
  20. <view class="express">
  21. <!-- 顶部收货地址 -->
  22. <view class="express-address row" v-if="take.contacts">
  23. <view class="express-left flex-col col-center">
  24. <image class="express-icon" :src="finish.tips ? '/bundle/static/logistics_address.png' : '/bundle/static/logistics_address_gray.png'"></image>
  25. <view class="express-line"></view>
  26. </view>
  27. <view class="express-right">
  28. <view class="name bold mb10 sm">{{take.contacts}} {{take.mobile}}</view>
  29. <view class="address sm lighter line2">{{take.address}}</view>
  30. </view>
  31. </view>
  32. <view class="express-item row" v-if="finish.tips">
  33. <view class="express-left flex-col col-center">
  34. <image class="express-icon" src="/bundle/static/logistics_success.png"></image>
  35. <view class="express-line"></view>
  36. </view>
  37. <view class="express-right">
  38. <view class="title bold sm">{{finish.title}}</view>
  39. <view class="dec sm">{{finish.tips}}</view>
  40. <view class="time xs muted">{{finish.time}}</view>
  41. </view>
  42. </view>
  43. <view class="express-item row" v-if="delivery.traces && delivery.traces.length">
  44. <view class="express-left flex-col col-center">
  45. <image class="express-icon" src="/bundle/static/logistics_transit.png"></image>
  46. <view class="express-line"></view>
  47. </view>
  48. <view class="express-right muted">
  49. <view class="title bold sm ">{{delivery.title}}</view>
  50. <view class="xs" v-if="delivery.traces[0][0]">
  51. {{delivery.traces[0][0]}}
  52. </view>
  53. <view class="xs" v-if="delivery.traces[0][1]">
  54. {{delivery.traces[0][1]}}
  55. </view>
  56. <view class="xs" v-if="delivery.traces[0][2]">
  57. {{delivery.traces[0][2]}}
  58. </view>
  59. </view>
  60. </view>
  61. <block v-for="(item, index) in delivery.traces" :key="index">
  62. <view class="express-item row" v-if="index >= 1">
  63. <view class="express-left flex-col col-center">
  64. <view class="express-doted"></view>
  65. <view class="express-line"></view>
  66. </view>
  67. <view class="express-right muted">
  68. <view class="sm" v-if="item[0]">{{item[0]}}</view>
  69. <view class="sm" v-if="item[1]">{{item[1]}}</view>
  70. <view class="sm" v-if="item[2]">{{item[2]}}</view>
  71. </view>
  72. </view>
  73. </block>
  74. <view class="express-item row" v-if="shipment.tips">
  75. <view class="express-left flex-col col-center">
  76. <image class="express-icon" src="/bundle/static/logistics_delivered.png"></image>
  77. <view class="express-line"></view>
  78. </view>
  79. <view class="express-right muted">
  80. <view class="title bold sm">{{shipment.title}}</view>
  81. <view class="dec xs">{{shipment.tips}}</view>
  82. <view class="time xs muted">{{shipment.time}}</view>
  83. </view>
  84. </view>
  85. <view class="express-item row" v-if="buy.tips">
  86. <view class="express-left flex-col col-center">
  87. <image class="express-icon" src="/bundle/static/logistics_pay.png"></image>
  88. <view class="express-line"></view>
  89. </view>
  90. <view class="express-right muted">
  91. <view class="title bold sm">{{buy.title}}</view>
  92. <view class="dec xs">{{buy.tips}}</view>
  93. <view class="time xs muted">{{buy.time}}</view>
  94. </view>
  95. </view>
  96. </view>
  97. </view>
  98. </view>
  99. <recommend></recommend>
  100. <loading-view v-if="isFirstLoading"></loading-view>
  101. </view>
  102. </template>
  103. <script>
  104. import {
  105. orderTraces
  106. } from '@/api/order';
  107. import { getIntegralOrderTraces } from '@/api/activity'
  108. import {copy} from '@/utils/tools'
  109. export default {
  110. data() {
  111. return {
  112. shipment: {},
  113. buy: {},
  114. delivery: {},
  115. finish: {},
  116. order: {},
  117. take: {},
  118. isFirstLoading: true
  119. };
  120. },
  121. onLoad () {
  122. this.id = this.$Route.query.id
  123. this.type = this.$Route.query.type
  124. this.orderTracesFun();
  125. },
  126. methods: {
  127. async orderTracesFun() {
  128. const {
  129. code,
  130. data: {
  131. shipment,
  132. buy,
  133. delivery,
  134. finish,
  135. order,
  136. take
  137. }
  138. } = this.type == 'integral' ? await getIntegralOrderTraces(this.id) : await orderTraces(this.id)
  139. if (code == 1) {
  140. this.shipment = shipment
  141. this.buy = buy
  142. this.delivery = delivery
  143. this.finish = finish
  144. this.order = order
  145. this.take = take
  146. this.isFirstLoading = false
  147. } else {
  148. setTimeout(() => uni.navigateBack(), 1000);
  149. }
  150. },
  151. onCopy() {
  152. copy(this.order.invoice_no)
  153. }
  154. }
  155. };
  156. </script>
  157. <style lang="scss">
  158. .goods-logistics {
  159. padding-top: 20rpx;
  160. .header {
  161. padding: 20rpx;
  162. .goods-img {
  163. width: 160rpx;
  164. height: 160rpx;
  165. flex: none;
  166. border-radius: 10rpx;
  167. }
  168. }
  169. .goods {
  170. position: relative;
  171. .count {
  172. position: absolute;
  173. bottom: 0;
  174. width: 100%;
  175. text-align: center;
  176. background-color: rgba(0, 0, 0, 0.6);
  177. padding: 4rpx 0;
  178. }
  179. }
  180. .express {
  181. width: 700rpx;
  182. padding-top: 30rpx;
  183. padding-bottom: 100rpx;
  184. margin: 0 auto;
  185. border-radius: 10rpx;
  186. }
  187. .express-address,
  188. .express-item {
  189. align-items: flex-start;
  190. position: relative;
  191. padding: 20rpx 0;
  192. }
  193. .express-left {
  194. margin-top: 10rpx;
  195. margin-right: 24rpx;
  196. height: 100%;
  197. position: absolute;
  198. width: 40rpx;
  199. flex: none;
  200. .express-icon {
  201. width: 40rpx;
  202. height: 40rpx;
  203. }
  204. .express-line {
  205. flex: 1;
  206. border-left: 1px dotted #E5E5E5;
  207. }
  208. .express-doted {
  209. width: 16rpx;
  210. height: 16rpx;
  211. border-radius: 50%;
  212. background-color: #E5E5E5;
  213. }
  214. }
  215. .express-right {
  216. padding-left: 60rpx;
  217. & .title,
  218. & .dec {
  219. margin-bottom: 5rpx;
  220. }
  221. }
  222. .express-item:last-of-type .express-left .express-line {
  223. border: none;
  224. }
  225. }
  226. </style>