From dccad819cfb23e262e8d5f7a2fee95ac0807bfb9 Mon Sep 17 00:00:00 2001 From: sexygoat <1538832180@qq.com> Date: Wed, 25 Feb 2026 16:14:38 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=B7=A5=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/locales/langs/zh.json | 2 +- src/router/routes/asyncRoutes.ts | 309 +++++---- .../account-management/account/index.vue | 113 ++-- .../authorization-records/index.vue | 30 +- .../iot-card-management/index.vue | 26 - .../card-management/single-card/index.vue | 239 +++++-- src/views/common/account-list.vue | 639 ++++++++++++++++-- .../commission/agent-commission/index.vue | 2 +- src/views/my-simcard/single-card/index.vue | 315 ++++++++- .../order-management/order-list/index.vue | 14 +- .../package-assign/detail.vue | 212 +++--- .../package-assign/index.vue | 19 +- .../package-list/detail.vue | 409 +++++------ .../package-management/package-list/index.vue | 20 +- .../package-series/detail.vue | 444 ++++++------ .../package-series/index.vue | 16 +- .../series-assign/detail.vue | 322 +++++---- .../series-assign/index.vue | 15 +- src/views/product/shop/index.vue | 169 +++-- src/views/system/role/index.vue | 77 ++- 20 files changed, 2163 insertions(+), 1229 deletions(-) diff --git a/src/locales/langs/zh.json b/src/locales/langs/zh.json index 53d5599..79856e5 100644 --- a/src/locales/langs/zh.json +++ b/src/locales/langs/zh.json @@ -422,7 +422,7 @@ "agent": "代理商管理", "customerAccount": "客户账号", "enterpriseCustomer": "企业客户", - "enterpriseCustomerAccounts": "客户账号列表", + "enterpriseCustomerAccounts": "关联账号列表", "enterpriseCards": "企业卡管理", "customerCommission": "客户账号佣金" }, diff --git a/src/router/routes/asyncRoutes.ts b/src/router/routes/asyncRoutes.ts index 9b1e638..bddc38e 100644 --- a/src/router/routes/asyncRoutes.ts +++ b/src/router/routes/asyncRoutes.ts @@ -296,6 +296,15 @@ export const asyncRoutes: AppRouteRecord[] = [ roles: ['R_SUPER'] } }, + { + path: 'carrier-management', + name: 'CarrierManagement', + component: RoutesAlias.CarrierManagement, + meta: { + title: 'menus.account.carrierManagement', + keepAlive: true + } + }, { path: 'user-center', name: 'UserCenter', @@ -611,98 +620,98 @@ export const asyncRoutes: AppRouteRecord[] = [ // } // }, // 物联网卡管理系统模块 - { - path: '/card-management', - name: 'CardManagement', - component: RoutesAlias.Home, - meta: { - title: 'menus.cardManagement.title', - icon: '' - }, - children: [ - // { - // path: 'card-detail', - // name: 'CardDetail', - // component: RoutesAlias.CardDetail, - // meta: { - // title: 'menus.cardManagement.cardDetail', - // keepAlive: true - // } - // }, - { - path: 'single-card', - name: 'SingleCard', - component: RoutesAlias.SingleCard, - meta: { - title: 'menus.cardManagement.singleCard', - keepAlive: true - } - }, - // { - // path: 'card-assign', - // name: 'CardAssign', - // component: RoutesAlias.CardAssign, - // meta: { - // title: 'menus.cardManagement.cardAssign', - // keepAlive: true - // } - // }, - // { - // path: 'card-shutdown', - // name: 'CardShutdown', - // component: RoutesAlias.CardShutdown, - // meta: { - // title: 'menus.cardManagement.cardShutdown', - // keepAlive: true - // } - // }, - // { - // path: 'my-cards', - // name: 'MyCards', - // component: RoutesAlias.MyCards, - // meta: { - // title: 'menus.cardManagement.myCards', - // keepAlive: true - // } - // }, - // { - // path: 'card-transfer', - // name: 'CardTransfer', - // component: RoutesAlias.CardTransfer, - // meta: { - // title: 'menus.cardManagement.cardTransfer', - // keepAlive: true - // } - // }, - // { - // path: 'card-replacement', - // name: 'CardReplacement', - // component: RoutesAlias.CardReplacement, - // meta: { - // title: 'menus.cardManagement.cardReplacement', - // keepAlive: true - // } - // }, - // { - // path: 'package-gift', - // name: 'PackageGift', - // component: RoutesAlias.PackageGift, - // meta: { - // title: 'menus.cardManagement.packageGift', - // keepAlive: true - // } - // }, - // { - // path: 'card-change-card', - // name: 'CardChangeCard', - // component: RoutesAlias.CardChangeCard, - // meta: { - // title: 'menus.cardManagement.cardChange', - // keepAlive: true - // } - // } - ] - }, + // { + // path: '/card-management', + // name: 'CardManagement', + // component: RoutesAlias.Home, + // meta: { + // title: 'menus.cardManagement.title', + // icon: '' + // }, + // children: [ + // { + // path: 'card-detail', + // name: 'CardDetail', + // component: RoutesAlias.CardDetail, + // meta: { + // title: 'menus.cardManagement.cardDetail', + // keepAlive: true + // } + // }, + // { + // path: 'single-card', + // name: 'SingleCard', + // component: RoutesAlias.SingleCard, + // meta: { + // title: 'menus.cardManagement.singleCard', + // keepAlive: true + // } + // }, + // { + // path: 'card-assign', + // name: 'CardAssign', + // component: RoutesAlias.CardAssign, + // meta: { + // title: 'menus.cardManagement.cardAssign', + // keepAlive: true + // } + // }, + // { + // path: 'card-shutdown', + // name: 'CardShutdown', + // component: RoutesAlias.CardShutdown, + // meta: { + // title: 'menus.cardManagement.cardShutdown', + // keepAlive: true + // } + // }, + // { + // path: 'my-cards', + // name: 'MyCards', + // component: RoutesAlias.MyCards, + // meta: { + // title: 'menus.cardManagement.myCards', + // keepAlive: true + // } + // }, + // { + // path: 'card-transfer', + // name: 'CardTransfer', + // component: RoutesAlias.CardTransfer, + // meta: { + // title: 'menus.cardManagement.cardTransfer', + // keepAlive: true + // } + // }, + // { + // path: 'card-replacement', + // name: 'CardReplacement', + // component: RoutesAlias.CardReplacement, + // meta: { + // title: 'menus.cardManagement.cardReplacement', + // keepAlive: true + // } + // }, + // { + // path: 'package-gift', + // name: 'PackageGift', + // component: RoutesAlias.PackageGift, + // meta: { + // title: 'menus.cardManagement.packageGift', + // keepAlive: true + // } + // }, + // { + // path: 'card-change-card', + // name: 'CardChangeCard', + // component: RoutesAlias.CardChangeCard, + // meta: { + // title: 'menus.cardManagement.cardChange', + // keepAlive: true + // } + // } + // ] + // }, { path: '/package-management', name: 'PackageManagement', @@ -969,6 +978,15 @@ export const asyncRoutes: AppRouteRecord[] = [ icon: '' }, children: [ + { + path: 'single-card', + name: 'SingleCard', + component: RoutesAlias.SingleCard, + meta: { + title: 'menus.cardManagement.singleCard', + keepAlive: true + } + }, { path: 'iot-card-management', name: 'StandaloneCardList', @@ -1072,15 +1090,6 @@ export const asyncRoutes: AppRouteRecord[] = [ // keepAlive: true // } // }, - { - path: 'carrier-management', - name: 'CarrierManagement', - component: RoutesAlias.CarrierManagement, - meta: { - title: 'menus.account.carrierManagement', - keepAlive: true - } - }, { path: 'orders', name: 'OrderManagement', @@ -1089,7 +1098,7 @@ export const asyncRoutes: AppRouteRecord[] = [ title: 'menus.account.orders', keepAlive: true } - }, + } // { // path: 'my-account', // name: 'MyAccount', @@ -1099,56 +1108,56 @@ export const asyncRoutes: AppRouteRecord[] = [ // keepAlive: true // } // } + ] + }, + { + path: '/commission', + name: 'CommissionManagement', + component: RoutesAlias.Home, + meta: { + title: 'menus.commission.menu.management', + icon: '' + }, + children: [ { - path: 'commission', - name: 'CommissionManagement', - component: '', + path: 'withdrawal-approval', + name: 'WithdrawalApproval', + component: RoutesAlias.WithdrawalApproval, meta: { - title: 'menus.commission.menu.management', - icon: '' - }, - children: [ - { - path: 'withdrawal-approval', - name: 'WithdrawalApproval', - component: RoutesAlias.WithdrawalApproval, - meta: { - title: 'menus.commission.menu.withdrawal', - keepAlive: true, - roles: ['R_SUPER', 'R_ADMIN'] - } - }, - { - path: 'withdrawal-settings', - name: 'CommissionWithdrawalSettings', - component: RoutesAlias.CommissionWithdrawalSettings, - meta: { - title: 'menus.commission.menu.withdrawalSettings', - keepAlive: true, - roles: ['R_SUPER', 'R_ADMIN'] - } - }, - { - path: 'my-commission', - name: 'MyCommission', - component: RoutesAlias.MyCommission, - meta: { - title: 'menus.commission.menu.myCommission', - keepAlive: true, - roles: ['R_AGENT'] - } - }, - { - path: 'agent-commission', - name: 'AgentCommission', - component: RoutesAlias.AgentCommission, - meta: { - title: 'menus.commission.menu.agentCommission', - keepAlive: true, - roles: ['R_SUPER', 'R_ADMIN'] - } - } - ] + title: 'menus.commission.menu.withdrawal', + keepAlive: true, + roles: ['R_SUPER', 'R_ADMIN'] + } + }, + { + path: 'withdrawal-settings', + name: 'CommissionWithdrawalSettings', + component: RoutesAlias.CommissionWithdrawalSettings, + meta: { + title: 'menus.commission.menu.withdrawalSettings', + keepAlive: true, + roles: ['R_SUPER', 'R_ADMIN'] + } + }, + { + path: 'my-commission', + name: 'MyCommission', + component: RoutesAlias.MyCommission, + meta: { + title: 'menus.commission.menu.myCommission', + keepAlive: true, + roles: ['R_AGENT'] + } + }, + { + path: 'agent-commission', + name: 'AgentCommission', + component: RoutesAlias.AgentCommission, + meta: { + title: 'menus.commission.menu.agentCommission', + keepAlive: true, + roles: ['R_SUPER', 'R_ADMIN'] + } } ] } diff --git a/src/views/account-management/account/index.vue b/src/views/account-management/account/index.vue index 7ef516c..a2f9795 100644 --- a/src/views/account-management/account/index.vue +++ b/src/views/account-management/account/index.vue @@ -68,44 +68,6 @@ > - - - - - - - - - - - - @@ -124,6 +86,9 @@ 分配角色 @@ -142,18 +107,11 @@
-
+
{{ role.role_name }} - + {{ role.role_type === 1 ? '平台角色' : '客户角色' }} @@ -196,19 +154,11 @@ > {{ role.role_name }} - + {{ role.role_type === 1 ? '平台角色' : '客户角色' }} - + 移除
@@ -256,6 +206,7 @@ const roleSubmitLoading = ref(false) const currentAccountId = ref(0) const currentAccountName = ref('') + const currentAccountType = ref(0) const selectedRoles = ref([]) const allRoles = ref([]) const rolesToAdd = ref([]) @@ -517,7 +468,7 @@ { prop: 'operation', label: '操作', - width: 200, + width: 240, fixed: 'right', formatter: (row: any) => { const buttons = [] @@ -525,7 +476,7 @@ if (hasAuth('account:patch_role')) { buttons.push( h(ArtButtonTable, { - icon: '', + text: '分配角色', onClick: () => showRoleDialog(row) }) ) @@ -534,7 +485,7 @@ if (hasAuth('account:edit')) { buttons.push( h(ArtButtonTable, { - type: 'edit', + text: '编辑', onClick: () => showDialog('edit', row) }) ) @@ -543,7 +494,7 @@ if (hasAuth('account:delete')) { buttons.push( h(ArtButtonTable, { - type: 'delete', + text: '删除', onClick: () => deleteAccount(row) }) ) @@ -593,11 +544,23 @@ } } - // 计算属性:过滤后的可分配角色 + // 计算属性:过滤后的可分配角色(根据账号类型过滤) const filteredAvailableRoles = computed(() => { - if (!leftRoleFilter.value) return allRoles.value + let roles = allRoles.value + + // 根据账号类型过滤角色 + if (currentAccountType.value === 3) { + // 代理账号:只显示客户角色 + roles = roles.filter((role) => role.role_type === 2) + } else if (currentAccountType.value === 2) { + // 平台用户:只显示平台角色 + roles = roles.filter((role) => role.role_type === 1) + } + + // 根据搜索关键词过滤 + if (!leftRoleFilter.value) return roles const keyword = leftRoleFilter.value.toLowerCase() - return allRoles.value.filter((role) => role.role_name.toLowerCase().includes(keyword)) + return roles.filter((role) => role.role_name.toLowerCase().includes(keyword)) }) // 计算属性:过滤后的已分配角色 @@ -612,6 +575,7 @@ const showRoleDialog = async (row: any) => { currentAccountId.value = row.id currentAccountName.value = row.username + currentAccountType.value = row.user_type selectedRoles.value = [] rolesToAdd.value = [] leftRoleFilter.value = '' @@ -641,18 +605,31 @@ if (rolesToAdd.value.length === 0) return try { - // 将选中的角色添加到已分配列表 - const newRoles = [...new Set([...selectedRoles.value, ...rolesToAdd.value])] + let newRoles: number[] + + // 代理账号只能分配一个角色,会覆盖之前的角色 + if (currentAccountType.value === 3) { + if (rolesToAdd.value.length > 1) { + ElMessage.warning('代理账号只能分配一个角色') + return + } + // 只保留新选择的一个角色 + newRoles = rolesToAdd.value + } else { + // 其他账号类型可以分配多个角色 + newRoles = [...new Set([...selectedRoles.value, ...rolesToAdd.value])] + } + await AccountService.assignRolesToAccount(currentAccountId.value, newRoles) selectedRoles.value = newRoles rolesToAdd.value = [] - ElMessage.success('角色添加成功') + ElMessage.success('角色分配成功') // 刷新列表以更新角色显示 await getAccountList() } catch (error) { - console.error('添加角色失败:', error) + console.error('分配角色失败:', error) } } diff --git a/src/views/asset-management/authorization-records/index.vue b/src/views/asset-management/authorization-records/index.vue index 5c822f2..6be682d 100644 --- a/src/views/asset-management/authorization-records/index.vue +++ b/src/views/asset-management/authorization-records/index.vue @@ -39,25 +39,39 @@ - {{ currentRecord.enterprise_id }} - {{ currentRecord.enterprise_name }} + {{ + currentRecord.enterprise_id + }} + {{ + currentRecord.enterprise_name + }} {{ currentRecord.card_id }} {{ currentRecord.iccid }} - {{ currentRecord.msisdn || '--' }} - {{ currentRecord.authorized_by }} - {{ currentRecord.authorizer_name }} + {{ + currentRecord.msisdn || '--' + }} + {{ + currentRecord.authorized_by + }} + {{ + currentRecord.authorizer_name + }} {{ getAuthorizerTypeText(currentRecord.authorizer_type) }} - {{ formatDateTime(currentRecord.authorized_at) }} + {{ + formatDateTime(currentRecord.authorized_at) + }} {{ getStatusText(currentRecord.status) }} - {{ currentRecord.remark || '--' }} + {{ + currentRecord.remark || '--' + }} - - + +
-
-
- {{ role.role_name }} - - {{ role.role_type === 1 ? '平台角色' : '客户角色' }} - -
- - 已添加 - +
+ {{ role.role_name }} + 客户角色
-
- 支持多选,已添加的角色将显示为禁用状态 +
+ 只能选择一个客户角色,设置后将覆盖之前的默认角色