logistics.vue 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. <template>
  2. <div class="box">
  3. <div class="null-page" v-show="yes"></div>
  4. <el-card class="box-card logistics">
  5. <div slot="header" class="clearfix">
  6. <el-breadcrumb separator="/">
  7. <el-breadcrumb-item :to="{ path: '/member/order_list' }">订单列表</el-breadcrumb-item>
  8. <el-breadcrumb-item>物流详情</el-breadcrumb-item>
  9. </el-breadcrumb>
  10. </div>
  11. <div v-loading="loading">
  12. <el-tabs v-model="activeParcel">
  13. <el-tab-pane v-for="(packageItem, packageIndex) in packageList" :key="packageIndex" :label="packageItem.package_name" :name="'parcel_' + packageIndex">
  14. <div class="trace" v-if="packageItem.trace.success && packageItem.trace.list.length > 0">
  15. <el-timeline>
  16. <el-timeline-item
  17. v-for="(traceItem, traceIndex) in packageItem.trace.list"
  18. :timestamp="traceItem.datetime"
  19. placement="top"
  20. :type="traceIndex == 0 ? 'primary' : ''"
  21. :key="traceIndex"
  22. >
  23. <p>{{ traceItem.remark }}</p>
  24. </el-timeline-item>
  25. </el-timeline>
  26. </div>
  27. <div class="trace" v-else>
  28. <p class="empty-wrap">{{ packageItem.trace.reason }}</p>
  29. </div>
  30. <ul class="info-wrap">
  31. <li>
  32. <label>运单号码:</label>
  33. <span>{{ packageItem.delivery_no }}</span>
  34. </li>
  35. <li>
  36. <label>物流公司:</label>
  37. <span>{{ packageItem.express_company_name }}</span>
  38. </li>
  39. </ul>
  40. <ul class="goods-wrap">
  41. <li v-for="(goodsItem, goodsIndex) in packageItem.goods_list" :key="goodsIndex" @click="$util.pushToTab('/sku/' + goodsItem.sku_id)">
  42. <div class="img-wrap"><img :src="$img(goodsItem.sku_image, { size: 'mid' })" @error="imageError(packageIndex, goodsIndex)" /></div>
  43. <p class="sku-name">{{ goodsItem.sku_name }} x {{ goodsItem.num }}</p>
  44. </li>
  45. </ul>
  46. </el-tab-pane>
  47. </el-tabs>
  48. </div>
  49. </el-card>
  50. </div>
  51. </template>
  52. <script>
  53. import { apiOrderPackageInfo } from '@/api/order/order';
  54. import { mapGetters } from 'vuex';
  55. export default {
  56. name: 'logistics',
  57. components: {},
  58. data: () => {
  59. return {
  60. orderId: 0,
  61. loading: true,
  62. activeParcel: 'parcel_0',
  63. packageList: [],
  64. yes: true
  65. };
  66. },
  67. created() {
  68. this.orderId = this.$route.query.order_id;
  69. if (!this.orderId) this.$router.push({ path: '/member/order_list' });
  70. this.getOrderPackageInfo();
  71. },
  72. computed: {
  73. ...mapGetters(['defaultGoodsImage'])
  74. },
  75. layout: 'member',
  76. mounted() {
  77. let self = this;
  78. setTimeout(function() {
  79. self.yes = false
  80. }, 300)
  81. },
  82. methods: {
  83. getOrderPackageInfo() {
  84. apiOrderPackageInfo({
  85. order_id: this.orderId
  86. })
  87. .then(res => {
  88. if (res.code >= 0) {
  89. this.packageList = res.data;
  90. this.packageList.forEach(item => {
  91. if (item.trace.list) {
  92. item.trace.list = item.trace.list.reverse();
  93. }
  94. });
  95. this.loading = false;
  96. } else {
  97. this.$message({
  98. message: '未获取到订单包裹信息!',
  99. type: 'warning',
  100. duration: 2000,
  101. onClose: () => {
  102. this.$router.push({ path: '/member/order_list' });
  103. }
  104. });
  105. }
  106. })
  107. .catch(res => {
  108. this.loading = false;
  109. });
  110. },
  111. imageError(packageIndex, goodsIndex) {
  112. this.packageList[packageIndex].goods_list[goodsIndex].sku_image = this.defaultGoodsImage;
  113. }
  114. }
  115. };
  116. </script>
  117. <style lang="scss" scoped>
  118. .box {
  119. width: 100%;
  120. position: relative;
  121. }
  122. .null-page {
  123. width: 100%;
  124. height: 730px;
  125. background-color: #FFFFFF;
  126. position: absolute;
  127. top: 0;
  128. left: 0;
  129. z-index: 9;
  130. }
  131. .logistics {
  132. .trace {
  133. .empty-wrap {
  134. padding: 10px 0;
  135. }
  136. }
  137. .info-wrap {
  138. overflow: hidden;
  139. display: flex;
  140. flex-wrap: wrap;
  141. li {
  142. flex: 0 0 33.3333%;
  143. margin-bottom: 10px;
  144. span {
  145. font-weight: bold;
  146. }
  147. }
  148. }
  149. .goods-wrap {
  150. overflow: hidden;
  151. margin: 10px 0;
  152. li {
  153. float: left;
  154. width: 130px;
  155. margin-right: 7px;
  156. cursor: pointer;
  157. &:nth-child(n + 7) {
  158. margin-right: 0;
  159. }
  160. .img-wrap {
  161. width: 120px;
  162. }
  163. .sku-name {
  164. margin-top: 5px;
  165. overflow: hidden;
  166. text-overflow: ellipsis;
  167. display: -webkit-box;
  168. -webkit-line-clamp: 2;
  169. -webkit-box-orient: vertical;
  170. font-size: $ns-font-size-sm;
  171. }
  172. }
  173. }
  174. }
  175. </style>