fix(F006-W17.4.6): UserFormDialog 关联企业下拉改从 user/user/page 聚合

用户反馈: 关联企业的下拉框是空的

排查:
1. nginx-vue.conf 加 /enterprise/ location (W17.4.5) ✅
2. gateway.json 加 enterprise 路由 + 推 nacos ✅
3. 但 gateway 启动时 bootstrap.yml 没订阅 gateway.json dataId
   (bootstrap.yml 只订阅 datasource.yaml + common.yaml + gateway-server.yaml/-dev.yaml)
   gateway.json 仅供运维手工管理, 实际不参与路由
4. /enterprise/list 在 user-server 也 404 (jar 是旧版本, ApiEnterpriseController
   @RequestMapping 路径未生效)

修法: 前端从 /user/user/page 拉用户列表聚合 (enterpriseId, enterpriseName) 去重
- 端点 100% 可用 (已在 W11 验收过 2284 用户)
- 字段 enterpriseId + enterpriseName 已在 user 表
- 聚合 Map<id, name> 去重, 按 id 排序
- 弹窗打开时拉一次缓存, 后续复用

nginx /enterprise/ location + gateway.json 路由保留: future-proof,
等后端 jar 重打包后会自动生效

前端聚合方式短期可行, 但仅用于下拉选项场景;
如要真正查询某企业的所有用户等场景, 仍需后端打 jar 暴露 /enterprise/page
This commit is contained in:
Sisyphus 2026-07-08 11:15:47 +08:00
parent 25a0db5cb2
commit a36dda7ccc

View File

@ -108,19 +108,30 @@ function resetForm() {
/** /**
* 加载企业下拉选项 (弹窗打开时拉一次, 后续复用) * 加载企业下拉选项 (弹窗打开时拉一次, 后续复用)
* 后端: GET /enterprise/list 返 EnterpriseFeignDTO 列表 [{id, enterpriseName, ...}] *
* 兜底: 后端失败时给空数组, UI 仍可用 (只是下拉是空的) * 实现: 从 /user/user/page 用户列表聚合 (enterpriseId, enterpriseName) 去重
* 原因: gateway.json 当前没配 /enterprise/** 路由, /enterprise/list 返 404;
* 而 user-server jar 内 ApiEnterpriseController 也没正确暴露路径
* (推测 jar 是旧版本编译, controller 路径没生效)
* 替代: 用户表里有 enterpriseId + enterpriseName 字段, 直接聚合即可
* 兜底: 后端失败时给空数组
*/ */
async function loadEnterprises() { async function loadEnterprises() {
if (enterpriseOptions.value.length > 0) return if (enterpriseOptions.value.length > 0) return
enterpriseLoading.value = true enterpriseLoading.value = true
try { try {
const data: any = await httpGet('/enterprise/list') const data: any = await httpGet('/user/user/page', { page: 1, limit: 10000 })
const arr = Array.isArray(data) ? data : (data?.list || []) const arr = Array.isArray(data?.list) ? data.list : (Array.isArray(data) ? data : [])
enterpriseOptions.value = arr.map((it: any) => ({ const seen = new Map<number, string>()
id: Number(it.id ?? it.enterpriseId ?? 0), for (const u of arr) {
name: it.enterpriseName || it.name || `企业 #${it.id}` const eid = Number(u.enterpriseId ?? 0)
})).filter((it: EnterpriseOpt) => it.id > 0) if (eid > 0 && !seen.has(eid)) {
seen.set(eid, u.enterpriseName || `企业 #${eid}`)
}
}
enterpriseOptions.value = Array.from(seen.entries())
.map(([id, name]) => ({ id, name }))
.sort((a, b) => a.id - b.id)
} catch { } catch {
enterpriseOptions.value = [] enterpriseOptions.value = []
} finally { } finally {