- docs/requirements/P0 PRD(交付开发·V1) - docs/requirements/服务机构端-P0范围清单、评估机构端-待设计清单 - docs/refs/ 数据字典与接口契约、产品介绍 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
48 KiB
投云长护险管理系统 · 数据字典与接口契约
第 4 步 · 交付物(V1 · 待确认)
本文档是什么:把第 3 步四份 PRD 里"用中文描述的对象、字段、状态",落成开发能直接照着建库、照着写接口的技术契约。这是 PRD 与代码之间的那一层——PRD 说"要什么",本文档说"怎么存、怎么传"。 前置文档:第 1 步产品大纲(已确认)→ 第 2 步总体方案与信息架构(V2 锁定 P0)→ 第 3 步四份 PRD(PRD-00 全局规范 / 01 护理员 APP / 02 机构后台 / 03 家属端)→ 本文档。 本期范围(写死):P0 四块(①待遇档案/②派单工单/③履约留痕/④质控闸门)。二期三块(⑤结算对账/⑥资质人员/⑦院长看板)只落结构,不落功能。 恒定总纲:既满足长护险政策要求,又让机构用得方便、不复杂。 编制:滇小构|2026-10-11
〇、读法说明(先看这三条,否则容易误用)
- 本文档的字段一律用英文键名(
snake_case),中文名只在"说明"列。- 理由:字段名要在数据库、接口、代码里统一;中文只在界面文案层出现。界面文案与字段名解耦,改名不改库。
- 每个字段标注【本期】/【预留】/【系统】三种标记:
- 【本期】=本期必须落库、必须进界面;
- 【预留】=本期只建字段、界面不出现(对应 PRD-00 §8 的 R1–R6);
- 【系统】=系统自动生成,人不填(如 ID、时间戳、MD5)。
- 本文档不含:接口的具体传输协议(HTTP/HTTPS 皆可)、服务器部署、加密算法选型——这些属于技术方案,不属产品文档。
一、术语与技术口径对齐(防开发歧义)
| PRD 里的中文 | 技术口径 | 说明 |
|---|---|---|
| 老人档案 | elder 表 |
主键 elder_id |
| 服务计划 | plan / plan_item 两张表 |
计划头 + 计划项目明细 |
| 工单 | order 表 |
一次服务=一条工单 |
| 服务留痕 | record 表(主记录)+ record_photo(照片)+ record_abnormal(异常) |
一对多 |
| 质控记录 | qc 表 |
一条留痕对应一条质控(可多次退回补正,留历史) |
| 服务项目 | svc_national(L1)/svc_local(L2)/svc_mapping(L3)/svc_org(L4) |
四层四表,对应 PRD-00 §2.2 |
| 人员与资质 | staff 表 |
【预留】R2 |
| 上报 | report 表 |
【预留】R4 |
| 结算 | settlement 表 |
【预留】R1 |
⚠️ 命名纪律:不得使用
checkin/clockin/punch作为留痕表名——术语表明确"打卡记录"是禁用说法,留痕=record。这是合规口径在代码层的落地(对应"不做打卡工具"的产品定性)。
二、数据库表总览
2.1 本期建表清单(12 张)
| # | 表名 | 中文 | 对应对象 | 本期用途 |
|---|---|---|---|---|
| 1 | org |
机构 | — | 机构信息、属地、账号根 |
| 2 | user |
账号 | — | 登录账号(后台三端角色) |
| 3 | staff |
人员 | ⑥〔预留〕 | 护理员/医护基础信息+资质字段预留 |
| 4 | elder |
老人档案 | ① | 待遇状态、等级、参保地(含 biz_line 多业务线预留 R8) |
| 5 | elder_status_log |
待遇状态变更日志 | ① | 状态变更留痕(不可无痕修改) |
| 6 | plan |
服务计划(头) | ② | 周期、等级、护理方式、确认信息 |
| 7 | plan_item |
服务计划(项) | ② | 计划内含哪些服务项目、频次、时长 |
| 8 | svc_national |
国家基准库 | L1 | 国家 36 项+官方代码(17 字符,字段 varchar(20) 留余量) |
| 9 | svc_local |
属地目录库 | L2 | 昆明 45 项;州市引用 L1 |
| 10 | svc_mapping |
属地↔国家映射 | L3 | 机构不可见 |
| 11 | svc_org |
机构项目库 | L4 | 机构勾选+配价 |
| 12 | order |
工单 | ③ | 一次服务任务(含 biz_line 多业务线预留 R8) |
2.2 本期建表清单(续,6 张)
| # | 表名 | 中文 | 对应对象 | 本期用途 |
|---|---|---|---|---|
| 13 | record |
服务留痕(主) | ③ | 签到签退、时长、语音、状态 |
| 14 | record_item |
留痕项目明细 | ③ | 每个项目的"做了/没做/免拍" |
| 15 | record_photo |
留痕照片 | ③ | 照片存储引用 |
| 16 | record_abnormal |
异常上报 | ③ | 9 宫格分类+语音+照片 |
| 17 | qc |
质控记录 | ④ | 放行/退回、异常处理 |
| 18 | report |
上报池 | R4〔预留〕 | 建表,本期不写业务数据 |
| 19 | settlement |
结算 | R1〔预留〕 | 建表,本期不写业务数据 |
另有 3 张"字典/配置表":
dict_abnormal_type(异常分类 9 宫格)/dict_photo_tier(拍照分档)/loc_config(统筹区配置,含目录来源)。合计 22 张。
三、核心表字段定义
通用字段(每张表都有,下文不再重复):
created_at(创建时间)/created_by(创建人)/updated_at(更新时间)/updated_by(更新人)/is_deleted(软删除标志,本期一律软删除,不物理删)。
3.1 org 机构表
| 字段 | 类型 | 必填 | 说明 | 标记 |
|---|---|---|---|---|
org_id |
varchar(32) | ✅ | 机构 ID(主键) | 【系统】 |
org_name |
varchar(100) | ✅ | 机构全称(须与备案名称一致) | 【本期】 |
org_type |
varchar(20) | ✅ | 机构类型:medical_care(医养结合)/nursing_home(养老机构)/home_care(居家上门)/home_individual(居家个体) |
【本期】 |
credit_code |
varchar(18) | ✅ | 统一社会信用代码 | 【本期】 |
loc_code |
varchar(12) | ✅ | 参保地/统筹区代码(决定加载哪套目录) | 【本期】 |
loc_name |
varchar(50) | ✅ | 统筹区名称(冗余,便于展示) | 【本期】 |
svc_source |
varchar(10) | ✅ | 本机构目录来源:national(引用国家36)/local(昆明本地45) |
【本期】 |
license_no |
varchar(50) | ○ | 定点服务机构编号 | 【本期】 |
address |
varchar(200) | ✅ | 机构地址 | 【本期】 |
contact_name / contact_phone |
varchar | ✅ | 联系人/电话 | 【本期】 |
bed_count |
int | ○ | 床位备案数(机构护理类必填) | 【本期】 |
sign_date |
date | ○ | 定点服务协议签订日(建档倒计时基准) | 【本期】 |
3.2 user 账号表
| 字段 | 类型 | 必填 | 说明 | 标记 |
|---|---|---|---|---|
user_id |
varchar(32) | ✅ | 账号 ID | 【系统】 |
org_id |
varchar(32) | ✅ | 所属机构 | 【本期】 |
login_name |
varchar(50) | ✅ | 登录名(手机号) | 【本期】 |
real_name |
varchar(30) | ✅ | 真实姓名 | 【本期】 |
role |
varchar(50) | ✅ | 角色(可多值,逗号分隔):nurse(护理员)/leader(组长)/qc(质控员)/admin(机构管理员)/director(院长);如 director,admin、leader,qc |
【本期】 |
staff_id |
varchar(32) | ○ | 关联 staff 表(护理员角色必填) |
【本期】 |
status |
varchar(10) | ✅ | active/disabled |
【本期】 |
⚠️ 权限落地纪律:角色不写在界面里做开关,写在后端权限校验。判权=角色并集(一人可兼多角色,见 PRD-00 §6.4 补充 2)。"院长不改数据"修正为"仅当账号只持
director时,写接口返回 403"——若同时持qc/admin(院长兼质控/兼管理员是常态),按并集放行。 ⚠️ 唯一例外:禁止"自审自放行"——同一账号录入的记录不得由自己质控放行(校验record.created_by ≠ qc.operator_id),否则返回4001。
3.3 staff 人员表(含 R2 预留)
| 字段 | 类型 | 必填 | 说明 | 标记 |
|---|---|---|---|---|
staff_id |
varchar(32) | ✅ | 人员 ID | 【系统】 |
org_id |
varchar(32) | ✅ | 所属机构 | 【本期】 |
name |
varchar(30) | ✅ | 姓名 | 【本期】 |
id_card_no |
varchar(18) | ✅ | 身份证号(实名制,加密存储) | 【本期】 |
person_code |
varchar(20) | ○ | 医保人员编码(按国家编码规范:LN+6位区划+6位顺序=14 位;字段留余量 varchar(20)) |
【预留】R4 |
phone |
varchar(15) | ✅ | 手机号(APP 登录用) | 【本期】 |
job_type |
varchar(20) | ✅ | nurse(护理员)/nurse_medical(医护)/manager |
【本期】 |
work_type |
varchar(10) | ✅ | fulltime/parttime |
【本期】 |
entry_date / leave_date |
date | ○ | 入职/离职日(离职自动移出可派列表) | 【本期】 |
employ_status |
varchar(10) | ✅ | on_job/leave(离职)/transfer |
【本期】 |
cert_type |
varchar(30) | ○ | 证书类型(长期照护师/养老护理员/护士执业证/医师执业证) | 【预留】R2 |
cert_no |
varchar(50) | ○ | 证书编号 | 【预留】R2 |
cert_level |
varchar(20) | ○ | 等级(五级/四级/三级) | 【预留】R2 |
cert_expire |
date | ○ | 有效期至 | 【预留】R2 |
cert_status |
varchar(20) | ○ | valid/expiring/expired/none(本期人工填) |
【预留】R2 |
cert_verify_url |
varchar(200) | ○ | 联网查验结果留痕(如 osta.org.cn 截图路径) | 【预留】R2 |
group_leader_id |
varchar(32) | ○ | 归属组长(=该护理员所在"组"的组长 staff_id;本组界定的唯一依据,见 PRD-00 §6.4 补充 4)。可为空=机构未分组,由 admin 在人员管理指定 |
【本期】 |
⚠️ 本期数据不空转纪律(PRD-00 §8.1 第 2 条):
cert_*五字段本期就要人工录入——签约机构手上都有证书信息,先录进去,二期直接可用,不浪费这一期的录入工作。 ⚠️ 界面纪律:本期cert_*字段只在"人员管理(精简版)"里可填可看,不做到期提醒、不做禁派拦截(那是二期)。
3.4 elder 老人档案表(① 待遇档案)
| 字段 | 类型 | 必填 | 说明 | 标记 |
|---|---|---|---|---|
elder_id |
varchar(32) | ✅ | 老人 ID | 【系统】 |
org_id |
varchar(32) | ✅ | 所属机构 | 【本期】 |
loc_code |
varchar(12) | ✅ | 参保地/统筹区(→ 数据铁律 3,全链路取目录依据) | 【本期】 |
name |
varchar(30) | ✅ | 姓名 | 【本期】 |
gender |
char(1) | ✅ | M/F |
【本期】 |
birth_date |
date | ✅ | 出生日期(系统算年龄) | 【本期】 |
id_card_no |
varchar(18) | ✅ | 身份证号(加密) | 【本期】 |
phone |
varchar(15) | ○ | 联系电话 | 【本期】 |
address |
varchar(200) | ✅ | 居住地址(服务上门用) | 【本期】 |
guardian_name / guardian_phone |
varchar | ○ | 紧急联系人 | 【本期】 |
insur_no |
varchar(30) | ✅ | 医保参保号 | 【本期】 |
insur_type |
varchar(10) | ✅ | employee(职工)/resident(居民) |
【本期】 |
biz_line |
varchar(20) | ✅ | 业务线:ltci(长护险)/self_pay(自费)/residence(居养)/civil_subsidy(民政补贴)——本期恒 ltci,多业务线二期扩展 |
【预留】R8 |
assess_level |
varchar(20) | ✅ | 失能等级:sev_1(重度一级·最高级)/sev_2/sev_3 |
【本期】 |
care_level |
varchar(20) | ✅ | 护理等级:care_1(一级·最高级)/care_2/care_3 |
【本期】 |
assess_date |
date | ✅ | 评估结论日期 | 【本期】 |
assess_org |
varchar(100) | ○ | 评估机构名称 | 【本期】 |
benefit_start / benefit_end |
date | ✅ | 待遇有效期起止 | 【本期】 |
treat_status |
varchar(20) | ✅ | 待遇状态(见 §3.5 状态机) | 【本期】 |
status_source |
varchar(10) | ✅ | 状态来源:manual(人工)/api(接口)——本期恒 manual |
【预留】R5 |
status_change_date |
date | ○ | 状态最后变更日 | 【本期】 |
hosp_start / hosp_end |
date | ○ | 住院起止日(treat_status = 住院暂停 时必填) |
【本期】 |
photo_tier_override |
json | ○ | 机构对本老人拍照分档的加严覆盖(只能加严,不能放宽) | 【本期】 |
note |
text | ○ | 备注(含"注意事项"区块内容,如吞咽障碍提示) | 【本期】 |
⚠️ 等级显示纪律:
assess_level/care_level在界面上必须带"最高级"字样——sev_1显示为"重度失能一级(最高级)",care_1显示为"一级护理(最高级)"。这是 PRD-00 §2.5 写死的,不允许前端省略。 ⚠️ 认知衰退边界:assess_level只反映日常活动 6 项自评+正式评估结论;认知/感知觉 7 项须上门评估,系统不筛。此口径须出现在任何展示等级的页面注脚。
3.5 elder_status_log 待遇状态变更日志(数据铁律 2 落地)
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
log_id |
varchar(32) | ✅ | 主键 |
elder_id |
varchar(32) | ✅ | 老人 ID |
from_status / to_status |
varchar(20) | ✅ | 变更前后状态 |
change_reason |
varchar(200) | ✅ | 变更原因(必填,不允许空) |
source |
varchar(10) | ✅ | manual/api |
operator_id |
varchar(32) | ✅ | 操作人 |
evidence_file |
varchar(200) | ○ | 佐证材料(如出院小结照片路径) |
changed_at |
datetime | ✅ | 变更时间 |
⚠️ 关键设计:待遇状态的每一次变更都必须写一条日志,且
change_reason强制必填。 理由:treat_status直接决定"能不能服务、能不能计费"。如果不留痕,"住院期间照做"这类问题将无法追溯——而官渡区公示的高频事由正是"账账不符、记录不详"。这条日志是机构自己的护身符。
3.6 plan 服务计划表(② 服务计划)
| 字段 | 类型 | 必填 | 说明 | 标记 |
|---|---|---|---|---|
plan_id |
varchar(32) | ✅ | 计划 ID | 【系统】 |
elder_id |
varchar(32) | ✅ | 老人 ID | 【本期】 |
org_id |
varchar(32) | ✅ | 机构 ID | 【本期】 |
plan_period_start / plan_period_end |
date | ✅ | 计划周期(月度/周期) | 【本期】 |
care_level |
varchar(20) | ✅ | 计划对应的护理等级(改等级须重新制定计划) | 【本期】 |
care_mode |
varchar(20) | ✅ | 护理方式:inst_medical/inst_nursing/home_org/home_individual |
【本期】 |
item_count |
int | ✅ | 计划项目数(系统按属地规则校验) | 【本期】 |
item_count_rule |
varchar(100) | ○ | 校验依据快照(如"昆明·医养结合·一级护理 ≥18 项") | 【本期】 |
extra_item_count |
int | ○ | 附加项数(≤5) | 【本期】 |
week_freq / month_hours |
int | ○ | 居家类的每周次数/每月小时数(昆明居家必填) | 【本期】 |
plan_status |
varchar(20) | ✅ | draft(草稿)/active(执行中)/changed(已变更)/ended(已结束) |
【本期】 |
confirm_elder |
tinyint | ○ | 老人/家属确认(0/1) | 【本期】 |
confirm_guardian |
tinyint | ○ | 家属确认(0/1,可选,不强制) | 【本期】 |
confirm_time |
datetime | ○ | 确认时间 | 【本期】 |
change_from_plan_id |
varchar(32) | ○ | 变更来源计划(改计划时新建一条,指向旧计划,旧计划不删) | 【本期】 |
⚠️ 计划变更纪律:改计划=新建一条计划 + 指向旧计划,绝不原地改。 理由:政策要求"服务与计划相吻合"。若原地改,历史工单会突然"对上"一个当时不存在的计划——这恰恰是"篡改数据"的典型形态。留旧版=留证据。
3.7 plan_item 计划项目明细表
| 字段 | 类型 | 必填 | 说明 | 标记 |
|---|---|---|---|---|
plan_item_id |
varchar(32) | ✅ | 主键 | 【系统】 |
plan_id |
varchar(32) | ✅ | 计划 ID | 【本期】 |
svc_id |
varchar(32) | ✅ | 引用 svc_local 或 svc_national 的 ID(按机构属地取) |
【本期】 |
svc_name_snapshot |
varchar(100) | ✅ | 项目名快照(防目录改名后历史计划显示错乱) | 【本期】 |
svc_code_snapshot |
varchar(20) | ○ | 国家代码快照(上报基准,二期用) | 【预留】R4 |
freq_type |
varchar(20) | ○ | 频次类型:daily/weekly_n/monthly_n/as_needed |
【本期】 |
freq_value |
int | ○ | 频次值(如每周 3 次填 3) | 【本期】 |
duration_min |
int | ○ | 单次时长(分钟) | 【本期】 |
photo_tier |
varchar(10) | ✅ | 拍照档位:must(必拍)/optional(可拍)/free(免拍) |
【本期】 |
caution_note |
text | ○ | 注意事项(显示在护理员 APP M4,如"进食慢、小口、坐起90度") | 【本期】 |
is_medical |
tinyint | ✅ | 是否医疗护理类(决定是否需医护资质) | 【本期】 |
need_cert |
tinyint | ✅ | 是否要求持证(医疗类=1) | 【本期】 |
⚠️
svc_name_snapshot不是冗余,是必需:目录会更新(国家曾"合并同类项"、昆明可能改版)。快照保证历史计划与历史留痕永远显示当时的项目名,否则三年前的服务记录会突然"变成"另一个项目名——这在稽核中是致命的。
3.8 服务项目四层表(L1–L4)
svc_national(L1 国家基准库 · 36 项)
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
nat_id |
varchar(32) | ✅ | 主键(NAT_ 前缀) |
nat_code |
varchar(20) | ✅ | 国家项目代码(经复核定型为 17 字符:L+0000+大类(1生活照护/2医疗护理)+类别2位+项目序号2位+0+010000;字段留余量) |
nat_name |
varchar(100) | ✅ | 项目名称 |
nat_category |
varchar(20) | ✅ | 大类:life/medical |
nat_sub_category |
varchar(50) | ○ | 类别 |
recommend_staff |
varchar(50) | ○ | 推荐服务人员 |
recommend_duration |
int | ○ | 推荐时长(分钟) |
is_medical |
tinyint | ✅ | 是否医疗护理类 |
version |
varchar(20) | ✅ | 版本(如 2025-24号) |
svc_local(L2 属地目录库)
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
loc_id |
varchar(32) | ✅ | 主键(LOC_ 前缀) |
loc_code |
varchar(12) | ✅ | 适用统筹区代码(530100=昆明等) |
local_item_name |
varchar(100) | ✅ | 本地项目名(昆明 45 项实际名称) |
local_category |
varchar(50) | ○ | 本地分类(昆明四大类:基础生活照料/非治疗性护理/功能维护/医疗护理) |
svc_time |
varchar(50) | ○ | 服务时间要求(昆明原文) |
min_freq |
varchar(50) | ○ | 最低服务频次(昆明原文) |
staff_qual |
varchar(100) | ○ | 护理人员资质要求(昆明医疗类:仅限医疗机构/医养结合机构及持证医护人员) |
is_medical |
tinyint | ✅ | 是否医疗护理类 |
source_doc |
varchar(100) | ✅ | 来源文件(如 昆医保2021-45项) |
map_status |
varchar(20) | ✅ | 映射状态:mapped(可映射国家)/local_only(仅属地执行) |
svc_mapping(L3 属地↔国家映射 · 机构不可见)
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
map_id |
varchar(32) | ✅ | 主键(MAP_ 前缀) |
loc_id |
varchar(32) | ✅ | 属地项目 ID |
nat_id |
varchar(32) | ○ | 对应国家项目 ID(可空=无法映射) |
map_type |
varchar(20) | ✅ | 五值(与《逐项映射表》§0.2 一致):one_to_one(完全对应)/many_to_one(被合并,多个昆明项→国家 1 项,如头面清洁等→擦浴)/partial(近似对应,内涵不完全重合)/local_only(仅属地,国家目录无此项)/national_only(国家新增,昆明无、国家有) |
map_note |
varchar(200) | ○ | 映射说明(我方内部技术资产) |
status |
varchar(20) | ✅ | confirmed(人工核定)/pending(待核) |
svc_org(L4 机构项目库)
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
org_svc_id |
varchar(32) | ✅ | 主键(ORG_ 前缀) |
org_id |
varchar(32) | ✅ | 机构 ID |
src_type |
varchar(10) | ✅ | 来源层级:local(从昆明45选)/national(从国家36选) |
src_id |
varchar(32) | ✅ | 来源项目 ID |
is_enabled |
tinyint | ✅ | 是否开展(机构只能开关,不能删) |
biz_line |
varchar(20) | ✅ | 业务线:ltci/self_pay/residence/civil_subsidy——本期恒 ltci,多业务线二期扩展 |
price |
decimal(10,2) | 【预留】R1 | 服务价格(本期可填可看,不参与结算) |
price_effective |
date | 【预留】R1 | 价格生效日 |
is_new_national |
tinyint | ○ | 是否"国家新增项"(昆明目录没有、国家有:吞咽功能训练等 5 项 → 必须显式提示) |
⚠️ 五条多属地纪律在表结构上的落地(对应 PRD-00 §2.4):
- 走配置不走代码 → 新增州市=插一行
loc_config+ 一批svc_local,代码零改动;- 必须可映射 →
svc_mapping保证每项可追;map_status = local_only的项上报时自动排除;- 机构不可改目录 →
svc_org只有is_enabled和price可改,其余字段只读;- 国家新增项显式提示 →
is_new_national = 1的项在机构勾选页独立区块显示,不隐藏;- 映射表不对外 →
svc_mapping表不提供任何机构侧接口。
3.9 order 工单表(③ 派单工单)
| 字段 | 类型 | 必填 | 说明 | 标记 |
|---|---|---|---|---|
order_id |
varchar(32) | ✅ | 工单 ID | 【系统】 |
elder_id |
varchar(32) | ✅ | 老人 ID | 【本期】 |
biz_line |
varchar(20) | ✅ | 业务线:ltci/self_pay/residence/civil_subsidy——本期恒 ltci,多业务线二期扩展 |
【预留】R8 |
plan_id |
varchar(32) | ✅ | 来源计划(L2 硬锁落地) | 【本期】 |
org_id |
varchar(32) | ✅ | 机构 ID | 【本期】 |
service_date |
date | ✅ | 服务日期 | 【本期】 |
time_slot_start / time_slot_end |
datetime | ✅ | 服务时段(用于冲突检测) | 【本期】 |
assignee_id |
varchar(32) | ○ | 派给谁(staff_id) |
【本期】 |
assign_time |
datetime | ○ | 派单时间 | 【本期】 |
assign_mode |
varchar(20) | ○ | 派单方式:manual/batch_recommend(批量必须人工确认) |
【本期】 |
order_status |
varchar(20) | ✅ | 工单状态(见 PRD-00 §4.2 七态) | 【本期】 |
item_list |
json | ✅ | 本次工单项目的快照(来自 plan_item) |
【本期】 |
need_photo |
tinyint | ✅ | 本次是否含必拍项(含则签退前强制拍照) | 【本期】 |
cancel_reason |
varchar(200) | ○ | 取消原因(order_status = 已取消 必填) |
【本期】 |
reschedule_log |
json | ○ | 调单记录(调过几次、谁调的、为什么) | 【本期】 |
qualification_check |
varchar(20) | 【预留】R2 | 资质校验结果(本期恒 unchecked) |
【预留】R2 |
billable |
tinyint | 【预留】R1 | 可计费标志(本期恒 1,不做结算判断) | 【预留】R1 |
price_snapshot |
decimal(10,2) | 【预留】R1 | 服务时点价 | 【预留】R1 |
settle_period |
varchar(20) | 【预留】R1 | 结算周期(如 2026-10) |
【预留】R1 |
exception_flag |
tinyint | 【预留】R6 | 是否异常费用 | 【预留】R6 |
⚠️ 一种硬冲突、其余软提示(PRD-02 §B2 落地):派单/调单时,只对"同一
assignee_id且time_slot重叠"返回硬错误(拒绝保存);其余情况(跨区距离远、项目不擅长、当日已排满)一律只返回提示、不拦。 理由:拦截要准,不能把便利性拦掉。 组长宁愿微信群说一句就改了,也不会忍受系统处处拦住。
3.10 record 服务留痕表(③ 履约留痕)
| 字段 | 类型 | 必填 | 说明 | 标记 |
|---|---|---|---|---|
record_id |
varchar(32) | ✅ | 留痕 ID | 【系统】 |
order_id |
varchar(32) | ✅ | 来源工单(L3 硬锁落地) | 【本期】 |
elder_id / assignee_id |
varchar(32) | ✅ | 老人/护理员 | 【本期】 |
checkin_time |
datetime | ✅ | 签到时间(系统自动取,不允许手工改) | 【本期】 |
checkout_time |
datetime | ○ | 签退时间(同上) | 【本期】 |
duration_min |
int | ○ | 实际时长(=签退-签到,系统算,人不能改) | 【本期】 |
checkin_lat / checkin_lng |
decimal(10,6) | ○ | 签到定位(定位失败不阻塞,允许空) | 【本期】 |
locate_status |
varchar(20) | ✅ | ok/failed/denied(失败照常可提交) |
【本期】 |
record_status |
varchar(20) | ✅ | 留痕状态:draft/submitted/pending_qc/passed/returned/reported |
【本期】 |
voice_file |
varchar(200) | ○ | 语音备注(免拍档留痕四要素之一) | 【本期】 |
offline_flag |
tinyint | ✅ | 是否离线创建(补传标记) | 【本期】 |
client_md5 |
varchar(32) | ✅ | 客户端指纹(防重复上传、防篡改) | 【系统】 |
submit_time |
datetime | ○ | 提交时间 | 【系统】 |
actual_duration_tier |
varchar(10) | ○ | 时长档位(<5 分钟标黄,供质控参考) | 【系统】 |
⚠️ 三条硬设计(都是合规点):
- 签到签退时间、时长一律系统取,接口不接受客户端传入的这两个值——防"补录时间"(对应"不得伪造/变造数据");
- 定位失败不阻塞提交(
locate_status = failed照常落库)——老人家里弱网是常态,不能因为定位不到就不让干活;- 时长不设"最低时长硬拦",只记
actual_duration_tier,由质控看,不由系统罚(对应 PRD-01 §4.7)。
3.11 record_item 留痕项目明细表
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
record_item_id |
varchar(32) | ✅ | 主键 |
record_id |
varchar(32) | ✅ | 留痕 ID |
svc_id |
varchar(32) | ✅ | 项目(来自 plan_item) |
exec_result |
varchar(20) | ✅ | 执行结果:done(做了)/undo_not_done(本次未执行)/undo_refused(老人拒绝) |
undo_reason |
varchar(100) | ○ | 未执行原因(选择项,非自由文本) |
extra_flag |
tinyint | ○ | 是否临时加项(APP M2 §4.6) |
photo_required |
tinyint | ✅ | 本次是否需拍照(由 photo_tier 推导) |
⚠️ 措辞纪律落到数据层:
exec_result的枚举值必须是undo_not_done(本次未执行)而不是not_done(未做)。 理由:家属端与导出文书都要显示这个状态。"未做"含指责意味,"本次未执行"是事实陈述——这条在字段命名层就要卡住,不让前端有机会写"未做"。
3.12 record_photo 留痕照片表
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
photo_id |
varchar(32) | ✅ | 主键 |
record_id |
varchar(32) | ✅ | 留痕 ID |
svc_id |
varchar(32) | ○ | 关联项目(必拍项时) |
file_path |
varchar(300) | ✅ | 存储路径(压缩后 ≤500KB) |
file_size |
int | ✅ | 字节数(校验压缩是否生效) |
visible_to_family |
tinyint | ✅ | 是否对家属可见(本期默认 0) |
upload_batch |
varchar(32) | ○ | 补传批次号(离线补传用) |
keep_until |
date | ✅ | 保留至(补传后至少 7 天) |
⚠️
visible_to_family本期恒为 0(PRD-03 §4.2 决策)。字段先建好——等用户定了"是否给机构开关",只改默认值或加一个开关,不改结构。
3.13 record_abnormal 异常上报表
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
abnormal_id |
varchar(32) | ✅ | 主键 |
record_id |
varchar(32) | ✅ | 留痕 ID |
elder_id / reporter_id |
varchar(32) | ✅ | 老人/上报人 |
abnormal_type |
varchar(30) | ✅ | 分类(9 宫格,必选):皮肤异常/跌倒/呛咳进食/意识精神/发热感染/管路异常/疼痛/排泄异常/其他 |
abnormal_desc |
text | ○ | 描述(可选,语音转写或手填) |
voice_file |
varchar(200) | ○ | 语音(可选) |
has_photo |
tinyint | ○ | 是否附照片(可选) |
notify_status |
varchar(20) | ✅ | 通知状态:pending/notified(上报后即时推送机构) |
handle_status |
varchar(20) | ✅ | 处理状态:new/processing/handled |
handle_result |
varchar(200) | ○ | 处理结论 |
link_plan_change |
varchar(32) | ○ | 是否联动变更计划(指向新 plan_id) |
⚠️ "一切可选、分类必选"的落地:只有
abnormal_type是必填,其余全可选(PRD-01 §M3)。 理由:需填会导致"不报",而"发现了没进系统"是最严重的断链。宁要一条没人名没照片的异常,也不要一条没报上来的压疮。
3.14 qc 质控记录表(④ 质控闸门)
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
qc_id |
varchar(32) | ✅ | 主键 |
record_id |
varchar(32) | ✅ | 被质控的留痕 |
qc_type |
varchar(20) | ✅ | normal(常规)/auto_push(系统主动推送)/recheck(退回后复检) |
push_reason |
varchar(100) | ○ | 推送原因(五类):必拍未拍/时长异常/异常上报未处理/住院状态仍有派单/项目数与计划不符 |
qc_result |
varchar(20) | ○ | passed(放行)/returned(退回) |
qc_note |
varchar(200) | ○ | 质控意见(退回时必填) |
qc_staff_id |
varchar(32) | ✅ | 质控员 |
qc_time |
datetime | ✅ | 质控时间 |
pass_time |
datetime | ○ | 放行时间(→ 进上报池,二期) |
first_qc_id |
varchar(32) | ○ | 首次质控 ID(退回补正后重提,形成链) |
⚠️ 全量非抽检(落库层面保证):每一条
record_status = submitted的留痕,都必须生成一条qc记录(由定时任务扫描生成,qc_type = normal)。 理由:抽检=总有漏的;而**"先质控再上报"是国家明文**(PRD-00 hard lock L5)。全量生成 qc 记录,是把"不抽检"从人工承诺变成数据结构。
四、状态机 ↔ 字段值对照(一份表说清"什么状态能干什么")
4.1 待遇状态 elder.treat_status(十态)
⚠️ 2026-10-12 修订(与
P0 PRD §3.2/§7.4对齐):七态 → 十态,新增waiting_period/review_waiting/transferring。本表为分册同源表,改合稿必改此处(防"合稿改了、分册没改")。
| 值 | 中文 | 可否新建计划 | 可否派单 | 可否服务 | 可否计费 |
|---|---|---|---|---|---|
pending_file |
待建档 | ✅ | ❌ | ❌ | ❌ |
waiting_period |
待起付(等待期/垫付期) | ✅ | ✅ | ✅(仅垫付台账) | ❌ |
active |
正常享受 | ✅ | ✅ | ✅ | ✅ |
hosp_pause |
住院暂停 | ❌ | ❌ | ❌ | ❌ |
review_waiting |
复评等待期 | ❌ | ❌ | ❌ | ❌ |
transferring |
跨统筹区转移中 | ❌ | ❌ | ❌ | ❌ |
dead |
死亡 | ❌ | ❌ | ❌ | ❌ |
long_away |
长期异地居住 | ❌ | ❌ | ❌ | ❌ |
benefit_expired |
待遇到期 | ❌ | ❌ | ❌ | ❌ |
terminated |
已终止 | ❌ | ❌ | ❌ | ❌ |
接口层强制:任何创建
order的请求,先校验elder.treat_status ∈ {active, waiting_period},不满足直接拒绝(不是警告)。这就是 L1 的代码落地。 ⚠️waiting_period是 L1 唯一例外:允许建order,但其record打is_prepaid=1、billable=0(不进结算池)。
4.2 工单状态 order.order_status(八态)
| 值 | 中文 | 后续可流转到 |
|---|---|---|
to_assign |
待派单 | assigned / cancelled |
assigned |
已派单 | serving / cancelled / **to_assign**(调单) |
serving |
服务中 | done / abnormal |
done |
已完成 | —(仅补正留痕) |
abnormal |
异常 | done / cancelled |
cancelled |
已取消 | — |
overdue |
逾期未做 | → 风险预警 |
not_met |
未遇(扑空) | 已到访未服务;到访时间+定位+原因必留 → 推组长决策 |
4.3 留痕状态 record.record_status(六态)
| 值 | 中文 | 说明 |
|---|---|---|
draft |
草稿 | 服务中;离线也在此状态 |
submitted |
已提交 | 护理员签退提交 |
pending_qc |
待质控 | 进入质控队列(自动生成 qc 记录) |
passed |
已放行 | 质控通过 → 进上报池〔二期〕 |
returned |
已退回 | 可补正后重提 |
reported |
已上报 | 〔二期〕 |
五、接口契约
说明:本节定义接口的语义契约(谁调、传什么、返什么、什么情况拒),不定义传输协议细节。三端(APP/后台/家属端)共用同一套后端接口。 统一响应结构(所有接口):
{
"code": 0, // 0=成功;非0=失败(见 5.1 错误码)
"message": "成功", // 面向开发;错误时给可读原因
"data": { }, // 业务数据
"hint": "" // ⚠️ 面向用户的"怎么解"提示(硬锁拒绝时必须返回)
}
5.1 统一错误码表(硬锁与业务规则)
| code | 含义 | 前端处置 |
|---|---|---|
0 |
成功 | — |
1001 |
无有效待遇,不可服务(L1) | 显示 hint,禁止进入服务页 |
1002 |
无有效计划,不可派单(L2) | 引导"先制定计划" |
1003 |
无有效工单,不可录痕(L3) | 拒绝提交 |
1004 |
留痕不完整,不可进上报池(L4) | 列出缺什么 |
1005 |
未质控放行,不可上报(L5) | 提示先质控 |
1006 |
资质不匹配(本期仅提示,不拦截)(L6) | 仅提示,允许继续 |
2001 |
派单时间冲突(同人同时段重叠) | 硬拒,提示换人或改时 |
2002 |
计划项目数不满足属地规则 | 仅提示,可保存 |
3001 |
必拍项未拍照,不可签退 | 硬拒,引导拍照 |
3002 |
定位失败(非错误,仅标记) | 允许提交 |
4001 |
越权:非本机构/非本人数据 | 403 |
⚠️
1006的设计是刻意的:资质校验本期返回一个"提示级"错误码而不是"拒绝级"。 这样二期只需把1006从"提示"改成"硬拒",前端代码基本不用动——这就是"预留位"在接口层的价值。
5.2 本期接口清单(按 P0 四块)
A · 待遇档案(①)
| 接口 | 方法 | 说明 | 关键校验 |
|---|---|---|---|
/elder/create |
POST | 新建老人档案 | 建档时限倒计时;loc_code 必填 |
/elder/detail |
GET | 档案详情 | 权限:本机构 |
/elder/status/change |
POST | 变更待遇状态 | change_reason 必填;写 elder_status_log |
/elder/status/log |
GET | 状态变更历史 | 只读 |
/elder/list |
GET | 老人列表(后台 B1) | 支持按待遇状态/护理等级筛 |
B · 服务计划(②)
| 接口 | 方法 | 说明 | 关键校验 |
|---|---|---|---|
/plan/create |
POST | 制定计划 | 项目数按属地规则校验(2002 提示级) |
/plan/change |
POST | 变更计划(新建+指向旧) | 不原地改;旧计划转 changed |
/plan/detail |
GET | 计划详情 | 含 item_list |
/plan/confirm |
POST | 老人/家属确认 | 可选 |
/svc/local/list |
GET | 按参保地加载属地目录 | 昆明→45项;州市→36项 |
/svc/org/list |
GET | 机构项目库 | — |
/svc/org/config |
POST | 勾选+配价 | 只允许改 is_enabled/price |
/svc/org/new-national |
GET | 国家新增项列表 | 昆明机构必须显式展示 |
C · 派单工单(③)
| 接口 | 方法 | 说明 | 关键校验 |
|---|---|---|---|
/order/generate |
POST | 由计划生成工单 | L2:无计划拒绝 |
/order/assign |
POST | 派单 | L1:待遇非 active 拒绝;2001 时间冲突硬拒;1006 资质提示 |
/order/reassign |
POST | 调单 | 记 reschedule_log;≤3 步 |
/order/batch-recommend |
GET | 批量推荐 | 仅返回推荐,必须人工确认后逐个 assign |
/order/today |
GET | 护理员今日任务(M1) | 仅本人 |
/order/cancel |
POST | 取消工单 | cancel_reason 必填 |
/order/detail |
GET | 工单详情(M4) | 含注意事项区块 |
D · 履约留痕(③)
| 接口 | 方法 | 说明 | 关键校验 |
|---|---|---|---|
/record/checkin |
POST | 签到 | 服务器取时间;定位失败不阻塞(3002) |
/record/item/save |
POST | 保存项目执行 | exec_result 枚举 |
/record/photo/upload |
POST | 上传照片 | 压缩校验 ≤500KB;返回 photo_id |
/record/checkout |
POST | 签退提交 | 必拍未拍拒绝(3001);计算时长 |
/record/offline/sync |
POST | 离线补传 | client_md5 去重;静默不弹窗 |
/record/detail |
GET | 留痕详情 | — |
/abnormal/report |
POST | 异常上报 | 仅 abnormal_type 必填 |
/abnormal/list |
GET | 异常列表(后台 B4) | 主动推送来源 |
E · 质控闸门(④)
| 接口 | 方法 | 说明 | 关键校验 |
|---|---|---|---|
/qc/pending/list |
GET | 待质控列表(含主动推送) | 全量,非抽检 |
/qc/detail |
GET | 质控详情 | 含留痕全文与照片 |
/qc/pass |
POST | 放行 | 写 qc_result=passed、pass_time |
/qc/return |
POST | 退回 | qc_note 必填 |
/qc/exception/link |
POST | 异常联动改计划 | 生成新 plan_id 并回填 link_plan_change |
F · 家属端(③)
| 接口 | 方法 | 说明 | 关键校验 |
|---|---|---|---|
/family/bind |
POST | 绑定(姓名+手机号后4位) | 只看自家 |
/family/elder |
GET | 我家老人信息 | 过滤 visible_to_family |
/family/records |
GET | 服务记录列表 | 不返回价格字段 |
/family/ack |
POST | 可选确认 | 非必做,不记录"未确认"为异常 |
/family/feedback |
POST | 反馈 | — |
5.3 硬锁在接口层的落点总表(L1–L6)
| 锁 | 接口 | 触发条件 | 结果 |
|---|---|---|---|
| L1 | /order/assign、/record/checkin |
elder.treat_status ∉ {active, waiting_period} |
1001 拒绝;waiting_period 放行但打 is_prepaid=1、不计费 |
| L2 | /order/generate |
无 plan_status=active 的计划 |
1002 拒绝 |
| L3 | /record/* |
无有效 order |
1003 拒绝 |
| L4 | /qc/pass |
留痕缺必填要素 | 1004 拒绝 |
| L5 | /report/*〔二期〕 |
无 qc_result=passed |
1005 拒绝 |
| L6 | /order/assign |
staff.cert_status ≠ valid |
1006 仅提示,不拒绝(二期改硬拒) |
六、⭐ 二期预留位落地对照(R1–R6,逐项核对)
对应 PRD-00 §8。本节证明"只加不改"是可验证的——二期每项功能,都能在本期表结构里找到它要用的字段。
| # | 二期功能 | 本期已建的字段/表 | 二期要新增的 | 要改的 |
|---|---|---|---|---|
| R1 | 结算对账 | order.billable/price_snapshot/settle_period;svc_org.price |
settlement 表(字段已预定义,见 §6.1)、申报页、导出格式 |
无 |
| R2 | 资质人员 | staff.cert_* 五字段;order.qualification_check |
到期提醒任务、禁派逻辑、资质管理页 | 无(1006 改硬拒属逻辑开关) |
| R3 | 院长看板 | 数据层可直接聚合现有表 | 聚合视图、图表页 | 无 |
| R4 | 上报池与接口 | report 表;order/plan_item 的 official_no/loc_code/代码快照 |
适配层实现、上报页 | 无 |
| R5 | 医保状态同步 | elder.status_source(人工/接口) |
接口实现 | 无(只改字段值来源) |
| R6 | 异常费用 | order.exception_flag/exception_reason/handle_deadline |
异常处理页、超时提醒 | 无 |
6.1 report 上报表(本期建表,不写入业务数据)
| 字段 | 类型 | 说明 | 标记 |
|---|---|---|---|
report_id |
varchar(32) | 主键 | 【系统】 |
record_id / order_id |
varchar(32) | 来源 | 【预留】 |
report_status |
varchar(20) | to_report/reported/rejected/corrected |
【预留】R4 |
report_time |
datetime | 上报时间 | 【预留】R4 |
official_no |
varchar(50) | 官方受理号 | 【预留】R4 |
loc_code |
varchar(12) | 上报归属统筹区 | 【预留】R4 |
nat_code_snapshot |
varchar(20) | 上报时使用的国家代码 | 【预留】R4 |
adapter_result |
json | 适配层返回(A/B/C 档) | 【预留】R4 |
6.2 settlement 结算表(本期建表,不写入业务数据)
| 字段 | 类型 | 说明 | 标记 |
|---|---|---|---|
settle_id |
varchar(32) | 主键 | 【系统】 |
org_id / settle_period |
varchar | 机构/结算周期 | 【预留】R1 |
amount_total |
decimal(12,2) | 申报总额 | 【预留】R1 |
amount_passed |
decimal(12,2) | 审核通过额 | 【预留】R1 |
amount_rejected |
decimal(12,2) | 拒付额 | 【预留】R1 |
submit_date / pay_date |
date | 申报日/拨付日 | 【预留】R1 |
exception_reason |
varchar(200) | 差异说明 | 【预留】R6 |
handle_deadline |
date | 说明超时(3 工作日) | 【预留】R6 |
⭐ 这就是"一次设计到位、免得返工"的验证:二期要做结算,
settlement表的字段今天就定好了,二期只写页面和申报逻辑,不碰任何已上线的表。
6.3 接口契约层预留
| 预留项 | 本期定义(写死) | 二期 |
|---|---|---|
| 适配层输入输出格式 | 按国家编码规范定稿(机构编码 13 位 LH+区划+序号、人员编码 14 位 LN+区划+序号、项目代码 17 字符:L+0000+大类+类别2位+序号2位+0+010000) |
直接实现 |
| A/B/C 三档 | A 人工登记/B 文件导入导出【本期】/C 专线前置机【预留】 | 实现 C 档 |
错误码 1006 |
提示级(不拦) | 改拒绝级 |
⚠️ 项目代码位数说明:原写"14 位"系归纳有误。经专项复核定型为 17 字符,且仅内部逻辑推演、未与官方原件对照 ⇒ 正式上报前必须以官方电子版核对。详见《20261011-国家36项代码复核报告(位数问题解构)》。字段长度一律按
varchar(20)设计,留余量。
七、⭐ 数据安全与留痕(合规条款的工程落地)
这一节不是"技术选型",是政策明文要求在本系统的落地方式。巡查表"信息管理 15 分"里的实名制、动态管理、材料调取,全都落在这一节。
| 要求(政策) | 工程实现 | 对应巡查点 |
|---|---|---|
| 一人一档 | elder 表 + 全链路 elder_id 外键,order/record/qc 均可回溯到人 |
信息管理 |
| 实名制管理 | staff.id_card_no 加密存储、唯一约束;user 绑定 staff_id |
信息管理第 1 条 |
| 不可伪造/变造 | ①checkin/checkout 服务器取时;②elder_status_log 必填原因;③record 软删除不物理删;④client_md5 防重复提交 |
巡查高频扣分项 |
| 记录与计划/数据/考勤相吻合 | plan_item → order.item_list → record_item 三级快照一致(同一 svc_id) |
服务管理 |
| 材料调取(巡查时能取证) | 全表导出接口,按老人/时间段/项目导出,导出即合规版式 | 档案管理 6 分 |
| 数据保留 | 照片 keep_until(补传后 ≥7 天),业务数据软删除保留 |
档案管理 |
| 隐私号/不展示真实号码 | 家属端接口一律不返回护理员真实手机号(扫码端走隐私号,与 C 端口径一致) | 合规红线 |
⚠️ 一条容易忽略的工程纪律:
record与qc表一律软删除——is_deleted置 1,原始记录永久保留。 理由:长护险数据是基金支付凭证。若允许物理删除,"事后删记录"就变成可能,那就丧失了留痕的意义。软删除+软删除也要留操作日志,是"不可无痕修改"的最后一道工程防线。
八、⚠️ 与文档/规范的差异与待确认(不阻塞开发)
| # | 事项 | 影响 | 处置 |
|---|---|---|---|
| 1 | 45↔36 完整逐项映射表(svc_mapping 全量数据) |
昆明机构上报准确性 | ✅ 已完成,见《20261011-昆明45项↔国家36项-逐项映射表(L3数据·可入库)》(45 行逐项数据)。遗留风险已转移至下方第 2 项(代码位数) |
| 2 | 国家项目代码复核 | 上报字段准确性 | ✅ 已完成内部复核(位数问题已解构,规则定型 17 字符,3 项短形态已补正)——见《20261011-国家36项代码复核报告(位数问题解构)》。⚠️ 仍须官方电子版最终确认(复核为逻辑推演,非原件对照);字段按 varchar(20) 设计 |
| 3 | 各州市 loc_config 是否另有自建目录 |
属地目录库内容 | 签约前逐一核实(推定=36 项) |
| 4 | 昆明 45 项是否已更新 | 属地目录库内容 | 建议 0871-65919196 核实 |
| 5 | 照片保留期限(政策要求 vs 机构成本) | 存储策略 | 有地方要求"保存 10 年";建议按属地要求配置化,不当统一硬编码 |
⚠️ 处置原则:这 5 项都不阻塞开发启动——前 4 项是"数据内容"和"配置值",不是"结构";唯第 2 项须在真正对接上报前收口(因上报字段错=功能不可用),但不影响 P0 四块的开发(P0 不含上报)。
九、本份交付说明
9.1 本文档定义了什么
- 22 张表清单与用途
- 6 张核心表的完整字段定义(老人档案/计划/工单/留痕/质控/机构)
- 服务项目四层表(L1–L4)字段结构
- 状态机 ↔ 字段值对照(待遇/工单/留痕)
- 统一响应结构与错误码表(含 L1–L6 落点)
- 本期接口清单 6 组 40+ 接口
- R1–R6 二期预留位的逐项落地对照
- 数据安全与留痕的工程实现(政策条款 → 代码)
9.2 下一步可做
| 序 | 文档 | 内容 |
|---|---|---|
| 1 | 45↔36 完整映射表(数据表) | 补 §8 第 1 项,昆明每一项对应到国家项目 |
| 2 | 界面线框稿 | 把 PRD 页面画成可看的样子 |
| 3 | 开发排期与模块拆分 | 按 P0 四块拆开发任务 |
云南投云科技有限公司 编制:滇小构|2026-10-11(第 4 步 · 数据字典与接口契约 · 待确认)