소스 검색

feat:完善用户详情 和订单商品列表 详情基本信息

叶静 2 주 전
부모
커밋
49ca22991f

+ 5 - 38
src/app/shop/admin/finance/commission/index.vue

@@ -114,7 +114,7 @@
   import { onMounted, reactive, ref } from 'vue';
   import { ElMessage } from 'element-plus';
   import { useModal, usePagination } from '@/sheep/hooks';
-  import { api } from '../finance.service';
+  import { api, financeUtils } from '../finance.service';
   import { request } from '@/sheep/request';
   import UserDetail from '../../user/list/detail.vue';
   import OrderDetail from '../../order/order/detail.vue';
@@ -207,43 +207,10 @@
   });
   const loading = ref(true);
 
-  // 获取状态类型
-  function getStatusType(status) {
-    const statusMap = {
-      1: 'warning', // 未结算
-      2: 'success', // 已结算
-    };
-    return statusMap[status] || 'info';
-  }
-
-  // 获取状态文本
-  function getStatusText(status) {
-    const statusMap = {
-      1: '未结算',
-      2: '已结算',
-    };
-    return statusMap[status] || '未知';
-  }
-
-  // 获取佣金类型文本
-  function getBizTypeText(bizType) {
-    const typeMap = {
-      1001: '充值',
-      2001: '提现',
-      3001: '开团支付',
-      3002: '参团支付',
-      4001: '未成团退款',
-      4002: '成团退款',
-      5001: '开团红包收益',
-      5002: '参团红包收益',
-      5003: '签到红包收益',
-      5004: '下级红包佣金',
-      5005: '下下级红包佣金',
-      6001: '充值返点',
-      7001: '提现手续费',
-    };
-    return typeMap[bizType] || '未知类型';
-  }
+  // 使用service中的状态处理函数
+  const getStatusType = financeUtils.getCommissionStatusType;
+  const getStatusText = financeUtils.getCommissionStatusText;
+  const getBizTypeText = financeUtils.getBizTypeText;
 
   // 获取佣金类型枚举
   async function getCommissionTypes() {

+ 36 - 0
src/app/shop/admin/finance/finance.service.js

@@ -103,6 +103,42 @@ const financeUtils = {
     };
     return channelMap[channel] || 'info';
   },
+
+  // 佣金相关状态处理函数
+  getCommissionStatusText: (status) => {
+    const statusMap = {
+      1: '未结算',
+      2: '已结算',
+    };
+    return statusMap[status] || '未知';
+  },
+
+  getCommissionStatusType: (status) => {
+    const statusMap = {
+      1: 'warning', // 未结算
+      2: 'success', // 已结算
+    };
+    return statusMap[status] || 'info';
+  },
+
+  getBizTypeText: (bizType) => {
+    const typeMap = {
+      1001: '充值',
+      2001: '提现',
+      3001: '开团支付',
+      3002: '参团支付',
+      4001: '未成团退款',
+      4002: '成团退款',
+      5001: '开团红包收益',
+      5002: '参团红包收益',
+      5003: '签到红包收益',
+      5004: '下级红包佣金',
+      5005: '下下级红包佣金',
+      6001: '充值返点',
+      7001: '提现手续费',
+    };
+    return typeMap[bizType] || '未知类型';
+  },
 };
 
 const route = {

+ 8 - 0
src/app/shop/admin/order/order.service.js

@@ -221,6 +221,14 @@ const api = {
         url: `/shop/admin/order/order/offlineConfirm/${id}`,
         method: 'POST',
       }),
+    // 获取拼团信息
+    getPinkList: (orderId) =>
+      request({
+        url: '/mall/pink/list',
+        method: 'POST',
+        params: { size: 100 },
+        data: { orderId },
+      }),
   },
   aftersale: {
     ...CRUD('shop/admin/order/aftersale', ['list', 'detail']),

+ 171 - 24
src/app/shop/admin/order/order/detail.vue

@@ -179,49 +179,83 @@
       <!-- 商品信息 -->
       <div class="goods-content sa-m-b-16">
         <div class="sa-title sa-m-b-10">商品信息</div>
-        <el-table class="sa-table" :data="state.orderDetail.items" stripe border>
+        <el-table class="sa-table" :data="state.orderDetail.orderInfoVO" stripe border>
           <el-table-column label="商品图片" width="100" align="center">
             <template #default="{ row }">
               <el-image
-                :src="row.goods_image"
+                :src="row.image"
                 style="width: 60px; height: 60px; border-radius: 4px"
                 fit="cover"
               />
             </template>
           </el-table-column>
-          <el-table-column label="商品名称" prop="goods_title" min-width="200" />
-          <el-table-column label="规格" prop="goods_sku_text" width="120" align="center" />
-          <el-table-column label="数量" prop="goods_num" width="80" align="center" />
-          <el-table-column label="单价" width="120" align="center">
-            <template #default="{ row }"> ৳{{ row.goods_price || '--' }} </template>
+          <el-table-column label="商品名称" prop="productName" />
+          <el-table-column label="规格" prop="sku" align="center" />
+          <el-table-column label="数量" prop="payNum" align="center" />
+          <el-table-column label="单价" align="center">
+            <template #default="{ row }"> ৳{{ row.price || '0' }} </template>
           </el-table-column>
         </el-table>
       </div>
 
       <!-- 收货信息 -->
-      <div class="address-content sa-m-b-16">
+      <div class="address-content sa-m-b-16" v-if="state.orderDetail.status == 1">
         <div class="sa-title sa-m-b-10">收货信息</div>
-        <el-table class="sa-table" :data="[state.orderDetail.address]" stripe border>
-          <el-table-column label="收件人" prop="consignee" width="120" align="center" />
-          <el-table-column label="手机号" prop="mobile" width="150" align="center" />
-          <el-table-column label="详细地址" prop="address" min-width="200" />
-          <el-table-column label="物流公司" prop="express_company" width="120" align="center" />
-          <el-table-column label="物流单号" prop="express_no" width="180" align="center" />
+        <el-table class="sa-table" :data="[state.orderDetail.orderAddressVO]" stripe border>
+          <el-table-column label="收件人" prop="realName" align="center" />
+          <el-table-column label="手机号" prop="phone" align="center" />
+          <el-table-column label="详细地址" min-width="200">
+            <template #default="{ row }">
+              {{ getFullAddress(row) }}
+            </template>
+          </el-table-column>
+          <el-table-column label="物流公司" align="center">
+            <template #default>
+              {{ state.orderDetail.deliveryName || '--' }}
+            </template>
+          </el-table-column>
+          <el-table-column label="物流单号" align="center">
+            <template #default>
+              {{ state.orderDetail.deliveryId || '--' }}
+            </template>
+          </el-table-column>
         </el-table>
       </div>
 
       <!-- 拼团信息 -->
-      <div class="group-content" v-if="state.orderDetail.group_info">
+      <div class="group-content" v-if="state.pinkList && state.pinkList.length > 0">
         <div class="sa-title sa-m-b-10"
-          >拼团信息({{ state.orderDetail.group_info.group_type }})</div
+          >拼团信息({{ state.pinkList[0]?.people || '未知' }}人团)</div
         >
-        <el-table class="sa-table" :data="state.orderDetail.group_info.members" stripe border>
-          <el-table-column label="昵称" prop="nickname" min-width="120" align="center" />
-          <el-table-column label="手机号" prop="mobile" min-width="150" align="center" />
-          <el-table-column label="参团订单号" prop="order_sn" min-width="180" align="center" />
-          <el-table-column label="参团时间" prop="join_time" min-width="160" align="center" />
-          <el-table-column label="支付时间" prop="pay_time" min-width="160" align="center" />
-          <el-table-column label="奖励佣金" prop="commission" min-width="120" align="center" />
+        <el-table class="sa-table" :data="state.pinkList" stripe border>
+          <el-table-column label="昵称" min-width="120" align="center">
+            <template #default="{ row }">
+              <el-link type="primary" @click="openUserDetail(row.uid)">
+                {{ row.nickname || '--' }}
+              </el-link>
+            </template>
+          </el-table-column>
+          <el-table-column label="手机号" min-width="150" align="center">
+            <template #default="{ row }">
+              {{ getUserPhone(row.uid) }}
+            </template>
+          </el-table-column>
+          <el-table-column label="参团订单号" min-width="180" align="center">
+            <template #default="{ row }">
+              <el-link type="primary" @click="openOrderDetail(row.orderId)">
+                {{ row.orderId || '--' }}
+              </el-link>
+            </template>
+          </el-table-column>
+          <el-table-column label="参团时间" prop="addTime" min-width="160" align="center" />
+          <el-table-column label="支付时间" min-width="160" align="center">
+            <template #default="{ row }">
+              {{ getPayTime(row.orderId) }}
+            </template>
+          </el-table-column>
+          <el-table-column label="奖励佣金" min-width="120" align="center">
+            <template #default="{ row }"> ৳{{ getBrokerage(row.orderId) }} </template>
+          </el-table-column>
         </el-table>
       </div>
     </el-main>
@@ -242,12 +276,15 @@
   import { useModal } from '@/sheep/hooks';
   import OrderDispatch from './dispatch.vue';
   import OrderRefund from './refund.vue';
+  import UserDetail from '../../user/list/detail.vue';
+  import OrderDetailC from './detail.vue';
 
   const emit = defineEmits(['modalCallBack']);
   const props = defineProps(['modal']);
 
   const state = reactive({
     orderDetail: {}, // 订单详情
+    pinkList: [], // 拼团信息列表
   });
 
   // 订单步骤配置
@@ -298,6 +335,22 @@
     const { code, data } = await api.order.detail(props.modal.params.id);
     if (code == 200) {
       state.orderDetail = data;
+      // 获取拼团信息
+      await getPinkList(data.orderId);
+    }
+  }
+
+  // 获取拼团信息
+  async function getPinkList(orderId) {
+    if (!orderId) return;
+    try {
+      const { code, data } = await api.order.getPinkList(orderId);
+      if (code == 200) {
+        state.pinkList = data.list || [];
+      }
+    } catch (error) {
+      console.error('获取拼团信息失败:', error);
+      state.pinkList = [];
     }
   }
 
@@ -349,10 +402,104 @@
     return getWinStatusInfo(winStatus).text;
   }
 
+  // 拼接完整地址
+  function getFullAddress(addressInfo) {
+    if (!addressInfo) return '--';
+
+    const parts = [];
+    if (addressInfo.province) parts.push(addressInfo.province);
+    if (addressInfo.city) parts.push(addressInfo.city);
+    if (addressInfo.district) parts.push(addressInfo.district);
+    if (addressInfo.detail) parts.push(addressInfo.detail);
+
+    return parts.length > 0 ? parts.join('') : '--';
+  }
+
+  // 获取用户手机号(这里需要根据实际情况调用用户接口或从其他地方获取)
+  function getUserPhone(uid) {
+    // TODO: 根据用户ID获取手机号,这里先返回占位符
+    return '--';
+  }
+
+  // 获取支付时间(这里需要根据订单ID获取支付时间)
+  function getPayTime(orderId) {
+    // TODO: 根据订单ID获取支付时间,这里先返回占位符
+    return '--';
+  }
+
+  // 获取奖励佣金(这里需要根据订单ID获取佣金信息)
+  function getBrokerage(orderId) {
+    // TODO: 根据订单ID获取佣金信息,这里先返回占位符
+    return '0';
+  }
+
+  // 打开用户详情
+  function openUserDetail(uid) {
+    if (!uid) {
+      ElMessage.warning('用户ID不存在');
+      return;
+    }
+
+    useModal(
+      UserDetail,
+      {
+        title: '用户详情',
+        id: uid,
+      },
+      {
+        success: () => {
+          // 用户详情关闭后的回调,如果需要的话
+        },
+      },
+    );
+  }
+
+  // 打开订单详情
+  function openOrderDetail(orderId) {
+    if (!orderId) {
+      ElMessage.warning('订单ID不存在');
+      return;
+    }
+
+    // 如果是当前订单,不需要打开新窗口
+    if (orderId === state.orderDetail.orderId) {
+      ElMessage.info('这是当前订单');
+      return;
+    }
+
+    // 需要先根据订单号查找订单ID,然后打开订单详情
+    // 这里假设需要调用接口根据订单号获取订单ID
+    openOrderDetailByOrderId(orderId);
+  }
+
+  // 根据订单号打开订单详情
+  async function openOrderDetailByOrderId(orderId) {
+    try {
+      // 这里需要根据实际情况调用接口获取订单ID
+      // 暂时直接使用订单号作为ID打开
+      useModal(
+        OrderDetailC,
+        {
+          title: '订单详情',
+          type: 'detail',
+          id: orderId, // 这里可能需要转换为数据库ID
+        },
+        {
+          success: () => {
+            // 订单详情关闭后的回调
+          },
+        },
+      );
+    } catch (error) {
+      console.error('打开订单详情失败:', error);
+      ElMessage.error('打开订单详情失败');
+    }
+  }
+
   // 发货
   function onOpenDispatch() {
     // 检查订单数据是否完整
-    if (!state.orderDetail || !state.orderDetail.items) {
+    if (!state.orderDetail || !state.orderDetail.orderInfoVO) {
       ElMessage.error('订单数据加载中,请稍后再试');
       return;
     }

+ 7 - 0
src/app/shop/admin/order/order/index.vue

@@ -147,6 +147,13 @@
                   </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)">

+ 309 - 113
src/app/shop/admin/user/list/detail.vue

@@ -30,7 +30,9 @@
                   />
                   <div class="user-name"
                     >{{ state.userDetail.nickname || '--' }}
-                    <span class="user-level ml-4px">V{{ state.userDetail.level || '1' }}</span>
+                    <span class="user-level ml-4px"
+                      >V{{ state.userDetail.vipLevel || '暂无等级' }}</span
+                    >
                   </div>
                 </div>
               </template>
@@ -149,33 +151,100 @@
           <el-tab-pane label="订单记录" name="orders">
             <el-skeleton v-if="state.loading.orders" :rows="5" animated />
             <el-table v-else class="sa-table" :data="state.orders" stripe border>
-              <el-table-column label="订单编号" prop="order_sn" width="180" align="center" />
-              <el-table-column label="商品信息" width="300" align="left">
+              <el-table-column sortable="custom" prop="orderId" label="订单编号" min-width="150">
                 <template #default="{ row }">
-                  <div class="goods-info">
+                  <div class="order-info">
+                    <div class="order-sn">{{ row.orderId }}</div>
+                  </div>
+                </template>
+              </el-table-column>
+              <el-table-column label="商品信息" min-width="300">
+                <template #default="{ row }">
+                  <div class="sa-flex" v-if="row.orderInfoVO && row.orderInfoVO.length > 0">
                     <el-image
-                      :src="row.goods_image"
-                      style="width: 50px; height: 50px; border-radius: 4px; margin-right: 10px"
+                      :src="row.orderInfoVO[0].image"
+                      style="width: 60px; height: 60px; margin-right: 12px"
                       fit="cover"
                     />
-                    <div class="goods-detail">
-                      <div class="goods-name">{{ row.goods_name || '--' }}</div>
+                    <div>
+                      <div class="goods-title">{{ row.orderInfoVO[0].productName }}</div>
                     </div>
                   </div>
+                  <div v-else>-</div>
                 </template>
               </el-table-column>
-              <el-table-column label="规格" prop="spec" width="100" align="center" />
-              <el-table-column label="数量" prop="quantity" width="80" align="center" />
-              <el-table-column label="付款金额" align="center">
-                <template #default="{ row }">৳{{ row.amount || '--' }}</template>
+              <el-table-column label="规格" min-width="120" align="center">
+                <template #default="{ row }">
+                  <div v-if="row.orderInfoVO && row.orderInfoVO.length > 0">
+                    {{ row.orderInfoVO[0].sku || '-' }}
+                  </div>
+                  <div v-else>-</div>
+                </template>
               </el-table-column>
-              <el-table-column label="订单状态" prop="status_text" width="100" align="center" />
-              <el-table-column label="物流信息" prop="logistics_info" width="100" align="center" />
-              <el-table-column label="下单时间" prop="created_at" width="140" align="center" />
-              <el-table-column label="付款时间" prop="paid_at" width="140" align="center" />
-              <el-table-column label="操作" width="80" align="center">
+              <el-table-column label="数量" min-width="80" align="center">
+                <template #default="{ row }">
+                  <div v-if="row.orderInfoVO && row.orderInfoVO.length > 0">
+                    {{ row.orderInfoVO[0].payNum || 0 }}
+                  </div>
+                  <div v-else>0</div>
+                </template>
+              </el-table-column>
+              <el-table-column prop="payPrice" label="付款金额" min-width="120" align="center">
+                <template #default="{ row }">
+                  <div>৳{{ row.payPrice || 0 }}</div>
+                </template>
+              </el-table-column>
+              <el-table-column label="支付状态" min-width="100" align="center">
+                <template #default="{ row }">
+                  <el-tag :type="row.paid === 1 ? 'success' : 'warning'">
+                    {{ row.paid === 1 ? '已付款' : '待付款' }}
+                  </el-tag>
+                </template>
+              </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>
+                </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>
+                </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>
+                </template>
+              </el-table-column>
+              <el-table-column label="物流信息" min-width="150" align="center">
+                <template #default="{ row }">
+                  <div v-if="row.deliveryId">
+                    <div class="delivery-name"
+                      >{{ row.deliveryName || '快递公司' }}:{{ row.deliveryId }}</div
+                    >
+                  </div>
+                  <div v-else>未发货</div>
+                </template>
+              </el-table-column>
+              <el-table-column label="下单时间" min-width="150" align="center">
                 <template #default="{ row }">
-                  <el-button type="primary" link @click="viewOrder(row)">查看</el-button>
+                  <div>{{ row.createTime }}</div>
+                </template>
+              </el-table-column>
+              <el-table-column label="付款时间" min-width="150" align="center">
+                <template #default="{ row }">
+                  <div>{{ row.payTime || '-' }}</div>
+                </template>
+              </el-table-column>
+              <el-table-column label="操作" min-width="80" align="center">
+                <template #default="{ row }">
+                  <el-button type="primary" link @click="viewOrder(row)">详情</el-button>
                 </template>
               </el-table-column>
             </el-table>
@@ -205,17 +274,35 @@
           <el-tab-pane label="佣金记录" name="commissions">
             <el-skeleton v-if="state.loading.commissions" :rows="5" animated />
             <el-table v-else class="sa-table" :data="state.commissions" stripe border>
-              <el-table-column label="佣金ID" prop="commission_id" align="center" />
-              <el-table-column label="佣金类型" prop="type_text" align="center" />
-              <el-table-column label="佣金说明" prop="description" />
-              <el-table-column label="佣金金额" align="center">
-                <template #default="{ row }"> ৳{{ row.amount || '--' }} </template>
-              </el-table-column>
-              <el-table-column label="佣金状态" prop="status_text" align="center" />
-              <el-table-column label="佣金发放时间" prop="created_at" align="center" />
-              <el-table-column label="操作" width="80" align="center">
+              <el-table-column label="佣金ID" prop="id" min-width="120" align="center" />
+              <el-table-column label="佣金类型" min-width="150">
+                <template #default="{ row }">
+                  <span class="sa-table-line-1">{{ getBizTypeText(row.bizType) }}</span>
+                </template>
+              </el-table-column>
+              <el-table-column label="佣金说明" min-width="200">
+                <template #default="{ row }">
+                  <span class="sa-table-line-1">{{ row.memo || '-' }}</span>
+                </template>
+              </el-table-column>
+              <el-table-column label="佣金金额" min-width="120" align="center">
+                <template #default="{ row }"> ৳{{ row.amount || 0 }} </template>
+              </el-table-column>
+              <el-table-column label="佣金状态" min-width="100" align="center">
                 <template #default="{ row }">
-                  <el-button type="primary" link @click="viewCommission(row)">查看</el-button>
+                  <el-tag :type="getCommissionStatusType(row.status)">
+                    {{ getCommissionStatusText(row.status) }}
+                  </el-tag>
+                </template>
+              </el-table-column>
+              <el-table-column
+                prop="createTime"
+                label="佣金发放时间"
+                min-width="160"
+                sortable="custom"
+              >
+                <template #default="{ row }">
+                  {{ row.createTime || '-' }}
                 </template>
               </el-table-column>
             </el-table>
@@ -224,18 +311,46 @@
           <el-tab-pane label="充值记录" name="recharges">
             <el-skeleton v-if="state.loading.recharges" :rows="5" animated />
             <el-table v-else class="sa-table" :data="state.recharges" stripe border>
-              <el-table-column label="充值订单号" prop="order_sn" align="center" />
-              <el-table-column label="充值渠道" prop="channel_text" align="center" />
-              <el-table-column label="币种" prop="currency" align="center" />
-              <el-table-column label="金额" align="center">
-                <template #default="{ row }">৳{{ row.amount || '--' }}</template>
-              </el-table-column>
-              <el-table-column label="状态" prop="status_text" align="center" />
-              <el-table-column label="下单时间" prop="created_at" align="center" />
-              <el-table-column label="成功时间" prop="success_at" align="center" />
-              <el-table-column label="操作" width="80" align="center">
+              <el-table-column prop="orderNo" label="充值订单号" min-width="180" sortable="custom">
+                <template #default="{ row }">
+                  <span class="sa-table-line-1">{{ row.orderNo || '-' }}</span>
+                </template>
+              </el-table-column>
+              <el-table-column label="充值渠道" min-width="100" align="center">
+                <template #default="{ row }">
+                  <el-tag :type="getChannelType(row.channel)">
+                    {{ getChannelText(row.channel) }}
+                  </el-tag>
+                </template>
+              </el-table-column>
+              <el-table-column label="币种" min-width="80" align="center">
+                <template #default="{ row }">
+                  {{ getCurrencyText(row.currency) }}
+                </template>
+              </el-table-column>
+              <el-table-column label="金额" min-width="120" align="center">
+                <template #default="{ row }"> ৳{{ row.amount || 0 }} </template>
+              </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>
+                </template>
+              </el-table-column>
+              <el-table-column prop="createTime" label="下单时间" min-width="160" sortable="custom">
                 <template #default="{ row }">
-                  <el-button type="primary" link @click="viewRecharge(row)">查看</el-button>
+                  {{ row.createTime || '-' }}
+                </template>
+              </el-table-column>
+              <el-table-column label="成功时间" min-width="160">
+                <template #default="{ row }">
+                  {{ row.successTime || '--' }}
+                </template>
+              </el-table-column>
+              <el-table-column fixed="right" label="操作" min-width="80">
+                <template #default="{ row }">
+                  <el-button link type="primary" @click="viewRecharge(row)">详情</el-button>
                 </template>
               </el-table-column>
             </el-table>
@@ -244,22 +359,68 @@
           <el-tab-pane label="提现记录" name="withdraws">
             <el-skeleton v-if="state.loading.withdraws" :rows="5" animated />
             <el-table v-else class="sa-table" :data="state.withdraws" stripe border>
-              <el-table-column label="提款订单号" prop="order_sn" width="150" align="center" />
-              <el-table-column label="退款类型" prop="type_text" width="100" align="center" />
-              <el-table-column label="提款渠道" prop="channel_text" width="100" align="center" />
-              <el-table-column label="币种" prop="currency" width="80" align="center" />
-              <el-table-column label="提款金额" width="100" align="center">
-                <template #default="{ row }">৳{{ row.amount || '--' }}</template>
-              </el-table-column>
-              <el-table-column label="状态" prop="status_text" width="100" align="center" />
-              <el-table-column label="收款银行" prop="bank_name" width="100" align="center" />
-              <el-table-column label="收款账户名称" prop="account_name" align="center" />
-              <el-table-column label="收款账户" prop="account_number" align="center" />
-              <el-table-column label="下单时间" prop="created_at" width="140" align="center" />
-              <el-table-column label="成功时间" prop="success_at" width="140" align="center" />
-              <el-table-column label="操作" width="80" align="center">
+              <el-table-column prop="orderNo" label="提款订单号" min-width="180" sortable="custom">
+                <template #default="{ row }">
+                  <span class="sa-table-line-1">{{ row.orderNo || '-' }}</span>
+                </template>
+              </el-table-column>
+              <el-table-column label="提款类型" min-width="100" align="center">
+                <template #default="{ row }">
+                  <el-tag :type="row.accountType === 1 ? 'primary' : 'success'">
+                    {{ getAccountTypeText(row.accountType) }}
+                  </el-tag>
+                </template>
+              </el-table-column>
+              <el-table-column label="提款渠道" min-width="100" align="center">
+                <template #default="{ row }">
+                  <el-tag :type="getChannelType(row.channel)">
+                    {{ getChannelText(row.channel) }}
+                  </el-tag>
+                </template>
+              </el-table-column>
+              <el-table-column label="币种" min-width="80" align="center">
                 <template #default="{ row }">
-                  <el-button type="primary" link @click="viewWithdraw(row)">查看</el-button>
+                  {{ getCurrencyText(row.currency) }}
+                </template>
+              </el-table-column>
+              <el-table-column label="提款金额" min-width="120" align="center">
+                <template #default="{ row }"> ৳{{ row.amount || 0 }} </template>
+              </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>
+                </template>
+              </el-table-column>
+              <el-table-column label="收款银行" min-width="150" align="center">
+                <template #default="{ row }">
+                  {{ row.bank || '-' }}
+                </template>
+              </el-table-column>
+              <el-table-column label="收款账户名称" min-width="130" align="center">
+                <template #default="{ row }">
+                  {{ row.bankAccountName || '-' }}
+                </template>
+              </el-table-column>
+              <el-table-column label="收款账户" min-width="160" align="center">
+                <template #default="{ row }">
+                  {{ row.bankAccount || '-' }}
+                </template>
+              </el-table-column>
+              <el-table-column prop="transTime" label="下单时间" min-width="160" sortable="custom">
+                <template #default="{ row }">
+                  {{ row.transTime || '-' }}
+                </template>
+              </el-table-column>
+              <el-table-column label="成功时间" min-width="160">
+                <template #default="{ row }">
+                  {{ row.successTime || '--' }}
+                </template>
+              </el-table-column>
+              <el-table-column fixed="right" label="操作" min-width="80">
+                <template #default="{ row }">
+                  <el-button link type="primary" @click="viewWithdraw(row)">详情</el-button>
                 </template>
               </el-table-column>
             </el-table>
@@ -290,15 +451,20 @@
 
 <script setup>
   import { ref, reactive, onMounted } from 'vue';
-  import { ElMessage } from 'element-plus';
   import { useModal, usePagination } from '@/sheep/hooks';
-  import { api } from '../user.service';
+  import { api, userUtils } from '../user.service';
+  import {
+    api as orderApi,
+    getOrderStatusInfo,
+    getRefundStatusInfo,
+    getPinkStatusInfo,
+  } from '../../order/order.service';
+  import { api as financeApi, financeUtils } from '../../finance/finance.service';
   import userEdit from './edit.vue';
   import OrderDetail from '../../order/order/detail.vue';
   import userDetail from './detail.vue';
-  import RechargeEdit from '../../finance/recharge/edit.vue';
-  import WithdrawEdit from '../../finance/withdraw/edit.vue';
-  import CommissionEdit from '../../finance/commission/edit.vue';
+  import RechargeDetail from '../../finance/recharge/detail.vue';
+  import WithdrawDetail from '../../finance/withdraw/detail.vue';
 
   const props = defineProps({
     modal: {
@@ -374,21 +540,36 @@
     ];
   };
 
-  // 获取状态文本
-  function getStatusText(status) {
-    switch (status) {
-      case 1:
-        return '正常';
-      case 2:
-        return '禁止提现';
-      case 3:
-        return '禁止登录';
-      case 4:
-        return '禁止下单';
-      default:
-        return '-';
-    }
-  }
+  // 使用各个service中的状态处理函数,避免重复代码
+  // 用户状态处理函数
+  const getStatusText = userUtils.getUserStatusText;
+
+  // 订单状态处理函数
+  const getOrderStatusText = (status) => getOrderStatusInfo(status).text;
+  const getOrderStatusType = (status) => getOrderStatusInfo(status).type;
+
+  // 退款状态处理函数
+  const getRefundStatusText = (status) => getRefundStatusInfo(status).text;
+  const getRefundStatusType = (status) => getRefundStatusInfo(status).type;
+
+  // 拼团状态处理函数
+  const getPinkStatusText = (status) => getPinkStatusInfo(status).text;
+  const getPinkStatusType = (status) => getPinkStatusInfo(status).type;
+
+  // 财务相关状态处理函数
+  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);
@@ -399,6 +580,8 @@
       if (code == '200') {
         state.userDetail = data;
         initBasicInfoTableData();
+        // 用户详情获取完成后,加载当前激活的tab数据
+        await loadTabData(state.activeTab);
       }
     } catch (error) {
       console.error('获取用户详情失败:', error);
@@ -409,6 +592,12 @@
   // 统一数据获取函数
   const fetchTabData = async (tabType, page = 1) => {
     try {
+      // 确保用户详情已获取,特别是手机号
+      if (!state.userDetail.phoneNo) {
+        console.warn('用户手机号未获取,跳过数据请求');
+        return;
+      }
+
       const requestData = {
         page,
         size: pageData.size,
@@ -419,9 +608,13 @@
 
       switch (tabType) {
         case 'orders':
-          // TODO: 实现订单记录获取
-          state.orders = [];
-          return;
+          // 获取用户订单记录 - 使用订单API,添加用户手机号筛选
+          response = await orderApi.order.list({
+            ...requestData,
+            userPhone: state.userDetail.phoneNo, // 使用用户手机号筛选
+          });
+          stateKey = 'orders';
+          break;
         case 'subordinates':
           response = await api.list.myUsers({
             ...requestData,
@@ -431,19 +624,40 @@
           stateKey = 'subordinates';
           break;
         case 'commissions':
-          // TODO: 实现佣金记录获取
-          state.commissions = [];
-          return;
+          // 获取用户佣金记录 - 使用佣金API,添加用户手机号筛选
+          response = await financeApi.commission.list(
+            {
+              ...requestData,
+              userPhone: state.userDetail.phoneNo, // 使用用户手机号筛选
+            },
+            false,
+          );
+          stateKey = 'commissions';
+          break;
         case 'recharges':
-          // TODO: 实现充值记录获取
-          state.recharges = [];
-          return;
+          // 获取用户充值记录 - 使用充值API,添加用户手机号筛选
+          response = await financeApi.recharge.list(
+            {
+              ...requestData,
+              userPhone: state.userDetail.phoneNo, // 使用用户手机号筛选
+            },
+            false,
+          );
+          stateKey = 'recharges';
+          break;
         case 'withdraws':
-          // TODO: 实现提现记录获取
-          state.withdraws = [];
-          return;
+          // 获取用户提现记录 - 使用提现API,添加用户手机号筛选
+          response = await financeApi.withdraw.list(
+            {
+              ...requestData,
+              userPhone: state.userDetail.phoneNo, // 使用用户手机号筛选
+            },
+            false,
+          );
+          stateKey = 'withdraws';
+          break;
         case 'addresses':
-          // TODO: 实现收货地址获取
+          // 获取用户收货地址(暂时留空,后端还在开发)
           state.addresses = [];
           return;
         default:
@@ -481,16 +695,6 @@
     }
   };
 
-  // 发短信
-  const onSendSms = () => {
-    ElMessage.info('发短信功能待开发');
-  };
-
-  // APP推送
-  const onAppPush = () => {
-    ElMessage.info('APP推送功能待开发');
-  };
-
   // 编辑资料
   const onEdit = () => {
     useModal(
@@ -512,12 +716,13 @@
 
   // 统一模态框打开函数
   const openDetailModal = (type, row) => {
+    console.log(row);
     const modalConfigs = {
       order: {
         component: OrderDetail,
         title: '订单详情',
         width: '90%',
-        id: row.order_sn,
+        id: row.id,
       },
       subordinateUser: {
         component: userDetail,
@@ -527,23 +732,17 @@
         id: row.id,
         hasConfirm: true,
       },
-      commission: {
-        component: CommissionEdit,
-        title: '佣金详情',
-        width: '80%',
-        id: row.commission_id,
-      },
       recharge: {
-        component: RechargeEdit,
+        component: RechargeDetail,
         title: '充值详情',
         width: '80%',
-        id: row.order_sn,
+        id: row.id,
       },
       withdraw: {
-        component: WithdrawEdit,
+        component: WithdrawDetail,
         title: '提现详情',
         width: '80%',
-        id: row.order_sn,
+        id: row.id,
       },
     };
 
@@ -554,7 +753,7 @@
 
     if (hasConfirm) {
       useModal(component, modalOptions, {
-        confirm: () => getData(),
+        confirm: () => getUserDetail(),
       });
     } else {
       useModal(component, modalOptions);
@@ -564,17 +763,14 @@
   // 各类详情查看函数(保持向后兼容)
   const viewOrder = (row) => openDetailModal('order', row);
   const viewSubordinateUser = (row) => openDetailModal('subordinateUser', row);
-  const viewCommission = (row) => openDetailModal('commission', row);
   const viewRecharge = (row) => openDetailModal('recharge', row);
   const viewWithdraw = (row) => openDetailModal('withdraw', row);
 
   onMounted(() => {
     // 先初始化基本信息表格数据(防止模板报错)
     initBasicInfoTableData();
-    // 初始化用户详情和基本信息
+    // 初始化用户详情和基本信息(会在获取完成后自动加载tab数据)
     getUserDetail();
-    // 默认加载当前激活的tab数据
-    loadTabData(state.activeTab);
   });
 </script>
 

+ 1 - 1
src/app/shop/admin/user/list/index.vue

@@ -301,7 +301,7 @@
       {
         title: '用户详情',
         type: 'view',
-        width: '1400px',
+        width: '80%',
         id: row.id,
       },
       {

+ 20 - 1
src/app/shop/admin/user/user.service.js

@@ -130,4 +130,23 @@ const api = {
     }),
 };
 
-export { route, api };
+// 用户状态处理工具函数
+const userUtils = {
+  // 获取用户状态文本
+  getUserStatusText: (status) => {
+    switch (status) {
+      case 1:
+        return '正常';
+      case 2:
+        return '禁止提现';
+      case 3:
+        return '禁止登录';
+      case 4:
+        return '禁止下单';
+      default:
+        return '-';
+    }
+  },
+};
+
+export { route, api, userUtils };