fix(aihr): version SOP traceability migration

This commit is contained in:
2026-07-14 16:18:59 +08:00
parent 52af9b6e4c
commit 0609bd3d17
4 changed files with 69 additions and 1 deletions
@@ -23,6 +23,22 @@ PREPARE aihr_sop_source_stmt FROM @aihr_sop_source_ddl;
EXECUTE aihr_sop_source_stmt;
DEALLOCATE PREPARE aihr_sop_source_stmt;
SET @aihr_sop_prompt_version_exists := (
SELECT COUNT(*)
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'aihr_sop_answer_review'
AND COLUMN_NAME = 'prompt_version'
);
SET @aihr_sop_prompt_version_ddl := IF(
@aihr_sop_review_table_exists = 1 AND @aihr_sop_prompt_version_exists = 0,
'ALTER TABLE aihr_sop_answer_review ADD COLUMN `prompt_version` varchar(80) DEFAULT NULL COMMENT ''答案生成提示词版本''',
'SELECT 1'
);
PREPARE aihr_sop_prompt_version_stmt FROM @aihr_sop_prompt_version_ddl;
EXECUTE aihr_sop_prompt_version_stmt;
DEALLOCATE PREPARE aihr_sop_prompt_version_stmt;
SET @aihr_sop_requester_exists := (
SELECT COUNT(*)
FROM information_schema.COLUMNS
+2 -1
View File
@@ -306,5 +306,6 @@
- 2026-07-14 BRD 验收脚本可执行性修复:`scripts/tests/demo-check-pilot-gates.test.sh` 原文件权限为 `100644`,按其 shebang 直接执行会 `permission denied`;现改为 `100755`。直接执行通过(含临时测试库行为校验),`scripts/tests/pilot-export-contract.test.mjs` 通过 `5/5`;未修改业务数据。
- 2026-07-14 BRD 用户端回归复核:`mobile-uni` 类型检查通过,用户端单测 `53/53` 通过;源码中的“工作上报·建设中”属于 BRD 阶段二/三信息直达或北森/报事集成边界,候选人“等待后续通知”属于完成态提示,不新增一期空壳功能。测试进程曾输出既有 Vite WebSocket 端口占用警告,但测试退出码为 `0`,需在独立 CI/无并行开发服务环境再确认,不作为业务失败。
- 2026-07-14 BRD 4.4 生产迁移顺序修复:每日三题评分模式迁移原先直接在 `score` 后添加 `score_mode`,旧生产表若缺少后来新增的 `score` 字段会迁移失败;现同一幂等脚本先补 `score`、再补 `score_mode`,并加入 `demo-check` marker。临时旧表连续执行两次迁移后得到 `score,score_mode`,未修改业务数据。
- 2026-07-14 BRD 4.4/4.7 旧 schema 迁移兼容性修复:SOP 提问主体迁移原先默认旧表已有 `source` 列,入职日期迁移原先默认 `aihr_org_snapshot` 表已存在;现分别先按表/列存在性补 `source` 再补 `requester_ext_party_id`,并在组织表不存在或缺少 `employment_status` 时安全跳过定位依赖。两份迁移均保持幂等,不写入业务数据;新增 `demo-check` marker,后续用临时旧 schema 做连续执行验证。
- 2026-07-14 BRD 4.4/4.7 旧 schema 迁移兼容性修复:SOP 提问主体迁移原先默认旧表已有 `source` 列,且严格门禁要求的 `prompt_version` 只有运行时懒建没有版本化生产迁移;入职日期迁移原先默认 `aihr_org_snapshot` 表已存在。现 SOP 脚本按表/列存在性依次补 `source`、`prompt_version`、`requester_ext_party_id`,组织脚本在表不存在或缺少 `employment_status` 时安全跳过定位依赖。两份迁移均保持幂等,不写入业务数据;新增 `demo-check` marker,后续用临时旧 schema 做连续执行验证。
- 2026-07-14 BRD 门禁夹具同步:严格预检已将 SOP 正式样本限定为带 `requester_ext_party_id` 且能命中在职组织身份的提问记录;原 `demo-check-pilot-gates` 临时表仍是旧 6 列,导致 SOP 指标为空并无法真实覆盖新口径。现补齐主体与 `prompt_version` 字段,使用安全员工主体 `E` 验证 `sop_usable=1/1`、待评审数和窗口过滤,未改变业务数据。
- 2026-07-14 BRD 生产迁移回归固化:新增 `scripts/tests/aihr-schema-migrations.test.sh`,在临时 MySQL 库验证 SOP 主体/版本字段和组织入职日期迁移面对旧表、缺前置表时可安全执行且重复执行幂等;不写入开发库业务数据。
+2
View File
@@ -532,6 +532,8 @@ contains backend/script/sql/aihr_org_snapshot_mysql8.sql "hire_date"
contains backend/script/sql/update/aihr_20260714_org_hire_date_mysql8.sql "hire_date"
contains backend/script/sql/update/aihr_20260714_org_hire_date_mysql8.sql "aihr_org_snapshot_table_exists"
contains backend/script/sql/update/aihr_20260714_sop_requester_identity_mysql8.sql "aihr_sop_source_exists"
contains backend/script/sql/update/aihr_20260714_sop_requester_identity_mysql8.sql "aihr_sop_prompt_version_exists"
contains scripts/tests/aihr-schema-migrations.test.sh "AIHR legacy schema migrations are idempotent"
contains backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/service/AihrOrgSyncService.java "hireDate"
contains frontend/src/api/aihr/practice.ts '/api/train/practice/scenarios/${id}/enabled'
contains backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/controller/AihrPracticeController.java "/scenarios/{id}/enabled"
+49
View File
@@ -0,0 +1,49 @@
#!/usr/bin/env bash
set -euo pipefail
if ! command -v docker >/dev/null || ! docker ps --format '{{.Names}}' | grep -qx 'wygj-mysql'; then
echo "SKIP: AIHR schema migration test requires wygj-mysql"
exit 0
fi
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
MYSQL_CONTAINER="wygj-mysql"
DB="wygj_aihr_schema_test_$$"
mysql() {
docker exec -i "$MYSQL_CONTAINER" mysql -uroot -proot --default-character-set=utf8mb4 "$@"
}
cleanup() {
mysql -e "DROP DATABASE IF EXISTS \`$DB\`;" >/dev/null 2>&1 || true
}
trap cleanup EXIT
mysql -e "CREATE DATABASE \`$DB\` CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;"
mysql "$DB" <<'SQL'
CREATE TABLE aihr_sop_answer_review (
id bigint NOT NULL AUTO_INCREMENT,
snippet_count int DEFAULT 0,
PRIMARY KEY (id)
) ENGINE=InnoDB;
SQL
mysql "$DB" < "$ROOT_DIR/backend/script/sql/update/aihr_20260714_sop_requester_identity_mysql8.sql"
mysql "$DB" < "$ROOT_DIR/backend/script/sql/update/aihr_20260714_sop_requester_identity_mysql8.sql"
sop_columns="$(mysql "$DB" -N -B -e "SELECT GROUP_CONCAT(column_name ORDER BY ordinal_position) FROM information_schema.columns WHERE table_schema='$DB' AND table_name='aihr_sop_answer_review' AND column_name IN ('source','prompt_version','requester_ext_party_id');")"
test "$sop_columns" = 'source,prompt_version,requester_ext_party_id'
mysql "$DB" < "$ROOT_DIR/backend/script/sql/update/aihr_20260714_org_hire_date_mysql8.sql"
mysql "$DB" <<'SQL'
CREATE TABLE aihr_org_snapshot (
id bigint NOT NULL AUTO_INCREMENT,
ext_party_id varchar(100),
PRIMARY KEY (id)
) ENGINE=InnoDB;
SQL
mysql "$DB" < "$ROOT_DIR/backend/script/sql/update/aihr_20260714_org_hire_date_mysql8.sql"
mysql "$DB" < "$ROOT_DIR/backend/script/sql/update/aihr_20260714_org_hire_date_mysql8.sql"
org_columns="$(mysql "$DB" -N -B -e "SELECT GROUP_CONCAT(column_name ORDER BY ordinal_position) FROM information_schema.columns WHERE table_schema='$DB' AND table_name='aihr_org_snapshot' AND column_name='hire_date';")"
test "$org_columns" = 'hire_date'
echo "PASS: AIHR legacy schema migrations are idempotent"