Преглед изворни кода

```
feat(order-manage): 订单管理功能优化

- 添加订单金额列到普通订单列表
- 修复用户属性类型权限验证路径错误
- 新增景区门票业务类型及取消状态常量
- 在订单详情页面添加订单状态过滤器和证件类型过滤器
- 实现退款记录查看功能和跳转到售后订单功能
- 支持景区门票类型的订单详情展示,包括游玩信息、联系人信息等
- 添加从路由缓存中包含订单管理组件的功能
```

wenjie пре 2 дана
родитељ
комит
466698d36b

+ 3 - 1
src/layouts/modules/global-content/index.vue

@@ -23,6 +23,8 @@ const appStore = useAppStore();
 const themeStore = useThemeStore();
 const routeStore = useRouteStore();
 const tabStore = useTabStore();
+const inclludeCacheRoutes = routeStore.cacheRoutes;
+inclludeCacheRoutes.push('order-manage_normal-order');
 
 const transitionName = computed(() => (themeStore.page.animate ? themeStore.page.animateMode : ''));
 
@@ -42,7 +44,7 @@ function resetScroll() {
       @after-leave="resetScroll"
       @after-enter="appStore.setContentXScrollable(false)"
     >
-      <KeepAlive :include="routeStore.cacheRoutes" :exclude="routeStore.excludeCacheRoutes">
+      <KeepAlive :include="inclludeCacheRoutes" :exclude="routeStore.excludeCacheRoutes">
         <component
           :is="Component"
           v-if="appStore.reloadFlag"

+ 6 - 0
src/views/order-manage/normal-order/index.vue

@@ -75,6 +75,12 @@ const columns: NaiveUI.TableColumn<Api.delivery.deliveryOrder>[] = [
       );
     }
   },
+  {
+    key: 'orderMoney',
+    title: '订单金额(元)',
+    align: 'center',
+    width: 120
+  },
   {
     key: 'status',
     title: '订单状态',

+ 9 - 2
src/views/order-manage/normal-order/normal-order.ts

@@ -88,7 +88,7 @@ export const SearchForm: FormSchema[] = [
       dictCode: 'user_attr_type',
       immediate: true
     },
-    show: useAuth().hasAuth('user:attr:type')
+    show: useAuth().hasAuth('order:user:attr:type')
   },
   {
     label: '退款类型',
@@ -220,7 +220,8 @@ export const businessType = {
   DYY: '电影演出',
   DJK: '大健康',
   XNSP: '虚拟商品',
-  JY: '加油'
+  JY: '加油',
+  JDMP: '景区门票'
 };
 
 /**
@@ -688,3 +689,9 @@ export const payType = {
   1: '微信支付',
   2: '支付宝'
 };
+
+export const cancelState = {
+  0: '申请中',
+  1: '取消成功',
+  2: '取消被拒绝'
+};

+ 151 - 4
src/views/order-manage/order-detail/index.vue

@@ -1,6 +1,6 @@
 <script setup lang="tsx">
 import { onMounted, ref } from 'vue';
-import { useRoute } from 'vue-router';
+import { useRoute, useRouter } from 'vue-router';
 // import { NFlex } from 'naive-ui';
 import { NDataTable } from 'naive-ui';
 import dayjs from 'dayjs';
@@ -16,6 +16,7 @@ import { useModalFrom } from '@/components/zt/ModalForm/hooks/useModalForm';
 // import { copyTextToClipboard } from '@/utils/zt';
 import {
   businessType,
+  cancelState,
   chargeMethod,
   dvyStatus,
   orderColumns,
@@ -33,6 +34,7 @@ const orderInfo = ref<Api.delivery.deliveryOrder>();
 const TimeDown = ref<number>(0);
 dayjs.extend(duration);
 const route = useRoute();
+const router = useRouter();
 const deliveryNode = ref<any[]>([]);
 const [
   registerModalForm,
@@ -251,6 +253,56 @@ function handleFinish() {
   open(String(orderInfo.value?.orderNumber));
 }
 
+function filterStatus(val: number) {
+  if (val == 0) {
+    return '待支付';
+  } else if (val == 70 || val == 80 || val == 61) {
+    return '已完成';
+  } else if (val == 60 || val == 62) {
+    return '已取消';
+  }
+  return '进行中';
+}
+// 证件类型,0 身份证 1 学生证 2 军官证 3 护照 4 户口本(儿童请选择此项) 5 港澳通行证 6 台湾居民来往大陆通行证 7 台湾通行证 8 入台证 9 香港居民往来内地通行证 10 警官证 11 驾驶证 12 海员证 13 外国人在中国永久居留证 14澳门居民往来内地通行证 15港澳居民来往内地通行证 16港澳台居民来往内地通行证 17港澳台居民居住证 18中华人民共和国旅行证 19回乡证 20台胞证 21香港身份证
+function filterType(val: number) {
+  const typeObj = {
+    0: '身份证',
+    1: '学生证',
+    2: '军官证',
+    3: '护照',
+    4: '户口本',
+    5: '港澳通行证',
+    6: '台湾居民来往大陆通行证',
+    7: '台湾通行证',
+    8: '入台证',
+    9: '港澳居民往来内地通行证',
+    10: '警官证',
+    11: '驾驶证',
+    12: '海员证',
+    13: '外国人在中国永久居留证',
+    14: '澳门居民往来内地通行证',
+    15: '港澳居民来往内地通行证',
+    16: '港澳台居民来往内地通行证',
+    17: '港澳台居民居住证',
+    18: '中华人民共和国旅行证',
+    19: '回乡证',
+    20: '台胞证',
+    21: '香港身份证'
+  };
+  return typeObj[val as keyof typeof typeObj];
+}
+
+function handleSaleOrder(row: Api.delivery.deliveryOrder) {
+  if (!row.orderNumber) {
+    window.$message?.error('订单异常');
+  }
+  router.push({
+    path: '/order-manage/after-sales-order',
+    query: {
+      orderNumber: orderInfo.value?.orderNumber
+    }
+  });
+}
 onMounted(async () => {
   await open(String(route.query.orderNumber));
   if (route.query.type == 'ship') {
@@ -266,7 +318,7 @@ onMounted(async () => {
         <div class="mb-10px text-16px font-semibold">
           统一状态:
           <template v-if="orderInfo.businessType != 'DYY'">
-            {{ orderStatus[orderInfo.hbOrderStatus as keyof typeof orderStatus] }}
+            {{ filterStatus(orderInfo.hbOrderStatus) }}
           </template>
           <template v-else>
             {{ yppStatus[orderInfo.yppDetail?.orderState as keyof typeof yppStatus] }}
@@ -284,7 +336,7 @@ onMounted(async () => {
               orderInfo.hbOrderStatus == 20 ||
               orderInfo.hbOrderStatus == 30 ||
               orderInfo.hbOrderStatus == 40 ||
-              orderInfo.hbOrderStatus == 70
+              orderInfo.hbOrderStatus == 1
               ? '进行中'
               : orderStatus[orderInfo.hbOrderStatus as keyof typeof orderStatus]
               }}
@@ -324,7 +376,18 @@ onMounted(async () => {
           </div>
           <div>支付时间:{{ orderInfo.payTime || '暂无' }}</div>
           <div>交易号:{{ orderInfo.outTradeNo || '---' }}</div>
-          <div>退款记录:{{ orderInfo.record || '暂无' }}</div>
+          <div>
+            退款记录:{{ orderInfo.refundOrderList ? orderInfo.refundOrderList.length : '暂无' }}
+            <NButton
+              v-if="orderInfo.refundOrderList && orderInfo.refundOrderList.length > 0"
+              size="small"
+              quaternary
+              type="primary"
+              @click="handleSaleOrder(orderInfo)"
+            >
+              查看
+            </NButton>
+          </div>
         </NCard>
       </div>
       <div class="flex-1">
@@ -645,6 +708,90 @@ onMounted(async () => {
             <div>抵扣券ID:{{ orderInfo.omsOrderOilVO?.allowanceId || '---' }}</div>
             <div>优惠描述:{{ orderInfo.omsOrderOilVO?.activityName || '---' }}</div>
           </template>
+          <template v-else-if="orderInfo.businessType == 'JDMP'">
+            <div>产品编号:{{ orderInfo.backendOrderScenic.productNo || '---' }}</div>
+            <div>产品名称:{{ orderInfo.backendOrderScenic.productName || '---' }}</div>
+            <div>景区名称:{{ orderInfo.backendOrderScenic.viewName || '---' }}</div>
+            <div>
+              游玩日期:{{ orderInfo.backendOrderScenic.travelDate || '---' }}
+              {{ orderInfo.backendOrderScenic.endTravelDate ? '-' + orderInfo.backendOrderScenic.endTravelDate : '' }}
+            </div>
+            <div>备注:{{ orderInfo.backendOrderScenic.orderMemo || '---' }}</div>
+
+            <div>联系人:{{ orderInfo.backendOrderScenic.linkMan || '---' }}</div>
+            <div>联系电话:{{ orderInfo.backendOrderScenic.linkPhone || '---' }}</div>
+
+            <div
+              v-for="(item, index) in orderInfo.backendOrderScenic.omsOrderScenicPeopleList"
+              :key="index"
+              class="mt-10px border rounded-4px p-8px"
+            >
+              <div>游客姓名{{ index + 1 }}:{{ item.linkMan || '---' }}</div>
+              <div>证据类型:{{ filterType(item.linkCreditType) || '---' }}</div>
+              <div>证件号码:{{ item.linkCreditNo || '---' }}</div>
+            </div>
+
+            <NTable class="mt-20px" :single-line="false">
+              <NThead>
+                <NTr>
+                  <NTh>产品</NTh>
+                  <NTh>数量</NTh>
+                  <NTh>金额/元</NTh>
+                </NTr>
+              </NThead>
+              <NTbody>
+                <NTr>
+                  <NTd>{{ orderInfo.backendOrderScenic.productName || '---' }}</NTd>
+                  <NTd>x{{ orderInfo.backendOrderScenic.num }}</NTd>
+                  <NTd>{{ orderInfo.total }}</NTd>
+                </NTr>
+              </NTbody>
+            </NTable>
+
+            <NTable class="mt-20px" :single-line="false">
+              <NThead>
+                <NTr>
+                  <NTh>订单金额</NTh>
+                  <NTh>{{ orderInfo.backendOrderScenic.orderMoney }}</NTh>
+                </NTr>
+              </NThead>
+              <NTbody>
+                <NTr>
+                  <NTd>积分抵扣</NTd>
+                  <NTd>-{{ (Number(orderInfo.backendOrderScenic.offsetPoints) / 100).toFixed(2) || 0 }}</NTd>
+                </NTr>
+                <NTr>
+                  <NTd>微信支付</NTd>
+                  <NTd>{{ orderInfo.backendOrderScenic.actualTotal || 0 }}</NTd>
+                </NTr>
+              </NTbody>
+            </NTable>
+
+            <NTable v-if="orderInfo.backendOrderScenic.refundCreateTime" class="mt-20px" :single-line="false">
+              <NThead>
+                <NTr>
+                  <NTh>退款信息</NTh>
+                  <NTh></NTh>
+                </NTr>
+              </NThead>
+              <NTbody>
+                <NTr>
+                  <NTd>申请时间</NTd>
+                  <NTd>{{ orderInfo.backendOrderScenic.refundCreateTime || '---' }}</NTd>
+                </NTr>
+                <NTr>
+                  <NTd>申请说明</NTd>
+                  <NTd>{{ orderInfo.backendOrderScenic.cancelMemo || '---' }}</NTd>
+                </NTr>
+                <NTr>
+                  <NTd>处理状态</NTd>
+                  <NTd>
+                    {{ cancelState[orderInfo.backendOrderScenic.cancelState as keyof typeof cancelState] || '---' }}
+                  </NTd>
+                </NTr>
+              </NTbody>
+            </NTable>
+          </template>
         </NCard>
       </div>
     </div>