xsb-orderList.vue 7.0 KB

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