From 8a1388608c49f2050be060eb8bfd5c2b175fb455 Mon Sep 17 00:00:00 2001 From: sexygoat <1538832180@qq.com> Date: Fri, 30 Jan 2026 15:39:19 +0800 Subject: [PATCH] =?UTF-8?q?fetch(add):=20=E6=96=B0=E5=A2=9E=E4=BC=81?= =?UTF-8?q?=E4=B8=9A=E8=AE=BE=E5=A4=87=E6=8E=88=E6=9D=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- index.html | 2 + src/api/modules/index.ts | 1 - src/api/modules/myPackage.ts | 45 --- src/assets/fonts/DMSans.woff2 | Bin 12128 -> 0 bytes src/assets/fonts/Montserrat.woff2 | Bin 12700 -> 0 bytes src/assets/styles/app.scss | 15 +- src/assets/styles/el-ui.scss | 30 ++ src/assets/styles/reset.scss | 4 +- .../core/layouts/art-header-bar/index.vue | 26 +- src/locales/langs/en.json | 7 +- src/locales/langs/zh.json | 8 +- src/router/routes/asyncRoutes.ts | 48 +-- src/router/routesAlias.ts | 8 +- src/types/api/card.ts | 28 +- src/types/api/packageManagement.ts | 86 ++-- .../asset-management/device-task/index.vue | 310 ++++++++++++++ .../index.vue | 143 +++++-- .../{card-search => iot-card-query}/index.vue | 0 .../index.vue | 181 +++------ src/views/dashboard/analysis/index.vue | 61 +-- src/views/dashboard/console/index.vue | 43 +- src/views/dashboard/ecommerce/index.vue | 103 ++--- .../package-management/my-packages/index.vue | 382 ------------------ .../package-assign/index.vue | 40 +- .../series-assign/index.vue | 329 ++++++++++----- 25 files changed, 978 insertions(+), 922 deletions(-) delete mode 100644 src/api/modules/myPackage.ts delete mode 100644 src/assets/fonts/DMSans.woff2 delete mode 100644 src/assets/fonts/Montserrat.woff2 create mode 100644 src/views/asset-management/device-task/index.vue rename src/views/asset-management/{card-list => iot-card-management}/index.vue (90%) rename src/views/asset-management/{card-search => iot-card-query}/index.vue (100%) rename src/views/asset-management/{task-management => iot-card-task}/index.vue (62%) delete mode 100644 src/views/package-management/my-packages/index.vue diff --git a/index.html b/index.html index 8e03a02..4803c3a 100644 --- a/index.html +++ b/index.html @@ -4,6 +4,8 @@ 君鸿卡管系统 + + diff --git a/src/api/modules/index.ts b/src/api/modules/index.ts index a229e8c..690c767 100644 --- a/src/api/modules/index.ts +++ b/src/api/modules/index.ts @@ -23,7 +23,6 @@ export { DeviceService } from './device' export { CarrierService } from './carrier' export { PackageSeriesService } from './packageSeries' export { PackageManageService } from './packageManage' -export { MyPackageService } from './myPackage' export { ShopPackageAllocationService } from './shopPackageAllocation' export { ShopSeriesAllocationService } from './shopSeriesAllocation' export { OrderService } from './order' diff --git a/src/api/modules/myPackage.ts b/src/api/modules/myPackage.ts deleted file mode 100644 index 8d465f4..0000000 --- a/src/api/modules/myPackage.ts +++ /dev/null @@ -1,45 +0,0 @@ -/** - * 代理可售套餐 API 服务 - */ - -import { BaseService } from '../BaseService' -import type { - MyPackageResponse, - MyPackageQueryParams, - MySeriesAllocationResponse, - BaseResponse, - PaginationResponse -} from '@/types/api' - -export class MyPackageService extends BaseService { - /** - * 获取我的可售套餐列表 - * GET /api/admin/my-packages - * @param params 查询参数 - */ - static getMyPackages( - params?: MyPackageQueryParams - ): Promise> { - return this.getPage('/api/admin/my-packages', params) - } - - /** - * 获取我的可售套餐详情 - * GET /api/admin/my-packages/{id} - * @param id 套餐ID - */ - static getMyPackageDetail(id: number): Promise> { - return this.getOne(`/api/admin/my-packages/${id}`) - } - - /** - * 获取我的被分配系列列表 - * GET /api/admin/my-series-allocations - * @param params 查询参数(支持分页) - */ - static getMySeriesAllocations( - params?: Record - ): Promise> { - return this.getPage('/api/admin/my-series-allocations', params) - } -} diff --git a/src/assets/fonts/DMSans.woff2 b/src/assets/fonts/DMSans.woff2 deleted file mode 100644 index a358ff373c245586a3cfa03b2955b50f3086cd31..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12128 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 diff --git a/src/assets/fonts/Montserrat.woff2 b/src/assets/fonts/Montserrat.woff2 deleted file mode 100644 index 6db06d182800f3b09ecdf81a8ee3a9c3c723e08a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12700 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 WQbVU0002(yLrR_ diff --git a/src/assets/styles/app.scss b/src/assets/styles/app.scss index 3062781..041be08 100644 --- a/src/assets/styles/app.scss +++ b/src/assets/styles/app.scss @@ -1,17 +1,8 @@ // 全局样式 -@font-face { - font-family: 'DMSans'; - font-style: normal; - font-weight: 400; - src: url(../fonts/DMSans.woff2) format('woff2'); -} - -@font-face { - font-family: 'Montserrat'; - font-style: normal; - font-weight: 400; - src: url(../fonts/Montserrat.woff2) format('woff2'); +// 强制所有元素使用小米字体 +* { + font-family: 'MiSans', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif !important; } .btn-icon { diff --git a/src/assets/styles/el-ui.scss b/src/assets/styles/el-ui.scss index 95bcab0..4e623f9 100644 --- a/src/assets/styles/el-ui.scss +++ b/src/assets/styles/el-ui.scss @@ -9,6 +9,8 @@ // --el-border-color: #E4E4E7 !important; // DCDFE6 // 按钮粗度 --el-font-weight-primary: 400 !important; + // Element Plus 全局字体 + --el-font-family: 'MiSans', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif !important; --el-component-custom-height: 36px !important; @@ -180,6 +182,8 @@ // 修改el-button样式 .el-button { + font-family: 'MiSans', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif !important; + &.el-button--text { background-color: transparent !important; padding: 0 !important; @@ -198,6 +202,32 @@ border-radius: 6px !important; font-weight: bold; transition: all 0s !important; + font-family: 'MiSans', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif !important; +} + +// 为所有 Element Plus 组件添加小米字体 +.el-input, +.el-input__wrapper, +.el-select, +.el-select__wrapper, +.el-form-item__label, +.el-table, +.el-pagination, +.el-dialog, +.el-message, +.el-message-box, +.el-dropdown-menu, +.el-menu, +.el-radio, +.el-checkbox, +.el-switch, +.el-date-picker, +.el-cascader, +.el-tree-select, +.el-upload, +.el-card, +.el-divider { + font-family: 'MiSans', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif !important; } .el-checkbox-group { diff --git a/src/assets/styles/reset.scss b/src/assets/styles/reset.scss index 9a25580..c81c5ca 100644 --- a/src/assets/styles/reset.scss +++ b/src/assets/styles/reset.scss @@ -34,9 +34,7 @@ h5 { body { color: var(--art-text-gray-700); text-align: left; - font-family: - Inter, 'Helvetica Neue', Helvetica, 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', - '微软雅黑', Arial, sans-serif; + font-family: 'MiSans', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif; } select { diff --git a/src/components/core/layouts/art-header-bar/index.vue b/src/components/core/layouts/art-header-bar/index.vue index 0be6dc2..2d2600c 100644 --- a/src/components/core/layouts/art-header-bar/index.vue +++ b/src/components/core/layouts/art-header-bar/index.vue @@ -24,7 +24,7 @@ - + -
-
- - -
-
+ + + + + + -
-
- - -
-
+ + + + + +
diff --git a/src/locales/langs/en.json b/src/locales/langs/en.json index 47eef9b..26ba8d8 100644 --- a/src/locales/langs/en.json +++ b/src/locales/langs/en.json @@ -433,11 +433,12 @@ }, "assetManagement": { "title": "Asset Management", - "cardSearch": "Card Search", + "cardSearch": "IoT Card Query", "deviceSearch": "Device Search", "singleCard": "Single Card Info", - "standaloneCardList": "Standalone Card List", - "taskManagement": "Task Management", + "standaloneCardList": "IoT Card Management", + "iotCardTask": "IoT Card Tasks", + "deviceTask": "Device Tasks", "taskDetail": "Task Details", "devices": "Device Management", "deviceDetail": "Device Details", diff --git a/src/locales/langs/zh.json b/src/locales/langs/zh.json index 6430cac..559f820 100644 --- a/src/locales/langs/zh.json +++ b/src/locales/langs/zh.json @@ -406,7 +406,6 @@ "packageAssign": "单套餐分配", "seriesAssign": "套餐系列分配", "packageSeries": "套餐系列", - "myPackages": "代理可售套餐", "packageCommission": "套餐佣金网卡" }, "accountManagement": { @@ -437,11 +436,12 @@ }, "assetManagement": { "title": "资产管理", - "cardSearch": "单卡查询", + "cardSearch": "IoT卡查询", "deviceSearch": "设备查询", "singleCard": "单卡信息", - "standaloneCardList": "单卡列表", - "taskManagement": "任务管理", + "standaloneCardList": "IoT卡管理", + "iotCardTask": "IoT卡任务", + "deviceTask": "设备任务", "taskDetail": "任务详情", "devices": "设备管理", "deviceDetail": "设备详情", diff --git a/src/router/routes/asyncRoutes.ts b/src/router/routes/asyncRoutes.ts index 0b28ada..04dcd17 100644 --- a/src/router/routes/asyncRoutes.ts +++ b/src/router/routes/asyncRoutes.ts @@ -620,15 +620,15 @@ export const asyncRoutes: AppRouteRecord[] = [ icon: '' }, children: [ - { - path: 'card-detail', - name: 'CardDetail', - component: RoutesAlias.CardDetail, - meta: { - title: 'menus.cardManagement.cardDetail', - keepAlive: true - } - }, + // { + // path: 'card-detail', + // name: 'CardDetail', + // component: RoutesAlias.CardDetail, + // meta: { + // title: 'menus.cardManagement.cardDetail', + // keepAlive: true + // } + // }, { path: 'card-assign', name: 'CardAssign', @@ -721,15 +721,6 @@ export const asyncRoutes: AppRouteRecord[] = [ keepAlive: true } }, - { - path: 'my-packages', - name: 'MyPackages', - component: RoutesAlias.MyPackages, - meta: { - title: 'menus.packageManagement.myPackages', - keepAlive: true - } - }, { path: 'package-assign', name: 'PackageAssign', @@ -900,7 +891,7 @@ export const asyncRoutes: AppRouteRecord[] = [ }, children: [ { - path: 'card-search', + path: 'iot-card-query', name: 'CardSearch', component: RoutesAlias.CardSearch, meta: { @@ -918,7 +909,7 @@ export const asyncRoutes: AppRouteRecord[] = [ } }, { - path: 'card-list', + path: 'iot-card-management', name: 'StandaloneCardList', component: RoutesAlias.StandaloneCardList, meta: { @@ -927,11 +918,20 @@ export const asyncRoutes: AppRouteRecord[] = [ } }, { - path: 'task-management', - name: 'TaskManagement', - component: RoutesAlias.TaskManagement, + path: 'iot-card-task', + name: 'IotCardTask', + component: RoutesAlias.IotCardTask, meta: { - title: 'menus.assetManagement.taskManagement', + title: 'menus.assetManagement.iotCardTask', + keepAlive: true + } + }, + { + path: 'device-task', + name: 'DeviceTask', + component: RoutesAlias.DeviceTask, + meta: { + title: 'menus.assetManagement.deviceTask', keepAlive: true } }, diff --git a/src/router/routesAlias.ts b/src/router/routesAlias.ts index 9c69d28..5f28e20 100644 --- a/src/router/routesAlias.ts +++ b/src/router/routesAlias.ts @@ -72,7 +72,6 @@ export enum RoutesAlias { PackageAssign = '/package-management/package-assign', // 单套餐分配 SeriesAssign = '/package-management/series-assign', // 套餐系列分配 PackageSeries = '/package-management/package-series', // 套餐系列 - MyPackages = '/package-management/my-packages', // 代理可售套餐 PackageCommission = '/package-management/package-commission', // 套餐佣金网卡 // 账号管理 @@ -92,10 +91,11 @@ export enum RoutesAlias { SimCardAssign = '/product/sim-card-assign', // 号卡分配 // 资产管理 - CardSearch = '/asset-management/card-search', // 单卡查询 + CardSearch = '/asset-management/iot-card-query', // IoT卡查询 DeviceSearch = '/asset-management/device-search', // 设备查询 - StandaloneCardList = '/asset-management/card-list', // 单卡列表(未绑定设备) - TaskManagement = '/asset-management/task-management', // 任务管理 + StandaloneCardList = '/asset-management/iot-card-management', // IoT卡管理 + IotCardTask = '/asset-management/iot-card-task', // IoT卡任务 + DeviceTask = '/asset-management/device-task', // 设备任务 TaskDetail = '/asset-management/task-detail', // 任务详情 DeviceList = '/asset-management/device-list', // 设备列表 DeviceDetail = '/asset-management/device-detail', // 设备详情 diff --git a/src/types/api/card.ts b/src/types/api/card.ts index 40acc9b..e4fa7a8 100644 --- a/src/types/api/card.ts +++ b/src/types/api/card.ts @@ -256,8 +256,9 @@ export interface ImportIotCardResponse { export interface IotCardImportTask { id: number // 任务ID task_no: string // 任务编号 - batch_no: string // 批次号 + batch_no?: string // 批次号 (可选) carrier_id: number // 运营商ID + carrier_type: string // 运营商类型 (CMCC:中国移动, CUCC:中国联通, CTCC:中国电信) carrier_name: string // 运营商名称 file_name: string // 文件名 status: IotCardImportTaskStatus // 任务状态 @@ -266,10 +267,10 @@ export interface IotCardImportTask { success_count: number // 成功数 fail_count: number // 失败数 skip_count: number // 跳过数 - error_message: string // 错误信息 + error_message?: string // 错误信息 (可选) created_at: string // 创建时间 - started_at: string | null // 开始处理时间 - completed_at: string | null // 完成时间 + started_at?: string | null // 开始处理时间 (可选) + completed_at?: string | null // 完成时间 (可选) } // 导入任务查询参数 @@ -323,24 +324,27 @@ export interface StandaloneCardQueryParams extends PaginationParams { export interface StandaloneIotCard { id: number // 卡ID iccid: string // ICCID - imsi: string // IMSI - msisdn: string // 卡接入号 + imsi?: string // IMSI (可选) + msisdn?: string // 卡接入号 (可选) carrier_id: number // 运营商ID + carrier_type: string // 运营商类型 (CMCC:中国移动, CUCC:中国联通, CTCC:中国电信, CBN:中国广电) carrier_name: string // 运营商名称 - card_type: string // 卡类型 + card_type: string // 卡类型 (physical:物理卡, data_card:流量卡, voice_card:语音卡等) card_category: string // 卡业务类型 (normal:普通卡, industry:行业卡) status: StandaloneCardStatus // 状态 activation_status: number // 激活状态 (0:未激活, 1:已激活) network_status: number // 网络状态 (0:停机, 1:开机) real_name_status: number // 实名状态 (0:未实名, 1:已实名) - batch_no: string // 批次号 - supplier: string // 供应商 - shop_id: number | null // 店铺ID - shop_name: string // 店铺名称 + batch_no?: string // 批次号 (可选) + supplier?: string // 供应商 (可选) + shop_id?: number | null // 店铺ID (可选) + shop_name?: string // 店铺名称 (可选) cost_price: number // 成本价(分) distribute_price: number // 分销价(分) data_usage_mb: number // 累计流量使用(MB) - activated_at: string | null // 激活时间 + first_commission_paid: boolean // 是否已支付首次佣金 + accumulated_recharge: number // 累计充值金额(分) + activated_at?: string | null // 激活时间 (可选) created_at: string // 创建时间 updated_at: string // 更新时间 } diff --git a/src/types/api/packageManagement.ts b/src/types/api/packageManagement.ts index 8d862ac..87deeaf 100644 --- a/src/types/api/packageManagement.ts +++ b/src/types/api/packageManagement.ts @@ -144,58 +144,6 @@ export interface SeriesSelectOption { series_code: string } -// ==================== 代理可售套餐 ==================== - -/** - * 我的可售套餐响应 - */ -export interface MyPackageResponse { - id: number - package_code: string - package_name: string - series_id: number - series_name: string - package_type: string - data_type: string - real_data_mb: number // 真流量额度(MB) - virtual_data_mb: number // 虚流量额度(MB) - duration_months: number - price: number // 套餐原价(分) - cost_price: number // 成本价(分) - suggested_retail_price: number // 建议售价(分) - profit_margin: number // 利润空间(分) - price_source: string // 价格来源:'series_pricing':系列加价, 'package_override':单套餐覆盖 - shelf_status: number - status: number - description?: string - created_at: string - updated_at: string -} - -/** - * 我的可售套餐查询参数 - */ -export interface MyPackageQueryParams extends PaginationParams { - series_id?: number // 系列ID筛选 - package_type?: string // 套餐类型筛选 -} - -/** - * 我的被分配系列响应 - */ -export interface MySeriesAllocationResponse { - id: number // 分配ID - series_id: number - series_code: string - series_name: string - pricing_mode: string // 定价模式:'fixed':固定金额, 'percent':百分比 - pricing_value: number // 定价值 - allocator_shop_name: string // 分配者店铺名称 - package_count: number // 可售套餐数量 - status: number - created_at: string -} - // ==================== 单套餐分配 ==================== /** @@ -276,6 +224,28 @@ export interface TierCommissionConfig { tiers: TierEntry[] // 梯度档位数组 } +/** + * 一次性佣金梯度档位配置 + */ +export interface OneTimeCommissionTierEntry { + tier_type: 'sales_count' | 'sales_amount' // 梯度类型:销量或销售额 + threshold: number // 阈值 + mode: 'fixed' | 'percent' // 返佣模式 + value: number // 返佣值 +} + +/** + * 一次性佣金配置 + */ +export interface OneTimeCommissionConfig { + type: 'fixed' | 'tiered' // 佣金类型:'fixed':固定佣金, 'tiered':梯度佣金 + trigger: 'single_recharge' | 'accumulated_recharge' // 触发方式:'single_recharge':单笔充值, 'accumulated_recharge':累计充值 + threshold: number // 最低阈值(分) + mode?: 'fixed' | 'percent' // 返佣模式(固定佣金时必填) + value?: number // 返佣值(固定佣金时必填) + tiers?: OneTimeCommissionTierEntry[] | null // 梯度档位数组(梯度佣金时必填) +} + /** * 套餐系列分配响应 */ @@ -288,8 +258,8 @@ export interface ShopSeriesAllocationResponse { allocator_shop_id: number // 分配者店铺ID allocator_shop_name: string // 分配者店铺名称 base_commission: BaseCommissionConfig // 基础返佣配置 - enable_tier_commission: boolean // 是否启用梯度返佣 - tier_config?: TierCommissionConfig // 梯度返佣配置(可选) + enable_one_time_commission: boolean // 是否启用一次性佣金 + one_time_commission_config?: OneTimeCommissionConfig // 一次性佣金配置(可选) status: number // 1:启用, 2:禁用 created_at: string updated_at: string @@ -311,8 +281,8 @@ export interface CreateShopSeriesAllocationRequest { series_id: number // 套餐系列ID,必填 shop_id: number // 店铺ID,必填 base_commission: BaseCommissionConfig // 基础返佣配置,必填 - enable_tier_commission?: boolean // 是否启用梯度返佣,可选(默认false) - tier_config?: TierCommissionConfig // 梯度返佣配置,当enable_tier_commission为true时必填 + enable_one_time_commission?: boolean // 是否启用一次性佣金,可选(默认false) + one_time_commission_config?: OneTimeCommissionConfig // 一次性佣金配置,当enable_one_time_commission为true时必填 } /** @@ -320,8 +290,8 @@ export interface CreateShopSeriesAllocationRequest { */ export interface UpdateShopSeriesAllocationRequest { base_commission?: BaseCommissionConfig // 基础返佣配置 - enable_tier_commission?: boolean // 是否启用梯度返佣 - tier_config?: TierCommissionConfig // 梯度返佣配置 + enable_one_time_commission?: boolean // 是否启用一次性佣金 + one_time_commission_config?: OneTimeCommissionConfig // 一次性佣金配置 } /** diff --git a/src/views/asset-management/device-task/index.vue b/src/views/asset-management/device-task/index.vue new file mode 100644 index 0000000..60f054a --- /dev/null +++ b/src/views/asset-management/device-task/index.vue @@ -0,0 +1,310 @@ + + + + + diff --git a/src/views/asset-management/card-list/index.vue b/src/views/asset-management/iot-card-management/index.vue similarity index 90% rename from src/views/asset-management/card-list/index.vue rename to src/views/asset-management/iot-card-management/index.vue index 0e6f998..67b113f 100644 --- a/src/views/asset-management/card-list/index.vue +++ b/src/views/asset-management/iot-card-management/index.vue @@ -28,6 +28,11 @@ 批量设置套餐系列 + 网卡分销 + 批量充值 + 网卡回收 + 批量下载 + 变更套餐 @@ -404,15 +409,10 @@ const initialSearchState = { status: undefined, carrier_id: undefined, - shop_id: undefined, iccid: '', msisdn: '', batch_no: '', - package_id: undefined, - is_distributed: undefined, - is_replaced: undefined, - iccid_start: '', - iccid_end: '' + is_distributed: undefined } // 搜索表单 @@ -603,14 +603,19 @@ // 列配置 const columnOptions = [ { label: 'ICCID', prop: 'iccid' }, - { label: 'IMSI', prop: 'imsi' }, { label: '卡接入号', prop: 'msisdn' }, - { label: '运营商', prop: 'carrier_name' }, { label: '卡类型', prop: 'card_type' }, + { label: '卡业务类型', prop: 'card_category' }, + { label: '运营商', prop: 'carrier_name' }, + { label: '成本价', prop: 'cost_price' }, + { label: '分销价', prop: 'distribute_price' }, { label: '状态', prop: 'status' }, - { label: '批次号', prop: 'batch_no' }, - { label: '店铺名称', prop: 'shop_name' }, - { label: '激活时间', prop: 'activated_at' }, + { label: '激活状态', prop: 'activation_status' }, + { label: '网络状态', prop: 'network_status' }, + { label: '实名状态', prop: 'real_name_status' }, + { label: '累计流量(MB)', prop: 'data_usage_mb' }, + { label: '首次佣金', prop: 'first_commission_paid' }, + { label: '累计充值', prop: 'accumulated_recharge' }, { label: '创建时间', prop: 'created_at' } ] @@ -653,28 +658,40 @@ { prop: 'iccid', label: 'ICCID', - minWidth: 180 - }, - { - prop: 'imsi', - label: 'IMSI', - width: 150 + minWidth: 190 }, { prop: 'msisdn', label: '卡接入号', - width: 120 - }, - { - prop: 'carrier_name', - label: '运营商', - width: 100 + width: 130 }, { prop: 'card_type', label: '卡类型', width: 100 }, + { + prop: 'card_category', + label: '卡业务类型', + width: 100 + }, + { + prop: 'carrier_name', + label: '运营商', + width: 150 + }, + { + prop: 'cost_price', + label: '成本价', + width: 100, + formatter: (row: StandaloneIotCard) => `¥${(row.cost_price / 100).toFixed(2)}` + }, + { + prop: 'distribute_price', + label: '分销价', + width: 100, + formatter: (row: StandaloneIotCard) => `¥${(row.distribute_price / 100).toFixed(2)}` + }, { prop: 'status', label: '状态', @@ -684,20 +701,55 @@ } }, { - prop: 'batch_no', - label: '批次号', + prop: 'activation_status', + label: '激活状态', + width: 100, + formatter: (row: StandaloneIotCard) => { + const type = row.activation_status === 1 ? 'success' : 'info' + const text = row.activation_status === 1 ? '已激活' : '未激活' + return h(ElTag, { type }, () => text) + } + }, + { + prop: 'network_status', + label: '网络状态', + width: 100, + formatter: (row: StandaloneIotCard) => { + const type = row.network_status === 1 ? 'success' : 'danger' + const text = row.network_status === 1 ? '开机' : '停机' + return h(ElTag, { type }, () => text) + } + }, + { + prop: 'real_name_status', + label: '实名状态', + width: 100, + formatter: (row: StandaloneIotCard) => { + const type = row.real_name_status === 1 ? 'success' : 'warning' + const text = row.real_name_status === 1 ? '已实名' : '未实名' + return h(ElTag, { type }, () => text) + } + }, + { + prop: 'data_usage_mb', + label: '累计流量(MB)', width: 120 }, { - prop: 'shop_name', - label: '店铺名称', - width: 150 + prop: 'first_commission_paid', + label: '首次佣金', + width: 100, + formatter: (row: StandaloneIotCard) => { + const type = row.first_commission_paid ? 'success' : 'info' + const text = row.first_commission_paid ? '已支付' : '未支付' + return h(ElTag, { type, size: 'small' }, () => text) + } }, { - prop: 'activated_at', - label: '激活时间', - width: 160, - formatter: (row: StandaloneIotCard) => (row.activated_at ? formatDateTime(row.activated_at) : '-') + prop: 'accumulated_recharge', + label: '累计充值', + width: 100, + formatter: (row: StandaloneIotCard) => `¥${(row.accumulated_recharge / 100).toFixed(2)}` }, { prop: 'created_at', @@ -729,7 +781,7 @@ const res = await CardService.getStandaloneIotCards(params) if (res.code === 0) { - cardList.value = res.data.list || [] + cardList.value = res.data.items || [] pagination.total = res.data.total || 0 } } catch (error) { @@ -1127,6 +1179,31 @@ } }) } + + // 网卡分销 - 正在开发中 + const cardDistribution = () => { + ElMessage.info('功能正在开发中') + } + + // 批量充值 - 正在开发中 + const batchRecharge = () => { + ElMessage.info('功能正在开发中') + } + + // 网卡回收 - 正在开发中 + const cardRecycle = () => { + ElMessage.info('功能正在开发中') + } + + // 批量下载 - 正在开发中 + const batchDownload = () => { + ElMessage.info('功能正在开发中') + } + + // 变更套餐 - 正在开发中 + const changePackage = () => { + ElMessage.info('功能正在开发中') + } diff --git a/src/views/dashboard/analysis/index.vue b/src/views/dashboard/analysis/index.vue index f14bca4..bac095c 100644 --- a/src/views/dashboard/analysis/index.vue +++ b/src/views/dashboard/analysis/index.vue @@ -1,37 +1,38 @@ diff --git a/src/views/dashboard/console/index.vue b/src/views/dashboard/console/index.vue index a2e8784..d9d44a8 100644 --- a/src/views/dashboard/console/index.vue +++ b/src/views/dashboard/console/index.vue @@ -1,29 +1,30 @@ diff --git a/src/views/dashboard/ecommerce/index.vue b/src/views/dashboard/ecommerce/index.vue index ec22e04..3fde32a 100644 --- a/src/views/dashboard/ecommerce/index.vue +++ b/src/views/dashboard/ecommerce/index.vue @@ -1,59 +1,60 @@ diff --git a/src/views/package-management/my-packages/index.vue b/src/views/package-management/my-packages/index.vue deleted file mode 100644 index e0b7d9b..0000000 --- a/src/views/package-management/my-packages/index.vue +++ /dev/null @@ -1,382 +0,0 @@ - - - - - diff --git a/src/views/package-management/package-assign/index.vue b/src/views/package-management/package-assign/index.vue index a6d4344..25fef19 100644 --- a/src/views/package-management/package-assign/index.vue +++ b/src/views/package-management/package-assign/index.vue @@ -97,6 +97,7 @@ :remote-method="searchPackage" :loading="packageLoading" clearable + @change="handlePackageChange" > ({ package_id: [{ required: true, message: '请选择套餐', trigger: 'change' }], shop_id: [{ required: true, message: '请选择店铺', trigger: 'change' }], - cost_price: [{ required: true, message: '请输入成本价', trigger: 'blur' }] + cost_price: [ + { required: true, message: '请输入成本价', trigger: 'blur' }, + { + validator: (rule: any, value: any, callback: any) => { + if (value === undefined || value === null || value === '') { + callback(new Error('请输入成本价')) + } else if (form.package_base_price && value < form.package_base_price) { + callback(new Error(`成本价不能低于套餐价格 ¥${(form.package_base_price / 100).toFixed(2)}`)) + } else { + callback() + } + }, + trigger: 'blur' + } + ] }) // 表单数据 @@ -281,7 +296,8 @@ id: 0, package_id: undefined, shop_id: undefined, - cost_price: 0 + cost_price: 0, + package_base_price: 0 // 存储选中套餐的成本价,用于验证 }) // 成本价表单验证规则 @@ -589,11 +605,13 @@ form.package_id = row.package_id form.shop_id = row.shop_id form.cost_price = row.cost_price + form.package_base_price = 0 } else { form.id = 0 form.package_id = undefined form.shop_id = undefined form.cost_price = 0 + form.package_base_price = 0 } // 重置表单验证状态 @@ -602,6 +620,23 @@ }) } + // 处理套餐选择变化 + const handlePackageChange = (packageId: number | undefined) => { + if (packageId) { + // 从套餐选项中找到选中的套餐 + const selectedPackage = packageOptions.value.find(pkg => pkg.id === packageId) + if (selectedPackage) { + // 将套餐的价格设置为成本价 + form.cost_price = selectedPackage.price + form.package_base_price = selectedPackage.price + } + } else { + // 清空时重置成本价 + form.cost_price = 0 + form.package_base_price = 0 + } + } + // 处理弹窗关闭事件 const handleDialogClosed = () => { // 清除表单验证状态 @@ -611,6 +646,7 @@ form.package_id = undefined form.shop_id = undefined form.cost_price = 0 + form.package_base_price = 0 } // 删除分配 diff --git a/src/views/package-management/series-assign/index.vue b/src/views/package-management/series-assign/index.vue index 410da4d..2b61e67 100644 --- a/src/views/package-management/series-assign/index.vue +++ b/src/views/package-management/series-assign/index.vue @@ -69,6 +69,20 @@ /> +
+
+ 系列名称: + {{ form.series_name || '-' }} +
+
+ 店铺名称: + {{ form.shop_name || '-' }} +
+
+ 分配者店铺: + {{ form.allocator_shop_name || '-' }} +
+
- - 梯度返佣设置(可选) - - + + 一次性佣金设置(可选) + + -