Prechádzať zdrojové kódy

feat: 完善充值和提款模块联调

叶静 2 týždňov pred
rodič
commit
d3210f392d

+ 1 - 3
.env.development

@@ -4,10 +4,8 @@ SHEEP_VERSION = v1.4.0
 SHEEP_BASE_URL = /
 
 # 开发环境接口域名
-;  SHEEP_DEV_BASE_URL = http://124.222.152.234:8501
+ SHEEP_DEV_BASE_URL = http://124.222.152.234:8501
 
- # 开发环境接口域名
- SHEEP_DEV_BASE_URL = http://124.222.152.234:8101/mall
 
 # 开发环境上传文件接口域名
  SHEEP_UPLOAD_BASE_URL = /operating

+ 129 - 28
src/app/shop/admin/finance/finance.service.js

@@ -1,5 +1,109 @@
 import Content from '@/sheep/layouts/content.vue';
 import { SELECT, CRUD } from '@/sheep/request/crud';
+import { request } from '@/sheep/request';
+
+// 财务模块公共配置
+const financeConfig = {
+  // 渠道配置
+  channels: {
+    1: 'TKPAY',
+    2: '3QPAY',
+  },
+
+  // 币种配置
+  currencies: {
+    1: 'BDT',
+  },
+
+  // 状态配置
+  status: {
+    recharge: {
+      1: '处理中',
+      2: '充值成功',
+      3: '充值失败',
+      4: '超时取消',
+    },
+    withdraw: {
+      1: '处理中',
+      2: '审核通过',
+      3: '审核拒绝',
+      4: '提现成功',
+      5: '提现失败',
+      6: '超时取消',
+    },
+  },
+
+  // 账户类型配置
+  accountTypes: {
+    1: '钱包余额',
+    2: '账户收益',
+  },
+
+  // 操作日志类型配置
+  logTypes: {
+    1: '提交充值订单',
+    2: '充值调用第三方',
+    3: '充值回调通知成功',
+    4: '提交提现申请',
+    5: '提现审核通过',
+    6: '提现审核失败',
+    7: '提现调用第三方',
+    8: '提现回调通知成功',
+  },
+};
+
+// 公共工具函数
+const financeUtils = {
+  // 获取渠道文本
+  getChannelText: (channel) => financeConfig.channels[channel] || '未知',
+
+  // 获取币种文本
+  getCurrencyText: (currency) => financeConfig.currencies[currency] || 'BDT',
+
+  // 获取充值状态文本
+  getRechargeStatusText: (status) => financeConfig.status.recharge[status] || '未知',
+
+  // 获取提现状态文本
+  getWithdrawStatusText: (status) => financeConfig.status.withdraw[status] || '未知',
+
+  // 获取账户类型文本
+  getAccountTypeText: (accountType) => financeConfig.accountTypes[accountType] || '未知',
+
+  // 获取操作日志类型文本
+  getLogTypeText: (type) => financeConfig.logTypes[type] || '未知操作',
+
+  // 获取状态类型(用于标签颜色)
+  getStatusType: (status, type = 'withdraw') => {
+    if (type === 'recharge') {
+      const statusMap = {
+        1: 'warning', // 处理中
+        2: 'success', // 充值成功
+        3: 'danger', // 充值失败
+        4: 'info', // 超时取消
+      };
+      return statusMap[status] || 'info';
+    } else {
+      const statusMap = {
+        1: 'warning', // 处理中
+        2: 'success', // 审核通过
+        3: 'danger', // 审核拒绝
+        4: 'success', // 提现成功
+        5: 'danger', // 提现失败
+        6: 'info', // 超时取消
+      };
+      return statusMap[status] || 'info';
+    }
+  },
+
+  // 获取渠道类型(用于标签颜色)
+  getChannelType: (channel) => {
+    const channelMap = {
+      1: 'info', // TKPAY
+      2: 'success', // 3QPAY
+    };
+    return channelMap[channel] || 'info';
+  },
+};
 
 const route = {
   path: 'finance',
@@ -39,23 +143,18 @@ const route = {
 const api = {
   // 佣金相关 API
   commission: {
-    ...CRUD('shop/admin/finance/commission'),
-    select: (params) => SELECT('shop/admin/finance/commission', params),
-    settle: (id) => ({
-      error: 0,
-      msg: '结算成功',
-      data: null,
-    }),
-    batchSettle: (ids) => ({
-      error: 0,
-      msg: '批量结算成功',
-      data: null,
-    }),
+    ...CRUD('/cif/red/envelope'),
   },
-  
+
   // 充值相关 API
   recharge: {
-    ...CRUD('shop/admin/finance/recharge'),
+    ...CRUD('cif/recharge/record'),
+    recordDetail: (id) =>
+      request({
+        url: `cif/recharge/record/detail`,
+        method: 'GET',
+        params: { id },
+      }),
     select: (params) => SELECT('shop/admin/finance/recharge', params),
     confirm: (id) => ({
       error: 0,
@@ -68,21 +167,23 @@ const api = {
       data: null,
     }),
   },
-  
+
   // 提现相关 API
   withdraw: {
-    ...CRUD('shop/admin/finance/withdraw'),
-    select: (params) => SELECT('shop/admin/finance/withdraw', params),
-    approve: (id) => ({
-      error: 0,
-      msg: '通过成功',
-      data: null,
-    }),
-    reject: (id, data) => ({
-      error: 0,
-      msg: '拒绝成功',
-      data: null,
-    }),
+    ...CRUD('/cif/withdraw/record'),
+    withdrawDetail: (id) =>
+      request({
+        url: `cif/withdraw/record/detail`,
+        method: 'GET',
+        params: { id },
+      }),
+    // 审核接口
+    review: (data) =>
+      request({
+        url: 'cif/withdraw/record/review',
+        method: 'POST',
+        data,
+      }),
     batchApprove: (ids) => ({
       error: 0,
       msg: '批量通过成功',
@@ -96,4 +197,4 @@ const api = {
   },
 };
 
-export { route, api };
+export { route, api, financeConfig, financeUtils };

+ 45 - 77
src/app/shop/admin/finance/recharge/detail.vue

@@ -1,6 +1,6 @@
 <template>
   <el-container class="recharge-detail">
-    <el-main>
+    <el-main v-loading="loading" element-loading-text="加载中...">
       <!-- 基本信息 -->
       <div class="basic-info sa-m-b-26">
         <h3 class="sa-m-b-20">基本信息</h3>
@@ -8,27 +8,27 @@
           <el-col :span="6">
             <div class="info-item">
               <span class="label">充值单号:</span>
-              <span class="value">{{ rechargeDetail.order_no || '--' }}</span>
+              <span class="value">{{ rechargeDetail.orderNo || '--' }}</span>
             </div>
           </el-col>
           <el-col :span="6">
             <div class="info-item">
               <span class="label">充值状态:</span>
               <el-tag :type="getStatusType(rechargeDetail.status)">
-                {{ rechargeDetail.status_text || '--' }}
+                {{ getStatusText(rechargeDetail.status) }}
               </el-tag>
             </div>
           </el-col>
           <el-col :span="6">
             <div class="info-item">
               <span class="label">充值银行:</span>
-              <span class="value">{{ rechargeDetail.bank_name || 'BKASH' }}</span>
+              <span class="value">{{ rechargeDetail.bankName || '--' }}</span>
             </div>
           </el-col>
           <el-col :span="6">
             <div class="info-item">
               <span class="label">用户名:</span>
-              <span class="value">{{ rechargeDetail.username || '--' }}</span>
+              <span class="value">{{ rechargeDetail.userName || '--' }}</span>
             </div>
           </el-col>
         </el-row>
@@ -36,27 +36,25 @@
           <el-col :span="6">
             <div class="info-item">
               <span class="label">账户名称:</span>
-              <span class="value">{{ rechargeDetail.account_name || 'Aamir Khan' }}</span>
+              <span class="value">{{ rechargeDetail.bankAccountName || '--' }}</span>
             </div>
           </el-col>
           <el-col :span="6">
             <div class="info-item">
               <span class="label">手机号:</span>
-              <span class="value">{{ rechargeDetail.phone || '--' }}</span>
+              <span class="value">{{ rechargeDetail.userPhone || '--' }}</span>
             </div>
           </el-col>
           <el-col :span="6">
             <div class="info-item">
               <span class="label">充值渠道:</span>
-              <el-tag :type="rechargeDetail.channel === 'TKPAY' ? 'info' : 'success'">
-                {{ rechargeDetail.channel_text || '--' }}
-              </el-tag>
+              <span class="value">{{ getChannelText(rechargeDetail.channel) }}</span>
             </div>
           </el-col>
           <el-col :span="6">
             <div class="info-item">
               <span class="label">充值账户:</span>
-              <span class="value">{{ rechargeDetail.recharge_account || '8806422510008' }}</span>
+              <span class="value">{{ rechargeDetail.bankAccount || '--' }}</span>
             </div>
           </el-col>
         </el-row>
@@ -64,25 +62,25 @@
           <el-col :span="6">
             <div class="info-item">
               <span class="label">账户余额:</span>
-              <span class="value">৳{{ rechargeDetail.account_balance || '1,000' }}</span>
+              <span class="value">৳{{ rechargeDetail.walletBalance || 0 }}</span>
             </div>
           </el-col>
           <el-col :span="6">
             <div class="info-item">
               <span class="label">币种:</span>
-              <span class="value">{{ rechargeDetail.currency || 'BDT' }}</span>
+              <span class="value">{{ getCurrencyText(rechargeDetail.currency) }}</span>
             </div>
           </el-col>
           <el-col :span="6">
             <div class="info-item">
               <span class="label">收益余额:</span>
-              <span class="value">৳{{ rechargeDetail.profit_balance || '1,000' }}</span>
+              <span class="value">৳{{ rechargeDetail.earningsBalance || 0 }}</span>
             </div>
           </el-col>
           <el-col :span="6">
             <div class="info-item">
-              <span class="label">充值额:</span>
-              <span class="value">৳{{ rechargeDetail.recharge_balance || '300' }}</span>
+              <span class="label">充值额:</span>
+              <span class="value">৳{{ rechargeDetail.amount || 0 }}</span>
             </div>
           </el-col>
         </el-row>
@@ -102,37 +100,28 @@
             <template #empty>
               <sa-empty />
             </template>
-            <el-table-column prop="time" label="时间" min-width="160" align="center">
+            <el-table-column prop="createTime" label="时间" min-width="160" align="center">
               <template #default="scope">
-                {{ scope.row.time || '--' }}
+                {{ scope.row.createTime || '--' }}
               </template>
             </el-table-column>
-            <el-table-column prop="operator" label="操作人" min-width="120" align="center">
+            <el-table-column prop="createUser" label="操作人" min-width="120" align="center">
               <template #default="scope">
-                {{ scope.row.operator || '--' }}
+                {{ scope.row.createUser || '--' }}
               </template>
             </el-table-column>
-            <el-table-column prop="action" label="事项" min-width="200">
+            <el-table-column prop="type" label="事项" min-width="200">
               <template #default="scope">
-                {{ scope.row.action || '--' }}
+                {{ getLogTypeText(scope.row.type) }}
               </template>
             </el-table-column>
-            <el-table-column prop="remark" label="备注" min-width="300">
+            <el-table-column prop="memo" label="备注" min-width="160" align="center">
               <template #default="scope">
-                {{ scope.row.remark || '--' }}
+                {{ scope.row.memo || '--' }}
               </template>
             </el-table-column>
           </el-table>
         </div>
-
-        <!-- 分页 -->
-        <div class="sa-m-t-16" v-if="operationLogs.total > 0">
-          <sa-pagination
-            :pageData="operationLogs.pageData"
-            @updateFn="getOperationLogs"
-            layout="total, prev, pager, next"
-          />
-        </div>
       </div>
     </el-main>
   </el-container>
@@ -140,11 +129,15 @@
 
 <script setup>
   import { onMounted, reactive, ref } from 'vue';
-  import { rechargeMockData } from '@/sheep/mock/recharge';
   import { usePagination } from '@/sheep/hooks';
+  import { api, financeUtils } from '../finance.service';
 
-  const props = defineProps(['modal']);
-  const emit = defineEmits(['modalCallBack']);
+  const props = defineProps({
+    modal: {
+      type: Object,
+      default: () => ({}),
+    },
+  });
 
   const rechargeDetail = ref({});
   const loading = ref(false);
@@ -158,15 +151,12 @@
     pageData: logPageData,
   });
 
-  // 获取状态类型
-  function getStatusType(status) {
-    const statusMap = {
-      processing: 'warning',
-      success: 'success',
-      failed: 'danger',
-    };
-    return statusMap[status] || 'info';
-  }
+  // 使用公共配置的函数
+  const getStatusType = (status) => financeUtils.getStatusType(status, 'recharge');
+  const getStatusText = financeUtils.getRechargeStatusText;
+  const getChannelText = financeUtils.getChannelText;
+  const getCurrencyText = financeUtils.getCurrencyText;
+  const getLogTypeText = financeUtils.getLogTypeText;
 
   // 获取充值详情
   async function getRechargeDetail() {
@@ -174,9 +164,11 @@
 
     loading.value = true;
     try {
-      const result = rechargeMockData.getDetail(props.modal.params.id);
-      if (result.code == '200') {
-        rechargeDetail.value = result.data;
+      const { code, data } = await api.recharge.recordDetail(props.modal.params.id);
+      if (code == '200') {
+        rechargeDetail.value = data;
+        // 获取详情后更新操作日志
+        getOperationLogs();
       }
     } catch (error) {
       console.error('获取充值详情失败:', error);
@@ -185,36 +177,13 @@
     }
   }
 
-  // 获取操作日志
-  function getOperationLogs(page) {
-    if (page) operationLogs.pageData.page = page;
+  // 获取操作日志 - 从详情数据中获取
+  function getOperationLogs() {
     operationLogs.loading = true;
-
     try {
-      // 模拟操作日志数据
-      const mockLogs = [
-        {
-          time: '2025/06/06 12:30:30',
-          operator: 'Aamir Khan',
-          action: '提交充值订单',
-          remark: '--',
-        },
-        {
-          time: '2025/06/06 12:36:30',
-          operator: 'Aamir Khan',
-          action: '提交充值凭证',
-          remark: '--',
-        },
-        {
-          time: '2025/06/06 12:36:30',
-          operator: 'system',
-          action: '充值订单审核通过',
-          remark: '--',
-        },
-      ];
-
-      operationLogs.data = mockLogs;
-      operationLogs.total = mockLogs.length;
+      // 使用详情数据中的 bizLogs
+      operationLogs.data = rechargeDetail.value.bizLogs || [];
+      operationLogs.total = operationLogs.data.length;
     } catch (error) {
       console.error('获取操作日志失败:', error);
     } finally {
@@ -224,7 +193,6 @@
 
   onMounted(() => {
     getRechargeDetail();
-    getOperationLogs();
   });
 </script>
 

+ 111 - 58
src/app/shop/admin/finance/recharge/index.vue

@@ -6,11 +6,19 @@
         <sa-search-simple
           :searchFields="searchFields"
           :defaultValues="defaultSearchValues"
-          @search="(val) => getData(1, val)"
-          @reset="getData(1)"
+          @search="handleSearch"
+          @reset="handleReset"
         >
         </sa-search-simple>
       </div>
+      <!-- 状态Tab切换 -->
+      <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="1"></el-tab-pane>
+        <el-tab-pane label="充值成功" name="2"></el-tab-pane>
+        <el-tab-pane label="充值失败" name="3"></el-tab-pane>
+        <el-tab-pane label="超时取消" name="4"></el-tab-pane>
+      </el-tabs>
       <div class="sa-title sa-flex sa-row-between">
         <div class="label sa-flex">充值管理</div>
         <div>
@@ -33,33 +41,33 @@
           <template #empty>
             <sa-empty />
           </template>
-          <el-table-column prop="order_no" label="充值订单号" min-width="180" sortable="custom">
+          <el-table-column prop="orderNo" label="订单号" min-width="180" sortable="custom">
             <template #default="scope">
-              <span class="sa-table-line-1">{{ scope.row.order_no || '-' }}</span>
+              <span class="sa-table-line-1">{{ scope.row.orderNo || '-' }}</span>
             </template>
           </el-table-column>
           <el-table-column label="用户名" min-width="120">
             <template #default="scope">
               <el-link type="primary" :underline="true" @click="viewUserDetail(scope.row)">
-                {{ scope.row.username || '-' }}
+                {{ scope.row.userName || '-' }}
               </el-link>
             </template>
           </el-table-column>
-          <el-table-column prop="phone" label="手机号" min-width="130" align="center">
+          <el-table-column prop="userPhone" label="手机号" min-width="130" align="center">
             <template #default="scope">
-              {{ scope.row.phone || '-' }}
+              {{ scope.row.userPhone || '-' }}
             </template>
           </el-table-column>
           <el-table-column label="充值渠道" min-width="100" align="center">
             <template #default="scope">
-              <el-tag :type="scope.row.channel === 'TKPAY' ? 'info' : 'success'">
-                {{ scope.row.channel_text || '-' }}
+              <el-tag :type="getChannelType(scope.row.channel)">
+                {{ getChannelText(scope.row.channel) }}
               </el-tag>
             </template>
           </el-table-column>
           <el-table-column label="币种" min-width="80" align="center">
             <template #default="scope">
-              {{ scope.row.currency || 'BDT' }}
+              {{ getCurrencyText(scope.row.currency) }}
             </template>
           </el-table-column>
           <el-table-column label="金额" min-width="120" align="center">
@@ -68,18 +76,18 @@
           <el-table-column label="状态" min-width="100" align="center">
             <template #default="scope">
               <el-tag :type="getStatusType(scope.row.status)">
-                {{ scope.row.status_text || '-' }}
+                {{ getStatusText(scope.row.status) }}
               </el-tag>
             </template>
           </el-table-column>
-          <el-table-column prop="create_time" label="下单时间" min-width="160" sortable="custom">
+          <el-table-column prop="createTime" label="下单时间" min-width="160" sortable="custom">
             <template #default="scope">
-              {{ scope.row.create_time || '-' }}
+              {{ scope.row.createTime || '-' }}
             </template>
           </el-table-column>
           <el-table-column label="成功时间" min-width="160">
             <template #default="scope">
-              {{ scope.row.success_time || '--' }}
+              {{ scope.row.successTime || '--' }}
             </template>
           </el-table-column>
           <el-table-column fixed="right" label="操作" min-width="80">
@@ -101,70 +109,74 @@
   import { onMounted, reactive, ref } from 'vue';
   import { ElMessage } from 'element-plus';
   import { useModal, usePagination } from '@/sheep/hooks';
-  import { rechargeMockData } from '@/sheep/mock/recharge';
+  import { api, financeUtils } from '../finance.service';
   import UserDetail from '../../user/list/detail.vue';
   import RechargeDetail from './detail.vue';
   const { pageData } = usePagination();
 
   // 搜索字段配置
   const searchFields = reactive({
-    username: {
+    userName: {
       type: 'input',
       label: '用户名',
       placeholder: '请输入用户名',
       width: 150,
     },
-    phone: {
+    userPhone: {
       type: 'input',
       label: '手机号',
       placeholder: '请输入手机号',
       width: 150,
     },
-    order_no: {
+    orderNo: {
       type: 'input',
-      label: '充值订单号',
+      label: '订单号',
       placeholder: '请输入订单号',
       width: 180,
     },
-    status: {
+    channel: {
       type: 'select',
-      label: '充值状态',
-      placeholder: '请选择状态',
+      label: '充值通道',
+      placeholder: '请选择通道',
       width: 120,
       options: [
-        { label: '全部', value: 'all' },
-        { label: '处理中', value: 'processing' },
-        { label: '充值成功', value: 'success' },
-        { label: '充值失败', value: 'failed' },
+        { label: 'TKPAY', value: 1 },
+        { label: '3QPAY', value: 2 },
       ],
     },
-    channel: {
+    timeType: {
       type: 'select',
-      label: '充值通道',
-      placeholder: '请选择通道',
+      label: '时间类型',
+      placeholder: '请选择时间类型',
       width: 120,
       options: [
-        { label: 'TKPAY', value: 'TKPAY' },
-        { label: '3QPAY', value: '3QPAY' },
+        { label: '下单时间', value: 1 },
+        { label: '成功时间', value: 2 },
       ],
     },
     date_range: {
       type: 'daterange',
-      label: '下单时间',
+      label: '时间范围',
       placeholder: '请选择时间范围',
-      width: 240,
+      width: 400,
     },
   });
 
   // 默认搜索值
   const defaultSearchValues = reactive({
-    username: '',
-    phone: '',
-    order_no: '',
-    status: 'all',
+    userName: '',
+    userPhone: '',
+    orderNo: '',
     channel: '',
+    timeType: 1, // 默认下单时间
     date_range: [],
   });
+  // 当前状态标签
+  const currentStatus = ref('all');
+
+  // 当前搜索条件
+  const currentSearchParams = ref({});
+
   // 列表
   const table = reactive({
     data: [],
@@ -174,15 +186,12 @@
   });
   const loading = ref(true);
 
-  // 获取状态类型
-  function getStatusType(status) {
-    const statusMap = {
-      processing: 'warning',
-      success: 'success',
-      failed: 'danger',
-    };
-    return statusMap[status] || 'info';
-  }
+  // 使用公共配置的函数
+  const getStatusType = (status) => financeUtils.getStatusType(status, 'recharge');
+  const getStatusText = financeUtils.getRechargeStatusText;
+  const getChannelType = financeUtils.getChannelType;
+  const getChannelText = financeUtils.getChannelText;
+  const getCurrencyText = financeUtils.getCurrencyText;
 
   // 获取数据
   async function getData(page, searchParams = {}) {
@@ -190,28 +199,28 @@
     loading.value = true;
 
     try {
-      // 处理时间范围参数
+      // 构建请求参数
       let params = {
         page: pageData.page,
         size: pageData.size,
-        order: table.order,
-        sort: table.sort,
         ...searchParams,
       };
 
       // 处理日期范围
       if (searchParams.date_range && searchParams.date_range.length === 2) {
-        params.start_time = searchParams.date_range[0];
-        params.end_time = searchParams.date_range[1];
+        params.startTime = searchParams.date_range[0];
+        params.endTime = searchParams.date_range[1];
         delete params.date_range;
       }
 
-      const result = rechargeMockData.getList(params);
-      if (result.code == '200') {
-        table.data = result.data.data;
-        pageData.page = result.data.current_page;
-        pageData.size = result.data.per_page;
-        pageData.total = result.data.total;
+      // 调用真实API
+      const { code, data } = await api.recharge.list(params, false);
+
+      if (code == '200') {
+        table.data = data.list || [];
+        pageData.page = data.pageNum || 1;
+        pageData.size = data.pageSize || 10;
+        pageData.total = data.total || 0;
       }
     } catch (error) {
       console.error('获取数据失败:', error);
@@ -220,6 +229,50 @@
       loading.value = false;
     }
   }
+  // 标签切换处理
+  const handleTabChange = (status) => {
+    currentStatus.value = status;
+
+    // 根据不同状态设置不同的筛选参数
+    let statusParams = {};
+
+    if (status !== 'all') {
+      statusParams.status = parseInt(status);
+    }
+
+    // 整合搜索条件和状态筛选
+    const allParams = { ...currentSearchParams.value, ...statusParams };
+    getData(1, allParams);
+  };
+
+  // 搜索处理
+  const handleSearch = (searchParams) => {
+    currentSearchParams.value = searchParams;
+
+    // 获取当前tab的状态参数
+    let statusParams = {};
+    if (currentStatus.value !== 'all') {
+      statusParams.status = parseInt(currentStatus.value);
+    }
+
+    // 整合搜索条件和状态筛选
+    const allParams = { ...searchParams, ...statusParams };
+    getData(1, allParams);
+  };
+
+  // 重置处理
+  const handleReset = () => {
+    currentSearchParams.value = {};
+
+    // 获取当前tab的状态参数
+    let statusParams = {};
+    if (currentStatus.value !== 'all') {
+      statusParams.status = parseInt(currentStatus.value);
+    }
+
+    getData(1, statusParams);
+  };
+
   // table 字段排序
   function fieldFilter({ prop, order }) {
     table.order = order == 'ascending' ? 'asc' : 'desc';
@@ -251,7 +304,7 @@
       {
         title: '用户详情',
         type: 'view',
-        id: row.user_id,
+        id: row.userId,
       },
       {
         confirm: () => {

+ 34 - 34
src/app/shop/admin/finance/withdraw/audit.vue

@@ -2,24 +2,24 @@
   <el-container>
     <el-main>
       <el-form ref="formRef" :model="formData" label-width="100px" :rules="rules">
-        <!-- 审核通过时显示通道选择 -->
-        <el-form-item v-if="auditType === 'approve'" label="选择通道:" prop="channel">
+        <!-- 审核通过时显示通道选择 - 暂时注释 -->
+        <!-- <el-form-item v-if="auditType === 'approve'" label="选择通道:" prop="channel">
           <el-select v-model="formData.channel" placeholder="请选择提款通道" style="width: 100%">
             <el-option label="TKPAY" value="TKPAY" />
             <el-option label="3QPAY" value="3QPAY" />
           </el-select>
-        </el-form-item>
+        </el-form-item> -->
 
-        <!-- 审核备注 -->
-        <el-form-item :label="auditType === 'approve' ? '审核备注:' : '审核备注:'" prop="remark">
+        <!-- 审核内容 -->
+        <el-form-item :label="auditType === 'approve' ? '审核备注:' : '拒绝原因:'" prop="review">
           <el-input
-            v-model="formData.remark"
+            v-model="formData.review"
             type="textarea"
-            :rows="auditType === 'approve' ? 3 : 4"
+            :rows="4"
             :placeholder="
-              auditType === 'approve' ? '请输入审核备注(可选)' : '请输入拒绝原因(限100字)'
+              auditType === 'approve' ? '请输入审核备注(可选)' : '请输入拒绝原因(必填)'
             "
-            :maxlength="auditType === 'approve' ? 200 : 100"
+            :maxlength="200"
             show-word-limit
           />
         </el-form-item>
@@ -35,6 +35,7 @@
 <script setup>
   import { reactive, ref, computed } from 'vue';
   import { ElMessage } from 'element-plus';
+  import { api } from '../finance.service';
 
   const props = defineProps(['modal']);
   const emit = defineEmits(['modalCallBack']);
@@ -47,20 +48,18 @@
 
   // 表单数据
   const formData = reactive({
-    channel: '',
-    remark: '',
+    review: '', // 审核内容
   });
 
   // 表单验证规则
   const rules = computed(() => {
     const baseRules = {};
 
-    if (auditType.value === 'approve') {
-      baseRules.channel = [{ required: true, message: '请选择提款通道', trigger: 'change' }];
-    } else {
-      baseRules.remark = [
+    if (auditType.value === 'reject') {
+      // 拒绝时必须填写原因
+      baseRules.review = [
         { required: true, message: '请输入拒绝原因', trigger: 'blur' },
-        { min: 1, max: 100, message: '拒绝原因长度在1到100个字符', trigger: 'blur' },
+        { min: 1, max: 200, message: '拒绝原因长度在1到200个字符', trigger: 'blur' },
       ];
     }
 
@@ -82,25 +81,26 @@
 
       loading.value = true;
 
-      // 模拟API调用
-      await new Promise((resolve) => setTimeout(resolve, 1000));
-
-      const successMessage = auditType.value === 'approve' ? '审核通过成功' : '审核拒绝成功';
-      ElMessage.success(successMessage);
-
-      // 返回审核结果
-      emit('modalCallBack', {
-        action: 'confirm',
-        data: {
-          type: auditType.value,
-          channel: formData.channel,
-          remark: formData.remark,
-        },
-      });
+      // 构建请求参数
+      const requestData = {
+        id: props.modal?.params?.id,
+        type: auditType.value === 'approve' ? 1 : 2, // 1通过 2不通过
+        review: formData.review || '', // 审核内容
+      };
+
+      // 调用审核API
+      const { code, message } = await api.withdraw.review(requestData);
+
+      if (code === '200') {
+        const successMessage = auditType.value === 'approve' ? '审核通过成功' : '审核拒绝成功';
+        ElMessage.success(successMessage);
+
+        // 返回审核结果
+        emit('modalCallBack', { event: 'confirm' });
+      } else {
+        throw new Error(message || '审核失败');
+      }
     } catch (error) {
-      console.error('审核操作失败:', error);
-      const errorMessage = auditType.value === 'approve' ? '审核通过失败' : '审核拒绝失败';
-      ElMessage.error(errorMessage);
     } finally {
       loading.value = false;
     }

+ 65 - 151
src/app/shop/admin/finance/withdraw/detail.vue

@@ -1,40 +1,43 @@
 <template>
   <el-container class="withdraw-detail">
-    <el-main>
-      <!-- 操作按钮 -->
-      <div class="operation-buttons sa-m-b-26" v-if="withdrawDetail.status === 'processing'">
-        <el-button type="success" @click="handleApprove">审核通过</el-button>
-        <el-button type="danger" @click="handleReject">审核拒绝</el-button>
-      </div>
-
+    <el-main v-loading="loading" element-loading-text="加载中...">
       <!-- 基本信息 -->
       <div class="basic-info sa-m-b-26">
-        <h3 class="sa-m-b-20">基本信息</h3>
+        <div class="sa-flex sa-row-between sa-m-b-20">
+          <h3>基本信息</h3>
+          <!-- 操作按钮 -->
+          <div class="operation-buttons mb-40px" v-if="withdrawDetail.status === 1">
+            <el-button type="success" plain @click="handleApprove" class="mr-10px"
+              >审核通过</el-button
+            >
+            <el-button type="danger" plain @click="handleReject">审核拒绝</el-button>
+          </div>
+        </div>
         <el-row :gutter="20">
           <el-col :span="6">
             <div class="info-item">
               <span class="label">提款单号:</span>
-              <span class="value">{{ withdrawDetail.order_no || '--' }}</span>
+              <span class="value">{{ withdrawDetail.orderNo || '--' }}</span>
             </div>
           </el-col>
           <el-col :span="6">
             <div class="info-item">
               <span class="label">提款状态:</span>
               <el-tag :type="getStatusType(withdrawDetail.status)">
-                {{ withdrawDetail.status_text || '--' }}
+                {{ getStatusText(withdrawDetail.status) }}
               </el-tag>
             </div>
           </el-col>
           <el-col :span="6">
             <div class="info-item">
               <span class="label">收款银行:</span>
-              <span class="value">{{ withdrawDetail.bank_name || '--' }}</span>
+              <span class="value">{{ withdrawDetail.bank || '--' }}</span>
             </div>
           </el-col>
           <el-col :span="6">
             <div class="info-item">
               <span class="label">用户名:</span>
-              <span class="value">{{ withdrawDetail.username || '--' }}</span>
+              <span class="value">{{ withdrawDetail.userName || '--' }}</span>
             </div>
           </el-col>
         </el-row>
@@ -42,28 +45,28 @@
           <el-col :span="6">
             <div class="info-item">
               <span class="label">提款类型:</span>
-              <el-tag :type="withdrawDetail.withdraw_type === 'bank' ? 'info' : 'success'">
-                {{ withdrawDetail.withdraw_type_text || '--' }}
+              <el-tag :type="withdrawDetail.accountType === 1 ? 'primary' : 'success'">
+                {{ getAccountTypeText(withdrawDetail.accountType) }}
               </el-tag>
             </div>
           </el-col>
           <el-col :span="6">
             <div class="info-item">
               <span class="label">账户名称:</span>
-              <span class="value">{{ withdrawDetail.account_name || '--' }}</span>
+              <span class="value">{{ withdrawDetail.bankAccountName || '--' }}</span>
             </div>
           </el-col>
           <el-col :span="6">
             <div class="info-item">
               <span class="label">手机号:</span>
-              <span class="value">{{ withdrawDetail.phone || '--' }}</span>
+              <span class="value">{{ withdrawDetail.userPhone || '--' }}</span>
             </div>
           </el-col>
           <el-col :span="6">
             <div class="info-item">
               <span class="label">提款渠道:</span>
-              <el-tag type="info">
-                {{ withdrawDetail.withdraw_channel_text || '--' }}
+              <el-tag :type="getChannelType(withdrawDetail.channel)">
+                {{ getChannelText(withdrawDetail.channel) }}
               </el-tag>
             </div>
           </el-col>
@@ -72,25 +75,25 @@
           <el-col :span="6">
             <div class="info-item">
               <span class="label">收款账户:</span>
-              <span class="value">{{ withdrawDetail.account_number || '--' }}</span>
+              <span class="value">{{ withdrawDetail.bankAccount || '--' }}</span>
             </div>
           </el-col>
           <el-col :span="6">
             <div class="info-item">
               <span class="label">账户余额:</span>
-              <span class="value">৳{{ withdrawDetail.account_balance || '0' }}</span>
+              <span class="value">৳{{ withdrawDetail.walletBalance || 0 }}</span>
             </div>
           </el-col>
           <el-col :span="6">
             <div class="info-item">
               <span class="label">币种:</span>
-              <span class="value">{{ withdrawDetail.currency || 'BDT' }}</span>
+              <span class="value">{{ getCurrencyText(withdrawDetail.currency) }}</span>
             </div>
           </el-col>
           <el-col :span="6">
             <div class="info-item">
               <span class="label">收益余额:</span>
-              <span class="value">৳{{ withdrawDetail.profit_balance || '0' }}</span>
+              <span class="value">৳{{ withdrawDetail.earningsBalance || 0 }}</span>
             </div>
           </el-col>
         </el-row>
@@ -98,25 +101,13 @@
           <el-col :span="6">
             <div class="info-item">
               <span class="label">提款金额:</span>
-              <span class="value">৳{{ withdrawDetail.amount || '0' }}</span>
+              <span class="value">৳{{ withdrawDetail.amount || 0 }}</span>
             </div>
           </el-col>
           <el-col :span="6">
             <div class="info-item">
               <span class="label">提款手续费:</span>
-              <span class="value">৳{{ withdrawDetail.fee || '0' }}</span>
-            </div>
-          </el-col>
-          <el-col :span="6">
-            <div class="info-item">
-              <span class="label">申请时间:</span>
-              <span class="value">{{ withdrawDetail.create_time || '--' }}</span>
-            </div>
-          </el-col>
-          <el-col :span="6">
-            <div class="info-item">
-              <span class="label">成功时间:</span>
-              <span class="value">{{ withdrawDetail.success_time || '--' }}</span>
+              <span class="value">৳{{ withdrawDetail.fee || 0 }}</span>
             </div>
           </el-col>
         </el-row>
@@ -136,19 +127,19 @@
             <template #empty>
               <sa-empty />
             </template>
-            <el-table-column prop="time" label="时间" min-width="160" align="center">
+            <el-table-column prop="createTime" label="时间" min-width="160" align="center">
               <template #default="scope">
-                {{ scope.row.time || '--' }}
+                {{ scope.row.createTime || '--' }}
               </template>
             </el-table-column>
-            <el-table-column prop="operator" label="操作人" min-width="120" align="center">
+            <el-table-column prop="createUser" label="操作人" min-width="120" align="center">
               <template #default="scope">
-                {{ scope.row.operator || '--' }}
+                {{ scope.row.createUser || '--' }}
               </template>
             </el-table-column>
-            <el-table-column prop="action" label="事项" min-width="200">
+            <el-table-column prop="type" label="事项" min-width="200">
               <template #default="scope">
-                {{ scope.row.action || '--' }}
+                {{ getLogTypeText(scope.row.type) }}
               </template>
             </el-table-column>
             <el-table-column prop="remark" label="备注" min-width="300">
@@ -158,15 +149,6 @@
             </el-table-column>
           </el-table>
         </div>
-
-        <!-- 分页 -->
-        <div class="sa-m-t-16" v-if="operationLogs.total > 0">
-          <sa-pagination
-            :pageData="operationLogs.pageData"
-            @updateFn="getOperationLogs"
-            layout="total, prev, pager, next"
-          />
-        </div>
       </div>
     </el-main>
   </el-container>
@@ -174,13 +156,16 @@
 
 <script setup>
   import { onMounted, reactive, ref } from 'vue';
-  import { ElMessage } from 'element-plus';
-  import { withdrawMockData } from '@/sheep/mock/withdraw';
   import { useModal, usePagination } from '@/sheep/hooks';
+  import { api, financeUtils } from '../finance.service';
   import WithdrawAudit from './audit.vue';
 
-  const props = defineProps(['modal']);
-  const emit = defineEmits(['modalCallBack']);
+  const props = defineProps({
+    modal: {
+      type: Object,
+      default: () => ({}),
+    },
+  });
 
   const withdrawDetail = ref({});
   const loading = ref(false);
@@ -194,15 +179,14 @@
     pageData: logPageData,
   });
 
-  // 获取状态类型
-  function getStatusType(status) {
-    const statusMap = {
-      processing: 'warning',
-      success: 'success',
-      failed: 'danger',
-    };
-    return statusMap[status] || 'info';
-  }
+  // 使用公共配置的函数
+  const getStatusType = (status) => financeUtils.getStatusType(status, 'withdraw');
+  const getStatusText = financeUtils.getWithdrawStatusText;
+  const getAccountTypeText = financeUtils.getAccountTypeText;
+  const getChannelType = financeUtils.getChannelType;
+  const getChannelText = financeUtils.getChannelText;
+  const getCurrencyText = financeUtils.getCurrencyText;
+  const getLogTypeText = financeUtils.getLogTypeText;
 
   // 获取提款详情
   async function getWithdrawDetail() {
@@ -210,9 +194,11 @@
 
     loading.value = true;
     try {
-      const result = withdrawMockData.getDetail(props.modal.params.id);
-      if (result.code == '200') {
-        withdrawDetail.value = result.data;
+      const { code, data } = await api.withdraw.withdrawDetail(props.modal.params.id);
+      if (code == '200') {
+        withdrawDetail.value = data;
+        // 获取详情后更新操作日志
+        getOperationLogs();
       }
     } catch (error) {
       console.error('获取提款详情失败:', error);
@@ -221,42 +207,13 @@
     }
   }
 
-  // 获取操作日志
-  function getOperationLogs(page) {
-    if (page) operationLogs.pageData.page = page;
+  // 获取操作日志 - 从详情数据中获取
+  function getOperationLogs() {
     operationLogs.loading = true;
-
     try {
-      // 模拟操作日志数据
-      const mockLogs = [
-        {
-          time: '2025/01/15 10:30:00',
-          operator: 'John Doe',
-          action: '提交提款申请',
-          remark: '--',
-        },
-        {
-          time: '2025/01/15 10:35:00',
-          operator: 'John Doe',
-          action: '上传银行凭证',
-          remark: '--',
-        },
-        {
-          time: '2025/01/15 11:00:00',
-          operator: 'system',
-          action: '提款申请审核中',
-          remark: '--',
-        },
-        {
-          time: '2025/01/15 11:30:00',
-          operator: 'admin',
-          action: '提款申请审核通过',
-          remark: '审核通过,开始处理',
-        },
-      ];
-
-      operationLogs.data = mockLogs;
-      operationLogs.total = mockLogs.length;
+      // 使用详情数据中的 bizLogs
+      operationLogs.data = withdrawDetail.value.bizLogs || [];
+      operationLogs.total = operationLogs.data.length;
     } catch (error) {
       console.error('获取操作日志失败:', error);
     } finally {
@@ -271,13 +228,12 @@
       {
         width: '500px',
         title: '提款审核通过',
+        id: withdrawDetail.value.id,
         type: 'approve',
       },
       {
-        confirm: (result) => {
-          if (result.action === 'confirm') {
-            handleAuditResult(result.data);
-          }
+        confirm: () => {
+          getWithdrawDetail();
         },
       },
     );
@@ -290,69 +246,27 @@
       {
         width: '500px',
         title: '提款审核拒绝',
+        id: withdrawDetail.value.id,
         type: 'reject',
       },
       {
-        confirm: (result) => {
-          if (result.action === 'confirm') {
-            handleAuditResult(result.data);
-          }
+        confirm: () => {
+          getWithdrawDetail();
         },
       },
     );
   }
 
-  // 处理审核结果
-  function handleAuditResult(data) {
-    if (data.type === 'approve') {
-      // 更新状态为成功
-      withdrawDetail.value.status = 'success';
-      withdrawDetail.value.status_text = '提款成功';
-      withdrawDetail.value.success_time = new Date().toLocaleString();
-
-      // 添加操作日志
-      operationLogs.data.unshift({
-        time: new Date().toLocaleString(),
-        operator: 'admin',
-        action: '审核通过',
-        remark: `通过渠道:${data.channel}${data.remark ? ',备注:' + data.remark : ''}`,
-      });
-    } else if (data.type === 'reject') {
-      // 更新状态为失败
-      withdrawDetail.value.status = 'failed';
-      withdrawDetail.value.status_text = '提款失败';
-
-      // 添加操作日志
-      operationLogs.data.unshift({
-        time: new Date().toLocaleString(),
-        operator: 'admin',
-        action: '审核拒绝',
-        remark: data.remark,
-      });
-    }
-
-    // 通知父组件刷新
-    emit('modalCallBack');
-  }
-
   onMounted(() => {
     getWithdrawDetail();
-    getOperationLogs();
   });
 </script>
 
 <style lang="scss" scoped>
   .withdraw-detail {
     .operation-buttons {
-      text-align: center;
-      padding: 20px 0;
-      border-bottom: 1px solid #ebeef5;
-
       .el-button {
-        margin: 0 10px;
-        padding: 12px 30px;
-        font-size: 14px;
-        font-weight: 500;
+        margin-left: 8px;
       }
     }
 

+ 132 - 62
src/app/shop/admin/finance/withdraw/index.vue

@@ -7,10 +7,20 @@
           key="withdraw-search"
           :searchFields="searchFields"
           :defaultValues="defaultSearchValues"
-          @search="(val) => getData(1, val)"
-          @reset="getData(1)"
+          @search="handleSearch"
+          @reset="handleReset"
         />
       </div>
+      <!-- 状态Tab切换 -->
+      <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="1"></el-tab-pane>
+        <el-tab-pane label="审核通过" name="2"></el-tab-pane>
+        <el-tab-pane label="审核拒绝" name="3"></el-tab-pane>
+        <el-tab-pane label="提现成功" name="4"></el-tab-pane>
+        <el-tab-pane label="提现失败" name="5"></el-tab-pane>
+        <el-tab-pane label="超时取消" name="6"></el-tab-pane>
+      </el-tabs>
       <div class="sa-title sa-flex sa-row-between">
         <div class="label sa-flex">提款管理</div>
         <div>
@@ -26,47 +36,46 @@
           class="sa-table"
           :data="table.data"
           @sort-change="fieldFilter"
-          @row-dblclick="viewDetail"
           row-key="id"
           stripe
         >
           <template #empty>
             <sa-empty />
           </template>
-          <el-table-column prop="order_no" label="提款订单号" min-width="180" sortable="custom">
+          <el-table-column prop="orderNo" label="提款订单号" min-width="180" sortable="custom">
             <template #default="scope">
-              <span class="sa-table-line-1">{{ scope.row.order_no || '-' }}</span>
+              <span class="sa-table-line-1">{{ scope.row.orderNo || '-' }}</span>
             </template>
           </el-table-column>
           <el-table-column label="用户名" min-width="120">
             <template #default="scope">
               <el-link type="primary" :underline="true" @click="viewUserDetail(scope.row)">
-                {{ scope.row.username || '-' }}
+                {{ scope.row.userName || '-' }}
               </el-link>
             </template>
           </el-table-column>
-          <el-table-column prop="phone" label="手机号" min-width="130" align="center">
+          <el-table-column prop="userPhone" label="手机号" min-width="130" align="center">
             <template #default="scope">
-              {{ scope.row.phone || '-' }}
+              {{ scope.row.userPhone || '-' }}
             </template>
           </el-table-column>
           <el-table-column label="提款类型" min-width="100" align="center">
             <template #default="scope">
-              <el-tag :type="scope.row.withdraw_type === 'bank' ? 'info' : 'success'">
-                {{ scope.row.withdraw_type_text || '-' }}
+              <el-tag :type="scope.row.accountType === 1 ? 'primary' : 'success'">
+                {{ getAccountTypeText(scope.row.accountType) }}
               </el-tag>
             </template>
           </el-table-column>
           <el-table-column label="提款渠道" min-width="100" align="center">
             <template #default="scope">
-              <el-tag type="info">
-                {{ scope.row.withdraw_channel_text || '-' }}
+              <el-tag :type="getChannelType(scope.row.channel)">
+                {{ getChannelText(scope.row.channel) }}
               </el-tag>
             </template>
           </el-table-column>
           <el-table-column label="币种" min-width="80" align="center">
             <template #default="scope">
-              {{ scope.row.currency || 'BDT' }}
+              {{ getCurrencyText(scope.row.currency) }}
             </template>
           </el-table-column>
           <el-table-column label="提款金额" min-width="120" align="center">
@@ -75,33 +84,33 @@
           <el-table-column label="状态" min-width="100" align="center">
             <template #default="scope">
               <el-tag :type="getStatusType(scope.row.status)">
-                {{ scope.row.status_text || '-' }}
+                {{ getStatusText(scope.row.status) }}
               </el-tag>
             </template>
           </el-table-column>
           <el-table-column label="收款银行" min-width="150" align="center">
             <template #default="scope">
-              {{ scope.row.bank_name || '-' }}
+              {{ scope.row.bank || '-' }}
             </template>
           </el-table-column>
           <el-table-column label="收款账户名称" min-width="130" align="center">
             <template #default="scope">
-              {{ scope.row.account_name || '-' }}
+              {{ scope.row.bankAccountName || '-' }}
             </template>
           </el-table-column>
           <el-table-column label="收款账户" min-width="160" align="center">
             <template #default="scope">
-              {{ scope.row.account_number || '-' }}
+              {{ scope.row.bankAccount || '-' }}
             </template>
           </el-table-column>
-          <el-table-column prop="create_time" label="下单时间" min-width="160" sortable="custom">
+          <el-table-column prop="transTime" label="下单时间" min-width="160" sortable="custom">
             <template #default="scope">
-              {{ scope.row.create_time || '-' }}
+              {{ scope.row.transTime || '-' }}
             </template>
           </el-table-column>
           <el-table-column label="成功时间" min-width="160">
             <template #default="scope">
-              {{ scope.row.success_time || '--' }}
+              {{ scope.row.successTime || '--' }}
             </template>
           </el-table-column>
           <el-table-column fixed="right" label="操作" min-width="80">
@@ -123,58 +132,74 @@
   import { onMounted, reactive, ref } from 'vue';
   import { ElMessage } from 'element-plus';
   import { useModal, usePagination } from '@/sheep/hooks';
-  import { withdrawMockData } from '@/sheep/mock/withdraw';
+  import { api, financeUtils } from '../finance.service';
   import UserDetail from '../../user/list/detail.vue';
   import WithdrawDetail from './detail.vue';
+
   const { pageData } = usePagination();
 
+  // 当前状态标签
+  const currentStatus = ref('all');
+
+  // 当前搜索条件
+  const currentSearchParams = ref({});
+
   // 搜索字段配置
   const searchFields = reactive({
-    username: {
+    userName: {
       type: 'input',
       label: '用户名',
       placeholder: '请输入用户名',
       width: 150,
     },
-    phone: {
+    userPhone: {
       type: 'input',
       label: '手机号',
       placeholder: '请输入手机号',
       width: 150,
     },
-    order_no: {
+    orderNo: {
       type: 'input',
-      label: '提款订单号',
+      label: '订单号',
       placeholder: '请输入订单号',
       width: 180,
     },
-    status: {
+    channel: {
       type: 'select',
-      label: '提款状态',
-      placeholder: '请选择状态',
+      label: '提现通道',
+      placeholder: '请选择通道',
       width: 120,
       options: [
-        { label: '全部状态', value: 'all' },
-        { label: '处理中', value: 'processing' },
-        { label: '提款成功', value: 'success' },
-        { label: '提款失败', value: 'failed' },
+        { label: 'TKPAY', value: 1 },
+        { label: '3QPAY', value: 2 },
       ],
     },
-    create_time: {
+    timeType: {
+      type: 'select',
+      label: '时间类型',
+      placeholder: '请选择时间类型',
+      width: 120,
+      options: [
+        { label: '下单时间', value: 1 },
+        { label: '成功时间', value: 2 },
+      ],
+    },
+    date_range: {
       type: 'daterange',
-      label: '下单时间',
+      label: '时间范围',
       placeholder: '请选择时间范围',
-      width: 240,
+      width: 400,
     },
   });
 
   // 默认搜索值
   const defaultSearchValues = reactive({
-    username: '',
-    phone: '',
-    order_no: '',
-    status: 'all',
-    create_time: [],
+    userName: '',
+    userPhone: '',
+    orderNo: '',
+    channel: '',
+    timeType: 1, // 默认下单时间
+    date_range: [],
   });
   // 列表
   const table = reactive({
@@ -185,15 +210,13 @@
   });
   const loading = ref(true);
 
-  // 获取状态类型
-  function getStatusType(status) {
-    const statusMap = {
-      processing: 'warning',
-      success: 'success',
-      failed: 'danger',
-    };
-    return statusMap[status] || 'info';
-  }
+  // 使用公共配置的函数
+  const getStatusType = (status) => financeUtils.getStatusType(status, 'withdraw');
+  const getStatusText = financeUtils.getWithdrawStatusText;
+  const getChannelType = financeUtils.getChannelType;
+  const getChannelText = financeUtils.getChannelText;
+  const getCurrencyText = financeUtils.getCurrencyText;
+  const getAccountTypeText = financeUtils.getAccountTypeText;
 
   // 获取数据
   async function getData(page, searchParams = {}) {
@@ -201,28 +224,28 @@
     loading.value = true;
 
     try {
-      // 处理时间范围参数
+      // 构建请求参数
       let params = {
         page: pageData.page,
         size: pageData.size,
-        order: table.order,
-        sort: table.sort,
         ...searchParams,
       };
 
       // 处理日期范围
-      if (searchParams.create_time && searchParams.create_time.length === 2) {
-        params.start_time = searchParams.create_time[0];
-        params.end_time = searchParams.create_time[1];
-        delete params.create_time;
+      if (searchParams.date_range && searchParams.date_range.length === 2) {
+        params.startTime = searchParams.date_range[0];
+        params.endTime = searchParams.date_range[1];
+        delete params.date_range;
       }
 
-      const result = withdrawMockData.getList(params);
-      if (result.code == '200') {
-        table.data = result.data.data;
-        pageData.page = result.data.current_page;
-        pageData.size = result.data.per_page;
-        pageData.total = result.data.total;
+      // 调用真实API
+      const { code, data } = await api.withdraw.list(params, false);
+
+      if (code == '200') {
+        table.data = data.list || [];
+        pageData.page = data.pageNum || 1;
+        pageData.size = data.pageSize || 10;
+        pageData.total = data.total || 0;
       }
     } catch (error) {
       console.error('获取数据失败:', error);
@@ -231,6 +254,50 @@
       loading.value = false;
     }
   }
+  // 标签切换处理
+  const handleTabChange = (status) => {
+    currentStatus.value = status;
+
+    // 根据不同状态设置不同的筛选参数
+    let statusParams = {};
+
+    if (status !== 'all') {
+      statusParams.status = parseInt(status);
+    }
+
+    // 整合搜索条件和状态筛选
+    const allParams = { ...currentSearchParams.value, ...statusParams };
+    getData(1, allParams);
+  };
+
+  // 搜索处理
+  const handleSearch = (searchParams) => {
+    currentSearchParams.value = searchParams;
+
+    // 获取当前tab的状态参数
+    let statusParams = {};
+    if (currentStatus.value !== 'all') {
+      statusParams.status = parseInt(currentStatus.value);
+    }
+
+    // 整合搜索条件和状态筛选
+    const allParams = { ...searchParams, ...statusParams };
+    getData(1, allParams);
+  };
+
+  // 重置处理
+  const handleReset = () => {
+    currentSearchParams.value = {};
+
+    // 获取当前tab的状态参数
+    let statusParams = {};
+    if (currentStatus.value !== 'all') {
+      statusParams.status = parseInt(currentStatus.value);
+    }
+
+    getData(1, statusParams);
+  };
+
   // table 字段排序
   function fieldFilter({ prop, order }) {
     table.order = order == 'ascending' ? 'asc' : 'desc';
@@ -252,6 +319,9 @@
           // 审核操作后刷新列表
           getData();
         },
+        close: () => {
+          getData();
+        },
       },
     );
   }

+ 6 - 2
src/app/shop/admin/user/list/detail.vue

@@ -342,7 +342,7 @@
         field2: getStatusText(state.userDetail.status) || '--', // 状态
         field3: state.userDetail.nickname || '--', // 昵称
         field4: state.userDetail.bank || '--', // 收款银行
-        field5: state.userDetail.name || '--', // 账户名称
+        field5: state.userDetail.bankAccountName || '--', // 账户名称
       },
       {
         field1: state.userDetail.phoneNo || '--', // 手机号
@@ -423,7 +423,11 @@
           state.orders = [];
           return;
         case 'subordinates':
-          response = await api.list.myUsers({ ...requestData, type: 1 });
+          response = await api.list.myUsers({
+            ...requestData,
+            type: 1,
+            userId: props.modal.params.id,
+          });
           stateKey = 'subordinates';
           break;
         case 'commissions':

+ 4 - 3
src/app/shop/admin/user/list/edit.vue

@@ -24,6 +24,7 @@
             :max-size="5"
             :direct-upload="true"
             :size="100"
+            field5
             placeholder="上传用户头像"
           />
         </el-form-item>
@@ -32,8 +33,8 @@
           <el-input v-model="form.model.bank" placeholder="请输入收款银行"></el-input>
         </el-form-item>
 
-        <el-form-item label="账户名称" prop="name">
-          <el-input v-model="form.model.name" placeholder="请输入账户名称"></el-input>
+        <el-form-item label="账户名称" prop="bankAccountName">
+          <el-input v-model="form.model.bankAccountName" placeholder="请输入账户名称"></el-input>
         </el-form-item>
 
         <el-form-item label="收款账户" prop="bankAccount">
@@ -86,7 +87,7 @@
       phoneNo: '',
       headPic: [],
       bank: '',
-      name: '',
+      bankAccountName: '',
       bankAccount: '',
       status: 1,
       memo: '',