orderList.vue 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. <script setup lang="ts">
  2. import { tabsList } from '../order-data'
  3. import attractionsList from '@/subPack-smqjh/components/attractions-orderList/attractions-orderList.vue?async'
  4. import { createGlobalLoadingMiddleware } from '@/api/core/middleware'
  5. const tab = ref<number>(0)
  6. const { statusBarHeight, MenuButtonHeight } = storeToRefs(useSysStore())
  7. // 状态映射:tab索引 -> 接口status
  8. const statusMap: Record<number, number> = {
  9. 0: 0, // 全部
  10. 1: 1, // 待支付
  11. 2: 2, // 已支付
  12. 3: 3, // 已取消
  13. 4: 4, // 已完成
  14. }
  15. const { data: orderList, isLastPage, page, error, refresh, reload } = usePagination((pageNum, pageSize) => Apis.xsb.orderList({ data: {
  16. businessType: 'JDMP',
  17. pageNum,
  18. pageSize,
  19. orderStatus: statusMap[tab.value],
  20. } }), {
  21. immediate: true,
  22. pageNum: 1,
  23. pageSize: 10,
  24. initialData: [],
  25. data: res => res.data?.list,
  26. append: true,
  27. middleware: createGlobalLoadingMiddleware(),
  28. })
  29. // tab切换
  30. function handleClick(e: { index: number }) {
  31. tab.value = e.index
  32. orderList.value = []
  33. refresh()
  34. }
  35. onReachBottom(() => {
  36. if (!isLastPage.value) {
  37. page.value++
  38. refresh()
  39. }
  40. })
  41. const state = computed(() => {
  42. return error.value ? 'error' : !isLastPage.value ? 'loading' : 'finished'
  43. })
  44. </script>
  45. <template>
  46. <view class="attractions-order-page" style="min-height: 100vh; background-color: #f6f6f6;">
  47. <wd-navbar
  48. title="订单列表" custom-style="background-color:#FFF" :bordered="false" :z-index="99"
  49. safe-area-inset-top fixed
  50. />
  51. <view :style="{ paddingTop: `${(Number(statusBarHeight) || 44) + MenuButtonHeight + 12}px` }" />
  52. <wd-tabs v-model="tab" :offset-top="statusBarHeight + MenuButtonHeight + 12" sticky custom-style="background-color: transparent;" @click="handleClick">
  53. <block v-for="(item, index) in tabsList" :key="index">
  54. <wd-tab :title="item">
  55. <view class="box-border w-full overflow-hidden px24rpx">
  56. <view class="h-20rpx" />
  57. <StatusTip v-if="!orderList.length" tip="暂无内容" />
  58. <view v-for="order in orderList" :key="order.orderNumber" class="w-full overflow-hidden">
  59. <attractionsList :order="order" />
  60. </view>
  61. <wd-loadmore :state="state" :loading-props="{ color: '#9ED605', size: 20 }" @reload="reload" />
  62. <view class="h-40rpx" />
  63. </view>
  64. </wd-tab>
  65. </block>
  66. </wd-tabs>
  67. </view>
  68. </template>
  69. <style lang="scss" scoped></style>