|
@@ -6,8 +6,8 @@
|
|
<sa-search-simple
|
|
<sa-search-simple
|
|
:searchFields="searchFields"
|
|
:searchFields="searchFields"
|
|
:defaultValues="defaultSearchValues"
|
|
:defaultValues="defaultSearchValues"
|
|
- @search="(val) => getData(1, val)"
|
|
|
|
- @reset="getData(1)"
|
|
|
|
|
|
+ @search="handleSearch"
|
|
|
|
+ @reset="handleReset"
|
|
>
|
|
>
|
|
</sa-search-simple>
|
|
</sa-search-simple>
|
|
</div>
|
|
</div>
|
|
@@ -15,7 +15,15 @@
|
|
<div class="label sa-flex">佣金管理</div>
|
|
<div class="label sa-flex">佣金管理</div>
|
|
<div>
|
|
<div>
|
|
<el-button class="sa-button-refresh" icon="RefreshRight" @click="getData()"></el-button>
|
|
<el-button class="sa-button-refresh" icon="RefreshRight" @click="getData()"></el-button>
|
|
- <el-button icon="Download" type="primary" @click="exportRecords">导出记录</el-button>
|
|
|
|
|
|
+ <el-button
|
|
|
|
+ icon="Download"
|
|
|
|
+ type="primary"
|
|
|
|
+ :loading="exportLoading"
|
|
|
|
+ :disabled="exportLoading"
|
|
|
|
+ @click="exportRecords"
|
|
|
|
+ >
|
|
|
|
+ {{ exportLoading ? '导出中...' : '导出记录' }}
|
|
|
|
+ </el-button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</el-header>
|
|
</el-header>
|
|
@@ -26,47 +34,51 @@
|
|
class="sa-table"
|
|
class="sa-table"
|
|
:data="table.data"
|
|
:data="table.data"
|
|
@sort-change="fieldFilter"
|
|
@sort-change="fieldFilter"
|
|
- @row-dblclick="viewDetail"
|
|
|
|
row-key="id"
|
|
row-key="id"
|
|
stripe
|
|
stripe
|
|
>
|
|
>
|
|
<template #empty>
|
|
<template #empty>
|
|
<sa-empty />
|
|
<sa-empty />
|
|
</template>
|
|
</template>
|
|
- <el-table-column prop="commission_no" label="佣金单号" min-width="180" sortable="custom">
|
|
|
|
|
|
+ <el-table-column prop="tranNo" label="佣金单号" min-width="180" sortable="custom">
|
|
<template #default="scope">
|
|
<template #default="scope">
|
|
- <span class="sa-table-line-1">{{ scope.row.commission_no || '-' }}</span>
|
|
|
|
|
|
+ <span class="sa-table-line-1">{{ scope.row.tranNo || '-' }}</span>
|
|
</template>
|
|
</template>
|
|
</el-table-column>
|
|
</el-table-column>
|
|
<el-table-column label="用户名" min-width="120">
|
|
<el-table-column label="用户名" min-width="120">
|
|
<template #default="scope">
|
|
<template #default="scope">
|
|
<el-link type="primary" :underline="true" @click="viewUserDetail(scope.row)">
|
|
<el-link type="primary" :underline="true" @click="viewUserDetail(scope.row)">
|
|
- {{ scope.row.username || '-' }}
|
|
|
|
|
|
+ {{ scope.row.name || '-' }}
|
|
</el-link>
|
|
</el-link>
|
|
</template>
|
|
</template>
|
|
</el-table-column>
|
|
</el-table-column>
|
|
- <el-table-column prop="phone" label="手机号" min-width="130" align="center">
|
|
|
|
|
|
+ <el-table-column prop="phoneNo" label="手机号" min-width="130" align="center">
|
|
<template #default="scope">
|
|
<template #default="scope">
|
|
- {{ scope.row.phone || '-' }}
|
|
|
|
|
|
+ {{ scope.row.phoneNo || '-' }}
|
|
</template>
|
|
</template>
|
|
</el-table-column>
|
|
</el-table-column>
|
|
<el-table-column label="佣金金额" min-width="120" align="center">
|
|
<el-table-column label="佣金金额" min-width="120" align="center">
|
|
<template #default="scope"> ৳{{ scope.row.amount || 0 }} </template>
|
|
<template #default="scope"> ৳{{ scope.row.amount || 0 }} </template>
|
|
</el-table-column>
|
|
</el-table-column>
|
|
|
|
+ <el-table-column label="佣金类型" min-width="150">
|
|
|
|
+ <template #default="scope">
|
|
|
|
+ <span class="sa-table-line-1">{{ getBizTypeText(scope.row.bizType) }}</span>
|
|
|
|
+ </template>
|
|
|
|
+ </el-table-column>
|
|
<el-table-column label="佣金说明" min-width="200">
|
|
<el-table-column label="佣金说明" min-width="200">
|
|
<template #default="scope">
|
|
<template #default="scope">
|
|
- <span class="sa-table-line-1">{{ scope.row.description || '-' }}</span>
|
|
|
|
|
|
+ <span class="sa-table-line-1">{{ scope.row.memo || '-' }}</span>
|
|
</template>
|
|
</template>
|
|
</el-table-column>
|
|
</el-table-column>
|
|
<el-table-column label="订单号" min-width="150">
|
|
<el-table-column label="订单号" min-width="150">
|
|
<template #default="scope">
|
|
<template #default="scope">
|
|
<el-link
|
|
<el-link
|
|
- v-if="scope.row.order_no"
|
|
|
|
|
|
+ v-if="scope.row.orderNo"
|
|
type="primary"
|
|
type="primary"
|
|
:underline="true"
|
|
:underline="true"
|
|
@click="viewOrderDetail(scope.row)"
|
|
@click="viewOrderDetail(scope.row)"
|
|
>
|
|
>
|
|
- {{ scope.row.order_no }}
|
|
|
|
|
|
+ {{ scope.row.orderNo }}
|
|
</el-link>
|
|
</el-link>
|
|
<span v-else>--</span>
|
|
<span v-else>--</span>
|
|
</template>
|
|
</template>
|
|
@@ -74,23 +86,18 @@
|
|
<el-table-column label="状态" min-width="100" align="center">
|
|
<el-table-column label="状态" min-width="100" align="center">
|
|
<template #default="scope">
|
|
<template #default="scope">
|
|
<el-tag :type="getStatusType(scope.row.status)">
|
|
<el-tag :type="getStatusType(scope.row.status)">
|
|
- {{ scope.row.status_text || '-' }}
|
|
|
|
|
|
+ {{ getStatusText(scope.row.status) }}
|
|
</el-tag>
|
|
</el-tag>
|
|
</template>
|
|
</template>
|
|
</el-table-column>
|
|
</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">
|
|
<template #default="scope">
|
|
- {{ scope.row.create_time || '-' }}
|
|
|
|
|
|
+ {{ scope.row.createTime || '-' }}
|
|
</template>
|
|
</template>
|
|
</el-table-column>
|
|
</el-table-column>
|
|
<el-table-column label="到账时间" min-width="160">
|
|
<el-table-column label="到账时间" min-width="160">
|
|
<template #default="scope">
|
|
<template #default="scope">
|
|
- {{ scope.row.settle_time || '--' }}
|
|
|
|
- </template>
|
|
|
|
- </el-table-column>
|
|
|
|
- <el-table-column fixed="right" label="操作" min-width="80">
|
|
|
|
- <template #default="scope">
|
|
|
|
- <el-button link type="primary" @click="viewDetail(scope.row)">详情</el-button>
|
|
|
|
|
|
+ {{ scope.row.settleTime || '--' }}
|
|
</template>
|
|
</template>
|
|
</el-table-column>
|
|
</el-table-column>
|
|
</el-table>
|
|
</el-table>
|
|
@@ -107,61 +114,53 @@
|
|
import { onMounted, reactive, ref } from 'vue';
|
|
import { onMounted, reactive, ref } from 'vue';
|
|
import { ElMessage } from 'element-plus';
|
|
import { ElMessage } from 'element-plus';
|
|
import { useModal, usePagination } from '@/sheep/hooks';
|
|
import { useModal, usePagination } from '@/sheep/hooks';
|
|
- import { commissionMockData } from '@/sheep/mock/commission';
|
|
|
|
|
|
+ import { api } from '../finance.service';
|
|
|
|
+ import { request } from '@/sheep/request';
|
|
import UserDetail from '../../user/list/detail.vue';
|
|
import UserDetail from '../../user/list/detail.vue';
|
|
- import CommissionDetail from './detail.vue';
|
|
|
|
import OrderDetail from '../../order/order/detail.vue';
|
|
import OrderDetail from '../../order/order/detail.vue';
|
|
const { pageData } = usePagination();
|
|
const { pageData } = usePagination();
|
|
|
|
|
|
// 搜索字段配置
|
|
// 搜索字段配置
|
|
const searchFields = reactive({
|
|
const searchFields = reactive({
|
|
- username: {
|
|
|
|
|
|
+ name: {
|
|
type: 'input',
|
|
type: 'input',
|
|
label: '用户名',
|
|
label: '用户名',
|
|
placeholder: '请输入用户名',
|
|
placeholder: '请输入用户名',
|
|
width: 150,
|
|
width: 150,
|
|
},
|
|
},
|
|
- phone: {
|
|
|
|
|
|
+ phoneNo: {
|
|
type: 'input',
|
|
type: 'input',
|
|
label: '手机号',
|
|
label: '手机号',
|
|
placeholder: '请输入手机号',
|
|
placeholder: '请输入手机号',
|
|
width: 150,
|
|
width: 150,
|
|
},
|
|
},
|
|
- commission_no: {
|
|
|
|
|
|
+ orderNo: {
|
|
type: 'input',
|
|
type: 'input',
|
|
- label: '佣金单号',
|
|
|
|
- placeholder: '请输入佣金单号',
|
|
|
|
|
|
+ label: '订单号',
|
|
|
|
+ placeholder: '请输入订单号',
|
|
width: 180,
|
|
width: 180,
|
|
},
|
|
},
|
|
status: {
|
|
status: {
|
|
type: 'select',
|
|
type: 'select',
|
|
- label: '佣金状态',
|
|
|
|
|
|
+ label: '状态',
|
|
placeholder: '请选择状态',
|
|
placeholder: '请选择状态',
|
|
width: 120,
|
|
width: 120,
|
|
options: [
|
|
options: [
|
|
- { label: '全部', value: 'all' },
|
|
|
|
- { label: '处理中', value: 'processing' },
|
|
|
|
- { label: '已到账', value: 'settled' },
|
|
|
|
- { label: '未到账', value: 'unsettled' },
|
|
|
|
|
|
+ { label: '全部', value: '' },
|
|
|
|
+ { label: '未结算', value: 1 },
|
|
|
|
+ { label: '已结算', value: 2 },
|
|
],
|
|
],
|
|
},
|
|
},
|
|
- type: {
|
|
|
|
|
|
+ bizType: {
|
|
type: 'select',
|
|
type: 'select',
|
|
label: '佣金类型',
|
|
label: '佣金类型',
|
|
placeholder: '请选择类型',
|
|
placeholder: '请选择类型',
|
|
width: 150,
|
|
width: 150,
|
|
- options: [
|
|
|
|
- { label: '邀请奖励', value: 'invite_reward' },
|
|
|
|
- { label: '拼团奖励', value: 'group_reward' },
|
|
|
|
- { label: '开团奖励', value: 'leader_reward' },
|
|
|
|
- { label: '签到奖励', value: 'checkin_reward' },
|
|
|
|
- { label: '拼团奖励-下线', value: 'group_sub_reward' },
|
|
|
|
- { label: '开团奖励-下线', value: 'leader_sub_reward' },
|
|
|
|
- ],
|
|
|
|
|
|
+ options: [], // 动态加载
|
|
},
|
|
},
|
|
date_range: {
|
|
date_range: {
|
|
type: 'daterange',
|
|
type: 'daterange',
|
|
- label: '时间',
|
|
|
|
|
|
+ label: '时间范围',
|
|
placeholder: '请选择时间范围',
|
|
placeholder: '请选择时间范围',
|
|
width: 240,
|
|
width: 240,
|
|
},
|
|
},
|
|
@@ -169,13 +168,36 @@
|
|
|
|
|
|
// 默认搜索值
|
|
// 默认搜索值
|
|
const defaultSearchValues = reactive({
|
|
const defaultSearchValues = reactive({
|
|
- username: '',
|
|
|
|
- phone: '',
|
|
|
|
- commission_no: '',
|
|
|
|
- status: 'all',
|
|
|
|
- type: '',
|
|
|
|
|
|
+ name: '',
|
|
|
|
+ phoneNo: '',
|
|
|
|
+ orderNo: '',
|
|
|
|
+ status: '',
|
|
|
|
+ bizType: '',
|
|
date_range: [],
|
|
date_range: [],
|
|
});
|
|
});
|
|
|
|
+
|
|
|
|
+ // 当前搜索参数状态
|
|
|
|
+ const currentSearchParams = ref({});
|
|
|
|
+
|
|
|
|
+ // 导出loading状态
|
|
|
|
+ const exportLoading = ref(false);
|
|
|
|
+
|
|
|
|
+ // 搜索处理函数
|
|
|
|
+ function handleSearch(searchParams) {
|
|
|
|
+ // 保存当前搜索参数
|
|
|
|
+ currentSearchParams.value = { ...searchParams };
|
|
|
|
+ // 执行搜索
|
|
|
|
+ getData(1, searchParams);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 重置搜索参数处理函数
|
|
|
|
+ function handleReset() {
|
|
|
|
+ // 清空当前搜索参数
|
|
|
|
+ currentSearchParams.value = {};
|
|
|
|
+ // 执行重置
|
|
|
|
+ getData(1);
|
|
|
|
+ }
|
|
|
|
+
|
|
// 列表
|
|
// 列表
|
|
const table = reactive({
|
|
const table = reactive({
|
|
data: [],
|
|
data: [],
|
|
@@ -188,41 +210,93 @@
|
|
// 获取状态类型
|
|
// 获取状态类型
|
|
function getStatusType(status) {
|
|
function getStatusType(status) {
|
|
const statusMap = {
|
|
const statusMap = {
|
|
- processing: 'warning',
|
|
|
|
- settled: 'success',
|
|
|
|
- unsettled: 'danger',
|
|
|
|
|
|
+ 1: 'warning', // 未结算
|
|
|
|
+ 2: 'success', // 已结算
|
|
};
|
|
};
|
|
return statusMap[status] || 'info';
|
|
return statusMap[status] || 'info';
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ // 获取状态文本
|
|
|
|
+ function getStatusText(status) {
|
|
|
|
+ const statusMap = {
|
|
|
|
+ 1: '未结算',
|
|
|
|
+ 2: '已结算',
|
|
|
|
+ };
|
|
|
|
+ return statusMap[status] || '未知';
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 获取佣金类型文本
|
|
|
|
+ function getBizTypeText(bizType) {
|
|
|
|
+ const typeMap = {
|
|
|
|
+ 1001: '充值',
|
|
|
|
+ 2001: '提现',
|
|
|
|
+ 3001: '开团支付',
|
|
|
|
+ 3002: '参团支付',
|
|
|
|
+ 4001: '未成团退款',
|
|
|
|
+ 4002: '成团退款',
|
|
|
|
+ 5001: '开团红包收益',
|
|
|
|
+ 5002: '参团红包收益',
|
|
|
|
+ 5003: '签到红包收益',
|
|
|
|
+ 5004: '下级红包佣金',
|
|
|
|
+ 5005: '下下级红包佣金',
|
|
|
|
+ 6001: '充值返点',
|
|
|
|
+ 7001: '提现手续费',
|
|
|
|
+ };
|
|
|
|
+ return typeMap[bizType] || '未知类型';
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 获取佣金类型枚举
|
|
|
|
+ async function getCommissionTypes() {
|
|
|
|
+ try {
|
|
|
|
+ const { code, data } = await request({
|
|
|
|
+ url: 'cif/api/user/getEnum',
|
|
|
|
+ method: 'GET',
|
|
|
|
+ params: { id: 5 },
|
|
|
|
+ });
|
|
|
|
+
|
|
|
|
+ if (code === '200' && data) {
|
|
|
|
+ const options = [{ label: '全部', value: '' }];
|
|
|
|
+ data.forEach((item) => {
|
|
|
|
+ options.push({
|
|
|
|
+ label: item.name,
|
|
|
|
+ value: item.code,
|
|
|
|
+ });
|
|
|
|
+ });
|
|
|
|
+ searchFields.bizType.options = options;
|
|
|
|
+ }
|
|
|
|
+ } catch (error) {
|
|
|
|
+ console.error('获取佣金类型枚举失败:', error);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
// 获取数据
|
|
// 获取数据
|
|
async function getData(page, searchParams = {}) {
|
|
async function getData(page, searchParams = {}) {
|
|
if (page) pageData.page = page;
|
|
if (page) pageData.page = page;
|
|
loading.value = true;
|
|
loading.value = true;
|
|
|
|
|
|
try {
|
|
try {
|
|
- // 处理时间范围参数
|
|
|
|
|
|
+ // 构建请求参数
|
|
let params = {
|
|
let params = {
|
|
page: pageData.page,
|
|
page: pageData.page,
|
|
size: pageData.size,
|
|
size: pageData.size,
|
|
- order: table.order,
|
|
|
|
- sort: table.sort,
|
|
|
|
...searchParams,
|
|
...searchParams,
|
|
};
|
|
};
|
|
|
|
|
|
// 处理日期范围
|
|
// 处理日期范围
|
|
if (searchParams.date_range && searchParams.date_range.length === 2) {
|
|
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;
|
|
delete params.date_range;
|
|
}
|
|
}
|
|
|
|
|
|
- const result = commissionMockData.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.commission.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) {
|
|
} catch (error) {
|
|
console.error('获取数据失败:', error);
|
|
console.error('获取数据失败:', error);
|
|
@@ -237,23 +311,6 @@
|
|
table.sort = prop;
|
|
table.sort = prop;
|
|
getData();
|
|
getData();
|
|
}
|
|
}
|
|
- // 查看详情
|
|
|
|
- function viewDetail(row) {
|
|
|
|
- useModal(
|
|
|
|
- CommissionDetail,
|
|
|
|
- {
|
|
|
|
- title: '佣金详情',
|
|
|
|
- type: 'view',
|
|
|
|
- id: row.id,
|
|
|
|
- size: '80%',
|
|
|
|
- },
|
|
|
|
- {
|
|
|
|
- confirm: () => {
|
|
|
|
- // 详情页面通常不需要确认回调
|
|
|
|
- },
|
|
|
|
- },
|
|
|
|
- );
|
|
|
|
- }
|
|
|
|
|
|
|
|
// 查看用户详情
|
|
// 查看用户详情
|
|
function viewUserDetail(row) {
|
|
function viewUserDetail(row) {
|
|
@@ -262,7 +319,7 @@
|
|
{
|
|
{
|
|
title: '用户详情',
|
|
title: '用户详情',
|
|
type: 'view',
|
|
type: 'view',
|
|
- id: row.user_id,
|
|
|
|
|
|
+ id: row.userId,
|
|
},
|
|
},
|
|
{
|
|
{
|
|
confirm: () => {
|
|
confirm: () => {
|
|
@@ -274,13 +331,13 @@
|
|
|
|
|
|
// 查看订单详情
|
|
// 查看订单详情
|
|
function viewOrderDetail(row) {
|
|
function viewOrderDetail(row) {
|
|
- if (!row.order_no) return;
|
|
|
|
|
|
+ if (!row.orderNo) return;
|
|
useModal(
|
|
useModal(
|
|
OrderDetail,
|
|
OrderDetail,
|
|
{
|
|
{
|
|
title: '订单详情',
|
|
title: '订单详情',
|
|
type: 'view',
|
|
type: 'view',
|
|
- id: row.order_no,
|
|
|
|
|
|
+ id: row.orderNo,
|
|
},
|
|
},
|
|
{
|
|
{
|
|
confirm: () => {
|
|
confirm: () => {
|
|
@@ -291,23 +348,32 @@
|
|
}
|
|
}
|
|
|
|
|
|
// 导出记录
|
|
// 导出记录
|
|
- function exportRecords() {
|
|
|
|
|
|
+ async function exportRecords() {
|
|
|
|
+ if (exportLoading.value) return; // 防止重复点击
|
|
|
|
+
|
|
|
|
+ exportLoading.value = true;
|
|
try {
|
|
try {
|
|
- const result = commissionMockData.export({});
|
|
|
|
- if (result.code == '200') {
|
|
|
|
- ElMessage.success('导出成功');
|
|
|
|
- // 这里可以触发文件下载
|
|
|
|
- console.log('导出文件:', result.data);
|
|
|
|
- } else {
|
|
|
|
- ElMessage.error(result.msg);
|
|
|
|
|
|
+ // 构建导出参数,与列表请求参数保持一致,但排除分页相关数据
|
|
|
|
+ const exportParams = {
|
|
|
|
+ ...currentSearchParams.value, // 当前搜索参数
|
|
|
|
+ };
|
|
|
|
+
|
|
|
|
+ // 处理日期范围搜索(与 getData 函数保持一致)
|
|
|
|
+ if (exportParams.date_range && exportParams.date_range.length === 2) {
|
|
|
|
+ exportParams.startTime = exportParams.date_range[0];
|
|
|
|
+ exportParams.endTime = exportParams.date_range[1];
|
|
|
|
+ delete exportParams.date_range;
|
|
}
|
|
}
|
|
- } catch (error) {
|
|
|
|
- console.error('导出失败:', error);
|
|
|
|
- ElMessage.error('导出失败');
|
|
|
|
|
|
+
|
|
|
|
+ // 调用导出API,所有下载逻辑都在REPORT函数中处理
|
|
|
|
+ await api.commission.report(exportParams, '佣金记录');
|
|
|
|
+ } finally {
|
|
|
|
+ exportLoading.value = false;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
onMounted(() => {
|
|
onMounted(() => {
|
|
|
|
+ getCommissionTypes(); // 获取佣金类型枚举
|
|
getData();
|
|
getData();
|
|
});
|
|
});
|
|
</script>
|
|
</script>
|