From 33e15314ac504fcfec72e9fba4138eeeffde591a Mon Sep 17 00:00:00 2001 From: sexygoat <1538832180@qq.com> Date: Sat, 11 Apr 2026 12:19:35 +0800 Subject: [PATCH] bug --- opencode.json | 4 +- .../changes/add-button-permissions/tasks.md | 17 +- src/api/modules/commission.ts | 6 +- .../business/CustomerAccountDialog.vue | 2 +- src/config/constants/commission.ts | 10 +- src/locales/langs/zh.json | 6 +- src/router/routes/asyncRoutes.ts | 30 +- src/router/routesAlias.ts | 4 +- src/types/api/commission.ts | 30 +- src/types/api/common.ts | 4 - src/types/api/order.ts | 4 + .../account-management/account/index.vue | 12 +- .../asset-information/index.vue | 8 +- .../iot-card-management/index.vue | 17 +- .../index.vue | 37 +- .../my-commission/index.vue | 213 ++++++--- .../withdrawal-approval/index.vue | 16 +- src/views/common/account-list.vue | 37 +- src/views/dashboard/analysis/index.vue | 35 +- .../analysis/widget/ActiveWechatConfig.vue | 35 +- .../analysis/widget/CommissionStats.vue | 267 +++++++++++ .../analysis/widget/CommissionSummary.vue | 452 ++++++++++-------- .../analysis/widget/WithdrawalSettings.vue | 204 +++++--- .../order-management/order-list/detail.vue | 21 + .../order-management/order-list/index.vue | 43 ++ .../package-management/package-list/index.vue | 65 +-- .../package-series/index.vue | 24 +- .../withdrawal-settings/index.vue | 2 +- src/views/shop-management/list/index.vue | 2 +- src/views/system/role/index.vue | 2 +- 30 files changed, 1077 insertions(+), 532 deletions(-) rename src/views/commission-management/{agent-commission => agent-fund-overview}/index.vue (96%) create mode 100644 src/views/dashboard/analysis/widget/CommissionStats.vue rename src/views/{commission-management => settings}/withdrawal-settings/index.vue (99%) diff --git a/opencode.json b/opencode.json index 9983b76..83fe564 100644 --- a/opencode.json +++ b/opencode.json @@ -7,9 +7,9 @@ "apiKey": "sk-ZBGcMXCdwtSK7G35s" } }, - "google": { + "minimax": { "options": { - "baseURL": "http://45.155.220.179:8317/v1beta", + "baseURL": "http://45.155.220.179:8317/v1", "apiKey": "sk-ZBGcMXCdwtSK7G35s" } } diff --git a/openspec/changes/add-button-permissions/tasks.md b/openspec/changes/add-button-permissions/tasks.md index e961f6e..94f6344 100644 --- a/openspec/changes/add-button-permissions/tasks.md +++ b/openspec/changes/add-button-permissions/tasks.md @@ -9,14 +9,12 @@ ### 1. 套餐管理模块 (Package Management) ✅ - [x] **套餐系列页面** (`/package-management/package-series`) - - ✅ 引入 `useAuth` composable - ✅ 为"新增套餐系列"按钮添加 `v-permission="'package_series:add'"` - ✅ 为状态切换添加 `disabled: !hasAuth('package_series:update_status')` - ✅ 在操作列中使用 `hasAuth()` 判断编辑权限 (`package_series:edit`)和删除权限 (`package_series:delete`) - [x] **套餐列表页面** (`/package-management/package-list`) - - ✅ 引入 `useAuth` composable - ✅ 为"新增套餐"按钮添加 `v-permission="'package:add'"` - ✅ 为上/下架切换添加 `disabled: !hasAuth('package:update_away')` @@ -24,7 +22,6 @@ - ✅ 在操作列中使用 `hasAuth()` 判断编辑 (`package:edit`) 和删除 (`package:delete`) 权限 - [x] **单套餐分配页面** (`/package-management/package-assign`) - - ✅ 引入 `useAuth` composable - ✅ 为"新增分配"按钮添加 `v-permission="'package_assign:add'"` - ✅ 为状态切换添加 `disabled: !hasAuth('package_assign:update_status')` @@ -53,7 +50,6 @@ ### 3. 账号管理模块 (Account Management) ✅ - [x] **账号列表页面** (`/account-management/account`) - - ✅ 引入 `useAuth` composable - ✅ 为"新增账号"按钮添加 `v-permission="'account:add'"` - ✅ 在操作列中使用 `hasAuth()` 判断以下权限: @@ -61,11 +57,9 @@ - 编辑: `account:edit` - 删除: `account:delete` - ### 4. 资产管理模块 (Asset Management) ✅ - [x] **IoT卡管理页面** (`/asset-management/iot-card-management`) - - ✅ 引入 `useAuth` composable - ✅ 为表格头部操作按钮添加权限控制: - 批量分配: `v-permission="'iot_card:batch_allocation'"` @@ -79,19 +73,16 @@ - ✅ 验证权限控制正确工作 - [x] **IoT卡任务页面** (`/asset-management/iot-card-task`) - - ✅ 引入 `useAuth` composable - ✅ 为"批量导入IoT卡"按钮添加 `v-permission="''"` - ✅ 验证权限控制正确工作 - [x] **设备任务页面** (`/asset-management/device-task`) - - ✅ 引入 `useAuth` composable - ✅ 为"批量导入设备"按钮添加 `v-permission="'device_task:bulk_import'"` - ✅ 验证权限控制正确工作 - [x] **设备管理页面** (`/asset-management/device-list`) - - ✅ 引入 `useAuth` composable - ✅ 为表格头部操作按钮添加权限控制: - 批量分配: `v-permission="'devices:batch_allocation'"` @@ -110,7 +101,6 @@ ### 5. 账户管理模块 (Account Module) ✅ - [x] **企业客户页面** (`/account/enterprise-customer`) - - ✅ 引入 `useAuth` composable - ✅ 为"新增企业客户"按钮添加 `v-permission="'enterprise_customer:add'"` - ✅ 在操作列中使用 `hasAuth()` 判断以下权限: @@ -121,7 +111,6 @@ - ✅ 验证权限控制正确工作 - [x] **运营商管理页面** (`/account/carrier-management`) - - ✅ 引入 `useAuth` composable - ✅ 为"新增运营商"按钮添加 `v-permission="'carrier:add'"` - ✅ 为状态切换添加 `disabled: !hasAuth('carrier:update_status')` @@ -129,24 +118,21 @@ - ✅ 验证权限控制正确工作 - [x] **订单管理页面** (`/account/orders`) - - ✅ 引入 `useAuth` composable - ✅ 为"创建订单"按钮添加 `v-permission="'orders:add'"` - ✅ 验证权限控制正确工作 - [x] **提现配置页面** (`/account/commission/withdrawal-settings`) - - ✅ 引入 `useAuth` composable - ✅ 为"新增配置"按钮添加 `v-permission="'withdrawal_settings:add'"` - ✅ 验证权限控制正确工作 - [x] **我的佣金页面** (`/account/commission/my-commission`) - - ✅ 引入 `useAuth` composable - ✅ 为"发起提现"按钮添加 `v-permission="'my_commission:add'"` - ✅ 验证权限控制正确工作 -- [x] **代理商佣金管理页面** (`/account/commission/agent-commission`) +- [x] **代理商资金概况页面** (`/account/commission/agent-fund-overview`) - ✅ 引入 `useAuth` composable - ✅ 在操作列中使用 `hasAuth()` 判断查看详情权限 (`agent_commission:detail`) - ✅ 验证权限控制正确工作 @@ -162,7 +148,6 @@ ### 7. 测试与文档 - [ ] **权限控制测试** - - 创建不同权限组合的测试用户 - 验证每个页面的按钮显示/隐藏符合预期 - 验证状态切换的启用/禁用符合预期 diff --git a/src/api/modules/commission.ts b/src/api/modules/commission.ts index 61df223..a578ff2 100644 --- a/src/api/modules/commission.ts +++ b/src/api/modules/commission.ts @@ -93,10 +93,10 @@ export class CommissionService extends BaseService { ) } - // ==================== 代理商佣金管理 ==================== + // ==================== 代理商资金概况 ==================== /** - * 获取代理商佣金明细 + * 获取代理商资金明细 * GET /api/admin/shops/{shop_id}/commission-records */ static getShopCommissionRecords( @@ -137,7 +137,7 @@ export class CommissionService extends BaseService { } /** - * 获取代理商佣金统计 + * 获取代理商资金统计 * GET /api/admin/shops/{shop_id}/commission-stats */ static getShopCommissionStats( diff --git a/src/components/business/CustomerAccountDialog.vue b/src/components/business/CustomerAccountDialog.vue index 83fb505..74015f7 100644 --- a/src/components/business/CustomerAccountDialog.vue +++ b/src/components/business/CustomerAccountDialog.vue @@ -215,7 +215,7 @@ try { const params: any = { page: pagination.page, - pageSize: pagination.pageSize, + page_size: pagination.pageSize, username: searchForm.username || undefined, phone: searchForm.phone || undefined, user_type: searchForm.user_type, diff --git a/src/config/constants/commission.ts b/src/config/constants/commission.ts index c0e60cb..632b851 100644 --- a/src/config/constants/commission.ts +++ b/src/config/constants/commission.ts @@ -58,9 +58,15 @@ export const WithdrawalMethodMap = { bank: { label: '银行卡', icon: 'bank' } } -// ========== 佣金类型映射 ========== +// ========== 佣金来源映射 ========== -// 佣金类型映射 (one_time:一次性佣金, long_term:长期佣金) +// 佣金来源映射 (cost_diff:成本差价, one_time:一次性佣金) +export const CommissionSourceMap = { + cost_diff: { label: '成本差价', type: 'primary' as const }, + one_time: { label: '一次性佣金', type: 'success' as const } +} + +// 佣金类型映射 (one_time:一次性佣金, long_term:长期佣金) - 兼容旧字段 export const CommissionTypeMap = { one_time: { label: '一次性佣金', type: 'primary' as const }, long_term: { label: '长期佣金', type: 'success' as const } diff --git a/src/locales/langs/zh.json b/src/locales/langs/zh.json index 236aa2e..ee5c6cb 100644 --- a/src/locales/langs/zh.json +++ b/src/locales/langs/zh.json @@ -395,14 +395,14 @@ "commission": { "title": "佣金管理", "withdrawal": "提现审批", - "withdrawalSettings": "提现配置", "myCommission": "我的佣金", - "agentCommission": "代理商佣金" + "agentCommission": "代理商资金概况" }, "settings": { "title": "设置管理", "wechatPayConfiguration": "微信支付配置", - "detailsOfPaymentConfiguration": "支付配置详情" + "detailsOfPaymentConfiguration": "支付配置详情", + "withdrawalSettings": "提现配置" } }, "table": { diff --git a/src/router/routes/asyncRoutes.ts b/src/router/routes/asyncRoutes.ts index ec37c3e..34485d5 100644 --- a/src/router/routes/asyncRoutes.ts +++ b/src/router/routes/asyncRoutes.ts @@ -543,17 +543,6 @@ export const asyncRoutes: AppRouteRecord[] = [ roles: ['R_SUPER', 'R_ADMIN'] } }, - // 提现配置 - { - path: 'withdrawal-settings', - name: 'CommissionWithdrawalSettings', - component: RoutesAlias.CommissionWithdrawalSettings, - meta: { - title: 'menus.commission.withdrawalSettings', - keepAlive: true, - roles: ['R_SUPER', 'R_ADMIN'] - } - }, // 我的佣金 { path: 'my-commission', @@ -565,11 +554,11 @@ export const asyncRoutes: AppRouteRecord[] = [ roles: ['R_AGENT'] } }, - // 代理商佣金 + // 代理商资金概况 { - path: 'agent-commission', - name: 'AgentCommission', - component: RoutesAlias.AgentCommission, + path: 'agent-fund-overview', + name: 'AgentFundOverview', + component: RoutesAlias.AgentFundOverview, meta: { title: 'menus.commission.agentCommission', keepAlive: true, @@ -599,6 +588,17 @@ export const asyncRoutes: AppRouteRecord[] = [ keepAlive: true } }, + // 提现配置 + { + path: 'withdrawal-settings', + name: 'WithdrawalSettings', + component: RoutesAlias.WithdrawalSettings, + meta: { + title: 'menus.settings.withdrawalSettings', + keepAlive: true, + roles: ['R_SUPER', 'R_ADMIN'] + } + }, // 微信支付配置详情 { path: 'wechat-config/detail/:id', diff --git a/src/router/routesAlias.ts b/src/router/routesAlias.ts index 9d6dcd3..7080219 100644 --- a/src/router/routesAlias.ts +++ b/src/router/routesAlias.ts @@ -72,11 +72,11 @@ export enum RoutesAlias { // 佣金管理 WithdrawalApproval = '/commission-management/withdrawal-approval', // 提现审批 - CommissionWithdrawalSettings = '/commission-management/withdrawal-settings', // 提现配置 MyCommission = '/commission-management/my-commission', // 我的佣金 - AgentCommission = '/commission-management/agent-commission', // 代理商佣金管理 + AgentFundOverview = '/commission-management/agent-fund-overview', // 代理商资金概况 // 设置管理 + WithdrawalSettings = '/settings/withdrawal-settings', // 提现配置 WechatConfig = '/settings/wechat-config', // 微信支付配置 WechatConfigDetail = '/settings/wechat-config/detail', // 微信支付配置详情 diff --git a/src/types/api/commission.ts b/src/types/api/commission.ts index 482dfbc..4fa8ef7 100644 --- a/src/types/api/commission.ts +++ b/src/types/api/commission.ts @@ -59,6 +59,7 @@ export interface WithdrawalRequestItem { account_number: string // 收款账号 bank_name?: string // 银行名称 status: WithdrawalStatus // 状态 + status_name: string // 状态名称 payment_type: PaymentType // 放款类型 applicant_id: number // 申请人账号ID applicant_name: string // 申请人用户名 @@ -68,12 +69,14 @@ export interface WithdrawalRequestItem { remark?: string // 备注 created_at: string // 申请时间 processed_at?: string // 处理时间 + paid_at?: string // 到账时间 } /** * 提现申请查询参数 */ export interface WithdrawalRequestQueryParams extends PaginationParams { + page_size?: number // 每页数量 status?: WithdrawalStatus // 状态筛选 withdrawal_no?: string // 提现单号 shop_name?: string // 店铺名称 @@ -141,10 +144,14 @@ export interface MyCommissionRecordItem { * 佣金记录查询参数 */ export interface CommissionRecordQueryParams extends PaginationParams { - commission_type?: CommissionType // 佣金类型 - status?: CommissionStatus // 状态 + page_size?: number // 每页数量 + commission_source?: string // 佣金来源(cost_diff:成本差价,one_time:一次性佣金) + status?: number // 状态(1已入账,2已失效) start_time?: string // 开始时间 end_time?: string // 结束时间 + iccid?: string // ICCID(模糊查询) + virtual_no?: string // 设备虚拟号(模糊查询) + order_no?: string // 订单号(模糊查询) } /** @@ -171,23 +178,26 @@ export interface SubmitWithdrawalParams { remark?: string // 备注 } -// ==================== 代理商佣金相关 ==================== +// ==================== 代理商资金概况相关 ==================== /** - * 代理商佣金记录项 + * 代理商资金记录项 */ export interface ShopCommissionRecordItem { id: number // 佣金记录ID amount: number // 佣金金额(分) balance_after: number // 入账后佣金余额(分) - commission_type: CommissionType // 佣金类型 - status: CommissionStatus // 状态 + commission_source: string // 佣金来源(cost_diff:成本差价,one_time:一次性佣金) + status: number // 状态(1已冻结, 2解冻中, 3已发放, 4已失效) + status_name: string // 状态名称 order_id?: number // 订单ID order_no?: string // 订单号 order_created_at?: string // 订单创建时间 iccid?: string // ICCID virtual_no?: string // 虚拟号(原 device_no) created_at: string // 佣金入账时间 + seller_shop_id?: number // 卖家店铺ID + seller_shop_name?: string // 卖家店铺名称 } /** @@ -314,7 +324,7 @@ export interface MainWalletTransactionPageResult { // ==================== 我的佣金统计相关 ==================== /** - * 代理商佣金统计查询参数(shop_id 通过路径参数传递,不再在 query 中) + * 代理商资金统计查询参数(shop_id 通过路径参数传递,不再在 query 中) */ export interface ShopCommissionStatsQueryParams { start_time?: string // 开始时间 @@ -327,7 +337,7 @@ export interface ShopCommissionStatsQueryParams { export type MyCommissionStatsQueryParams = ShopCommissionStatsQueryParams /** - * 代理商佣金统计响应 + * 代理商资金统计响应 */ export interface CommissionStatsResponse { total_amount: number // 总收入(分) @@ -346,7 +356,7 @@ export interface CommissionStatsResponse { export type MyCommissionStatsResponse = CommissionStatsResponse /** - * 代理商每日佣金统计查询参数(shop_id 通过路径参数传递) + * 代理商每日资金统计查询参数(shop_id 通过路径参数传递) */ export interface DailyCommissionStatsQueryParams { start_date?: string // 开始日期(YYYY-MM-DD) @@ -360,7 +370,7 @@ export interface DailyCommissionStatsQueryParams { export type MyDailyCommissionStatsQueryParams = DailyCommissionStatsQueryParams /** - * 每日佣金统计项 + * 每日资金统计项 */ export interface DailyCommissionStatsItem { date: string // 日期(YYYY-MM-DD) diff --git a/src/types/api/common.ts b/src/types/api/common.ts index 14be888..f019462 100644 --- a/src/types/api/common.ts +++ b/src/types/api/common.ts @@ -12,10 +12,6 @@ export interface BaseResponse { // 分页请求参数 export interface PaginationParams { - current?: number - size?: number - pageNum?: number - pageSize?: number page?: number page_size?: number } diff --git a/src/types/api/order.ts b/src/types/api/order.ts index 039d237..1c98443 100644 --- a/src/types/api/order.ts +++ b/src/types/api/order.ts @@ -34,6 +34,7 @@ export interface OrderItem { quantity: number unit_price: number // 单价(分) amount: number // 小计金额(分) + package_type?: string // 套餐类型快照:formal(正式套餐)或 addon(加油包) } // 订单响应 @@ -43,6 +44,8 @@ export interface Order { order_type: OrderType buyer_id: number buyer_type: BuyerType + buyer_phone?: string // 买家手机号快照(个人客户下单时填充,代理商订单为空) + buyer_nickname?: string // 买家微信昵称快照(个人客户下单时填充,代理商订单为空) payment_status: PaymentStatus payment_status_text: string payment_method: OrderPaymentMethod @@ -72,6 +75,7 @@ export interface OrderQueryParams { order_no?: string identifier?: string // 按资产标识符过滤 purchase_role?: string // 订单渠道 + buyer_phone?: string // 按买家手机号精确过滤 start_time?: string end_time?: string dateRange?: string[] | any // For date range picker in UI diff --git a/src/views/account-management/account/index.vue b/src/views/account-management/account/index.vue index 62615d9..087e4bc 100644 --- a/src/views/account-management/account/index.vue +++ b/src/views/account-management/account/index.vue @@ -130,7 +130,8 @@ />
- + +
@@ -204,7 +205,7 @@ - - diff --git a/src/views/commission-management/withdrawal-approval/index.vue b/src/views/commission-management/withdrawal-approval/index.vue index acfa9c3..beda355 100644 --- a/src/views/commission-management/withdrawal-approval/index.vue +++ b/src/views/commission-management/withdrawal-approval/index.vue @@ -38,11 +38,7 @@ - + () const rejectRules = reactive({ - reject_reason: [ - { required: true, message: '请输入拒绝原因', trigger: 'blur' } - ], - remark: [ - { required: true, message: '请输入备注', trigger: 'blur' } - ] + reject_reason: [{ required: true, message: '请输入拒绝原因', trigger: 'blur' }], + remark: [{ required: true, message: '请输入备注', trigger: 'blur' }] }) const rejectForm = reactive({ @@ -318,7 +310,7 @@ try { const params = { page: pagination.page, - pageSize: pagination.pageSize, + page_size: pagination.pageSize, withdrawal_no: searchForm.withdrawal_no || undefined, shop_name: searchForm.shop_name || undefined, status: searchForm.status, diff --git a/src/views/common/account-list.vue b/src/views/common/account-list.vue index 93be935..39a6d03 100644 --- a/src/views/common/account-list.vue +++ b/src/views/common/account-list.vue @@ -113,10 +113,12 @@ clearable size="small" style="width: 180px" + @input="handleLeftRoleSearch" />
- + +
@@ -201,7 +203,8 @@ ElFormItem, ElInput, ElCheckbox, - ElCheckboxGroup + ElCheckboxGroup, + ElEmpty } from 'element-plus' import { ArrowLeft } from '@element-plus/icons-vue' import type { FormInstance, FormRules } from 'element-plus' @@ -407,7 +410,7 @@ const entityId = Number(route.params.id) const params: any = { page: pagination.page, - pageSize: pagination.pageSize, + page_size: pagination.pageSize, username: searchForm.username || undefined, phone: searchForm.phone || undefined, user_type: isShopType.value ? 3 : 4, // 根据页面类型自动设置: 3:代理账号, 4:企业账号 @@ -553,9 +556,16 @@ } // 加载所有角色列表 - const loadAllRoles = async () => { + const loadAllRoles = async (keyword: string = '') => { try { - const res = await RoleService.getRoles({ page: 1, pageSize: 100 }) + const params: any = { + page: 1, + page_size: 20 + } + if (keyword) { + params.role_name = keyword + } + const res = await RoleService.getRoles(params) if (res.code === 0) { allRoles.value = res.data.items || [] } @@ -564,6 +574,17 @@ } } + // 左侧角色搜索防抖 + let leftSearchTimer: ReturnType | null = null + const handleLeftRoleSearch = (val: string) => { + if (leftSearchTimer) { + clearTimeout(leftSearchTimer) + } + leftSearchTimer = setTimeout(() => { + loadAllRoles(val) + }, 300) + } + // 计算属性:过滤后的可分配角色(根据账号类型过滤) const filteredAvailableRoles = computed(() => { let roles = allRoles.value @@ -580,10 +601,7 @@ roles = roles.filter((role) => role.role_type === 2) } - // 根据搜索关键词过滤 - if (!leftRoleFilter.value) return roles - const keyword = leftRoleFilter.value.toLowerCase() - return roles.filter((role) => role.role_name.toLowerCase().includes(keyword)) + return roles }) // 计算属性:过滤后的已分配角色 @@ -675,7 +693,6 @@ onMounted(() => { getTableData() - loadAllRoles() }) diff --git a/src/views/dashboard/analysis/index.vue b/src/views/dashboard/analysis/index.vue index a7efdc1..40daa5b 100644 --- a/src/views/dashboard/analysis/index.vue +++ b/src/views/dashboard/analysis/index.vue @@ -1,19 +1,9 @@ + + diff --git a/src/views/dashboard/analysis/widget/CommissionSummary.vue b/src/views/dashboard/analysis/widget/CommissionSummary.vue index af6407f..8e77428 100644 --- a/src/views/dashboard/analysis/widget/CommissionSummary.vue +++ b/src/views/dashboard/analysis/widget/CommissionSummary.vue @@ -1,101 +1,116 @@ diff --git a/src/views/order-management/order-list/detail.vue b/src/views/order-management/order-list/detail.vue index 5587285..57cb12e 100644 --- a/src/views/order-management/order-list/detail.vue +++ b/src/views/order-management/order-list/detail.vue @@ -23,6 +23,17 @@

订单项列表

+ + +