pxb hace 1 semana
padre
commit
6c91de8605

+ 63 - 0
src/api/data.js

@@ -826,6 +826,69 @@ export function getUserInfo(params) {
   })
   })
 }
 }
 
 
+// 出入款汇总
+export function getFundsSummary(params) {
+  return request({
+    url: 'funds/summary',
+    method: 'get',
+    params: params
+  })
+}
+
+// 人工稽查列表
+export function getManualAuditList(params) {
+  return request({
+    url: 'manualAudit',
+    method: 'get',
+    params: params
+  })
+}
+
+// 人工稽查详情
+export function getManualAuditDetail(params) {
+  return request({
+    url: 'manualAudit/detail',
+    method: 'get',
+    params: params
+  })
+}
+
+// 人工上分
+export function manualAuditTopUp(data) {
+  return request({
+    url: 'manualAudit/topUp',
+    method: 'post',
+    data: data
+  })
+}
+
+// 人工下分
+export function manualAuditDebit(data) {
+  return request({
+    url: 'manualAudit/debit',
+    method: 'post',
+    data: data
+  })
+}
+
+// 第三方入款列表
+export function getThirdPartyDepositList(params) {
+  return request({
+    url: 'thirdPartyDeposit',
+    method: 'get',
+    params: params
+  })
+}
+
+// 第三方入款详情
+export function getThirdPartyDepositDetail(params) {
+  return request({
+    url: 'thirdPartyDeposit/detail',
+    method: 'get',
+    params: params
+  })
+}
+
 /**
 /**
  * 彩票配置
  * 彩票配置
  * @description GET请求
  * @description GET请求

+ 37 - 23
src/views/fund/inOutSummary/index.vue

@@ -28,7 +28,7 @@
       <div class="summary-body">
       <div class="summary-body">
         <!-- 收入 -->
         <!-- 收入 -->
         <div class="summary-card income-card">
         <div class="summary-card income-card">
-          <div class="card-header">收入</div>
+          <div class="card-header">收入(总金额:<span style="color: #18C80A;">{{ incomeTotal }}</span>)</div>
           <div class="card-body">
           <div class="card-body">
             <div class="row-header">
             <div class="row-header">
               <span class="row-label">收入项目</span>
               <span class="row-label">收入项目</span>
@@ -43,7 +43,7 @@
 
 
         <!-- 支出 -->
         <!-- 支出 -->
         <div class="summary-card expense-card">
         <div class="summary-card expense-card">
-          <div class="card-header">支出</div>
+          <div class="card-header">支出(总金额:<span style="color: #F56C6C;">{{ expenseTotal }}</span>)</div>
           <div class="card-body">
           <div class="card-body">
             <div class="row-header">
             <div class="row-header">
               <span class="row-label">支出项目</span>
               <span class="row-label">支出项目</span>
@@ -61,6 +61,7 @@
 </template>
 </template>
 
 
 <script>
 <script>
+import { getFundsSummary } from '@/api/data'
 import { buildDatePickerOptions } from '@/utils/index'
 import { buildDatePickerOptions } from '@/utils/index'
 export default {
 export default {
   name: 'InOutSummary',
   name: 'InOutSummary',
@@ -107,26 +108,16 @@ export default {
           }
           }
         ]
         ]
       }),
       }),
-      // 假数据:收入
-      incomeRows: [
-        { name: '公司入款', amount: 0, count: 0 },
-        { name: '第三方支付(入款)', amount: 0, count: 0 },
-        { name: '人工上分', amount: 20000, count: 16 },
-        { name: '会员出款扣除', amount: 0, count: 0 }
-      ],
-      // 假数据:支出
-      expenseRows: [
-        { name: '会员出款', amount: 0, count: 0 },
-        { name: '人工出款', amount: 0, count: 0 },
-        { name: '给予优惠(VIP 折扣)', amount: 0, count: 0 },
-        { name: '给予返点', amount: 0, count: 0 },
-        { name: '优惠金', amount: 0, count: 0 },
-        { name: '第三方手续费', amount: 0, count: 0 },
-        { name: '第三方支付出款 (自动出款)', amount: 0, count: 0 },
-        { name: '第三方支付自动出款手续费', amount: 0, count: 0 }
-      ]
+      // 接口数据:收入 / 支出
+      incomeRows: [],
+      expenseRows: [],
+      incomeTotal: '0.00',
+      expenseTotal: '0.00'
     }
     }
   },
   },
+  created() {
+    this.handleSearch()
+  },
   methods: {
   methods: {
     getDefaultDate(offsetDays) {
     getDefaultDate(offsetDays) {
       const d = new Date()
       const d = new Date()
@@ -136,10 +127,33 @@ export default {
     },
     },
     handleSearch() {
     handleSearch() {
       this.loading = true
       this.loading = true
-      // TODO: 替换为真实接口
-      setTimeout(() => {
+      const [start, end] = this.query.dateRange || []
+      getFundsSummary({
+        start_date: start ? start.split(' ')[0] : '',
+        end_date: end ? end.split(' ')[0] : ''
+      }).then(res => {
+        if (res.code === 0 || res.code === 99) {
+          const data = res.data || {}
+          this.incomeRows = (data.income || []).map(item => ({
+            name: item.label,
+            amount: item.amount != null ? item.amount : '0.00',
+            count: item.people != null ? item.people : 0
+          }))
+          this.expenseRows = (data.expense || []).map(item => ({
+            name: item.label,
+            amount: item.amount != null ? item.amount : '0.00',
+            count: item.people != null ? item.people : 0
+          }))
+          this.incomeTotal = data.income_total != null ? data.income_total : '0.00'
+          this.expenseTotal = data.expense_total != null ? data.expense_total : '0.00'
+        } else {
+          this.$message.error(res.msg || '获取汇总数据失败')
+        }
+      }).catch(() => {
+        this.$message.error('请求异常')
+      }).finally(() => {
         this.loading = false
         this.loading = false
-      }, 300)
+      })
     }
     }
   }
   }
 }
 }

+ 181 - 58
src/views/fund/manualAudit/index.vue

@@ -7,10 +7,22 @@
           <el-button type="danger" size="small" @click="openDownDialog">人工下分</el-button>
           <el-button type="danger" size="small" @click="openDownDialog">人工下分</el-button>
         </div>
         </div>
         <el-form inline :model="query" class="filter-form">
         <el-form inline :model="query" class="filter-form">
+          <el-form-item label="会员ID">
+            <el-input v-model="query.member_id" clearable placeholder="请输入" style="width: 150px" />
+          </el-form-item>
+          <el-form-item label="会员昵称">
+            <el-input v-model="query.first_name" clearable placeholder="请输入" style="width: 150px" />
+          </el-form-item>
           <el-form-item label="交易类型">
           <el-form-item label="交易类型">
             <el-select v-model="query.pay_type" clearable placeholder="请选择" style="width: 150px">
             <el-select v-model="query.pay_type" clearable placeholder="请选择" style="width: 150px">
-              <el-option label="人工上分" value="up" />
-              <el-option label="人工下分" value="down" />
+              <el-option label="全部" value="" />
+              <el-option v-for="t in transactionTypeOptions" :key="t.value" :label="t.label" :value="t.value" />
+            </el-select>
+          </el-form-item>
+          <el-form-item label="状态">
+            <el-select v-model="query.status" clearable placeholder="请选择" style="width: 150px">
+              <el-option label="全部" value="" />
+              <el-option v-for="s in statusFilterOptions" :key="s.value" :label="s.label" :value="s.value" />
             </el-select>
             </el-select>
           </el-form-item>
           </el-form-item>
           <el-form-item label="时间">
           <el-form-item label="时间">
@@ -36,21 +48,37 @@
       </div>
       </div>
 
 
       <div class="table-section">
       <div class="table-section">
-        <el-table v-loading="loading" :data="pagedData"
+        <el-table v-loading="loading" :data="tableData"
           height="calc(100vh - 340px)" style="width: 100%; border-radius: 12px; overflow: hidden;"
           height="calc(100vh - 340px)" style="width: 100%; border-radius: 12px; overflow: hidden;"
           empty-text="暂无数据">
           empty-text="暂无数据">
           <el-table-column type="index" label="序号" width="80" align="center" />
           <el-table-column type="index" label="序号" width="80" align="center" />
-          <el-table-column prop="member_account" label="会员账号" width="140" align="center" />
+          <el-table-column prop="member_account" label="会员ID" width="140" align="center" />
           <el-table-column prop="member_name" label="会员昵称" width="140" align="center" />
           <el-table-column prop="member_name" label="会员昵称" width="140" align="center" />
-          <el-table-column prop="pay_type" label="支付类型" width="100" align="center" />
-          <el-table-column prop="before_level" label="充值前等级" width="110" align="center" />
-          <el-table-column prop="amount" label="充值金额" width="110" align="center">
+          <el-table-column prop="pay_type" label="类型" width="100" align="center">
+            <template slot-scope="{ row }">
+              <span :style="{ color: row.pay_type === '人工上分' ? '#18C80A' : row.pay_type === '人工下分' ? '#F56C6C' : '#606266' }">{{ row.pay_type }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column prop="change_type" label="上分类型" width="100" align="center" />
+          <el-table-column prop="amount" label="金额" width="110" align="center">
+            <template slot-scope="{ row }">
+              <span>{{ row.amount != null ? Number(row.amount).toFixed(2) : '--' }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column prop="signed_amount" label="实际变动" width="110" align="center">
             <template slot-scope="{ row }">
             <template slot-scope="{ row }">
-              <span style="color: #18C80A;">
-                {{ row.amount != null ? Number(row.amount).toFixed(2) : '--' }}
+              <span :style="{ color: Number(row.signed_amount) >= 0 ? '#18C80A' : '#F56C6C' }">
+                {{ row.signed_amount != null ? Number(row.signed_amount).toFixed(2) : '--' }}
               </span>
               </span>
             </template>
             </template>
           </el-table-column>
           </el-table-column>
+          <el-table-column prop="before_balance" label="变动前余额" width="110" align="center" />
+          <el-table-column prop="after_balance" label="变动后余额" width="110" align="center">
+            <template slot-scope="{ row }">
+              <span style="color: #1677FF;">{{ row.after_balance != null ? Number(row.after_balance).toFixed(2) : '--' }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column prop="before_level" label="充值前等级" width="110" align="center" />
           <el-table-column prop="after_level" label="充值后等级" width="110" align="center" />
           <el-table-column prop="after_level" label="充值后等级" width="110" align="center" />
           <el-table-column prop="status" label="状态" width="90" align="center">
           <el-table-column prop="status" label="状态" width="90" align="center">
             <template slot-scope="{ row }">
             <template slot-scope="{ row }">
@@ -58,18 +86,24 @@
             </template>
             </template>
           </el-table-column>
           </el-table-column>
           <el-table-column prop="remark" label="备注" min-width="140" align="center" />
           <el-table-column prop="remark" label="备注" min-width="140" align="center" />
+          <el-table-column prop="failure_reason" label="失败原因" min-width="140" align="center">
+            <template slot-scope="{ row }">
+              <span :style="{ color: row.status === '失败' ? '#F56C6C' : '#909399' }">{{ row.failure_reason || '--' }}</span>
+            </template>
+          </el-table-column>
           <el-table-column prop="trade_date" label="交易日期" width="175" align="center" />
           <el-table-column prop="trade_date" label="交易日期" width="175" align="center" />
+          <el-table-column prop="admin_id" label="操作管理员" width="110" align="center" />
           <el-table-column label="操作" width="90" align="center" fixed="right">
           <el-table-column label="操作" width="90" align="center" fixed="right">
             <template slot-scope="{ row }">
             <template slot-scope="{ row }">
               <el-button type="text" size="small" class="ym-view-btn" @click="handleView(row)">查看</el-button>
               <el-button type="text" size="small" class="ym-view-btn" @click="handleView(row)">查看</el-button>
             </template>
             </template>
           </el-table-column>
           </el-table-column>
         </el-table>
         </el-table>
-        <el-pagination v-if="tableData.length" background
+        <el-pagination v-if="total" background
           layout="total, prev, pager, next, jumper" :page-size="pageSize"
           layout="total, prev, pager, next, jumper" :page-size="pageSize"
           :page-sizes="[15, 30, 45, 60]" :current-page="page"
           :page-sizes="[15, 30, 45, 60]" :current-page="page"
-          :total="tableData.length"
-          @current-change="page = $event" @size-change="handleSizeChange" />
+          :total="total"
+          @current-change="page = $event; fetchList()" @size-change="handleSizeChange" />
       </div>
       </div>
     </div>
     </div>
 
 
@@ -82,7 +116,7 @@
           </el-form-item>
           </el-form-item>
           <el-form-item label="充值类型" prop="change_type">
           <el-form-item label="充值类型" prop="change_type">
             <el-select v-model="upForm.change_type" placeholder="请选择" style="width: 280px">
             <el-select v-model="upForm.change_type" placeholder="请选择" style="width: 280px">
-              <el-option v-for="item in listTypes" :key="item" :label="item" :value="item" />
+              <el-option v-for="item in listTypes" :key="item.value" :label="item.label" :value="item.value" />
             </el-select>
             </el-select>
           </el-form-item>
           </el-form-item>
           <el-form-item label="充值金额" prop="amount">
           <el-form-item label="充值金额" prop="amount">
@@ -126,10 +160,10 @@
             <div :style="{ color: field.color || '#303133', fontSize: '15px' }">{{ field.value }}</div>
             <div :style="{ color: field.color || '#303133', fontSize: '15px' }">{{ field.value }}</div>
           </div>
           </div>
         </div>
         </div>
-        <!-- 操作按钮:充值/扣款 -->
+        <!-- 操作按钮:人工上分/人工下分 -->
         <div style="margin-top: 16px; text-align: center; border-top: 1px solid #e4e7ed; padding-top: 16px;">
         <div style="margin-top: 16px; text-align: center; border-top: 1px solid #e4e7ed; padding-top: 16px;">
-          <el-button type="primary" size="small" @click="openViewUp">充值</el-button>
-          <el-button type="danger" size="small" @click="openViewDown">扣款</el-button>
+          <el-button type="success" size="small" @click="openViewUp">人工上分</el-button>
+          <el-button type="danger" size="small" @click="openViewDown">人工下分</el-button>
         </div>
         </div>
       </template>
       </template>
     </Dialog>
     </Dialog>
@@ -137,19 +171,10 @@
 </template>
 </template>
 
 
 <script>
 <script>
-import { withdraw, walletdebiting, getChangeTypes } from '@/api/data'
+import { getManualAuditList, getManualAuditDetail, manualAuditTopUp, manualAuditDebit } from '@/api/data'
 import Dialog from '@/components/Dialog/index.vue'
 import Dialog from '@/components/Dialog/index.vue'
 import { buildDatePickerOptions } from '@/utils/index'
 import { buildDatePickerOptions } from '@/utils/index'
 
 
-// 假数据
-const MANUAL_AUDIT_MOCK = [
-  { id: 1, member_account: 'test01', member_name: 'test01', pay_type: '人工上分', before_level: '普通会员', amount: 2000, after_level: '普通会员', status: '成功', remark: '人工上分', trade_date: '2026-08-05 10:20:30' },
-  { id: 2, member_account: 'test02', member_name: 'test02', pay_type: '人工上分', before_level: '普通会员', amount: 5000, after_level: '白银会员', status: '成功', remark: '人工上分', trade_date: '2026-08-05 11:00:00' },
-  { id: 3, member_account: 'test03', member_name: 'test03', pay_type: '人工下分', before_level: '白银会员', amount: 1000, after_level: '普通会员', status: '成功', remark: '人工下分', trade_date: '2026-08-05 14:30:00' },
-  { id: 4, member_account: 'test04', member_name: 'test04', pay_type: '人工上分', before_level: '普通会员', amount: 8000, after_level: '黄金会员', status: '成功', remark: '人工上分', trade_date: '2026-08-06 09:15:00' },
-  { id: 5, member_account: 'test05', member_name: 'test05', pay_type: '人工下分', before_level: '黄金会员', amount: 3000, after_level: '白银会员', status: '失败', remark: '余额不足', trade_date: '2026-08-06 16:40:00' }
-]
-
 export default {
 export default {
   name: 'ManualAudit',
   name: 'ManualAudit',
   components: {
   components: {
@@ -160,12 +185,17 @@ export default {
       loading: false,
       loading: false,
       page: 1,
       page: 1,
       pageSize: 15,
       pageSize: 15,
-      tableData: [...MANUAL_AUDIT_MOCK],
-      filteredData: [...MANUAL_AUDIT_MOCK],
+      total: 0,
+      tableData: [],
       listTypes: [],
       listTypes: [],
+      transactionTypeOptions: [],
+      statusFilterOptions: [],
       query: {
       query: {
+        member_id: '',
+        first_name: '',
         pay_type: '',
         pay_type: '',
-        dateRange: [this.getDefaultDate(0) + ' 00:00:00', this.getDefaultDate(0) + ' 23:59:59']
+        status: '',
+        dateRange: []
       },
       },
       upForm: {
       upForm: {
         member_id: '',
         member_id: '',
@@ -224,28 +254,33 @@ export default {
     }
     }
   },
   },
   computed: {
   computed: {
-    pagedData() {
-      const start = (this.page - 1) * this.pageSize
-      return this.filteredData.slice(start, start + this.pageSize)
-    },
     viewFields() {
     viewFields() {
       if (!this.viewRow) return []
       if (!this.viewRow) return []
       const row = this.viewRow
       const row = this.viewRow
       const statusColor = row.status === '成功' ? '#18C80A' : row.status === '失败' ? '#F56C6C' : '#909399'
       const statusColor = row.status === '成功' ? '#18C80A' : row.status === '失败' ? '#F56C6C' : '#909399'
+      const payTypeColor = row.pay_type === '人工上分' ? '#18C80A' : row.pay_type === '人工下分' ? '#F56C6C' : '#606266'
       return [
       return [
-        { label: '序号', prop: 'id', value: row.id },
-        { label: '会员账号', prop: 'member_account', value: row.member_account || '--' },
+        { label: '会员ID', prop: 'member_account', value: row.member_account || '--' },
         { label: '会员昵称', prop: 'member_name', value: row.member_name || '--' },
         { label: '会员昵称', prop: 'member_name', value: row.member_name || '--' },
-        { label: '支付类型', prop: 'pay_type', value: row.pay_type || '--' },
+        { label: '类型', prop: 'pay_type', value: row.pay_type || '--', color: payTypeColor },
+        { label: '上分类型', prop: 'change_type', value: row.change_type || '--' },
+        { label: '金额', prop: 'amount', value: row.amount != null ? Number(row.amount).toFixed(2) : '--' },
+        { label: '实际变动', prop: 'signed_amount', value: row.signed_amount != null ? Number(row.signed_amount).toFixed(2) : '--', color: Number(row.signed_amount) >= 0 ? '#18C80A' : '#F56C6C' },
+        { label: '变动前余额', prop: 'before_balance', value: row.before_balance != null ? Number(row.before_balance).toFixed(2) : '--' },
+        { label: '变动后余额', prop: 'after_balance', value: row.after_balance != null ? Number(row.after_balance).toFixed(2) : '--', color: '#1677FF' },
         { label: '充值前等级', prop: 'before_level', value: row.before_level || '--' },
         { label: '充值前等级', prop: 'before_level', value: row.before_level || '--' },
-        { label: '充值金额', prop: 'amount', value: row.amount != null ? Number(row.amount).toFixed(2) : '--', color: '#18C80A' },
         { label: '充值后等级', prop: 'after_level', value: row.after_level || '--' },
         { label: '充值后等级', prop: 'after_level', value: row.after_level || '--' },
         { label: '状态', prop: 'status', value: row.status || '--', color: statusColor },
         { label: '状态', prop: 'status', value: row.status || '--', color: statusColor },
         { label: '备注', prop: 'remark', value: row.remark || '--' },
         { label: '备注', prop: 'remark', value: row.remark || '--' },
-        { label: '交易日期', prop: 'trade_date', value: row.trade_date || '--' }
+        { label: '失败原因', prop: 'failure_reason', value: row.failure_reason || '--', color: row.status === '失败' ? '#F56C6C' : '#909399' },
+        { label: '交易日期', prop: 'trade_date', value: row.trade_date || '--' },
+        { label: '操作管理员', prop: 'admin_id', value: row.admin_id != null ? row.admin_id : '--' }
       ]
       ]
     }
     }
   },
   },
+  created() {
+    this.fetchList()
+  },
   methods: {
   methods: {
     getDefaultDate(offsetDays) {
     getDefaultDate(offsetDays) {
       const d = new Date()
       const d = new Date()
@@ -253,24 +288,85 @@ export default {
       const pad = n => String(n).padStart(2, '0')
       const pad = n => String(n).padStart(2, '0')
       return d.getFullYear() + '-' + pad(d.getMonth() + 1) + '-' + pad(d.getDate())
       return d.getFullYear() + '-' + pad(d.getMonth() + 1) + '-' + pad(d.getDate())
     },
     },
+    // 列表字段映射
+    mapRow(row) {
+      return {
+        id: row.id,
+        request_id: row.request_id || '--',
+        admin_id: row.admin_id != null ? row.admin_id : '--',
+        member_account: row.username || row.member_id || '--',
+        member_name: row.first_name || '--',
+        member_id: row.member_id,
+        pay_type: row.transaction_type_text || (row.transaction_type === 'credit' ? '人工上分' : '人工下分'),
+        change_type: row.change_type || '--',
+        before_level: row.level_before_name || '--',
+        after_level: row.level_after_name || '--',
+        amount: row.amount,
+        signed_amount: row.signed_amount,
+        before_balance: row.before_balance,
+        after_balance: row.after_balance,
+        status: row.status_text || (Number(row.status) === 1 ? '成功' : '失败'),
+        status_code: row.status,
+        failure_reason: row.failure_reason || '--',
+        remark: row.remark || '--',
+        trade_date: row.created_at || '--'
+      }
+    },
     handleSizeChange(val) {
     handleSizeChange(val) {
       this.pageSize = val
       this.pageSize = val
       this.page = 1
       this.page = 1
+      this.fetchList()
     },
     },
     handleSearch() {
     handleSearch() {
       this.page = 1
       this.page = 1
-      let filtered = [...this.tableData]
-      if (this.query.pay_type) {
-        filtered = filtered.filter(r => r.pay_type === (this.query.pay_type === 'up' ? '人工上分' : '人工下分'))
+      this.fetchList()
+    },
+    fetchList() {
+      this.loading = true
+      const [start, end] = this.query.dateRange || []
+      // status 可能是 0(失败),不能用 || 兜底,避免丢失 0
+      const statusVal = this.query.status === '' || this.query.status === null || this.query.status === undefined ? '' : this.query.status
+      const params = {
+        page: this.page,
+        limit: this.pageSize,
+        member_id: this.query.member_id || '',
+        first_name: this.query.first_name || '',
+        transaction_type: this.query.pay_type || '',
+        status: statusVal
       }
       }
-      this.filteredData = filtered
+      // 仅当用户选择了日期范围才传 start_date/end_date(首屏不带日期,返回全部数据)
+      if (start && end) {
+        params.start_date = start.split(' ')[0]
+        params.end_date = end.split(' ')[0]
+      }
+      getManualAuditList(params).then(res => {
+        if (res.code === 0 || res.code === 99) {
+          const data = res.data || {}
+          this.total = Number(data.total) || 0
+          this.tableData = (data.data || []).map(row => this.mapRow(row))
+          // 填充筛选与弹窗选项
+          const opts = data.options || {}
+          if (Array.isArray(opts.credit_types)) {
+            this.listTypes = opts.credit_types
+          }
+          if (Array.isArray(opts.transaction_types)) {
+            this.transactionTypeOptions = opts.transaction_types
+          }
+          if (Array.isArray(opts.statuses)) {
+            this.statusFilterOptions = opts.statuses
+          }
+        } else {
+          this.$message.error(res.msg || '获取列表失败')
+        }
+      }).catch(() => {
+        this.$message.error('请求异常')
+      }).finally(() => {
+        this.loading = false
+      })
     },
     },
     openUpDialog() {
     openUpDialog() {
       this.upForm = { member_id: '', change_type: '', amount: '', remark: '' }
       this.upForm = { member_id: '', change_type: '', amount: '', remark: '' }
       this.$refs.upDialog.open()
       this.$refs.upDialog.open()
-      getChangeTypes().then((res) => {
-        this.listTypes = res.data
-      })
     },
     },
     // 查看弹窗内的充值操作
     // 查看弹窗内的充值操作
     openViewUp() {
     openViewUp() {
@@ -281,9 +377,6 @@ export default {
         remark: ''
         remark: ''
       }
       }
       this.$refs.upDialog.open()
       this.$refs.upDialog.open()
-      getChangeTypes().then((res) => {
-        this.listTypes = res.data
-      })
     },
     },
     // 查看弹窗内的扣款操作
     // 查看弹窗内的扣款操作
     openViewDown() {
     openViewDown() {
@@ -295,8 +388,18 @@ export default {
       this.$refs.downDialog.open()
       this.$refs.downDialog.open()
     },
     },
     handleView(row) {
     handleView(row) {
-      this.viewRow = { ...row }
-      this.$refs.viewDialog.open()
+      // 拉取最新详情
+      getManualAuditDetail({ id: row.id }).then(res => {
+        if (res.code === 0 || res.code === 99) {
+          this.viewRow = this.mapRow(res.data || {})
+        } else {
+          this.viewRow = { ...row }
+        }
+      }).catch(() => {
+        this.viewRow = { ...row }
+      }).finally(() => {
+        this.$refs.viewDialog.open()
+      })
     },
     },
     openDownDialog() {
     openDownDialog() {
       this.downForm = { member_id: '', amount: '', remark: '' }
       this.downForm = { member_id: '', amount: '', remark: '' }
@@ -306,17 +409,19 @@ export default {
       this.$refs.upFormRef.validate((valid) => {
       this.$refs.upFormRef.validate((valid) => {
         if (!valid) return
         if (!valid) return
         this.loading = true
         this.loading = true
-        withdraw({
+        manualAuditTopUp({
+          request_id: this.genUUID(),
           member_id: this.upForm.member_id,
           member_id: this.upForm.member_id,
-          remark: this.upForm.remark,
+          change_type: this.upForm.change_type,
           amount: this.upForm.amount,
           amount: this.upForm.amount,
-          change_type: this.upForm.change_type
+          remark: this.upForm.remark
         }).then((res) => {
         }).then((res) => {
           this.loading = false
           this.loading = false
           if (res.code === 0) {
           if (res.code === 0) {
             this.$message.success('操作成功')
             this.$message.success('操作成功')
             this.$refs.upDialog.close()
             this.$refs.upDialog.close()
-            this.handleSearch()
+            this.$refs.viewDialog.close()
+            this.fetchList()
           } else {
           } else {
             this.$message.error(res.msg || '操作失败')
             this.$message.error(res.msg || '操作失败')
           }
           }
@@ -329,16 +434,18 @@ export default {
       this.$refs.downFormRef.validate((valid) => {
       this.$refs.downFormRef.validate((valid) => {
         if (!valid) return
         if (!valid) return
         this.loading = true
         this.loading = true
-        walletdebiting({
+        manualAuditDebit({
+          request_id: this.genUUID(),
           member_id: this.downForm.member_id,
           member_id: this.downForm.member_id,
-          remark: this.downForm.remark,
-          amount: this.downForm.amount
+          amount: this.downForm.amount,
+          remark: this.downForm.remark
         }).then((res) => {
         }).then((res) => {
           this.loading = false
           this.loading = false
           if (res.code === 0) {
           if (res.code === 0) {
             this.$message.success('操作成功')
             this.$message.success('操作成功')
             this.$refs.downDialog.close()
             this.$refs.downDialog.close()
-            this.handleSearch()
+            this.$refs.viewDialog.close()
+            this.fetchList()
           } else {
           } else {
             this.$message.error(res.msg || '操作失败')
             this.$message.error(res.msg || '操作失败')
           }
           }
@@ -346,6 +453,22 @@ export default {
           this.loading = false
           this.loading = false
         })
         })
       })
       })
+    },
+    // 生成 UUID(幂等请求 ID)
+    genUUID() {
+      if (window.crypto && crypto.randomUUID) {
+        return crypto.randomUUID()
+      }
+      // 降级方案
+      return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {
+        const r = Math.random() * 16 | 0
+        const v = c === 'x' ? r : (r & 0x3 | 0x8)
+        return v.toString(16)
+      })
+    }
+  }
+}
+</script>
     }
     }
   }
   }
 }
 }

+ 90 - 51
src/views/fund/thirdPartyDeposit/index.vue

@@ -9,33 +9,25 @@
           <el-form-item label="支付公司">
           <el-form-item label="支付公司">
             <el-select v-model="query.company" clearable placeholder="请选择" style="width: 150px">
             <el-select v-model="query.company" clearable placeholder="请选择" style="width: 150px">
               <el-option label="全部" value="" />
               <el-option label="全部" value="" />
-              <el-option v-for="c in companyOptions" :key="c" :label="c" :value="c" />
+              <el-option v-for="c in companyOptions" :key="c.value" :label="c.label" :value="c.value" />
             </el-select>
             </el-select>
           </el-form-item>
           </el-form-item>
           <el-form-item label="支付方式">
           <el-form-item label="支付方式">
             <el-select v-model="query.pay_method" clearable placeholder="请选择" style="width: 150px">
             <el-select v-model="query.pay_method" clearable placeholder="请选择" style="width: 150px">
               <el-option label="全部" value="" />
               <el-option label="全部" value="" />
-              <el-option label="微信" value="微信" />
-              <el-option label="支付宝" value="支付宝" />
-              <el-option label="银行卡" value="银行卡" />
-              <el-option label="USDT" value="USDT" />
+              <el-option v-for="m in payMethodOptions" :key="m.value" :label="m.label" :value="m.value" />
             </el-select>
             </el-select>
           </el-form-item>
           </el-form-item>
           <el-form-item label="状态">
           <el-form-item label="状态">
             <el-select v-model="query.status" clearable placeholder="请选择" style="width: 150px">
             <el-select v-model="query.status" clearable placeholder="请选择" style="width: 150px">
               <el-option label="全部" value="" />
               <el-option label="全部" value="" />
-              <el-option label="待支付" value="待支付" />
-              <el-option label="成功" value="成功" />
-              <el-option label="失败" value="失败" />
+              <el-option v-for="s in statusOptions" :key="s.value" :label="s.label" :value="s.value" />
             </el-select>
             </el-select>
           </el-form-item>
           </el-form-item>
           <el-form-item label="平台">
           <el-form-item label="平台">
             <el-select v-model="query.platform" clearable placeholder="请选择" style="width: 150px">
             <el-select v-model="query.platform" clearable placeholder="请选择" style="width: 150px">
               <el-option label="全部" value="" />
               <el-option label="全部" value="" />
-              <el-option label="PC" value="PC" />
-              <el-option label="Android" value="Android" />
-              <el-option label="iOS" value="iOS" />
-              <el-option label="H5" value="H5" />
+              <el-option v-for="p in platformOptions" :key="p.value" :label="p.label" :value="p.value" />
             </el-select>
             </el-select>
           </el-form-item>
           </el-form-item>
           <el-form-item label="提交时间">
           <el-form-item label="提交时间">
@@ -77,7 +69,7 @@
       </div>
       </div>
 
 
       <div class="table-section">
       <div class="table-section">
-        <el-table v-loading="loading" :data="pagedData"
+        <el-table v-loading="loading" :data="tableData"
           height="calc(100vh - 360px)" style="width: 100%; border-radius: 12px; overflow: hidden;"
           height="calc(100vh - 360px)" style="width: 100%; border-radius: 12px; overflow: hidden;"
           empty-text="暂无数据">
           empty-text="暂无数据">
           <el-table-column type="index" label="序号" width="80" align="center" />
           <el-table-column type="index" label="序号" width="80" align="center" />
@@ -119,11 +111,11 @@
             </template>
             </template>
           </el-table-column>
           </el-table-column>
         </el-table>
         </el-table>
-        <el-pagination v-if="tableData.length" background
+        <el-pagination v-if="total" background
           layout="total, prev, pager, next, jumper" :page-size="pageSize"
           layout="total, prev, pager, next, jumper" :page-size="pageSize"
           :page-sizes="[15, 30, 45, 60]" :current-page="page"
           :page-sizes="[15, 30, 45, 60]" :current-page="page"
-          :total="tableData.length"
-          @current-change="page = $event" @size-change="handleSizeChange" />
+          :total="total"
+          @current-change="page = $event; fetchList()" @size-change="handleSizeChange" />
       </div>
       </div>
     </div>
     </div>
 
 
@@ -147,18 +139,10 @@
 </template>
 </template>
 
 
 <script>
 <script>
+import { getThirdPartyDepositList, getThirdPartyDepositDetail } from '@/api/data'
 import Dialog from '@/components/Dialog/index.vue'
 import Dialog from '@/components/Dialog/index.vue'
 import { disableFutureDate } from '@/utils/index'
 import { disableFutureDate } from '@/utils/index'
 
 
-// 假数据
-const THIRD_PARTY_MOCK = [
-  { id: 1, member_id: 10001, member_name: 'test01', company: 'AAPAY2', pay_method: '微信', channel_no: 'CH001', amount: 1000, before_amount: 5000, after_amount: 6000, submit_date: '2026-08-05 10:20:30', deposit_date: '2026-08-05 10:25:10', gateway_no: 'GW1000001', gateway_return: 'A1B2C3D4E5', platform: 'PC', status: '成功' },
-  { id: 2, member_id: 10002, member_name: 'test02', company: 'AAPAY2', pay_method: '支付宝', channel_no: 'CH002', amount: 2000, before_amount: 8000, after_amount: 10000, submit_date: '2026-08-05 11:00:00', deposit_date: '2026-08-05 11:05:30', gateway_no: 'GW1000002', gateway_return: 'X9Y8Z7W6V5', platform: 'Android', status: '成功' },
-  { id: 3, member_id: 10003, member_name: 'test03', company: 'AAPAY2', pay_method: '银行卡', channel_no: 'CH003', amount: 500, before_amount: 3000, after_amount: 3500, submit_date: '2026-08-05 14:30:00', deposit_date: '2026-08-05 14:35:00', gateway_no: 'GW1000003', gateway_return: 'M1N2B3V4C5', platform: 'iOS', status: '待支付' },
-  { id: 4, member_id: 10004, member_name: 'test04', company: 'AAPAY2', pay_method: 'USDT', channel_no: 'CH004', amount: 3000, before_amount: 12000, after_amount: 15000, submit_date: '2026-08-06 09:15:00', deposit_date: '2026-08-06 09:20:45', gateway_no: 'GW1000004', gateway_return: 'Q1W2E3R4T5', platform: 'H5', status: '成功' },
-  { id: 5, member_id: 10005, member_name: 'test05', company: 'AAPAY2', pay_method: '微信', channel_no: 'CH005', amount: 800, before_amount: 2000, after_amount: 2800, submit_date: '2026-08-06 16:40:00', deposit_date: '2026-08-06 16:45:00', gateway_no: 'GW1000005', gateway_return: 'Z1X2C3V4B5', platform: 'PC', status: '失败' }
-]
-
 export default {
 export default {
   name: 'ThirdPartyDeposit',
   name: 'ThirdPartyDeposit',
   components: {
   components: {
@@ -169,10 +153,13 @@ export default {
       loading: false,
       loading: false,
       page: 1,
       page: 1,
       pageSize: 15,
       pageSize: 15,
-      tableData: [...THIRD_PARTY_MOCK],
-      filteredData: [...THIRD_PARTY_MOCK],
+      total: 0,
+      tableData: [],
       viewRow: null,
       viewRow: null,
-      companyOptions: ['AAPAY2'],
+      companyOptions: [],
+      payMethodOptions: [],
+      statusOptions: [],
+      platformOptions: [],
       query: {
       query: {
         member_id: '',
         member_id: '',
         company: '',
         company: '',
@@ -186,10 +173,6 @@ export default {
     }
     }
   },
   },
   computed: {
   computed: {
-    pagedData() {
-      const start = (this.page - 1) * this.pageSize
-      return this.filteredData.slice(start, start + this.pageSize)
-    },
     viewFields() {
     viewFields() {
       if (!this.viewRow) return []
       if (!this.viewRow) return []
       const row = this.viewRow
       const row = this.viewRow
@@ -213,34 +196,90 @@ export default {
       ]
       ]
     }
     }
   },
   },
+  created() {
+    this.fetchList()
+  },
   methods: {
   methods: {
-    handleView(row) {
-      this.viewRow = { ...row }
-      this.$refs.viewDialog.open()
+    // 列表字段映射
+    mapRow(row) {
+      return {
+        id: row.id,
+        member_id: row.member_id,
+        member_name: row.first_name || row.username || '--',
+        company: row.payment_company_name || row.payment_company || '--',
+        pay_method: row.payment_method || '--',
+        channel_no: row.channel_code || '--',
+        amount: row.amount,
+        before_amount: row.before_balance,
+        after_amount: row.after_balance,
+        submit_date: row.submitted_at || '--',
+        deposit_date: row.credited_at || '--',
+        gateway_no: row.gateway_order_no || row.gateway_response || '--',
+        gateway_return: row.gateway_response || '--',
+        platform: row.platform || '--',
+        status: row.status_text || (Number(row.status) === 2 ? '成功' : Number(row.status) === 3 ? '失败' : '处理中')
+      }
     },
     },
     handleSizeChange(val) {
     handleSizeChange(val) {
       this.pageSize = val
       this.pageSize = val
       this.page = 1
       this.page = 1
+      this.fetchList()
     },
     },
     handleSearch() {
     handleSearch() {
       this.page = 1
       this.page = 1
-      let filtered = [...this.tableData]
-      if (this.query.member_id) {
-        filtered = filtered.filter(r => String(r.member_id).includes(this.query.member_id))
-      }
-      if (this.query.company) {
-        filtered = filtered.filter(r => r.company === this.query.company)
-      }
-      if (this.query.pay_method) {
-        filtered = filtered.filter(r => r.pay_method === this.query.pay_method)
-      }
-      if (this.query.status) {
-        filtered = filtered.filter(r => r.status === this.query.status)
-      }
-      if (this.query.platform) {
-        filtered = filtered.filter(r => r.platform === this.query.platform)
+      this.fetchList()
+    },
+    fetchList() {
+      this.loading = true
+      const [sStart, sEnd] = this.query.submitRange || []
+      const [dStart, dEnd] = this.query.depositRange || []
+      // status 可能是 0(待处理),不能用 || '' 兜底,避免丢失 0
+      const statusVal = this.query.status === '' || this.query.status === null || this.query.status === undefined ? '' : this.query.status
+      const params = {
+        page: this.page,
+        limit: this.pageSize,
+        member_id: this.query.member_id || '',
+        payment_company: this.query.company || '',
+        payment_method: this.query.pay_method || '',
+        status: statusVal,
+        platform: this.query.platform || '',
+        submit_start_date: sStart ? sStart.split(' ')[0] : '',
+        submit_end_date: sEnd ? sEnd.split(' ')[0] : '',
+        credit_start_date: dStart ? dStart.split(' ')[0] : '',
+        credit_end_date: dEnd ? dEnd.split(' ')[0] : ''
       }
       }
-      this.filteredData = filtered
+      getThirdPartyDepositList(params).then(res => {
+        if (res.code === 0 || res.code === 99) {
+          const data = res.data || {}
+          this.total = Number(data.total) || 0
+          this.tableData = (data.data || []).map(row => this.mapRow(row))
+          // 填充筛选项
+          const opts = data.options || {}
+          this.companyOptions = Array.isArray(opts.payment_companies) ? opts.payment_companies : []
+          this.payMethodOptions = Array.isArray(opts.payment_methods) ? opts.payment_methods : []
+          this.statusOptions = Array.isArray(opts.statuses) ? opts.statuses : []
+          this.platformOptions = Array.isArray(opts.platforms) ? opts.platforms : []
+        } else {
+          this.$message.error(res.msg || '获取列表失败')
+        }
+      }).catch(() => {
+        this.$message.error('请求异常')
+      }).finally(() => {
+        this.loading = false
+      })
+    },
+    handleView(row) {
+      getThirdPartyDepositDetail({ id: row.id }).then(res => {
+        if (res.code === 0 || res.code === 99) {
+          this.viewRow = this.mapRow(res.data || {})
+        } else {
+          this.viewRow = { ...row }
+        }
+      }).catch(() => {
+        this.viewRow = { ...row }
+      }).finally(() => {
+        this.$refs.viewDialog.open()
+      })
     }
     }
   }
   }
 }
 }