fix(aihr): clarify pilot identity metric

This commit is contained in:
2026-07-14 12:50:10 +08:00
parent e3f7ec472b
commit 6ee29aa8b8
5 changed files with 12 additions and 11 deletions
@@ -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,
+1
View File
@@ -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` 通过;不改变真实试点数据门槛,也未发布生产。
+4 -4
View File
@@ -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;
+1 -1
View File
@@ -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',
+1 -1
View File
@@ -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')}`