diff --git a/backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/service/AihrPracticeSeedService.java b/backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/service/AihrPracticeSeedService.java index dd9d831b..ed215589 100644 --- a/backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/service/AihrPracticeSeedService.java +++ b/backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/service/AihrPracticeSeedService.java @@ -171,7 +171,7 @@ public class AihrPracticeSeedService { SELECT (SELECT COUNT(*) FROM aihr_practice_scenario s JOIN pilot_params p ON p.tenant_id = s.tenant_id WHERE s.position = '生活顾问' AND s.enabled = 1) AS scenario_count, - (SELECT COUNT(DISTINCT ext_party_id) FROM safe_org) AS org_login_count, + (SELECT COUNT(DISTINCT ext_party_id) FROM safe_org) AS org_identity_count, (SELECT COUNT(*) FROM pilot_org) AS pilot_people, (SELECT COUNT(DISTINCT o.project_code) FROM pilot_org po JOIN safe_org o ON o.ext_party_id = po.ext_party_id WHERE o.project_code IS NOT NULL AND o.project_code <> '') AS pilot_projects, @@ -1135,7 +1135,7 @@ public class AihrPracticeSeedService { try { metrics = jdbcTemplate.queryForObject(PILOT_METRICS_SQL, (rs, rowNum) -> new PilotReportMetrics( rs.getInt("scenario_count"), - rs.getInt("org_login_count"), + rs.getInt("org_identity_count"), rs.getInt("pilot_people"), rs.getInt("pilot_projects"), rs.getInt("training_count"), @@ -1159,7 +1159,7 @@ public class AihrPracticeSeedService { startDate.atStartOfDay(), endDate.plusDays(1).atStartOfDay()); int pilotPeople = metrics.pilotPeople(); int completedPeople = metrics.completedPeople(); - boolean scopeReady = metrics.orgLoginCount() >= 20 + boolean scopeReady = metrics.orgIdentityCount() >= 20 && pilotPeople >= 20 && metrics.pilotProjects() >= 1 && metrics.pilotProjects() <= 2; @@ -1175,7 +1175,7 @@ public class AihrPracticeSeedService { appendCsvRow(csv, "data_scope", "active_org_unique_identity"); appendCsvRow(csv, "scenario_count", metrics.scenarioCount()); appendCsvRow(csv, "scenario_count_target", 12); - appendCsvRow(csv, "formal_org_login_count", metrics.orgLoginCount()); + appendCsvRow(csv, "formal_org_identity_count", metrics.orgIdentityCount()); appendCsvRow(csv, "formal_pilot_people_count", pilotPeople); appendCsvRow(csv, "formal_pilot_people_target", 20); appendCsvRow(csv, "formal_pilot_project_count", metrics.pilotProjects()); @@ -3828,7 +3828,7 @@ public class AihrPracticeSeedService { private record PilotReportMetrics( int scenarioCount, - int orgLoginCount, + int orgIdentityCount, int pilotPeople, int pilotProjects, int trainingCount, diff --git a/docs/BRD_IMPLEMENTATION_AUDIT.md b/docs/BRD_IMPLEMENTATION_AUDIT.md index added5a4..03e6331d 100644 --- a/docs/BRD_IMPLEMENTATION_AUDIT.md +++ b/docs/BRD_IMPLEMENTATION_AUDIT.md @@ -248,3 +248,4 @@ - 2026-07-14 线上资源差异复核:生产根站、`/h5/`、`/prod-api/auth/tenant/list` 和 `/prod-api/api/aihr/mobile/home/user` 均返回 `200`;线上管理端仍加载 `/assets/index-CJZ3Ax3Z.js`,H5 仍加载 `/h5/assets/index-D4-NrEpb.js`,当前本地构建分别为 `/assets/index-ClaGy0E5.js`(SHA-256 `788247429e1e20d10306258747d08abdc6903f57fe1313a3e742d141ddcd77fb`)和 `/h5/assets/index-C5pwI-WO.js`(SHA-256 `9d1c53f98561799f4b13fda37e7a25899d4ccc877a3d54a93369bfbfc984dbf7`)。当前只读核验,未执行生产静态资源同步、后端重启或业务数据写入;发布预检继续保留未提交文件保护。 - 2026-07-14 发布预检卫生复核:根目录 `node_modules/` 确认为构建工具生成物,已加入 `.gitignore`,避免依赖目录阻塞发布检查;`RELEASE_VERIFY_REMOTE_MATCH=true` 的预检仍因两份用户未提交的 Figma 文档退出,说明未绕过“发布批次必须干净”的保护。 - 2026-07-14 BRD G3 匿名入口复核:扫描 AIHR 全部控制器后,当前仅保留两个 `@SaIgnore` 方法:公开移动首页 `/api/aihr/mobile/home/{role}` 和岗位-SOP 导航 `/api/knowledge/position-sop`;训练、搜索、上传、复盘、模型、组织同步及音频读取均有登录或角色门禁,未发现新的匿名业务数据入口。本轮无新增代码修复。 +- 2026-07-14 BRD M5 导出指标语义复核:`formal_org_login_count` 原名会把按安全手机号映射统计的在职组织身份误读为登录次数;现统一更名为 `formal_org_identity_count`,统计 SQL 不变,CSV 契约、严格校验和验证脚本同步更新。AIHR 目标测试 `34/34`、CSV 契约测试 `5/5` 通过;不改变真实试点数据门槛,也未发布生产。 diff --git a/scripts/lib/pilot-export-contract.mjs b/scripts/lib/pilot-export-contract.mjs index d96e5646..6c5359fa 100644 --- a/scripts/lib/pilot-export-contract.mjs +++ b/scripts/lib/pilot-export-contract.mjs @@ -4,7 +4,7 @@ const REQUIRED_METRICS = [ 'data_scope', 'scenario_count', 'scenario_count_target', - 'formal_org_login_count', + 'formal_org_identity_count', 'formal_pilot_people_count', 'formal_pilot_people_target', 'formal_pilot_project_count', @@ -38,7 +38,7 @@ const REQUIRED_METRICS = [ const INTEGER_METRICS = [ 'scenario_count', 'scenario_count_target', - 'formal_org_login_count', + 'formal_org_identity_count', 'formal_pilot_people_count', 'formal_pilot_people_target', 'formal_pilot_project_count', @@ -241,12 +241,12 @@ export function verifyPilotExportContract({ csv, startDate, endDate, contentDisp const completionTotal = integerMetric(metrics, 'completion_people_total'); const completedPeople = integerMetric(metrics, 'completion_people_count'); const projects = integerMetric(metrics, 'formal_pilot_project_count'); - const orgLogin = integerMetric(metrics, 'formal_org_login_count'); + const orgIdentityCount = integerMetric(metrics, 'formal_org_identity_count'); if (completionTotal !== formalPeople) { fail(`completion_people_total ${completionTotal} does not match formal_pilot_people_count ${formalPeople}`); } if (completedPeople > completionTotal) fail('completion_people_count exceeds completion_people_total'); - const scopeReady = orgLogin >= 20 && formalPeople >= 20 && projects >= 1 && projects <= 2; + const scopeReady = orgIdentityCount >= 20 && formalPeople >= 20 && projects >= 1 && projects <= 2; expectMetric(metrics, 'formal_pilot_scope_ready', String(scopeReady)); expectMetric(metrics, 'completion_rate', expectedPercentage(completedPeople, completionTotal)); const completionReady = scopeReady && completedPeople * 100 >= completionTotal * 80; diff --git a/scripts/tests/pilot-export-contract.test.mjs b/scripts/tests/pilot-export-contract.test.mjs index 26a98c4a..d33fe91e 100644 --- a/scripts/tests/pilot-export-contract.test.mjs +++ b/scripts/tests/pilot-export-contract.test.mjs @@ -13,7 +13,7 @@ function validCsv() { data_scope: 'active_org_unique_identity', scenario_count: '12', scenario_count_target: '12', - formal_org_login_count: '20', + formal_org_identity_count: '20', formal_pilot_people_count: '20', formal_pilot_people_target: '20', formal_pilot_project_count: '1', diff --git a/scripts/verify-demo-questions.mjs b/scripts/verify-demo-questions.mjs index 759a1a94..b0770e2c 100755 --- a/scripts/verify-demo-questions.mjs +++ b/scripts/verify-demo-questions.mjs @@ -223,7 +223,7 @@ if (pilotExport) { const { metrics } = verifiedExport; console.log( `PILOT_EXPORT window=${pilotStartDate}..${pilotEndDate}` - + ` org_login=${metrics.get('formal_org_login_count')}` + + ` org_identity=${metrics.get('formal_org_identity_count')}` + ` people=${metrics.get('formal_pilot_people_count')}` + ` projects=${metrics.get('formal_pilot_project_count')}` + ` ten_sessions=${metrics.get('completion_people_count')}/${metrics.get('completion_people_total')}`