瀏覽代碼

feat:update 修改代码入参规范,调整订单列表详情传参规则

叶静 2 天之前
父節點
當前提交
7e4c6dbd57

+ 6 - 0
.promptx/memory/vue3-expert/declarative.dpml

@@ -63,4 +63,10 @@
     </content>
     <tags>#最佳实践 #工具使用</tags>
   </item>
+  <item id="mem_1755138100036_7ynkrvdao" time="2025/08/14 10:21">
+    <content>
+      项目已引入UnoCSS原子化CSS框架,后续开发中有样式需求时,优先使用UnoCSS的原子化类名而不是自定义CSS。UnoCSS配置文件为uno.config.js,支持Preset Uno和Transformer Directives。开发时应该:1. 优先使用UnoCSS原子化类名(如 flex, items-center, justify-between, p-4, m-2等);2. 减少自定义CSS的编写;3. 保持与现有sa-前缀组件的兼容性;4. 利用UnoCSS的响应式、状态变体等高级特性。
+    </content>
+    <tags>#其他</tags>
+  </item>
 </memory>

File diff suppressed because it is too large
+ 7 - 166
.promptx/pouch.json


+ 11 - 11
.promptx/resource/project.registry.json

@@ -4,8 +4,8 @@
   "metadata": {
     "version": "2.0.0",
     "description": "project 级资源注册表",
-    "createdAt": "2025-08-08T01:17:13.090Z",
-    "updatedAt": "2025-08-08T01:17:13.096Z",
+    "createdAt": "2025-08-14T02:16:18.307Z",
+    "updatedAt": "2025-08-14T02:16:18.316Z",
     "resourceCount": 3
   },
   "resources": [
@@ -17,9 +17,9 @@
       "description": "执行模式,定义具体的行为模式",
       "reference": "@project://.promptx/resource/role/vue3-expert/execution/vue3-development.execution.md",
       "metadata": {
-        "createdAt": "2025-08-08T01:17:13.094Z",
-        "updatedAt": "2025-08-08T01:17:13.094Z",
-        "scannedAt": "2025-08-08T01:17:13.094Z",
+        "createdAt": "2025-08-14T02:16:18.311Z",
+        "updatedAt": "2025-08-14T02:16:18.311Z",
+        "scannedAt": "2025-08-14T02:16:18.311Z",
         "path": "role/vue3-expert/execution/vue3-development.execution.md"
       }
     },
@@ -31,9 +31,9 @@
       "description": "思维模式,指导AI的思考方式",
       "reference": "@project://.promptx/resource/role/vue3-expert/thought/vue3-thinking.thought.md",
       "metadata": {
-        "createdAt": "2025-08-08T01:17:13.095Z",
-        "updatedAt": "2025-08-08T01:17:13.095Z",
-        "scannedAt": "2025-08-08T01:17:13.095Z",
+        "createdAt": "2025-08-14T02:16:18.313Z",
+        "updatedAt": "2025-08-14T02:16:18.313Z",
+        "scannedAt": "2025-08-14T02:16:18.313Z",
         "path": "role/vue3-expert/thought/vue3-thinking.thought.md"
       }
     },
@@ -45,9 +45,9 @@
       "description": "专业角色,提供特定领域的专业能力",
       "reference": "@project://.promptx/resource/role/vue3-expert/vue3-expert.role.md",
       "metadata": {
-        "createdAt": "2025-08-08T01:17:13.095Z",
-        "updatedAt": "2025-08-08T01:17:13.095Z",
-        "scannedAt": "2025-08-08T01:17:13.095Z",
+        "createdAt": "2025-08-14T02:16:18.315Z",
+        "updatedAt": "2025-08-14T02:16:18.315Z",
+        "scannedAt": "2025-08-14T02:16:18.314Z",
         "path": "role/vue3-expert/vue3-expert.role.md"
       }
     }

+ 26 - 19
src/app/shop/admin/finance/commission/detail.vue

@@ -14,8 +14,8 @@
           <el-col :span="6">
             <div class="info-item">
               <span class="label">状态:</span>
-              <el-tag :type="getStatusType(commissionDetail.status)">
-                {{ getStatusText(commissionDetail.status) }}
+              <el-tag :type="getStatusType('commission', commissionDetail.status)">
+                {{ getStatusText('commission', commissionDetail.status) }}
               </el-tag>
             </div>
           </el-col>
@@ -156,23 +156,30 @@
     pageData: logPageData,
   });
 
-  // 获取状态类型
-  function getStatusType(status) {
-    const statusMap = {
-      1: 'warning', // 未结算
-      2: 'success', // 已结算
-    };
-    return statusMap[status] || 'info';
-  }
-
-  // 获取状态文本
-  function getStatusText(status) {
-    const statusMap = {
-      1: '未结算',
-      2: '已结算',
-    };
-    return statusMap[status] || '未知';
-  }
+  // 通用状态处理函数
+  const getStatusText = (type, value) => {
+    // 对于佣金状态,直接使用financeUtils中的函数
+    if (type === 'commission') {
+      const statusMap = {
+        1: '未结算',
+        2: '已结算',
+      };
+      return statusMap[value] || '未知';
+    }
+    return '未知';
+  };
+
+  const getStatusType = (type, value) => {
+    // 对于佣金状态,直接使用financeUtils中的函数
+    if (type === 'commission') {
+      const statusMap = {
+        1: 'warning', // 未结算
+        2: 'success', // 已结算
+      };
+      return statusMap[value] || 'info';
+    }
+    return 'info';
+  };
 
   // 获取佣金类型文本
   function getBizTypeText(bizType) {

+ 1 - 1
src/app/shop/admin/goods/goods.service.js

@@ -35,7 +35,7 @@ const api = {
     // 批量上下架
     batchShowStatus: (data) =>
       request({
-        url: '/product/batchShowStatus',
+        url: 'mall/product/batchShowStatus',
         method: 'POST',
         params: data,
       }),

+ 69 - 32
src/app/shop/admin/goods/goods/select.vue

@@ -123,7 +123,8 @@
   const table = reactive({
     list: [],
     ids: props.modal.params.ids || [],
-    selectedGoods: [], // 存储选中的商品完整数据
+    selectedGoods: new Map(), // 使用Map存储选中的商品完整数据,key为商品id
+    preloadedGoods: new Map(), // 存储预加载的商品数据
   });
   async function getData(page, searchParams = {}) {
     if (page) pageData.page = page;
@@ -145,6 +146,8 @@
 
         nextTick(() => {
           setDefaultSelected();
+          // 初始化当前页面的选中商品数据
+          initSelectedGoods();
         });
       }
     } catch (error) {
@@ -180,13 +183,15 @@
       if (table.ids.includes(row.id)) {
         let index = table.ids.findIndex((id) => id == row.id);
         table.ids.splice(index, 1);
+        // 从选中商品数据中移除
+        table.selectedGoods.delete(row.id);
       } else {
         table.ids.push(row.id);
+        // 添加到选中商品数据中
+        addToSelectedGoods(row);
       }
     }
     toggleRowSelection('row', selection, row);
-    // 更新选中的商品数据
-    updateSelectedGoods();
   }
   function selectAll(selection) {
     if (
@@ -194,23 +199,27 @@
       (props.modal.params.max && props.modal.params.max > table.ids.length + selection.length)
     ) {
       if (selection.length == 0) {
+        // 取消全选:移除当前页面的所有选中项
         table.list.forEach((l) => {
           if (table.ids.includes(l.id)) {
             let index = table.ids.findIndex((id) => id == l.id);
             table.ids.splice(index, 1);
+            // 从选中商品数据中移除
+            table.selectedGoods.delete(l.id);
           }
         });
       } else {
+        // 全选:添加当前页面的所有项
         table.list.forEach((l) => {
           if (!table.ids.includes(l.id)) {
             table.ids.push(l.id);
+            // 添加到选中商品数据中
+            addToSelectedGoods(l);
           }
         });
       }
     }
     toggleRowSelection('all', selection);
-    // 更新选中的商品数据
-    updateSelectedGoods();
   }
 
   function toggleRowSelection(type, selection, row) {
@@ -234,17 +243,49 @@
     }
   }
 
-  // 更新选中的商品数据
-  function updateSelectedGoods() {
-    table.selectedGoods = table.list
-      .filter((item) => table.ids.includes(item.id))
-      .map((item) => ({
-        id: item.id,
-        title: item.title,
-        image: item.image,
-        price: item.price || item.current_price || item.original_price,
-        stock: item.stock,
-      }));
+  // 添加商品到选中数据集合
+  function addToSelectedGoods(item) {
+    const goodsData = {
+      id: item.id,
+      title: item.title || item.storeName,
+      image: item.image,
+      price: item.price || item.current_price || item.original_price || item.otPrice,
+      stock: item.stock,
+    };
+    table.selectedGoods.set(item.id, goodsData);
+  }
+
+  // 初始化时添加已选中的商品数据
+  function initSelectedGoods() {
+    table.list.forEach((item) => {
+      if (table.ids.includes(item.id)) {
+        addToSelectedGoods(item);
+      }
+    });
+  }
+
+  // 预加载所有已选中商品的完整数据
+  async function preloadSelectedGoods() {
+    if (!table.ids.length) return;
+
+    try {
+      // 批量获取已选中商品的详细信息
+      const promises = table.ids.map(async (id) => {
+        try {
+          const { code, data } = await api.goods.info(id);
+          if (code === '200' && data) {
+            addToSelectedGoods(data);
+            table.preloadedGoods.set(id, data);
+          }
+        } catch (error) {
+          console.warn(`获取商品${id}详情失败:`, error);
+        }
+      });
+
+      await Promise.allSettled(promises);
+    } catch (error) {
+      console.error('预加载选中商品数据失败:', error);
+    }
   }
 
   function singleSelect(id) {
@@ -253,9 +294,13 @@
     if (selectedItem) {
       const goodsData = {
         id: selectedItem.id,
-        title: selectedItem.title,
+        title: selectedItem.title || selectedItem.storeName,
         image: selectedItem.image,
-        price: selectedItem.price || selectedItem.current_price || selectedItem.original_price,
+        price:
+          selectedItem.price ||
+          selectedItem.current_price ||
+          selectedItem.original_price ||
+          selectedItem.otPrice,
         stock: selectedItem.stock,
       };
 
@@ -267,19 +312,8 @@
   }
 
   function confirm() {
-    // 直接使用选中的商品数据
-    const selectedGoodsData =
-      table.selectedGoods.length > 0
-        ? table.selectedGoods
-        : table.list
-            .filter((item) => table.ids.includes(item.id))
-            .map((item) => ({
-              id: item.id,
-              title: item.title,
-              image: item.image,
-              price: item.price || item.current_price || item.original_price,
-              stock: item.stock,
-            }));
+    // 将Map转换为数组,获取所有选中的商品数据
+    const selectedGoodsData = Array.from(table.selectedGoods.values());
 
     emit('modalCallBack', {
       event: 'confirm',
@@ -287,7 +321,10 @@
     });
   }
 
-  onMounted(() => {
+  onMounted(async () => {
+    // 先预加载已选中的商品数据
+    await preloadSelectedGoods();
+    // 再获取第一页数据
     getData();
   });
 </script>

+ 3 - 6
src/app/shop/admin/marketing/group/index.vue

@@ -372,17 +372,16 @@
       // 使用 CRUD 的 edit 方法更新活动商品
       const productIds = goodsList.map((item) => ({ productId: item.id }));
 
-      const { code, message } = await api.group.addActivityProduct(activityId, productIds);
+      const { code, message } = await api.group.addActivityProduct(activityId, {
+        list: productIds,
+      });
 
       if (code === '200') {
         ElMessage.success('商品设置成功');
         getData(); // 刷新列表
-      } else {
-        ElMessage.error(message || '设置商品失败');
       }
     } catch (error) {
       console.error('设置商品失败:', error);
-      ElMessage.error('设置商品失败');
     }
   }
 
@@ -431,8 +430,6 @@
         ElMessage.success('批量删除成功');
         getData();
         table.selected = []; // 清空选中项
-      } else {
-        ElMessage.error(message || '批量删除失败');
       }
     } catch (error) {
       console.error('批量删除失败:', error);

+ 2 - 3
src/app/shop/admin/marketing/marketing.service.js

@@ -28,15 +28,14 @@ const api = {
     getActivityProductIds: (activityId) =>
       request({
         url: `mall/combination/getActivityProductIds`,
-        method: 'POST',
+        method: 'GET',
         params: { activityId },
       }),
     addActivityProduct: (activityId, data) =>
       request({
         url: `mall/combination/addActivityProduct`,
         method: 'POST',
-        params: { activityId },
-        data,
+        data: { ...data, activityId },
       }),
     select: (params) => SELECT('shop/admin/group_buy', params),
   },

+ 13 - 20
src/app/shop/admin/order/order.service.js

@@ -2,21 +2,18 @@ import Content from '@/sheep/layouts/content.vue';
 import { request } from '@/sheep/request';
 import { REPORT } from '@/sheep/request/crud';
 
-// 订单状态配置
+// 订单状态配置 - 根据最新状态机调整
 export const ORDER_STATUS = {
-  // 支付状态
-  PAY_STATUS: {
-    0: { text: '待付款', type: 'warning' },
-    1: { text: '已付款', type: 'success' },
-  },
-
-  // 订单状态
+  // 订单状态 - 新的状态机
   ORDER_STATUS: {
-    0: { text: '待发货', type: 'warning' },
-    1: { text: '待收货', type: 'primary' },
-    3: { text: '已完成', type: 'success' },
-    4: { text: '已关闭', type: 'info' },
-    5: { text: '已取消', type: 'danger' },
+    1: { text: '待支付', type: 'warning' },
+    2: { text: '订单取消', type: 'danger' },
+    3: { text: '已支付', type: 'success' },
+    4: { text: '失败已退款', type: 'info' },
+    5: { text: '待发货', type: 'warning' },
+    6: { text: '未中奖关闭', type: 'info' },
+    7: { text: '待收货', type: 'primary' },
+    8: { text: '订单完成', type: 'success' },
   },
 
   // 退款状态
@@ -50,11 +47,6 @@ export const ORDER_STATUS = {
   },
 };
 
-// 获取支付状态信息
-export function getPayStatusInfo(paid) {
-  return ORDER_STATUS.PAY_STATUS[paid] || { text: '未知', type: 'info' };
-}
-
 // 获取订单状态信息
 export function getOrderStatusInfo(status) {
   return ORDER_STATUS.ORDER_STATUS[status] || { text: '未知', type: 'info' };
@@ -230,9 +222,10 @@ const api = {
         method: 'POST',
       }),
     // 获取拼团信息
-    getPinkList: (orderId) =>
+    getPinkList: (id) =>
       request({
-        url: `/mall/pink/orderPink/${orderId}`,
+        url: `/mall/pink/orderPink`,
+        params: { id },
         method: 'GET',
       }),
   },

+ 38 - 80
src/app/shop/admin/order/order/detail.vue

@@ -18,6 +18,7 @@
       <!-- 基本信息 -->
       <div class="basic-info sa-m-b-26">
         <h3 class="sa-m-b-20">基本信息</h3>
+        <!-- 第一行:订单编号、订单状态、拼团状态、全部金额 -->
         <el-row :gutter="20">
           <el-col :span="6">
             <div class="info-item">
@@ -25,37 +26,19 @@
               <span class="value">{{ state.orderDetail.orderId || '--' }}</span>
             </div>
           </el-col>
-          <el-col :span="6">
-            <div class="info-item">
-              <span class="label">支付状态:</span>
-              <el-tag :type="getPayStatusType(state.orderDetail.paid)">
-                {{ getPayStatusText(state.orderDetail.paid) }}
-              </el-tag>
-            </div>
-          </el-col>
           <el-col :span="6">
             <div class="info-item">
               <span class="label">订单状态:</span>
-              <el-tag :type="getOrderStatusType(state.orderDetail.status)">
-                {{ getOrderStatusText(state.orderDetail.status) }}
+              <el-tag :type="getStatusType('order', state.orderDetail.status)">
+                {{ getStatusText('order', state.orderDetail.status) }}
               </el-tag>
             </div>
           </el-col>
           <el-col :span="6">
             <div class="info-item">
               <span class="label">拼团状态:</span>
-              <el-tag :type="getPinkStatusType(state.orderDetail.pinkStatus)">
-                {{ getPinkStatusText(state.orderDetail.pinkStatus) }}
-              </el-tag>
-            </div>
-          </el-col>
-        </el-row>
-        <el-row :gutter="20" class="sa-m-t-12">
-          <el-col :span="6">
-            <div class="info-item">
-              <span class="label">退款状态:</span>
-              <el-tag :type="getRefundStatusType(state.orderDetail.refundStatus)">
-                {{ getRefundStatusText(state.orderDetail.refundStatus) }}
+              <el-tag :type="getStatusType('pink', state.orderDetail.pinkStatus)">
+                {{ getStatusText('pink', state.orderDetail.pinkStatus) }}
               </el-tag>
             </div>
           </el-col>
@@ -65,11 +48,14 @@
               <span class="value">৳{{ state.orderDetail.totalPrice || 0 }}</span>
             </div>
           </el-col>
+        </el-row>
+        <!-- 第二行:中奖状态、用户名、支付方式、优惠金额 -->
+        <el-row :gutter="20" class="sa-m-t-12">
           <el-col :span="6">
             <div class="info-item">
               <span class="label">中奖状态:</span>
-              <el-tag :type="getWinStatusType(state.orderDetail.winStatus)">
-                {{ getWinStatusText(state.orderDetail.winStatus) }}
+              <el-tag :type="getStatusType('win', state.orderDetail.winStatus)">
+                {{ getStatusText('win', state.orderDetail.winStatus) }}
               </el-tag>
             </div>
           </el-col>
@@ -79,8 +65,6 @@
               <span class="value">{{ state.orderDetail.realName || '--' }}</span>
             </div>
           </el-col>
-        </el-row>
-        <el-row :gutter="20" class="sa-m-t-12">
           <el-col :span="6">
             <div class="info-item">
               <span class="label">支付方式:</span>
@@ -93,6 +77,9 @@
               <span class="value">৳{{ state.orderDetail.deductionPrice || 0 }}</span>
             </div>
           </el-col>
+        </el-row>
+        <!-- 第三行:奖励佣金、手机号码、支付金额、实付金额 -->
+        <el-row :gutter="20" class="sa-m-t-12">
           <el-col :span="6">
             <div class="info-item">
               <span class="label">奖励佣金:</span>
@@ -105,8 +92,6 @@
               <span class="value">{{ state.orderDetail.userPhone || '--' }}</span>
             </div>
           </el-col>
-        </el-row>
-        <el-row :gutter="20" class="sa-m-t-12">
           <el-col :span="6">
             <div class="info-item">
               <span class="label">支付金额:</span>
@@ -155,19 +140,16 @@
 
       <!-- 操作按钮 -->
       <div class="action-buttons sa-m-b-26">
-        <!-- 取消订单按钮 - 只在待付状态显示 -->
-        <el-button v-if="state.orderDetail.paid === 0" type="warning" plain @click="onCancelOrder"
+        <!-- 取消订单按钮 - 只在待付状态显示 -->
+        <el-button v-if="state.orderDetail.status === 1" type="warning" plain @click="onCancelOrder"
           >取消订单</el-button
         >
-        <!-- 立即发货按钮 - 已付款待发货状态显示 -->
+        <!-- 立即发货按钮 - 待发货状态显示 -->
         <el-button type="primary" @click="onDispatch">立即发货测试</el-button>
-        <el-button
-          type="primary"
-          @click="onDispatch"
-          v-if="state.orderDetail.paid === 1 && state.orderDetail.status === 0"
+        <el-button type="primary" @click="onDispatch" v-if="state.orderDetail.status === 5"
           >立即发货</el-button
         >
-        <!-- 全部退款按钮 - 固定显示 -->
+        <!-- 全部退款按钮 - 在已支付、待发货、待收货状态显示 -->
         <el-button type="danger" plain @click="onRefund">全部退款</el-button>
       </div>
       <!-- 商品信息 -->
@@ -192,8 +174,8 @@
         </el-table>
       </div>
 
-      <!-- 收货信息 -->
-      <div class="address-content sa-m-b-16" v-if="state.orderDetail.status == 1">
+      <!-- 收货信息 - 在待收货和订单完成状态显示 -->
+      <div class="address-content sa-m-b-16" v-if="[7, 8].includes(state.orderDetail.status)">
         <div class="sa-title sa-m-b-10">收货信息</div>
         <el-table class="sa-table" :data="[state.orderDetail.orderAddressVO]" stripe border>
           <el-table-column label="收件人" prop="realName" align="center" />
@@ -264,9 +246,7 @@
   import { ElMessage, ElMessageBox } from 'element-plus';
   import {
     api,
-    getPayStatusInfo,
     getOrderStatusInfo,
-    getRefundStatusInfo,
     getPinkStatusInfo,
     getWinStatusInfo,
     getPayTypeText,
@@ -370,46 +350,24 @@
     return Math.max(0, trackData.length - 1);
   }
 
-  // 使用公共配置的状态处理函数
-  function getPayStatusType(paid) {
-    return getPayStatusInfo(paid).type;
-  }
-
-  function getPayStatusText(paid) {
-    return getPayStatusInfo(paid).text;
-  }
-
-  function getOrderStatusType(status) {
-    return getOrderStatusInfo(status).type;
-  }
-
-  function getOrderStatusText(status) {
-    return getOrderStatusInfo(status).text;
-  }
-
-  function getRefundStatusType(refundStatus) {
-    return getRefundStatusInfo(refundStatus).type;
-  }
-
-  function getRefundStatusText(refundStatus) {
-    return getRefundStatusInfo(refundStatus).text;
-  }
-
-  function getPinkStatusType(pinkStatus) {
-    return getPinkStatusInfo(pinkStatus).type;
-  }
-
-  function getPinkStatusText(pinkStatus) {
-    return getPinkStatusInfo(pinkStatus).text;
-  }
-
-  function getWinStatusType(winStatus) {
-    return getWinStatusInfo(winStatus).type;
-  }
-
-  function getWinStatusText(winStatus) {
-    return getWinStatusInfo(winStatus).text;
-  }
+  // 通用状态处理函数
+  const getStatusText = (type, value) => {
+    const statusMap = {
+      order: getOrderStatusInfo,
+      pink: getPinkStatusInfo,
+      win: getWinStatusInfo,
+    };
+    return statusMap[type]?.(value)?.text || '未知';
+  };
+
+  const getStatusType = (type, value) => {
+    const statusMap = {
+      order: getOrderStatusInfo,
+      pink: getPinkStatusInfo,
+      win: getWinStatusInfo,
+    };
+    return statusMap[type]?.(value)?.type || 'info';
+  };
 
   // 拼接完整地址
   function getFullAddress(addressInfo) {

+ 100 - 106
src/app/shop/admin/order/order/index.vue

@@ -8,8 +8,8 @@
             <sa-search-simple
               :searchFields="searchFields"
               :defaultValues="defaultSearchValues"
-              @search="(val) => getData(1, val)"
-              @reset="getData(1)"
+              @search="handleSearch"
+              @reset="handleReset"
             >
               <template #custom="{ data }">
                 <el-form-item label="下单时间">
@@ -30,14 +30,14 @@
           </div>
           <el-tabs class="sa-tabs" v-model="currentStatus" @tab-change="handleTabChange">
             <el-tab-pane label="全部" name="all"></el-tab-pane>
-            <el-tab-pane label="待付款" name="unpaid"></el-tab-pane>
-            <el-tab-pane label="已付" name="paid"></el-tab-pane>
-            <el-tab-pane label="待发货" name="nosend"></el-tab-pane>
-            <el-tab-pane label="待收货" name="noget"></el-tab-pane>
+            <el-tab-pane label="待支付" name="to_pay"></el-tab-pane>
+            <el-tab-pane label="已付" name="paid"></el-tab-pane>
+            <el-tab-pane label="已退款" name="refund"></el-tab-pane>
+            <el-tab-pane label="待发货" name="to_ship"></el-tab-pane>
             <el-tab-pane label="已完成" name="completed"></el-tab-pane>
-            <el-tab-pane label="已关闭" name="closed"></el-tab-pane>
-            <el-tab-pane label="已退款" name="refunded"></el-tab-pane>
-            <el-tab-pane label="已取消" name="cancelled"></el-tab-pane>
+            <el-tab-pane label="待收货" name="to_receive"></el-tab-pane>
+            <el-tab-pane label="已关闭" name="to_closed"></el-tab-pane>
+            <el-tab-pane label="已取消" name="cancellation"></el-tab-pane>
           </el-tabs>
           <div class="sa-title sa-flex sa-row-between">
             <div class="label sa-flex">
@@ -53,7 +53,7 @@
                 >订单导出</el-button
               >
               <el-button
-                v-if="currentStatus == 'nosend'"
+                v-if="currentStatus == 'to_ship'"
                 :loading="exportLoading"
                 :disabled="exportLoading"
                 @click="onExportDelivery()"
@@ -130,31 +130,17 @@
                   <div>৳{{ scope.row.payPrice || 0 }}</div>
                 </template>
               </el-table-column>
-              <el-table-column label="支付状态" min-width="100" align="center">
-                <template #default="scope">
-                  <el-tag :type="scope.row.paid === 1 ? 'success' : 'warning'">
-                    {{ scope.row.paid === 1 ? '已付款' : '待付款' }}
-                  </el-tag>
-                </template>
-              </el-table-column>
               <el-table-column label="订单状态" min-width="100" align="center">
                 <template #default="scope">
-                  <el-tag :type="getOrderStatusType(scope.row.status)">
-                    {{ getOrderStatusText(scope.row.status) }}
+                  <el-tag :type="getStatusType('order', scope.row.status)">
+                    {{ getStatusText('order', scope.row.status) }}
                   </el-tag>
                 </template>
               </el-table-column>
               <el-table-column label="拼团状态" min-width="100" align="center">
                 <template #default="scope">
-                  <el-tag :type="getPinkStatusType(scope.row.pinkStatus)">
-                    {{ getPinkStatusText(scope.row.pinkStatus) }}
-                  </el-tag>
-                </template>
-              </el-table-column>
-              <el-table-column label="退款状态" min-width="100" align="center">
-                <template #default="scope">
-                  <el-tag :type="getRefundStatusType(scope.row.refundStatus)">
-                    {{ getRefundStatusText(scope.row.refundStatus) }}
+                  <el-tag :type="getStatusType('pink', scope.row.pinkStatus)">
+                    {{ getStatusText('pink', scope.row.pinkStatus) }}
                   </el-tag>
                 </template>
               </el-table-column>
@@ -185,7 +171,7 @@
                       >发货测试</el-button
                     >
                     <el-button
-                      v-if="scope.row.paid === 1 && scope.row.status === 0"
+                      v-if="scope.row.status === 5"
                       class="is-link"
                       type="primary"
                       @click="onSend(scope.row)"
@@ -195,7 +181,7 @@
                       >详情</el-button
                     >
                     <el-button
-                      v-if="scope.row.paid === 0"
+                      v-if="scope.row.status === 1"
                       class="is-link sa-m-l-12"
                       type="danger"
                       @click="cancelOrder(scope.row.id)"
@@ -233,14 +219,7 @@
 </script>
 <script setup>
   import { onMounted, reactive, ref } from 'vue';
-  import {
-    api,
-    getPayStatusInfo,
-    getOrderStatusInfo,
-    getRefundStatusInfo,
-    getPinkStatusInfo,
-    getPayTypeText,
-  } from '../order.service';
+  import { api, getOrderStatusInfo, getPinkStatusInfo } from '../order.service';
   import { useModal, usePagination } from '@/sheep/hooks';
   import OrderDispatch from './dispatch.vue';
   import OrderBatchDispatch from './batchDispatch.vue';
@@ -288,59 +267,64 @@
   // 当前状态标签
   const currentStatus = ref('all');
 
-  // 状态映射 - 根据后端字段定义
+  // 状态映射 - 根据新的状态机定义
   const statusMap = {
-    all: {}, // 全部 - 不传任何状态参数
-    unpaid: { paid: 0 }, // 待付款:支付状态为0
-    paid: { paid: 1 }, // 已付款:支付状态为1(不限制订单状态)
-    nosend: { paid: 1, status: 0 }, // 待发货:已付款且订单状态为0
-    noget: { paid: 1, status: 1 }, // 待收货:已付款且订单状态为1
-    completed: { paid: 1, status: 3 }, // 已完成:已付款且订单状态为3
-    closed: { status: 4 }, // 已关闭:订单状态为4
-    refunded: { refundStatus: 2 }, // 已退款:退款状态为2
-    cancelled: { status: 5 }, // 已取消:订单状态为5
+    all: {}, // 全部 - 不传订单状态参数
+    to_pay: { status: 1 }, // 待支付:订单状态为1
+    cancellation: { status: 2 }, // 订单取消:订单状态为2
+    paid: { status: 3 }, // 已支付:订单状态为3
+    refund: { status: 4 }, // 失败已退款:订单状态为4
+    to_ship: { status: 5 }, // 待发货:订单状态为5
+    to_closed: { status: 6 }, // 未中奖关闭:订单状态为6
+    to_receive: { status: 7 }, // 待收货:订单状态为7
+    completed: { status: 8 }, // 订单完成:订单状态为8
   };
 
-  // 标签切换处理
-  const handleTabChange = (status) => {
-    currentStatus.value = status;
-    const statusParams = statusMap[status] || {};
-    // 合并当前搜索条件和状态参数
-    const mergedParams = { ...currentSearchParams.value, ...statusParams };
+  // 搜索处理
+  const handleSearch = (searchParams) => {
+    // 合并搜索条件和当前tab状态
+    const statusParams = statusMap[currentStatus.value] || {};
+    const mergedParams = { ...searchParams, ...statusParams };
     getData(1, mergedParams);
   };
 
-  // 使用公共配置的状态处理函数
-  const getOrderStatusText = (status) => {
-    return getOrderStatusInfo(status).text;
+  // 重置处理
+  const handleReset = () => {
+    // 重置时只保留当前tab状态
+    const statusParams = statusMap[currentStatus.value] || {};
+    getData(1, statusParams);
   };
 
-  const getOrderStatusType = (status) => {
-    return getOrderStatusInfo(status).type;
-  };
-
-  const getPayStatusText = (paid) => {
-    return getPayStatusInfo(paid).text;
-  };
+  // 标签切换处理
+  const handleTabChange = (status) => {
+    // 立即更新tab状态,不依赖接口结果
+    currentStatus.value = status;
 
-  const getPayStatusType = (paid) => {
-    return getPayStatusInfo(paid).type;
-  };
+    // 获取当前tab对应的状态参数
+    const statusParams = statusMap[status] || {};
 
-  const getRefundStatusText = (refundStatus) => {
-    return getRefundStatusInfo(refundStatus).text;
-  };
+    // 合并当前搜索条件和状态参数
+    const mergedParams = { ...currentSearchParams.value, ...statusParams };
 
-  const getRefundStatusType = (refundStatus) => {
-    return getRefundStatusInfo(refundStatus).type;
+    // 调用数据获取,无论成功与否都不影响tab状态
+    getData(1, mergedParams);
   };
 
-  const getPinkStatusText = (pinkStatus) => {
-    return getPinkStatusInfo(pinkStatus).text;
+  // 通用状态处理函数
+  const getStatusText = (type, value) => {
+    const statusMap = {
+      order: getOrderStatusInfo,
+      pink: getPinkStatusInfo,
+    };
+    return statusMap[type]?.(value)?.text || '未知';
   };
 
-  const getPinkStatusType = (pinkStatus) => {
-    return getPinkStatusInfo(pinkStatus).type;
+  const getStatusType = (type, value) => {
+    const statusMap = {
+      order: getOrderStatusInfo,
+      pink: getPinkStatusInfo,
+    };
+    return statusMap[type]?.(value)?.type || 'info';
   };
 
   const loading = ref(true);
@@ -355,40 +339,50 @@
 
   const { pageData } = usePagination();
 
-  // 保存当前搜索条件
+  // 保存当前搜索条件(不包含状态参数)
   const currentSearchParams = ref({});
 
   // 获取数据
   async function getData(page, searchParams = {}) {
-    // 保存搜索条件供导出使用
-    if (Object.keys(searchParams).length > 0) {
-      currentSearchParams.value = { ...searchParams };
+    // 分离搜索条件和状态参数
+    const { paid, status, refundStatus, ...pureSearchParams } = searchParams;
+
+    // 保存纯搜索条件(不包含状态参数)
+    if (Object.keys(pureSearchParams).length > 0) {
+      currentSearchParams.value = { ...pureSearchParams };
     }
+
     if (page) pageData.page = page;
     loading.value = true;
 
-    // 构建请求参数
-    const requestData = {
-      page: pageData.page,
-      size: pageData.size,
-      ...searchParams,
-    };
+    try {
+      // 构建请求参数
+      const requestData = {
+        page: pageData.page,
+        size: pageData.size,
+        ...searchParams,
+      };
 
-    // 处理时间范围搜索
-    if (searchParams.createTime && searchParams.createTime.length === 2) {
-      requestData.startTime = searchParams.createTime[0];
-      requestData.endTime = searchParams.createTime[1];
-      delete requestData.createTime;
-    }
+      // 处理时间范围搜索
+      if (searchParams.createTime && searchParams.createTime.length === 2) {
+        requestData.startTime = searchParams.createTime[0];
+        requestData.endTime = searchParams.createTime[1];
+        delete requestData.createTime;
+      }
 
-    const { code, data } = await api.order.list(requestData);
+      const { code, data } = await api.order.list(requestData);
 
-    if (code == '200') {
-      table.data = data.list;
-      pageData.page = data.pageNum;
-      pageData.total = data.total;
+      if (code == '200') {
+        table.data = data.list;
+        pageData.page = data.pageNum;
+        pageData.total = data.total;
+      }
+    } catch (error) {
+      console.error('获取订单列表失败:', error);
+      // 接口失败时也要确保loading状态正确
+    } finally {
+      loading.value = false;
     }
-    loading.value = false;
   }
 
   // table 字段排序
@@ -408,8 +402,9 @@
   async function onExport() {
     exportLoading.value = true;
     try {
-      // 构建导出参数,使用当前搜索条件但不包含分页参数
-      const exportParams = { ...currentSearchParams.value };
+      // 构建导出参数:合并搜索条件和当前tab状态
+      const statusParams = statusMap[currentStatus.value] || {};
+      const exportParams = { ...currentSearchParams.value, ...statusParams };
 
       // 处理时间范围搜索
       if (exportParams.createTime && exportParams.createTime.length === 2) {
@@ -418,13 +413,12 @@
         delete exportParams.createTime;
       }
 
-      // 添加当前状态筛选
-      const statusParams = statusMap[currentStatus.value] || {};
-      Object.assign(exportParams, statusParams);
-
       await api.order.export(exportParams, '订单记录');
-    } catch (error) {}
-    exportLoading.value = false;
+    } catch (error) {
+      console.error('导出订单失败:', error);
+    } finally {
+      exportLoading.value = false;
+    }
   }
 
   async function onExportDelivery() {

+ 43 - 34
src/app/shop/admin/user/list/detail.vue

@@ -203,22 +203,22 @@
               </el-table-column>
               <el-table-column label="订单状态" min-width="100" align="center">
                 <template #default="{ row }">
-                  <el-tag :type="getOrderStatusType(row.status)">
-                    {{ getOrderStatusText(row.status) }}
+                  <el-tag :type="getStatusType('order', row.status)">
+                    {{ getStatusText('order', row.status) }}
                   </el-tag>
                 </template>
               </el-table-column>
               <el-table-column label="拼团状态" min-width="100" align="center">
                 <template #default="{ row }">
-                  <el-tag :type="getPinkStatusType(row.pinkStatus)">
-                    {{ getPinkStatusText(row.pinkStatus) }}
+                  <el-tag :type="getStatusType('pink', row.pinkStatus)">
+                    {{ getStatusText('pink', row.pinkStatus) }}
                   </el-tag>
                 </template>
               </el-table-column>
               <el-table-column label="退款状态" min-width="100" align="center">
                 <template #default="{ row }">
-                  <el-tag :type="getRefundStatusType(row.refundStatus)">
-                    {{ getRefundStatusText(row.refundStatus) }}
+                  <el-tag :type="getStatusType('refund', row.refundStatus)">
+                    {{ getStatusText('refund', row.refundStatus) }}
                   </el-tag>
                 </template>
               </el-table-column>
@@ -290,8 +290,8 @@
               </el-table-column>
               <el-table-column label="佣金状态" min-width="100" align="center">
                 <template #default="{ row }">
-                  <el-tag :type="getCommissionStatusType(row.status)">
-                    {{ getCommissionStatusText(row.status) }}
+                  <el-tag :type="getStatusType('commission', row.status)">
+                    {{ getStatusText('commission', row.status) }}
                   </el-tag>
                 </template>
               </el-table-column>
@@ -333,8 +333,8 @@
               </el-table-column>
               <el-table-column label="状态" min-width="100" align="center">
                 <template #default="{ row }">
-                  <el-tag :type="getRechargeStatusType(row.status)">
-                    {{ getRechargeStatusText(row.status) }}
+                  <el-tag :type="getStatusType('recharge', row.status)">
+                    {{ getStatusText('recharge', row.status) }}
                   </el-tag>
                 </template>
               </el-table-column>
@@ -388,8 +388,8 @@
               </el-table-column>
               <el-table-column label="状态" min-width="100" align="center">
                 <template #default="{ row }">
-                  <el-tag :type="getWithdrawStatusType(row.status)">
-                    {{ getWithdrawStatusText(row.status) }}
+                  <el-tag :type="getStatusType('withdraw', row.status)">
+                    {{ getStatusText('withdraw', row.status) }}
                   </el-tag>
                 </template>
               </el-table-column>
@@ -517,7 +517,7 @@
     state.basicInfoTableData = [
       {
         field1: state.userDetail.userNo || '--', // 用户ID
-        field2: getStatusText(state.userDetail.status) || '--', // 状态
+        field2: getStatusText('user', state.userDetail.status) || '--', // 状态
         field3: state.userDetail.name || '--', // 昵称
         field4: state.userDetail.bank || '--', // 收款银行
         field5: state.userDetail.bankAccountName || '--', // 账户名称
@@ -552,36 +552,45 @@
     ];
   };
 
-  // 使用各个service中的状态处理函数,避免重复代码
-  // 用户状态处理函数
-  const getStatusText = userUtils.getUserStatusText;
+  // 通用状态处理函数
+  const getStatusText = (type, value) => {
+    const statusMap = {
+      user: userUtils.getUserStatusText,
+      order: getOrderStatusInfo,
+      refund: getRefundStatusInfo,
+      pink: getPinkStatusInfo,
+      commission: financeUtils.getCommissionStatusText,
+      recharge: financeUtils.getRechargeStatusText,
+      withdraw: financeUtils.getWithdrawStatusText,
+    };
 
-  // 订单状态处理函数
-  const getOrderStatusText = (status) => getOrderStatusInfo(status).text;
-  const getOrderStatusType = (status) => getOrderStatusInfo(status).type;
+    // 对于用户状态和财务状态,直接调用函数
+    if (['user', 'commission', 'recharge', 'withdraw'].includes(type)) {
+      return statusMap[type]?.(value) || '未知';
+    }
 
-  // 退款状态处理函数
-  const getRefundStatusText = (status) => getRefundStatusInfo(status).text;
-  const getRefundStatusType = (status) => getRefundStatusInfo(status).type;
+    // 对于订单相关状态,返回text属性
+    return statusMap[type]?.(value)?.text || '未知';
+  };
 
-  // 拼团状态处理函数
-  const getPinkStatusText = (status) => getPinkStatusInfo(status).text;
-  const getPinkStatusType = (status) => getPinkStatusInfo(status).type;
+  const getStatusType = (type, value) => {
+    const statusMap = {
+      order: getOrderStatusInfo,
+      refund: getRefundStatusInfo,
+      pink: getPinkStatusInfo,
+      commission: financeUtils.getCommissionStatusType,
+      recharge: (status) => financeUtils.getStatusType(status, 'recharge'),
+      withdraw: (status) => financeUtils.getStatusType(status, 'withdraw'),
+    };
+    return statusMap[type]?.(value) || 'info';
+  };
 
-  // 财务相关状态处理函数
+  // 财务相关工具函数(保持不变,因为这些是工具函数而非状态函数
   const getChannelText = financeUtils.getChannelText;
   const getChannelType = financeUtils.getChannelType;
   const getCurrencyText = financeUtils.getCurrencyText;
-  const getRechargeStatusText = financeUtils.getRechargeStatusText;
-  const getWithdrawStatusText = financeUtils.getWithdrawStatusText;
   const getAccountTypeText = financeUtils.getAccountTypeText;
-  const getRechargeStatusType = (status) => financeUtils.getStatusType(status, 'recharge');
-  const getWithdrawStatusType = (status) => financeUtils.getStatusType(status, 'withdraw');
-
-  // 佣金相关状态处理函数
   const getBizTypeText = financeUtils.getBizTypeText;
-  const getCommissionStatusText = financeUtils.getCommissionStatusText;
-  const getCommissionStatusType = financeUtils.getCommissionStatusType;
 
   // 获取用户详情
   const loading = ref(false);

+ 25 - 23
src/sheep/request/crud.js

@@ -2,35 +2,31 @@ import { request } from './index';
 import $storage from '@/sheep/utils/storage';
 import { ElMessage } from 'element-plus';
 
-// 查看列表
-export const LIST = (url, data, pageInParams = true) => {
-  // 分离分页参数和其他参数
-  const { page, size, ...otherParams } = data;
+// 检测是否为mall前缀的接口
+const isMallAPI = (url) => {
+  return url.startsWith('/mall') || url.startsWith('mall');
+};
 
+// 查看列表
+export const LIST = (url, data) => {
   const requestConfig = {
     url: url + `/list`,
     method: 'POST',
   };
-
-  if (pageInParams) {
-    // 分页参数放在params中(默认行为)
-    requestConfig.params = { page, size };
-    requestConfig.data = otherParams;
-  } else {
-    // 分页参数放在data中
-    requestConfig.data = { page, size, ...otherParams };
-  }
-
+  requestConfig.data = data;
   return request(requestConfig);
 };
 
 // 查看详情
-export const DETAIL = (url, id) =>
-  request({
+export const DETAIL = (url, id) => {
+  const isMall = isMallAPI(url);
+
+  return request({
     url: url + `/detail`,
-    method: 'POST',
+    method: isMall ? 'GET' : 'POST', // mall用GET,其他用POST
     params: { id },
   });
+};
 
 // 新增
 export const ADD = (url, data) =>
@@ -44,26 +40,32 @@ export const ADD = (url, data) =>
   });
 
 // 编辑&更新
-export const EDIT = (url, data) =>
-  request({
+export const EDIT = (url, data) => {
+  const isMall = isMallAPI(url);
+
+  return request({
     url: url + `/update`,
-    method: 'POST',
+    method: isMall ? 'PUT' : 'POST', // mall用PUT,其他用POST
     data,
     options: {
       showSuccessMessage: false,
     },
   });
+};
 
 // 删除(软删除/真实删除)
-export const DELETE = (url, data) =>
-  request({
+export const DELETE = (url, data) => {
+  const isMall = isMallAPI(url);
+
+  return request({
     url: url + `/delete`,
-    method: 'POST',
+    method: isMall ? 'DELETE' : 'POST', // mall用DELETE,其他用POST
     params: data,
     options: {
       showSuccessMessage: true,
     },
   });
+};
 
 // 选择
 export const SELECT = (url, params) =>

Some files were not shown because too many files changed in this diff