-- ============================================================================== -- RailwaySystem Clean Demo 资产: verify_demo_data.sql -- 适用数据库: KingbaseES V009R003C018 (schema: public) -- 执行目标: 对 Clean Demo Candidate 数据库进行全量数据充盈度与业务一致性强断言 -- 断言规则: 任何一项不符合硬性指标立即抛出 EXCEPTION -- ============================================================================== DO $$ DECLARE v_cnt INT; v_states INT; BEGIN RAISE NOTICE '=================================================='; RAISE NOTICE '>>> STARTING DEMO DATASET VERIFICATION <<<'; RAISE NOTICE '=================================================='; -- 1. 教师断言: Teachers >= 6 SELECT count(*) INTO v_cnt FROM public.train_teacher WHERE del_flag = 0; IF v_cnt < 6 THEN RAISE EXCEPTION '>>> [VERIFY-FATAL] 教师数量未达标: 当前 % 名 (要求 >= 6)', v_cnt; END IF; RAISE NOTICE '[VERIFY-PASS] 教师总数 = % (>= 6)', v_cnt; -- 2. 学员断言: Students >= 30 SELECT count(*) INTO v_cnt FROM public.train_student WHERE del_flag = 0; IF v_cnt < 30 THEN RAISE EXCEPTION '>>> [VERIFY-FATAL] 学员档案数量未达标: 当前 % 名 (要求 >= 30)', v_cnt; END IF; RAISE NOTICE '[VERIFY-PASS] 学员总数 = % (>= 30)', v_cnt; -- 3. 课程断言: Courses >= 8 SELECT count(*) INTO v_cnt FROM public.train_course WHERE del_flag = 0; IF v_cnt < 8 THEN RAISE EXCEPTION '>>> [VERIFY-FATAL] 课程标准库未达标: 当前 % 门 (要求 >= 8)', v_cnt; END IF; RAISE NOTICE '[VERIFY-PASS] 课程总数 = % (>= 8)', v_cnt; -- 4. 教室断言: Classrooms >= 4 SELECT count(*) INTO v_cnt FROM public.train_classroom_info; IF v_cnt < 4 THEN RAISE EXCEPTION '>>> [VERIFY-FATAL] 教室数量未达标: 当前 % 间 (要求 >= 4)', v_cnt; END IF; RAISE NOTICE '[VERIFY-PASS] 教室总数 = % (>= 4)', v_cnt; -- 5. 实训场地断言: Training sites >= 3 SELECT count(*) INTO v_cnt FROM public.train_training_site; IF v_cnt < 3 THEN RAISE EXCEPTION '>>> [VERIFY-FATAL] 实训场地未达标: 当前 % 处 (要求 >= 3)', v_cnt; END IF; RAISE NOTICE '[VERIFY-PASS] 实训场地总数 = % (>= 3)', v_cnt; -- 6. 宿舍房间断言: Dormitory rooms >= 20 SELECT count(*) INTO v_cnt FROM public.train_dormitory_info; IF v_cnt < 20 THEN RAISE EXCEPTION '>>> [VERIFY-FATAL] 宿舍房间数量未达标: 当前 % 间 (要求 >= 20)', v_cnt; END IF; RAISE NOTICE '[VERIFY-PASS] 宿舍房间总数 = % (>= 20)', v_cnt; -- 7. 开班计划状态断言: 覆盖 DRAFT(3), UPCOMING(0), IN_PROGRESS(1), COMPLETED(2) SELECT count(DISTINCT plan_status) INTO v_states FROM public.train_class_plan; IF v_states < 4 THEN RAISE EXCEPTION '>>> [VERIFY-FATAL] 开班计划状态不完整: 仅覆盖 % 种状态 (要求覆盖 4 种生命周期状态)', v_states; END IF; RAISE NOTICE '[VERIFY-PASS] 开班计划状态多样性 = % 种全覆盖', v_states; -- 8. 参训名单状态断言: 覆盖待报到(0)、已报到(1)、请假(2)、放弃(3)、已完成(4) SELECT count(DISTINCT enrollment_status) INTO v_states FROM public.train_enrollment; IF v_states < 5 THEN RAISE EXCEPTION '>>> [VERIFY-FATAL] 参训名单状态不完整: 仅覆盖 % 种状态 (要求覆盖 5 种状态)', v_states; END IF; RAISE NOTICE '[VERIFY-PASS] 学员参训状态多样性 = % 种全覆盖', v_states; -- 9. 住宿交互断言: 必须有 >=2 条预分配记录(办理入住演示), >=2 条在住记录(退宿/调房演示) SELECT count(*) INTO v_cnt FROM public.train_accommodation WHERE accommodation_status = 0; IF v_cnt < 2 THEN RAISE EXCEPTION '>>> [VERIFY-FATAL] 预分配住宿记录不足 2 条 (当前 % 条),无法演示现场办理入住!', v_cnt; END IF; SELECT count(*) INTO v_cnt FROM public.train_accommodation WHERE accommodation_status = 1; IF v_cnt < 2 THEN RAISE EXCEPTION '>>> [VERIFY-FATAL] 在住记录不足 2 条 (当前 % 条),无法演示现场调房与退宿!', v_cnt; END IF; RAISE NOTICE '[VERIFY-PASS] 住宿交互预留断言 = PASS (预分配 >= 2, 在住 >= 2)'; -- 10. 考勤状态多样性断言: 必须涵盖 缺勤(0)、正常(1)、迟到(2)、早退(3)、请假(4) SELECT count(DISTINCT attendance_status) INTO v_states FROM public.train_student_checkin; IF v_states < 4 THEN RAISE EXCEPTION '>>> [VERIFY-FATAL] 考勤打卡状态多样性不足: 仅 % 种状态 (要求至少 4 种)', v_states; END IF; RAISE NOTICE '[VERIFY-PASS] 考勤打卡状态多样性 = % 种全覆盖 (杜绝全零图表)', v_states; -- 11. 成绩 V2 架构断言: train_score_info 必须为 0/不存在,train_score_item 与 train_student_score 必须丰满 SELECT count(*) INTO v_cnt FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'train_score_info'; IF v_cnt > 0 THEN RAISE EXCEPTION '>>> [VERIFY-FATAL] 历史废弃表 train_score_info 仍然存在!必须彻底下线!'; END IF; SELECT count(*) INTO v_cnt FROM public.train_student_score; IF v_cnt < 20 THEN RAISE EXCEPTION '>>> [VERIFY-FATAL] Score V2 成绩数据不足: 当前 % 条 (要求 >= 20)', v_cnt; END IF; RAISE NOTICE '[VERIFY-PASS] Score V2 成绩体系 = PASS (废表彻底下线,新表数据量: % 条)', v_cnt; -- 12. 学员画像与学习时长断言 SELECT count(*) INTO v_cnt FROM public.train_student_portrait; IF v_cnt < 10 THEN RAISE EXCEPTION '>>> [VERIFY-FATAL] 学员画像记录不足: 当前 % 条', v_cnt; END IF; SELECT count(*) INTO v_cnt FROM public.train_study_duration; IF v_cnt < 20 THEN RAISE EXCEPTION '>>> [VERIFY-FATAL] 自主学习时长明细不足: 当前 % 条', v_cnt; END IF; RAISE NOTICE '[VERIFY-PASS] 学员360画像与驾驶舱分析数据 = PASS (画像数: %, 学习时长明细: %)', (SELECT count(*) FROM public.train_student_portrait), v_cnt; -- 13. 角色与账号断言 IF NOT EXISTS (SELECT 1 FROM public.sys_user u JOIN public.sys_user_role ur ON ur.user_id = u.user_id WHERE u.user_name = 'demo_admin' AND ur.role_id = 3) THEN RAISE EXCEPTION '>>> [VERIFY-FATAL] 培训管理员账号 demo_admin 未就绪或未正确绑定 role_id = 3'; END IF; IF NOT EXISTS (SELECT 1 FROM public.sys_user u JOIN public.sys_user_role ur ON ur.user_id = u.user_id JOIN public.train_teacher t ON t.user_id = u.user_id WHERE u.user_name = 'demo_teacher' AND ur.role_id = 4) THEN RAISE EXCEPTION '>>> [VERIFY-FATAL] 培训教师账号 demo_teacher 未就绪、未绑定 role_id = 4 或未绑定教师主档'; END IF; IF NOT EXISTS (SELECT 1 FROM public.sys_user u JOIN public.sys_user_role ur ON ur.user_id = u.user_id JOIN public.train_student s ON s.user_id = u.user_id WHERE u.user_name = 'demo_student' AND ur.role_id = 5) THEN RAISE EXCEPTION '>>> [VERIFY-FATAL] 培训学员账号 demo_student 未就绪、未绑定 role_id = 5 或未绑定学员主档'; END IF; RAISE NOTICE '[VERIFY-PASS] 业务角色账号就绪性 = PASS (demo_admin, demo_teacher, demo_student 均绑定成功)'; RAISE NOTICE '=================================================='; RAISE NOTICE '>>> DEMO DATASET VERIFICATION SUCCESSFUL! <<<'; RAISE NOTICE '=================================================='; END $$;