pxb 2 週間 前
コミット
ed60a5fcbc

+ 18 - 0
src/router/index.js

@@ -205,6 +205,24 @@ export const constantRoutes = [
         name: "topUpChannel",
         name: "topUpChannel",
         meta: { title: "充值通道" },
         meta: { title: "充值通道" },
       },
       },
+      {
+        path: "inOutSummary",
+        component: () => import("@/views/fund/inOutSummary/index"),
+        name: "InOutSummary",
+        meta: { title: "出入款汇总" },
+      },
+      {
+        path: "manualAudit",
+        component: () => import("@/views/fund/manualAudit/index"),
+        name: "ManualAudit",
+        meta: { title: "人工稽查" },
+      },
+      {
+        path: "thirdPartyDeposit",
+        component: () => import("@/views/fund/thirdPartyDeposit/index"),
+        name: "ThirdPartyDeposit",
+        meta: { title: "第三方入款" },
+      },
     ],
     ],
   },
   },
   {
   {

+ 221 - 0
src/views/fund/inOutSummary/index.vue

@@ -0,0 +1,221 @@
+<template>
+  <div class="new-app-container layout-vertical in-out-page">
+    <div class="content-panel">
+      <div class="filter-panel">
+        <el-form inline :model="query" class="filter-form">
+          <el-form-item label="时间">
+            <el-date-picker
+              v-model="query.dateRange"
+              type="daterange"
+              align="right"
+              unlink-panels
+              range-separator="至"
+              start-placeholder="开始日期"
+              end-placeholder="结束日期"
+              value-format="yyyy-MM-dd HH:mm:ss"
+              format="yyyy年MM月dd日"
+              :default-time="['00:00:00', '23:59:59']"
+              :picker-options="pickerOptions"
+              style="width: 380px"
+            />
+          </el-form-item>
+          <el-form-item class="filter-actions">
+            <el-button type="primary" size="small" :loading="loading" @click="handleSearch">查询</el-button>
+          </el-form-item>
+        </el-form>
+      </div>
+
+      <div class="summary-body">
+        <!-- 收入 -->
+        <div class="summary-card income-card">
+          <div class="card-header">收入</div>
+          <div class="card-body">
+            <div class="row-header">
+              <span class="row-label">收入项目</span>
+              <span class="row-value">收入金额 (人数)</span>
+            </div>
+            <div v-for="item in incomeRows" :key="item.name" class="row-item">
+              <span class="row-label">{{ item.name }}</span>
+              <span class="row-value">{{ item.amount }} ({{ item.count }} 人)</span>
+            </div>
+          </div>
+        </div>
+
+        <!-- 支出 -->
+        <div class="summary-card expense-card">
+          <div class="card-header">支出</div>
+          <div class="card-body">
+            <div class="row-header">
+              <span class="row-label">支出项目</span>
+              <span class="row-value">支出金额 (人数)</span>
+            </div>
+            <div v-for="item in expenseRows" :key="item.name" class="row-item">
+              <span class="row-label">{{ item.name }}</span>
+              <span class="row-value">{{ item.amount }} ({{ item.count }} 人)</span>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'InOutSummary',
+  data() {
+    return {
+      loading: false,
+      query: {
+        dateRange: [this.getDefaultDate(0) + ' 00:00:00', this.getDefaultDate(0) + ' 23:59:59']
+      },
+      pickerOptions: {
+        disabledDate(time) {
+          return time.getTime() > Date.now()
+        },
+        shortcuts: [
+          {
+            text: '今天',
+            onClick(picker) {
+              const start = new Date()
+              start.setHours(0, 0, 0, 0)
+              const end = new Date()
+              end.setHours(23, 59, 59, 999)
+              picker.$emit('pick', [start, end])
+            }
+          },
+          {
+            text: '昨天',
+            onClick(picker) {
+              const start = new Date()
+              start.setTime(start.getTime() - 3600 * 1000 * 24 * 1)
+              start.setHours(0, 0, 0, 0)
+              const end = new Date()
+              end.setTime(end.getTime() - 3600 * 1000 * 24 * 1)
+              end.setHours(23, 59, 59, 999)
+              picker.$emit('pick', [start, end])
+            }
+          },
+          {
+            text: '7天内',
+            onClick(picker) {
+              const start = new Date()
+              start.setTime(start.getTime() - 3600 * 1000 * 24 * 7)
+              start.setHours(0, 0, 0, 0)
+              const end = new Date()
+              end.setHours(23, 59, 59, 999)
+              picker.$emit('pick', [start, end])
+            }
+          }
+        ]
+      },
+      // 假数据:收入
+      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 }
+      ]
+    }
+  },
+  methods: {
+    getDefaultDate(offsetDays) {
+      const d = new Date()
+      d.setDate(d.getDate() + offsetDays)
+      const pad = n => String(n).padStart(2, '0')
+      return d.getFullYear() + '-' + pad(d.getMonth() + 1) + '-' + pad(d.getDate())
+    },
+    handleSearch() {
+      this.loading = true
+      // TODO: 替换为真实接口
+      setTimeout(() => {
+        this.loading = false
+      }, 300)
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.in-out-page {
+  padding: 16px;
+  background: #f5f7fa;
+}
+.content-panel {
+  min-height: calc(100vh - 82px);
+  overflow: hidden;
+  border-radius: 8px;
+  background: #fff;
+}
+.filter-panel {
+  padding: 16px 20px 0;
+  border-bottom: 1px solid #ebeef5;
+  background: #fff;
+}
+.filter-form {
+  display: flex;
+  flex-wrap: wrap;
+  align-items: center;
+}
+.filter-actions {
+  margin-left: auto;
+}
+.summary-body {
+  display: flex;
+  gap: 20px;
+  padding: 20px;
+}
+.summary-card {
+  flex: 1;
+  border-radius: 8px;
+  overflow: hidden;
+}
+.income-card {
+  background: #f0f9eb; // 收入浅绿底
+  border: 1px solid #e1f3d8;
+}
+.expense-card {
+  background: #fef0f0; // 支出浅红底
+  border: 1px solid #fde2e2;
+}
+.card-header {
+  padding: 14px 16px;
+  font-size: 16px;
+  font-weight: 600;
+  color: #303133;
+  background: #fff;
+  border-bottom: 1px solid #ebeef5;
+}
+.card-body {
+  padding: 4px 16px 16px;
+}
+.row-header {
+  display: flex;
+  justify-content: space-between;
+  padding: 12px 0;
+  font-weight: 600;
+  color: #303133;
+  border-bottom: 1px solid #ebeef5;
+}
+.row-item {
+  display: flex;
+  justify-content: space-between;
+  padding: 10px 0;
+  color: #606266;
+  border-bottom: 1px dashed #e4e7ed;
+}
+.row-item:last-child {
+  border-bottom: none;
+}
+</style>

+ 390 - 0
src/views/fund/manualAudit/index.vue

@@ -0,0 +1,390 @@
+<template>
+  <div class="new-app-container layout-vertical manual-audit-page">
+    <div class="content-panel">
+      <div class="filter-panel">
+        <div class="action-btns">
+          <el-button type="success" size="small" @click="openUpDialog">人工上分</el-button>
+          <el-button type="danger" size="small" @click="openDownDialog">人工下分</el-button>
+        </div>
+        <el-form inline :model="query" class="filter-form">
+          <el-form-item label="交易类型">
+            <el-select v-model="query.pay_type" clearable placeholder="请选择" style="width: 150px">
+              <el-option label="人工上分" value="up" />
+              <el-option label="人工下分" value="down" />
+            </el-select>
+          </el-form-item>
+          <el-form-item label="时间">
+            <el-date-picker
+              v-model="query.dateRange"
+              type="daterange"
+              align="right"
+              unlink-panels
+              range-separator="至"
+              start-placeholder="开始日期"
+              end-placeholder="结束日期"
+              value-format="yyyy-MM-dd HH:mm:ss"
+              format="yyyy年MM月dd日"
+              :default-time="['00:00:00', '23:59:59']"
+              :picker-options="pickerOptions"
+              style="width: 380px"
+            />
+          </el-form-item>
+          <el-form-item class="filter-actions">
+            <el-button type="primary" size="small" :loading="loading" @click="handleSearch">查询</el-button>
+          </el-form-item>
+        </el-form>
+      </div>
+
+      <div class="table-section">
+        <el-table v-loading="loading" :data="pagedData"
+          height="calc(100vh - 340px)" style="width: 100%; border-radius: 12px; overflow: hidden;"
+          empty-text="暂无数据">
+          <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_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">
+            <template slot-scope="{ row }">
+              <span style="color: #18C80A;">
+                {{ row.amount != null ? Number(row.amount).toFixed(2) : '--' }}
+              </span>
+            </template>
+          </el-table-column>
+          <el-table-column prop="after_level" label="充值后等级" width="110" align="center" />
+          <el-table-column prop="status" label="状态" width="90" align="center">
+            <template slot-scope="{ row }">
+              <span :style="{ color: row.status === '成功' ? '#18C80A' : row.status === '失败' ? '#F56C6C' : '#909399' }">{{ row.status }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column prop="remark" label="备注" min-width="140" align="center" />
+          <el-table-column prop="trade_date" label="交易日期" width="175" align="center" />
+          <el-table-column label="操作" width="90" align="center" fixed="right">
+            <template slot-scope="{ row }">
+              <el-button type="text" size="small" class="ym-view-btn" @click="handleView(row)">查看</el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+        <el-pagination v-if="tableData.length" background
+          layout="total, prev, pager, next, jumper" :page-size="pageSize"
+          :page-sizes="[15, 30, 45, 60]" :current-page="page"
+          :total="tableData.length"
+          @current-change="page = $event" @size-change="handleSizeChange" />
+      </div>
+    </div>
+
+    <!-- 人工上分弹窗 -->
+    <Dialog ref="upDialog" :dialog-actions="{ width: '480px', title: '人工上分' }" :loading="loading" @confirm="confirmUp">
+      <template slot="content">
+        <el-form ref="upFormRef" :rules="rulesData" :model="upForm" label-width="90px">
+          <el-form-item label="会员ID" prop="member_id">
+            <el-input v-model="upForm.member_id" placeholder="请输入会员ID" style="width: 280px" />
+          </el-form-item>
+          <el-form-item label="充值类型" prop="change_type">
+            <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-select>
+          </el-form-item>
+          <el-form-item label="充值金额" prop="amount">
+            <el-input type="number" v-model="upForm.amount" placeholder="请输入金额" style="width: 280px" />
+          </el-form-item>
+          <el-form-item label="说明" prop="remark">
+            <el-input v-model="upForm.remark" placeholder="请输入说明" style="width: 280px" />
+          </el-form-item>
+        </el-form>
+      </template>
+    </Dialog>
+
+    <!-- 人工下分弹窗 -->
+    <Dialog ref="downDialog" :dialog-actions="{ width: '480px', title: '人工下分' }" :loading="loading" @confirm="confirmDown">
+      <template slot="content">
+        <el-form ref="downFormRef" :rules="rulesData" :model="downForm" label-width="90px">
+          <el-form-item label="会员ID" prop="member_id">
+            <el-input v-model="downForm.member_id" placeholder="请输入会员ID" style="width: 280px" />
+          </el-form-item>
+          <el-form-item label="下分金额" prop="amount">
+            <el-input type="number" v-model="downForm.amount" placeholder="请输入金额" style="width: 280px" />
+          </el-form-item>
+          <el-form-item label="说明" prop="remark">
+            <el-input v-model="downForm.remark" placeholder="请输入说明" style="width: 280px" />
+          </el-form-item>
+        </el-form>
+      </template>
+    </Dialog>
+
+    <!-- 查看详情弹窗 -->
+    <Dialog ref="viewDialog" :dialog-actions="{
+      width: '820px',
+      title: '人工稽查详情',
+      confirmButtom: false,
+    }">
+      <template slot="content">
+        <div style="display: flex; flex-wrap: wrap; gap: 12px; padding: 10px 0; max-height: 400px; overflow-y: auto;">
+          <div v-for="field in viewFields" :key="field.prop"
+            style="flex: 0 0 calc(33.33% - 12px); background: #f5f7fa; border-radius: 6px; padding: 12px 16px; box-sizing: border-box; border: 1px solid #e4e7ed;">
+            <div style="font-size: 13px; color: #909399; margin-bottom: 4px;">{{ field.label }}</div>
+            <div :style="{ color: field.color || '#303133', fontSize: '15px' }">{{ field.value }}</div>
+          </div>
+        </div>
+        <!-- 操作按钮:充值/扣款 -->
+        <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>
+        </div>
+      </template>
+    </Dialog>
+  </div>
+</template>
+
+<script>
+import { withdraw, walletdebiting, getChangeTypes } from '@/api/data'
+import Dialog from '@/components/Dialog/index.vue'
+
+// 假数据
+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 {
+  name: 'ManualAudit',
+  components: {
+    Dialog
+  },
+  data() {
+    return {
+      loading: false,
+      page: 1,
+      pageSize: 15,
+      tableData: [...MANUAL_AUDIT_MOCK],
+      filteredData: [...MANUAL_AUDIT_MOCK],
+      listTypes: [],
+      query: {
+        pay_type: '',
+        dateRange: [this.getDefaultDate(0) + ' 00:00:00', this.getDefaultDate(0) + ' 23:59:59']
+      },
+      upForm: {
+        member_id: '',
+        change_type: '',
+        amount: '',
+        remark: ''
+      },
+      downForm: {
+        member_id: '',
+        amount: '',
+        remark: ''
+      },
+      rulesData: {
+        member_id: [{ required: true, message: '请输入会员ID', trigger: 'blur' }],
+        change_type: [{ required: true, message: '请选择充值类型', trigger: 'change' }],
+        amount: [{ required: true, message: '请输入金额', trigger: 'blur' }]
+      },
+      viewRow: null,
+      pickerOptions: {
+        disabledDate(time) {
+          return time.getTime() > Date.now()
+        },
+        shortcuts: [
+          {
+            text: '今天',
+            onClick(picker) {
+              const start = new Date()
+              start.setHours(0, 0, 0, 0)
+              const end = new Date()
+              end.setHours(23, 59, 59, 999)
+              picker.$emit('pick', [start, end])
+            }
+          },
+          {
+            text: '昨天',
+            onClick(picker) {
+              const start = new Date()
+              start.setTime(start.getTime() - 3600 * 1000 * 24 * 1)
+              start.setHours(0, 0, 0, 0)
+              const end = new Date()
+              end.setTime(end.getTime() - 3600 * 1000 * 24 * 1)
+              end.setHours(23, 59, 59, 999)
+              picker.$emit('pick', [start, end])
+            }
+          },
+          {
+            text: '7天内',
+            onClick(picker) {
+              const start = new Date()
+              start.setTime(start.getTime() - 3600 * 1000 * 24 * 7)
+              start.setHours(0, 0, 0, 0)
+              const end = new Date()
+              end.setHours(23, 59, 59, 999)
+              picker.$emit('pick', [start, end])
+            }
+          }
+        ]
+      }
+    }
+  },
+  computed: {
+    pagedData() {
+      const start = (this.page - 1) * this.pageSize
+      return this.filteredData.slice(start, start + this.pageSize)
+    },
+    viewFields() {
+      if (!this.viewRow) return []
+      const row = this.viewRow
+      const statusColor = row.status === '成功' ? '#18C80A' : row.status === '失败' ? '#F56C6C' : '#909399'
+      return [
+        { label: '序号', prop: 'id', value: row.id },
+        { label: '会员账号', prop: 'member_account', value: row.member_account || '--' },
+        { label: '会员昵称', prop: 'member_name', value: row.member_name || '--' },
+        { label: '支付类型', prop: 'pay_type', value: row.pay_type || '--' },
+        { 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: 'status', value: row.status || '--', color: statusColor },
+        { label: '备注', prop: 'remark', value: row.remark || '--' },
+        { label: '交易日期', prop: 'trade_date', value: row.trade_date || '--' }
+      ]
+    }
+  },
+  methods: {
+    getDefaultDate(offsetDays) {
+      const d = new Date()
+      d.setDate(d.getDate() + offsetDays)
+      const pad = n => String(n).padStart(2, '0')
+      return d.getFullYear() + '-' + pad(d.getMonth() + 1) + '-' + pad(d.getDate())
+    },
+    handleSizeChange(val) {
+      this.pageSize = val
+      this.page = 1
+    },
+    handleSearch() {
+      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.filteredData = filtered
+    },
+    openUpDialog() {
+      this.upForm = { member_id: '', change_type: '', amount: '', remark: '' }
+      this.$refs.upDialog.open()
+      getChangeTypes().then((res) => {
+        this.listTypes = res.data
+      })
+    },
+    // 查看弹窗内的充值操作
+    openViewUp() {
+      this.upForm = {
+        member_id: this.viewRow ? this.viewRow.member_id : '',
+        change_type: '',
+        amount: '',
+        remark: ''
+      }
+      this.$refs.upDialog.open()
+      getChangeTypes().then((res) => {
+        this.listTypes = res.data
+      })
+    },
+    // 查看弹窗内的扣款操作
+    openViewDown() {
+      this.downForm = {
+        member_id: this.viewRow ? this.viewRow.member_id : '',
+        amount: '',
+        remark: ''
+      }
+      this.$refs.downDialog.open()
+    },
+    handleView(row) {
+      this.viewRow = { ...row }
+      this.$refs.viewDialog.open()
+    },
+    openDownDialog() {
+      this.downForm = { member_id: '', amount: '', remark: '' }
+      this.$refs.downDialog.open()
+    },
+    confirmUp() {
+      this.$refs.upFormRef.validate((valid) => {
+        if (!valid) return
+        this.loading = true
+        withdraw({
+          member_id: this.upForm.member_id,
+          remark: this.upForm.remark,
+          amount: this.upForm.amount,
+          change_type: this.upForm.change_type
+        }).then((res) => {
+          this.loading = false
+          if (res.code === 0) {
+            this.$message.success('操作成功')
+            this.$refs.upDialog.close()
+            this.handleSearch()
+          } else {
+            this.$message.error(res.msg || '操作失败')
+          }
+        }).catch(() => {
+          this.loading = false
+        })
+      })
+    },
+    confirmDown() {
+      this.$refs.downFormRef.validate((valid) => {
+        if (!valid) return
+        this.loading = true
+        walletdebiting({
+          member_id: this.downForm.member_id,
+          remark: this.downForm.remark,
+          amount: this.downForm.amount
+        }).then((res) => {
+          this.loading = false
+          if (res.code === 0) {
+            this.$message.success('操作成功')
+            this.$refs.downDialog.close()
+            this.handleSearch()
+          } else {
+            this.$message.error(res.msg || '操作失败')
+          }
+        }).catch(() => {
+          this.loading = false
+        })
+      })
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.manual-audit-page {
+  padding: 16px;
+  background: #f5f7fa;
+}
+.content-panel {
+  min-height: calc(100vh - 82px);
+  overflow: hidden;
+  border-radius: 8px;
+  background: #fff;
+}
+.filter-panel {
+  padding: 16px 20px 0;
+  border-bottom: 1px solid #ebeef5;
+  background: #fff;
+}
+.action-btns {
+  margin-bottom: 12px;
+}
+.filter-form {
+  display: flex;
+  flex-wrap: wrap;
+  align-items: center;
+}
+.filter-actions {
+  margin-left: auto;
+}
+.table-section {
+  padding: 18px 20px 20px;
+}
+.el-pagination {
+  margin-top: 14px;
+  text-align: right;
+}
+</style>

+ 283 - 0
src/views/fund/thirdPartyDeposit/index.vue

@@ -0,0 +1,283 @@
+<template>
+  <div class="new-app-container layout-vertical third-party-page">
+    <div class="content-panel">
+      <div class="filter-panel">
+        <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-select v-model="query.company" clearable placeholder="请选择" style="width: 150px">
+              <el-option label="全部" value="" />
+              <el-option v-for="c in companyOptions" :key="c" :label="c" :value="c" />
+            </el-select>
+          </el-form-item>
+          <el-form-item label="支付方式">
+            <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="USDT" value="USDT" />
+            </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 label="待支付" value="待支付" />
+              <el-option label="成功" value="成功" />
+              <el-option label="失败" value="失败" />
+            </el-select>
+          </el-form-item>
+          <el-form-item label="平台">
+            <el-select v-model="query.platform" clearable placeholder="请选择" style="width: 150px">
+              <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-select>
+          </el-form-item>
+          <el-form-item label="提交时间">
+            <el-date-picker
+              v-model="query.submitRange"
+              type="daterange"
+              align="right"
+              unlink-panels
+              range-separator="至"
+              start-placeholder="开始日期"
+              end-placeholder="结束日期"
+              value-format="yyyy-MM-dd HH:mm:ss"
+              format="yyyy年MM月dd日"
+              :default-time="['00:00:00', '23:59:59']"
+              :picker-options="pickerOptions"
+              style="width: 380px"
+            />
+          </el-form-item>
+          <el-form-item label="存款时间">
+            <el-date-picker
+              v-model="query.depositRange"
+              type="daterange"
+              align="right"
+              unlink-panels
+              range-separator="至"
+              start-placeholder="开始日期"
+              end-placeholder="结束日期"
+              value-format="yyyy-MM-dd HH:mm:ss"
+              format="yyyy年MM月dd日"
+              :default-time="['00:00:00', '23:59:59']"
+              :picker-options="pickerOptions"
+              style="width: 380px"
+            />
+          </el-form-item>
+          <el-form-item class="filter-actions">
+            <el-button type="primary" size="small" :loading="loading" @click="handleSearch">查询</el-button>
+          </el-form-item>
+        </el-form>
+      </div>
+
+      <div class="table-section">
+        <el-table v-loading="loading" :data="pagedData"
+          height="calc(100vh - 360px)" style="width: 100%; border-radius: 12px; overflow: hidden;"
+          empty-text="暂无数据">
+          <el-table-column type="index" label="序号" width="80" align="center" />
+          <el-table-column prop="member_id" label="会员ID" width="100" align="center" />
+          <el-table-column prop="member_name" label="会员昵称" width="120" align="center" />
+          <el-table-column prop="company" label="支付公司" width="120" align="center">
+            <template slot-scope="{ row }">
+              {{ row.company || '--' }}
+            </template>
+          </el-table-column>
+          <el-table-column prop="pay_method" label="支付方式" width="100" align="center" />
+          <el-table-column prop="channel_no" label="通道编号" width="100" align="center" />
+          <el-table-column prop="amount" label="充值金额" width="110" align="center">
+            <template slot-scope="{ row }">
+              <span style="color: #18C80A;">{{ row.amount != null ? Number(row.amount).toFixed(2) : '--' }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column label="金额变化" width="150" align="center">
+            <template slot-scope="{ row }">
+              <div>变化前:{{ row.before_amount != null ? Number(row.before_amount).toFixed(2) : '--' }}</div>
+              <div>变化后:<span style="color: #1677FF;">{{ row.after_amount != null ? Number(row.after_amount).toFixed(2) : '--' }}</span></div>
+            </template>
+          </el-table-column>
+          <el-table-column prop="submit_date" label="提交日期" width="175" align="center" />
+          <el-table-column prop="deposit_date" label="存款日期" width="175" align="center" />
+          <el-table-column prop="gateway_no" label="网关单号" width="150" align="center" />
+          <el-table-column prop="gateway_return" label="网关回押" width="100" align="center" />
+          <el-table-column prop="platform" label="平台" width="90" align="center" />
+          <el-table-column prop="status" label="状态" width="90" align="center">
+            <template slot-scope="{ row }">
+              <span :style="{ color: row.status === '成功' ? '#18C80A' : row.status === '失败' ? '#F56C6C' : '#909399' }">
+                {{ row.status }}
+              </span>
+            </template>
+          </el-table-column>
+          <el-table-column label="操作" width="90" align="center" fixed="right">
+            <template slot-scope="{ row }">
+              <el-button type="text" size="small" class="ym-view-btn" @click="handleView(row)">查看</el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+        <el-pagination v-if="tableData.length" background
+          layout="total, prev, pager, next, jumper" :page-size="pageSize"
+          :page-sizes="[15, 30, 45, 60]" :current-page="page"
+          :total="tableData.length"
+          @current-change="page = $event" @size-change="handleSizeChange" />
+      </div>
+    </div>
+
+    <!-- 查看详情弹窗 -->
+    <Dialog ref="viewDialog" :dialog-actions="{
+      width: '820px',
+      title: '第三方入款详情',
+      confirmButtom: false,
+    }">
+      <template slot="content">
+        <div style="display: flex; flex-wrap: wrap; gap: 12px; padding: 10px 0; max-height: 400px; overflow-y: auto;">
+          <div v-for="field in viewFields" :key="field.prop"
+            style="flex: 0 0 calc(33.33% - 12px); background: #f5f7fa; border-radius: 6px; padding: 12px 16px; box-sizing: border-box; border: 1px solid #e4e7ed;">
+            <div style="font-size: 13px; color: #909399; margin-bottom: 4px;">{{ field.label }}</div>
+            <div :style="{ color: field.color || '#303133', fontSize: '15px' }">{{ field.value }}</div>
+          </div>
+        </div>
+      </template>
+    </Dialog>
+  </div>
+</template>
+
+<script>
+import Dialog from '@/components/Dialog/index.vue'
+
+// 假数据
+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 {
+  name: 'ThirdPartyDeposit',
+  components: {
+    Dialog
+  },
+  data() {
+    return {
+      loading: false,
+      page: 1,
+      pageSize: 15,
+      tableData: [...THIRD_PARTY_MOCK],
+      filteredData: [...THIRD_PARTY_MOCK],
+      viewRow: null,
+      companyOptions: ['AAPAY2'],
+      query: {
+        member_id: '',
+        company: '',
+        pay_method: '',
+        status: '',
+        platform: '',
+        submitRange: [],
+        depositRange: []
+      },
+      pickerOptions: {
+        disabledDate(time) {
+          return time.getTime() > Date.now()
+        }
+      }
+    }
+  },
+  computed: {
+    pagedData() {
+      const start = (this.page - 1) * this.pageSize
+      return this.filteredData.slice(start, start + this.pageSize)
+    },
+    viewFields() {
+      if (!this.viewRow) return []
+      const row = this.viewRow
+      const statusColor = row.status === '成功' ? '#18C80A' : row.status === '失败' ? '#F56C6C' : '#909399'
+      return [
+        { label: '序号', prop: 'id', value: row.id },
+        { label: '会员ID', prop: 'member_id', value: row.member_id },
+        { label: '会员昵称', prop: 'member_name', value: row.member_name || '--' },
+        { label: '支付公司', prop: 'company', value: row.company || '--' },
+        { label: '支付方式', prop: 'pay_method', value: row.pay_method || '--' },
+        { label: '通道编号', prop: 'channel_no', value: row.channel_no || '--' },
+        { label: '充值金额', prop: 'amount', value: row.amount != null ? Number(row.amount).toFixed(2) : '--', color: '#18C80A' },
+        { label: '变化前', prop: 'before_amount', value: row.before_amount != null ? Number(row.before_amount).toFixed(2) : '--' },
+        { label: '变化后', prop: 'after_amount', value: row.after_amount != null ? Number(row.after_amount).toFixed(2) : '--', color: '#1677FF' },
+        { label: '提交日期', prop: 'submit_date', value: row.submit_date || '--' },
+        { label: '存款日期', prop: 'deposit_date', value: row.deposit_date || '--' },
+        { label: '网关单号', prop: 'gateway_no', value: row.gateway_no || '--' },
+        { label: '网关回押', prop: 'gateway_return', value: row.gateway_return || '--' },
+        { label: '平台', prop: 'platform', value: row.platform || '--' },
+        { label: '状态', prop: 'status', value: row.status || '--', color: statusColor }
+      ]
+    }
+  },
+  methods: {
+    handleView(row) {
+      this.viewRow = { ...row }
+      this.$refs.viewDialog.open()
+    },
+    handleSizeChange(val) {
+      this.pageSize = val
+      this.page = 1
+    },
+    handleSearch() {
+      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.filteredData = filtered
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.third-party-page {
+  padding: 16px;
+  background: #f5f7fa;
+}
+.content-panel {
+  min-height: calc(100vh - 82px);
+  overflow: hidden;
+  border-radius: 8px;
+  background: #fff;
+}
+.filter-panel {
+  padding: 16px 20px 0;
+  border-bottom: 1px solid #ebeef5;
+  background: #fff;
+}
+.filter-form {
+  display: flex;
+  flex-wrap: wrap;
+  align-items: center;
+}
+.filter-actions {
+  margin-left: auto;
+}
+.table-section {
+  padding: 18px 20px 20px;
+}
+.el-pagination {
+  margin-top: 14px;
+  text-align: right;
+}
+</style>