Files
jcgl-dev/dev/sql/apt_rev01/99_verify.sql
T
zfjia 35751b4f00
IT-0 verify / verify (push) Waiting to run
1111
2026-11-11 18:30:31 +08:00

214 lines
11 KiB
SQL
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
-- =============================================================================
-- IT-0 验收校验脚本(表 13-10 验收③ / MS-0)
-- 预期:business_table_count = 59;missing_pk = 0;missing_gyid = 0
-- 口径:apt_* 36 + gy_*/gygl_* 18 + duty_* 5 = 59(CR-02 表 3-25、公寓端/03 表 3-8)
-- apt_ops_probe 为连通性探针表,显式排除,不计入 59 张。
-- 追加:第 7~13 段为 IT-3(DV-3)增量校验,见文件末段说明。
-- =============================================================================
SELECT '=== 1. 业务表总数(应为 59)===' AS section;
SELECT COUNT(*) AS business_table_count
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_TYPE = 'BASE TABLE'
AND (TABLE_NAME LIKE 'apt\_%' OR TABLE_NAME LIKE 'gy\_%'
OR TABLE_NAME LIKE 'gygl\_%' OR TABLE_NAME LIKE 'duty\_%')
AND TABLE_NAME <> 'apt_ops_probe';
SELECT '=== 2. 分前缀分布(应为 apt 36 / gy 17 / gygl 1 / duty 5)===' AS section;
SELECT CASE
WHEN TABLE_NAME LIKE 'apt\_%' THEN 'apt'
WHEN TABLE_NAME LIKE 'gygl\_%' THEN 'gygl'
WHEN TABLE_NAME LIKE 'gy\_%' THEN 'gy'
ELSE 'duty'
END AS prefix, COUNT(*) AS cnt
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = DATABASE()
AND (TABLE_NAME LIKE 'apt\_%' OR TABLE_NAME LIKE 'gy\_%'
OR TABLE_NAME LIKE 'gygl\_%' OR TABLE_NAME LIKE 'duty\_%')
AND TABLE_NAME <> 'apt_ops_probe'
GROUP BY prefix ORDER BY prefix;
SELECT '=== 3. 缺主键的业务表(应为 0 行)===' AS section;
SELECT t.TABLE_NAME
FROM information_schema.TABLES t
WHERE t.TABLE_SCHEMA = DATABASE()
AND (t.TABLE_NAME LIKE 'apt\_%' OR t.TABLE_NAME LIKE 'gy\_%'
OR t.TABLE_NAME LIKE 'gygl\_%' OR t.TABLE_NAME LIKE 'duty\_%')
AND t.TABLE_NAME <> 'apt_ops_probe'
AND NOT EXISTS (
SELECT 1 FROM information_schema.TABLE_CONSTRAINTS c
WHERE c.TABLE_SCHEMA = t.TABLE_SCHEMA AND c.TABLE_NAME = t.TABLE_NAME
AND c.CONSTRAINT_TYPE = 'PRIMARY KEY'
);
SELECT '=== 4. 缺 gyid 列的业务表(应为 0 行)===' AS section;
SELECT t.TABLE_NAME
FROM information_schema.TABLES t
WHERE t.TABLE_SCHEMA = DATABASE()
AND (t.TABLE_NAME LIKE 'apt\_%' OR t.TABLE_NAME LIKE 'gy\_%'
OR t.TABLE_NAME LIKE 'gygl\_%' OR t.TABLE_NAME LIKE 'duty\_%')
AND t.TABLE_NAME <> 'apt_ops_probe'
AND NOT EXISTS (
SELECT 1 FROM information_schema.COLUMNS c
WHERE c.TABLE_SCHEMA = t.TABLE_SCHEMA AND c.TABLE_NAME = t.TABLE_NAME
AND c.COLUMN_NAME = 'gyid'
);
SELECT '=== 5. 外键数量(应为 0:docs/10 表 5-6 明确不建外键)===' AS section;
SELECT COUNT(*) AS foreign_key_count
FROM information_schema.TABLE_CONSTRAINTS
WHERE TABLE_SCHEMA = DATABASE() AND CONSTRAINT_TYPE = 'FOREIGN KEY';
SELECT '=== 6. 探针表与基线种子 ===' AS section;
SELECT (SELECT COUNT(*) FROM apt_ops_probe) AS probe_rows,
(SELECT COUNT(*) FROM apt_master_version WHERE source = 'LOCAL') AS local_baseline_rows,
(SELECT COUNT(*) FROM apt_ops_selfcheck) AS selfcheck_item_rows;
-- =============================================================================
-- IT-3 追加校验(DV-3 / 13 表 13-13 验收①)
-- 预期:IT-3 增量列 6 条;人脸权限点 7 行(6 F + 1 C);IT-7 置灰项授权 0;
-- N-34 可申请设备 2 台;注册链三处「泄漏」计数均为 0。
-- =============================================================================
SELECT '=== 7. IT-3 增量列(应 6:回执态 3 + §12 设备范围 3)===' AS section;
SELECT TABLE_NAME, COLUMN_NAME, COLUMN_TYPE, IS_NULLABLE, COLUMN_DEFAULT
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND ( (TABLE_NAME = 'apt_person_face_reg' AND COLUMN_NAME IN ('platform_version','unit_code'))
OR (TABLE_NAME = 'apt_master_person' AND COLUMN_NAME = 'face_platform_version')
OR (TABLE_NAME = 'gy_sb' AND COLUMN_NAME IN ('device_class','face_scope_value','face_cache_enabled')))
ORDER BY TABLE_NAME, COLUMN_NAME;
SELECT '=== 8. 人脸权限点与页面菜单(应 7 行:6 F + 1 C)===' AS section;
SELECT menu_id, menu_name, menu_type, visible, status, perms
FROM sys_menu WHERE menu_id BETWEEN 3201 AND 3216 ORDER BY menu_id;
SELECT '=== 9. IT-7 预留点置灰且未授权(3213~3216 应为 0)===' AS section;
SELECT COUNT(*) AS it3_grey_bound
FROM sys_role_menu rm JOIN sys_menu m ON m.menu_id = rm.menu_id
WHERE m.menu_id IN (3213, 3214, 3215, 3216);
SELECT '=== 10. N-34 可申请设备(state <> DISABLED,应 2)===' AS section;
SELECT COUNT(*) AS it3_apply_device_count
FROM gy_sb
WHERE device_code IN ('DEV-CHECKIN-01', 'DEV-TABLET-01', 'DEV-CHECKIN-99')
AND state <> 'DISABLED';
SELECT '=== 11. 注册链一致性:APPLIED 不得带 ryid、CONFIRMED 必带 ryid(均应 0)===' AS section;
SELECT
(SELECT COUNT(*) FROM apt_person_face_reg
WHERE reg_state = 'APPLIED' AND (confirmed_ryid IS NOT NULL OR local_only <> 1)) AS it3_applied_leak,
(SELECT COUNT(*) FROM apt_person_face_reg
WHERE reg_state = 'CONFIRMED' AND confirmed_ryid IS NULL) AS it3_confirmed_without_ryid,
(SELECT COUNT(*) FROM apt_person_face_reg
WHERE reg_state = 'REJECTED' AND confirmed_ryid IS NOT NULL) AS it3_rejected_with_ryid;
SELECT '=== 12. 双路状态链独立:CONFIRMED 行不得缺 upload_state / dispatch_state(应 0)===' AS section;
SELECT reg_id, upload_state, dispatch_state, verdict, platform_version
FROM apt_person_face_reg
WHERE reg_state = 'CONFIRMED' AND (upload_state IS NULL OR dispatch_state IS NULL);
SELECT '=== 13. 确认行必须有对应人员主档(应 0 孤儿)===' AS section;
SELECT COUNT(*) AS it3_confirmed_orphan
FROM apt_person_face_reg r
WHERE r.reg_state = 'CONFIRMED'
AND NOT EXISTS (
SELECT 1 FROM apt_master_person p
WHERE p.gyid = r.gyid AND p.ryid = r.confirmed_ryid AND p.deleted = 0
);
-- =============================================================================
-- IT-4 追加校验(入住作业核心 / 表 11-4、表 11-9、CR-02 表 3-57 验收 18~20)
-- 预期:增量列 26 条;流程态字典 8/5 值;入住权限点 5 行;三处链路泄漏均为 0。
-- =============================================================================
SELECT '=== 14. IT-4 apt_local_task 增量列(应 27)===' AS section;
SELECT COUNT(*) AS it4_local_task_columns
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'apt_local_task'
AND COLUMN_NAME IN ('device_code','device_event_id','work_no','name_snapshot','reg_id',
'reg_state_at_apply','jch','kcsj_snapshot','verified_ryid','verified_at','feature_version',
'source','submitted_at','occurred_at','review_note','adjusted_by','adjusted_at','adjust_reason',
'reported_at','matched_at','task_ready_at','matched_plan_key','base_kcsj','base_jcfs',
'origin_jcsj','derived_rule_version','jllx');
SELECT '=== 15. 流程态字典(checkin_state 8 值 / sync_state 5 值 / 事件含 ROOM_SWAP)===' AS section;
SELECT CONSTRAINT_NAME, CHECK_CLAUSE
FROM information_schema.CHECK_CONSTRAINTS
WHERE CONSTRAINT_SCHEMA = DATABASE()
AND CONSTRAINT_NAME IN ('ck_lt_checkin','ck_lt_sync','ck_lye_type')
ORDER BY CONSTRAINT_NAME;
SELECT '=== 16. 入住权限点与页面菜单(应 5 行)===' AS section;
SELECT menu_id, menu_name, menu_type, visible, status, perms
FROM sys_menu WHERE menu_id IN (3005, 3202, 3217, 3218, 3219) ORDER BY menu_id;
SELECT '=== 17. 任务就绪必须已复算 jcsj(应 0)===' AS section;
SELECT COUNT(*) AS it4_task_ready_without_jcsj
FROM apt_local_task
WHERE sync_state = 'TASK_READY' AND jcsj IS NULL AND deleted = 0;
SELECT '=== 18. CHECKED_IN 必须有 gy_jcxx 行(应 0 孤儿)===' AS section;
SELECT COUNT(*) AS it4_checked_in_orphan
FROM apt_local_task t
WHERE t.checkin_state = 'CHECKED_IN' AND t.deleted = 0
AND NOT EXISTS (
SELECT 1 FROM gy_jcxx j WHERE j.gyid = t.gyid AND j.jcid = t.jcid AND j.deleted = 0
);
SELECT '=== 19. 未入住不得提前生成叫乘行(应 0 泄漏)===' AS section;
SELECT COUNT(*) AS it4_checkin_leak
FROM apt_local_task t
WHERE t.checkin_state IN ('SUBMITTED','REVIEWING','APPROVED','ROOM_ADJUSTED','REJECTED')
AND t.deleted = 0
AND EXISTS (SELECT 1 FROM gy_jcxx j WHERE j.gyid = t.gyid AND j.jcid = t.jcid AND j.deleted = 0);
-- =============================================================================
-- IT-5 追加校验(叫乘执行与状态机 / 表 3-10、表 4-9、表 5-20、表 7-3 M3)
-- 预期:增量列 11 条;叫乘权限点 5 行;平板字典 3 个 CHECK;
-- 状态一致性四类泄漏全为 0;平板链路无 #24 语音摘要。
-- =============================================================================
SELECT '=== 20. IT-5 gy_jcxx 增量列(应 12)===' AS section;
SELECT COUNT(*) AS it5_jcxx_columns
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'gy_jcxx'
AND COLUMN_NAME IN ('jcsj_s','hjxysj','jcbjsj_s','fjsj_s','lybjsj','is_jcbj',
'is_lybj','is_temp_call','leave_type','leave_event_id','leave_remark','jch');
SELECT '=== 21. 叫乘权限点与页面菜单(应 5 行)===' AS section;
SELECT menu_id, menu_name, menu_type, visible, status, perms
FROM sys_menu WHERE menu_id IN (3004, 3220, 3221, 3222, 3203) ORDER BY menu_id;
SELECT '=== 22. 平板字典 CHECK(应 3:face / result_type / applied_state)===' AS section;
SELECT CONSTRAINT_NAME, CHECK_CLAUSE
FROM information_schema.CHECK_CONSTRAINTS
WHERE CONSTRAINT_SCHEMA = DATABASE()
AND CONSTRAINT_NAME IN ('ck_tabletresult_face','ck_tabletresult_type','ck_tabletresult_applied')
ORDER BY CONSTRAINT_NAME;
SELECT '=== 23. 终态一致性:ryzt=3 必须 finish_jc=1(应 0)===' AS section;
SELECT COUNT(*) AS it5_answered_without_finish
FROM gy_jcxx
WHERE deleted = 0 AND ryzt = '3' AND finish_jc <> '1';
SELECT '=== 24. 已结束叫乘不得回退到未完成态(应 0)===' AS section;
SELECT COUNT(*) AS it5_finished_regressed
FROM gy_jcxx
WHERE deleted = 0 AND finish_jc = '1' AND ryzt IN ('0','1');
SELECT '=== 25. 平板任务与结果一致:DONE 任务必须有结果行(应 0)===' AS section;
SELECT COUNT(*) AS it5_task_done_without_result
FROM apt_tablet_task t
WHERE t.pull_state = 'DONE'
AND NOT EXISTS (
SELECT 1 FROM apt_tablet_call_result r
WHERE r.gyid = t.gyid AND r.task_id = t.task_id
);
SELECT '=== 26. 平板链路不得上报 #24 语音摘要(应 0)===' AS section;
SELECT COUNT(*) AS it5_tablet_voice_summary
FROM apt_report_outbox o
WHERE o.biz_type = 'VOICE_SUMMARY'
AND EXISTS (
SELECT 1 FROM gy_jcxx j
WHERE j.gyid = o.gyid AND j.jcid = o.biz_id AND j.call_mode = 'TABLET'
);