xsb-orderList.vue 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. <script setup lang="ts">
  2. import { StaticUrl } from '@/config'
  3. import router from '@/router'
  4. defineProps<{
  5. order: Api.xsbOrderList
  6. }>()
  7. const _emit = defineEmits<{
  8. refresh: []
  9. }>()
  10. const NodeList = ref<Api.DeliveryNode[]>([])
  11. const showNode = ref(false)
  12. // #ifdef MP-WEIXIN
  13. const plugins = requirePlugin('logisticsPlugin')
  14. // #endif
  15. async function handleCancel(order: Api.xsbOrderList) {
  16. await useUserStore().handleCommonCancelOrder?.(order)
  17. _emit('refresh')
  18. }
  19. async function handlePay(orderNumber: string) {
  20. const res = await useUserStore().handleCommonPayMent?.(orderNumber)
  21. if (res?.payType !== 1 && res) {
  22. // #ifdef MP-WEIXIN
  23. await useUserStore().getWxCommonPayment(res)
  24. _emit('refresh')
  25. // #endif
  26. // #ifdef H5
  27. useUserStore().handleCommonWechatPay(orderNumber)
  28. // #endif
  29. }
  30. else {
  31. _emit('refresh')
  32. }
  33. }
  34. async function handleSubmit(order: Api.xsbOrderList) {
  35. await useUserStore().handleCommonOrderReceive(order)
  36. _emit('refresh')
  37. }
  38. async function handleDel(order: Api.xsbOrderList) {
  39. await useUserStore().handleCommonDeleteOrder(order)
  40. _emit('refresh')
  41. }
  42. function handleClick(no: string) {
  43. router.push({ name: 'xsb-orderDetaile', params: { id: no } })
  44. }
  45. async function handleAfterSale(item: Api.xsbOrderList) {
  46. if (!item.orderItemList) {
  47. useGlobalToast().show('商品异常!')
  48. return
  49. }
  50. await useSysStore().getRefunOrder(item.orderNumber as string)
  51. }
  52. async function handleLogistics(_order: Api.xsbOrderList) {
  53. // router.push({ name: 'xsb-logistics', params: { id: order.orderNumber } })
  54. if (_order.dvyType === 3) {
  55. const res = await useUserStore().getOrderNode(String(_order.orderNumber))
  56. NodeList.value = res as Api.DeliveryNode[]
  57. showNode.value = true
  58. }
  59. if ([1, 10].includes(Number(_order.dvyType)) && _order.actualTotal) {
  60. uni.showLoading({ mask: true })
  61. try {
  62. const res = await Apis.xsb.getWaybillToken({ data: { orderNumber: String(_order.orderNumber) } })
  63. uni.hideLoading()
  64. const jsData = JSON.parse(res.data)
  65. if (jsData.errmsg === 'ok') {
  66. // #ifdef MP-WEIXIN
  67. plugins.openWaybillTracking({
  68. waybillToken: jsData.waybill_token,
  69. })
  70. // #endif
  71. }
  72. }
  73. catch {
  74. uni.hideLoading()
  75. }
  76. }
  77. }
  78. </script>
  79. <template>
  80. <view class="mb-20rpx rounded-16rpx bg-white p-24rpx">
  81. <view class="flex items-center justify-between">
  82. <view class="flex items-center">
  83. <image :src="`${StaticUrl}/order-icon.png`" class="h-36rpx w-36rpx" />
  84. <view class="ml-20rpx text-32rpx font-semibold">
  85. {{ order.shopName }}
  86. </view>
  87. </view>
  88. <view class="text-24rpx text-[#FF4D3A]">
  89. <template v-if="order.hbOrderStatus !== OrderStatus.PaddingPay">
  90. {{ useUserStore().handleXSBCommonOrderStatusText(order) }}
  91. </template>
  92. <template v-else>
  93. <view class="flex items-center">
  94. 待支付( 还剩 <wd-count-down :time="useUserStore().handleXSBCommonOrderStatusText(order)">
  95. <template #default="{ current }">
  96. <view class="text-24rpx text-[#FF4D3A]">
  97. {{ current.minutes }}:{{ current.seconds }}
  98. </view>
  99. </template>
  100. </wd-count-down> )
  101. </view>
  102. </template>
  103. </view>
  104. </view>
  105. <view class="my-24rpx h-2rpx w-full bg-[#F0F0F0]" />
  106. <view>
  107. <!-- <view class="mb20rpx box-border rounded-16rpx bg-#F9F9F9 p24rpx">
  108. <view class="flex items-center">
  109. <image :src="`${StaticUrl}/order-car.png`" class="h36rpx w36rpx" />
  110. <view class="ml20rpx text-28rpx text-#222 font-semibold">
  111. 预计10:40前可送达
  112. </view>
  113. </view>
  114. <view class="mt18rpx">
  115. 您的订单预计3月7日 10:40前送达
  116. </view>
  117. <view class="mt20rpx">
  118. 2025-03-26 11:56:07
  119. </view>
  120. </view> -->
  121. <view
  122. class="box-border h-176rpx w-full flex items-center justify-between rounded-16rpx bg-[#F9F9F9]"
  123. @click="handleClick(order.orderNumber as string)"
  124. >
  125. <view class="box-border h-full w-480rpx py-28rpx pl-20rpx">
  126. <scroll-view scroll-x class="h-full w-full whitespace-nowrap">
  127. <view class="flex items-center">
  128. <view v-for="goods in order.orderItemList" :key="goods.skuId" class="mr-50rpx">
  129. <image :src="goods.pic" class="h-120rpx w-120rpx" />
  130. </view>
  131. </view>
  132. </scroll-view>
  133. </view>
  134. <view class="box-shadow box-border h-full flex-1 flex-shrink-0 px-14rpx py-40rpx">
  135. <view class="text-center text-32rpx text-[#FF4D3A] font-semibold">
  136. ¥{{ order.actualTotal }}
  137. </view>
  138. <view class="text-center text-28rpx text-[#AAAAAA]">
  139. 共{{ order.goodsTotal }}件
  140. </view>
  141. </view>
  142. </view>
  143. </view>
  144. <view class="my-24rpx flex items-center justify-end">
  145. <template v-if="order.hbOrderStatus === OrderStatus.PaddingPay">
  146. <view class="mr-20rpx">
  147. <wd-button size="small" plain type="info" @click.stop="handleCancel(order)">
  148. 取消订单
  149. </wd-button>
  150. </view>
  151. <view class="mr-20rpx">
  152. <wd-button size="small" plain type="error" @click.stop="handlePay(order.orderNumber as string)">
  153. 付款
  154. </wd-button>
  155. </view>
  156. </template>
  157. <template v-if="[OrderStatus.OrderCancel, OrderStatus.OrderCompleted].includes(order.hbOrderStatus) ">
  158. <view class="mr-20rpx">
  159. <wd-button size="small" plain type="info" @click.stop="handleDel(order)">
  160. 删除订单
  161. </wd-button>
  162. </view>
  163. </template>
  164. <template v-if="order.hbOrderStatus === OrderStatus.OrderArrived">
  165. <view class="mr-20rpx">
  166. <wd-button size="small" plain type="info" @click.stop="handleSubmit(order)">
  167. 确认收货
  168. </wd-button>
  169. </view>
  170. </template>
  171. <template v-if="order.refundStatus != 2 && [OrderStatus.OrderWaitDelivery, OrderStatus.OrderAccepted].includes(order.hbOrderStatus) ">
  172. <view class="mr-20rpx">
  173. <wd-button size="small" plain type="info" @click.stop="() => handleAfterSale(order)">
  174. 申请售后
  175. </wd-button>
  176. </view>
  177. </template>
  178. <template v-if="[OrderStatus.OrderAccepted, OrderStatus.OrderWaitDelivery, OrderStatus.OrderDelivering].includes(order.hbOrderStatus)">
  179. <view class="mr-20rpx">
  180. <wd-button size="small" plain type="info" @click.stop="handleLogistics(order)">
  181. 查看物流
  182. </wd-button>
  183. </view>
  184. </template>
  185. </view>
  186. <Zpopup v-model="showNode" :showfooter="false">
  187. <view class="p-24rpx">
  188. <view class="text-center text-32rpx font-semibold">
  189. 订单追踪
  190. </view>
  191. <wd-steps :active="0" vertical dot>
  192. <wd-step v-for="item in NodeList" :key="item.id">
  193. <template #title>
  194. {{ item.content }}
  195. </template>
  196. <template #description>
  197. {{ item.createTime }}
  198. </template>
  199. </wd-step>
  200. </wd-steps>
  201. </view>
  202. </Zpopup>
  203. </view>
  204. </template>
  205. <style lang="scss" scoped>
  206. </style>