diff --git a/src/types/api.ts b/src/types/api.ts index c4c1eb6..6a68730 100644 --- a/src/types/api.ts +++ b/src/types/api.ts @@ -21,6 +21,12 @@ export interface PagedData { page: number /** 每页大小 */ pageSize: number + /** + * 去重用户数(仅请求带 WithUserCount=1 时后端才返回) + * + * 员工卡片标题「角色数:x/用户数:y」用:total 是角色(关系)条数,本字段是去重用户数。 + */ + user_count?: number } /** statusMap 单个状态的渲染配置 */ diff --git a/src/views/company/CompanyDetail.vue b/src/views/company/CompanyDetail.vue index 6bfd9c1..39bb54a 100644 --- a/src/views/company/CompanyDetail.vue +++ b/src/views/company/CompanyDetail.vue @@ -70,6 +70,10 @@ const resolvedNames = ref>>({}) /** 从路由 query 读取公司 UUID(computed 响应式:同一 tab 复用且 query 变化时自动更新) */ const companyUUID = computed(() => (route.query.CompanyUUID as string) || '') +// 员工计数(卡片标题「角色数:x/用户数:y」) +// 角色数 = 用户-角色关系条数;用户数 = 去重用户数(同一人挂多个角色只算一个) +const empCounts = ref<{ roles: number; users: number }>({ roles: 0, users: 0 }) + /** 公司主键字段名 */ const PK_FIELD = 'CompanyUUID' @@ -150,6 +154,8 @@ async function loadCompany(): Promise { } companyData.value = data setPageTitle(asStr(data.CompanyName) || '公司详情') + // 员工计数与子表同源(同样的 CompanyUUID 过滤),随主数据一起刷新 + void loadEmpCounts() // 解析 ParentCompanyUUID(Company 表)与 TenantUUID(Tenant 表) const uuidMap: Record = {} @@ -169,6 +175,33 @@ async function loadCompany(): Promise { } } +/** + * 加载「员工(角色数:x/用户数:y)」 + * + * 计数必须与子表同源(同样的 CompanyUUID 过滤条件),所以复用 List 接口: + * 只要 1 行数据,靠 total 拿角色数、user_count 拿去重用户数(后端按 WithUserCount 现算)。 + */ +async function loadEmpCounts(): Promise { + if (!companyUUID.value) return + try { + const result = await formApi.list('UserRole', { + CompanyUUID: companyUUID.value, + WithUserCount: 1, + pageSize: 1, + }) + const paged = result as unknown as { total?: number; user_count?: number } + empCounts.value = { roles: paged?.total ?? 0, users: paged?.user_count ?? 0 } + } catch { + // 计数失败不影响页面主体(错误提示已由响应拦截器统一处理) + } +} + +/** 刷新员工子表 + 计数(计数与子表同源,必须一起更新) */ +function refreshEmployees(): void { + empTableRef.value?.refresh?.() + void loadEmpCounts() +} + // ===== 子表行跳转(onView)===== /** 跳转部门详情 */ function goDeptDetail(row: RowData): void { @@ -475,7 +508,7 @@ watch(companyUUID, () => { { pk-field="UserRoleUUID" :on-view="goEmployeeDetail" > -