xsb-orderList.vue 7.4 KB

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