diff --git a/doc/数据质量筛查规则说明书.md b/doc/数据质量筛查规则说明书.md index 9af56bb..2480bea 100644 --- a/doc/数据质量筛查规则说明书.md +++ b/doc/数据质量筛查规则说明书.md @@ -1,8 +1,8 @@ # 异常事件数据质量控制规则说明书 -> **文档版本**:v1.0 -> **编写日期**:2026-07-28 -> **适用范围**:系统管理、健康咨询、应急就医、健康体检、营养管理、健康监测(共 6 个业务板块) +> **文档版本**:v1.1 +> **编写日期**:2026-07-29 +> **适用范围**:系统管理、健康咨询、应急就医、健康评估、营养管理、健康监测(共 6 个业务板块) > **执行主体**:数据中台(于数据同步环节内嵌执行质量校验) --- @@ -17,7 +17,7 @@ - [5.1 系统管理](#51-系统管理) - [5.2 健康咨询](#52-健康咨询) - [5.3 应急就医](#53-应急就医) - - [5.4 健康体检](#54-健康体检) + - [5.4 健康评估](#54-健康评估) - [5.5 营养管理](#55-营养管理) - [5.6 健康监测](#56-健康监测) - [六、附录](#六附录) @@ -40,7 +40,7 @@ |------|-----------|---------| | 健康咨询 | `web-admin/health-consult/` | 原型已定稿,后端已部分实现 | | 应急就医 | `web-admin/emergency-dispatch/` | 原型已定稿,后端有占位 | -| 健康体检 | `web-admin/health-checkup/` | 原型已定稿 | +| 健康评估 | `web-admin/health-assessment/` | 原型待开发,后端已部分实现 | | 营养管理 | `web-admin/nutrition/` | 原型已定稿,后端已部分实现 | | 健康监测 | `web-admin/health-monitor/` | 原型已定稿 | | 系统管理 | `platform-java/platform-system/` | 后端已实现 | @@ -638,97 +638,127 @@ --- -### 5.4 健康体检 +### 5.4 健康评估 #### 涉及数据表 -| 表名 | 说明 | 核心校验字段 | -|------|------|-------------| -| `exam_appointment` | 体检预约 | phone, employee_id, appointment_date, hospital_id, status | -| `employee_archive` | 员工档案 | id_card, name, gender, birth_date | -| `exam_report` | 体检报告 | report_status, employee_id, exam_date, hospital_id | -| `exam_item_result` | 体检项目结果 | result_value, item_code, reference_range, is_abnormal, exam_report_id | -| `exam_standard_item` | 体检基本项目 | item_code, item_name, is_key_indicator, has_reference | -| `exam_hospital_item` | 医院体检项目 | hospital_id, item_code, linked_standard_item_id | -| `exam_hospital` | 医院信息 | hospital_name, address, enable_occupational | -| `exam_report_template` | 报告模板 | template_name, version, status | -| `exam_plan` | 体检计划 | plan_name, year, date_range, hospital_id, status | -| `exam_quota` | 体检名额 | plan_id, unit_id, total_quota, used_quota | +健康评估模块对员工进行多维度健康评估,涵盖风险评估、心理评估、规律起居评估及人群分类。以下按业务子域列出核心校验表。 + +| 业务子域 | 核心表 | 关键校验字段 | +|----------|--------|-------------| +| 风险评估 | `ass_risk_evaluation`, `ass_risk_result`, `ass_risk_questionnaire_info`, `ass_risk_evaluation_statistics`, `ass_risk_diet_sports_prescription` | user_id, eval_source, status, is_exception, bmi, sbp, dbp, fasting_bg, health_age, bmi_mark, smoke_mark, height, weight, waist_line, smoking_status, personal_*, questions_json, statics_num, exception_num, energy_level, f_elements, aerobic_*, strength_*, flexibility_* | +| 心理评估 | `ass_psychology`, `ass_psychology_statistics` | type, grade, phy_grade_level, status, is_exception, questions_id | +| 规律起居 | `ass_daily_routine_online`, `ass_daily_routine_paper` | sleep_hour, sport_minute, resting_heart_rate, oxygen_saturation, pressure_value, week_start_date, week_end_date, sport_value, sleep_value, time_of_net_value, sport_level, sleep_type, time_of_net_level, is_exception | +| 人群分类 | `ass_group_user`, `ass_group_user_detail` | user_group, group_change_type, audit_status, is_archived, archived_time, date_year, latest_assessment_date, detail_type, data_type | +| 问卷 | `ass_questions` | questions_json | #### 检测规则 -**exam_appointment(体检预约)** +**ass_risk_evaluation(风险评估主表)** | 编码 | 规则描述 | 涉及字段 | 判定逻辑 | |------|----------|----------|----------| -| H01-D02 | 手机号格式不合法 | `phone` | 不匹配 11 位手机号正则(如 `"888"` 或非数字字符) | -| H01-D01 | 预约员工ID缺失 | `employee_id` | `IS NULL OR = ''` | -| H01-D03 | 预约日期为过去年份(录入错误) | `appointment_date` | 年份早于 2020 或晚于当前年份+2 | -| H01-D05 | 关联医院不存在 | `hospital_id` | 引用的医院不存在 | +| A01-D01 | 用户ID缺失 | `user_id` | `IS NULL` | +| A01-D03 | 评估来源枚举越界 | `eval_source` | `NOT IN (1, 2)`(1=问卷, 2=自动) | +| A01-D04 | 异常标记与评估结果矛盾 | `is_exception` ↔ `ass_risk_result.*_level` | `is_exception = 1` 但关联结果中所有疾病等级均为正常 | -**employee_archive(员工档案)** +**ass_risk_result(风险评估结果)** | 编码 | 规则描述 | 涉及字段 | 判定逻辑 | |------|----------|----------|----------| -| H02-D02 | 身份证号格式不合法 | `id_card` | 长度不为 18 位,或含非法字符,或校验位不通过 | -| H02-D01 | 姓名缺失 | `name` | `IS NULL OR = ''` | -| H02-D03 | 性别枚举越界 | `gender` | `NOT IN (1, 2)` 或 `NOT IN ('男', '女')` | -| H02-D03 | 出生日期为未来日期 | `birth_date` | `birth_date > CURRENT_DATE` | +| A02-D03 | BMI 值越界 | `bmi` | `< 10 OR > 80` | +| A02-D03 | 收缩压越界 | `sbp` | `< 50 OR > 300` (mmHg) | +| A02-D03 | 舒张压越界 | `dbp` | `< 30 OR > 200` (mmHg) | +| A02-D03 | 空腹血糖越界 | `fasting_bg` | `< 0 OR > 50` (mmol/L) | +| A02-D03 | 健康年龄越界 | `health_age`, `potential_health_age` | `< 0 OR > 150` | +| A02-D03 | 疾病等级枚举越界 | `diabetes_level`, `hypertension_level` 等 | 不在预定义枚举集合内 | +| A02-D02 | 生活习惯标记格式非法 | `bmi_mark`, `smoke_mark`, `sleep_mark` 等 | 不符合 `state,score,fullmark` 格式 | +| A02-D04 | 收缩压低于舒张压 | `sbp`, `dbp` | `sbp < dbp` | +| A02-D04 | 血脂数据缺失但疾病等级非空 | `cholesterol`, `triglycerin`, `hdlc`, `ldlc` + `*_level` | 血脂四项均为 0 或 NULL 但存在非空疾病等级 | -**exam_report(体检报告)** +**ass_risk_questionnaire_info(问卷信息)** | 编码 | 规则描述 | 涉及字段 | 判定逻辑 | |------|----------|----------|----------| -| H03-D03 | 报告状态枚举越界 | `report_status` | 不在预定义报告状态枚举集合内 | -| H03-D05 | 关联员工不存在 | `employee_id` | 引用的员工档案不存在 | -| H03-D04 | 报告状态为"已生成"但无结果明细 | `report_status` ↔ `exam_item_result` | 报告状态为已生成但无关联的检查结果明细 | +| A03-D01 | 基础体测数据完全缺失 | `height`, `weight`, `waist_line` | 三者均为 NULL | +| A03-D03 | 身高越界 | `height` | `< 50 OR > 250` (cm) | +| A03-D03 | 体重越界 | `weight` | `< 20 OR > 300` (kg) | +| A03-D03 | 腰围越界 | `waist_line` | `< 30 OR > 200` (cm) | +| A03-D03 | 吸烟状态枚举越界 | `smoking_status` | `NOT IN (1, 2, 3)` | +| A03-D03 | 个人病史枚举越界 | `personal_diabetes`, `personal_hypertension` 等 `personal_*` 字段 | `NOT IN (0, 1)` | +| A03-D02 | 问卷 JSON 格式非法 | `questions_json`(通过 `ass_questions`) | JSON 解析失败 | -**exam_item_result(体检项目结果)** +**ass_risk_evaluation_statistics(评估统计)** | 编码 | 规则描述 | 涉及字段 | 判定逻辑 | |------|----------|----------|----------| -| H04-D01 | 检查结果值为空 | `result_value` | `IS NULL OR = ''` | -| H04-D03 | 结果值为负数(仅适用于不应为负的指标) | `result_value` | `result_value < 0` 且项目类型非偏移量类指标 | -| H04-D05 | 关联体检项目不存在 | `item_code` | 引用的标准体检项目不存在 | -| H04-D05 | 关联报告不存在 | `exam_report_id` | 引用的体检报告不存在 | -| H04-D04 | 异常标记与结果值矛盾 | `is_abnormal`, `result_value`, `reference_range` | 标记为异常但结果值在参考范围内,或标记为正常但结果值明显超出参考范围 | +| A04-D04 | 统计次数与实际评估次数不一致 | `statics_num` ↔ `ass_risk_evaluation` | `statics_num` 不等于该用户实际评估记录数 | +| A04-D04 | 疾病异常标记与源数据脱节 | `is_bmi_abnormal`, `is_sbp_abnormal` 等 ↔ `last_evaluation_id` 对应结果 | 统计标记与引用的评估结果数据不一致 | +| A04-D04 | 异常计数错误 | `exception_num` | `exception_num` 不等于实际 `is_exception = 1` 的记录数 | -**exam_standard_item(体检基本项目)** +**ass_psychology / ass_psychology_statistics(心理评估)** | 编码 | 规则描述 | 涉及字段 | 判定逻辑 | |------|----------|----------|----------| -| H05-D01 | 项目编码缺失 | `item_code` | `IS NULL OR = ''` | -| H05-D01 | 项目名称缺失 | `item_name` | `IS NULL OR = ''` | -| H05-D06 | 项目编码重复 | `item_code` | 存在多条记录使用同一项目编码 | +| A05-D01 | 评估得分或健康等级缺失 | `grade`, `phy_grade_level` | 任一为 NULL | +| A05-D03 | 评估类型枚举越界 | `type` | `NOT IN (1, 2, 3, 4)`(1=综合, 2=压力, 3=焦虑, 4=抑郁) | +| A05-D03 | 评估得分超出合理范围 | `grade` | 超出该评估量表的标准分值范围 | +| A05-D03 | 健康等级编码越界 | `phy_grade_level` | 不在数据字典预定义编码范围内 | +| A05-D04 | 异常标记与得分矛盾 | `is_exception`, `grade` | `is_exception = 1` 但 `grade` 在正常范围内 | +| A05-D04 | 统计值与实际评估记录数不一致 | `ass_psychology_statistics` 统计字段 | 统计值不等于 `ass_psychology` 中实际记录数 | +| A05-D05 | 关联问卷不存在 | `questions_id` | 引用的问卷在 `ass_questions` 中不存在 | -**exam_hospital_item(医院体检项目)** +**ass_daily_routine_online(在线穿戴起居评估)** | 编码 | 规则描述 | 涉及字段 | 判定逻辑 | |------|----------|----------|----------| -| H06-D05 | 关联标准项目不存在 | `linked_standard_item_id` | 引用的标准体检项目不存在 | -| H06-D05 | 关联医院不存在 | `hospital_id` | 引用的医院不存在 | +| A06-D01 | 异常标记缺失 | `is_exception` | `IS NULL` | +| A06-D03 | 睡眠时长越界 | `sleep_hour` | `< 0 OR > 1440`(分钟) | +| A06-D03 | 运动时长越界 | `sport_minute` | `< 0 OR > 1440`(分钟) | +| A06-D03 | 静息心率越界 | `resting_heart_rate` | `< 20 OR > 300` (bpm) | +| A06-D03 | 血氧饱和度越界 | `oxygen_saturation` | `< 50 OR > 100` (%) | +| A06-D03 | 压力值超出量程 | `pressure_value` | 超出传感器标定量程范围 | +| A06-D04 | 周结束日期早于开始日期 | `week_start_date`, `week_end_date` | `week_end_date < week_start_date` | +| A06-D04 | 睡眠+运动超过 24 小时 | `sleep_hour`, `sport_minute` | `sleep_hour + sport_minute > 1440` | -**exam_report_template(报告模板)** +**ass_daily_routine_paper(问卷起居评估)** | 编码 | 规则描述 | 涉及字段 | 判定逻辑 | |------|----------|----------|----------| -| H07-D01 | 模板名称缺失 | `template_name` | `IS NULL OR = ''` | -| H07-D03 | 模板状态枚举越界 | `status` | `NOT IN (0, 1)`(0=无效, 1=有效) | +| A07-D01 | 异常标记缺失 | `is_exception` | `IS NULL` | +| A07-D03 | 运动/睡眠/上网时长为负数 | `sport_value`, `sleep_value`, `time_of_net_value` | 任一 < 0 | +| A07-D03 | 上网时长超出合理范围 | `time_of_net_value` | `> 24`(小时) | +| A07-D03 | 运动/睡眠/上网等级枚举越界 | `sport_level`, `sleep_type`, `time_of_net_level` | 不在预定义枚举集合内 | +| A07-D05 | 关联问卷不存在 | `questions_id` | 引用的问卷在 `ass_questions` 中不存在 | -**exam_plan(体检计划)** +**ass_group_user / ass_group_user_detail(人群分类)** | 编码 | 规则描述 | 涉及字段 | 判定逻辑 | |------|----------|----------|----------| -| H08-D04 | 计划结束日期早于开始日期 | `date_range` (start, end) | `end_date < start_date` | -| H08-D05 | 关联医院不存在 | `hospital_id` | 引用的医院不存在 | +| A08-D03 | 人群分类枚举越界 | `user_group` | `NOT IN ('A', 'B', 'C', 'D', 'E')` | +| A08-D03 | 变更类型枚举越界 | `group_change_type` | `NOT IN (1, 2, 3)` | +| A08-D03 | 审核状态枚举越界 | `audit_status` | `NOT IN (0, 1, 2)` | +| A08-D03 | 归属年份越界 | `date_year` | 早于 2020 或为未来年份 | +| A08-D03 | 最近评估日期为未来日期 | `latest_assessment_date` | `latest_assessment_date > CURRENT_DATE` | +| A08-D03 | 明细类型枚举越界 | `detail_type` | `NOT IN ('A', 'B', 'C', 'D')` | +| A08-D03 | 数据类型枚举越界 | `data_type` | `NOT IN (1, 2)` | +| A08-D04 | 已归档但无归档时间 | `is_archived`, `archived_time` | `is_archived = 1` 且 `archived_time IS NULL` | +| A08-D05 | 关联人群分类主表记录不存在 | `group_user_id` | 引用的 `ass_group_user` 记录不存在 | +| A08-D06 | 同一用户同一年度多条活跃分类记录 | `user_id`, `date_year` | `COUNT(*) > 1 GROUP BY user_id, date_year`(排除已归档记录) | -**exam_quota(体检名额)** +**ass_questions(问卷答案)** | 编码 | 规则描述 | 涉及字段 | 判定逻辑 | |------|----------|----------|----------| -| H09-D03 | 名额总数为负数 | `total_quota` | `< 0` | -| H09-D03 | 已用名额大于总数 | `used_quota` | `used_quota > total_quota` | -| H09-D05 | 关联计划不存在 | `plan_id` | 引用的体检计划不存在 | +| A09-D02 | 问卷 JSON 格式非法 | `questions_json` | JSON 解析失败 | + +**ass_risk_diet_sports_prescription(饮食运动处方)** + +| 编码 | 规则描述 | 涉及字段 | 判定逻辑 | +|------|----------|----------|----------| +| A10-D01 | 评估正常但运动处方字段全为空 | `aerobic_*`, `strength_*`, `flexibility_*` | 关联评估为正常但所有运动字段均为 NULL | +| A10-D02 | 食物元素格式非法 | `f_elements` | 不符合 `meal_foodCode_amount;...` 格式 | +| A10-D03 | 能量等级越界 | `energy_level` | `< 0 OR > 10000` (kcal) | --- @@ -946,7 +976,7 @@ |------|------| | 健康咨询 | C (Consult) | | 应急就医 | E (Emergency) | -| 健康体检 | H (Health Checkup) | +| 健康评估 | A (Assessment) | | 营养管理 | N (Nutrition) | | 健康监测 | M (Monitor) | | 系统管理 | S (System) | @@ -960,7 +990,7 @@ | 系统管理 | 12 | 2 | 14 | 1 | 5 | 7 | **41** | | 健康咨询 | 3 | 0 | 12 | 5 | 8 | 0 | **28** | | 应急就医 | 5 | 2 | 10 | 4 | 3 | 0 | **24** | -| 健康体检 | 6 | 2 | 9 | 5 | 9 | 2 | **33** | +| 健康评估 | 6 | 4 | 31 | 11 | 3 | 1 | **56** | | 营养管理 | 4 | 3 | 14 | 5 | 4 | 2 | **32** | | 健康监测 | 1 | 2 | 14 | 9 | 1 | 3 | **30** | -| **合计** | **31** | **11** | **73** | **29** | **30** | **14** | **188** | +| **合计** | **31** | **13** | **95** | **35** | **24** | **13** | **211** |