跳转到主要内容

FSD m08 · 诊疗过程(care)

本册覆盖代码域 internal/domain/care(无新表——care_stage 落 ticket 列 TransitionStageInTx 唯一入口,阶段历史=lifecycle 行集,不建阶段记录表——DIF-M7 ①)。全局规则见 00-总则 §2(C 轴状态机 §2.2)。

m08 功能节目录

ID名称路由/入口
F8.01C 轴 8 阶段推进POST /api/care/:ticketId/stage
F8.02阶段资料版本组POST /api/care/:ticketId/documents/presign + /confirm
F8.03患者进度同步(F4.04 派生 + SSE ticket 事件)

F8.01 C 轴 8 阶段推进

对应 SRS:F-CARE-001 | 实现落点:internal/domain/care/service.go:50(AdvanceStage)/ticket/service.go(TransitionStageInTx)/ticket/pure.go:115(stageTransitions)/main.go:311(路由) | 操作入口:web 工单详情「阶段推进」操作(顾问)

1 功能定义

顾问推进患者医疗旅程 8 阶段(出发准备→到达接待→初诊→检查→确诊→治疗→康复→返程):C 轴白名单单向链推进,前置 status=IN_TREATMENT 严格校验;推进=care_stage 谓词 CAS + lifecycle(from/to 填 stage 值——A/C 两轴事件同表靠值区分) + op_log 同事务 → Commit 后三 key SSE。

2 触发条件与前置状态

care:write(CONSULTANT);工单 status='IN_TREATMENT'(否则 409 ErrNotInTreatment);COMPLETED 后查询可见但不推进。

3 输入与校验
字段类型校验
tostringstageTransitions 白名单(回退/跳段 409 ErrInvalidStageTransition)
reasonstring必填(关键操作审计)
4 处理流程
5 输出与结果状态

204;ticket.care_stage 已推进;患者进度页(F4.04 派生)对应步点亮;SSE ticket 事件双端刷新。

6 状态流转

C 轴单向链(NONE→PREP_DEPARTURE→…→DEPARTURE,无回退边——SRS 无回退语义);推进前置 status=IN_TREATMENT 由 service 层校验(白名单外-1:C 轴仅在就医中推进,tech-design §6.2 正交性)。

7 边界与异常
场景行为
工单不在 IN_TREATMENT409 ErrNotInTreatment(前置不满足)
回退/跳段409 ErrInvalidStageTransition
DEPARTURE 再推进409(终态无出边)
阶段历史查询lifecycle 行集(GET /api/lifecycle/ticket/:id 统一端点,from/to=stage 值)
8 权限与数据规则

care:write(CONSULTANT 专属——患者只读 F8.03);无阶段记录表(历史=lifecycle 行集,双日志轨兑现「状态表必配日志表」六原则——DIF-M7 ①)。


F8.02 阶段资料版本组

对应 SRS:F-CARE-002(文件上传、文字说明、自动归类、版本管理) | 实现落点:internal/domain/care/service.go:71(PresignStageDocument)/:81(ConfirmStageDocument)/ticket/service.go:164(InsertStageDocumentInTx)/ReplaceDocumentVersionInTx | 操作入口:web 工单详情「上传阶段资料」(选阶段+文件+说明,可替换既有组)

1 功能定义

顾问上传阶段资料(检查报告/处方等):直传两道(B 端内部操作不走 pub 面 gsid 配额——20MB/mime 由 Store 执行);stage 列落上传阶段(自动归类);版本组语义:缺省=新组首传(doc_group 事务内回填=id);显式 doc_group=替换(旧行 is_current=0 CAS + INSERT version_no+1 同事务)。

2 触发条件与前置状态

care:write;工单归属存在(替换时组须属于本单)。

3 输入与校验
端点/字段校验
presign {mime}pdf/jpg/png(Store 白名单)20MB
confirm {key, file_name, label, stage, doc_group?}Confirm 复核实际 size/mime;doc_group=nil=新组;显式 0=历史散件不可替换(400 ErrDocGroupInvalid);组不存在/不属于本单 400;替换并发 409 ErrDocGroupConflict
4 处理流程
5 输出与结果状态

文档 JSON(doc_group/version_no/is_current/stage/label…);同组下 current 唯一由事务保证;历史版本只软置 is_current=0 不物理删(审计要求)。

6 状态流转

medical_document 版本翻转(is_current 1→0 / 新行 1);doc_group=0=历史散件哨兵(M4 注册直传行恒 0,语义不可替换);lifecycle event=DOC_REPLACE(替换时)。

7 边界与异常
场景行为
doc_group=0 显式传入400(历史散件组不可作为替换目标——语义裁断)
组不存在/不属于本单400 ErrDocGroupInvalid
并发替换(is_current CAS 命中 0 行)409 ErrDocGroupConflict(回滚零副作用)
对象不存在/超限/mime 不符404/400(Confirm 第二道)
存量 doc_group=0 行不回填迁移(DIF-M7 ③ 申报——语义=不可替换历史散件)
8 权限与数据规则

care:write;uploaded_by=actor_id;版本读端点=共享 F5.04(GET /api/documents/:id/versions,归属谓词同款)。


F8.03 患者进度同步

对应 SRS:F-CARE-003(可视化进度条、阶段详情、待办事项、推送通知、报告下载) | 实现落点:派生视图 ticket/pure.go:68(DerivePatientSteps,消费在 F4.04)+ SSE ticket 事件(F8.01 Commit 后三 key) | 操作入口:app H5 #/pages/progress 进度页(实时刷新)

1 功能定义

患者端进度的同步机制=三层组合:①SSE 实时推送(ticket 事件携 status/care_stage);②REST 兜底(/pt/progress 派生重算);③派生八步投影(纯函数跨 A+C 两轴)。注意与 SRS 的差异:待办事项不做(MVP 无该实体——登记 DIF),推送通知=EMAIL outbox 仅注册/方案/支付三节点(无阶段级邮件——DIF-M7 ⑤ app 只读拉取口径)。

2 触发条件与前置状态

pt JWT;F8.01 推进后 SSE 自动到达;重连/打开页面走 /pt/progress 全量重算。

3 输入与校验

无业务入参(F4.04 同源)。

4 处理流程
5 输出与结果状态

进度步数组(done 标记)+ 阶段详情(ticket 列+版本组文档)+ 出行记录(F9.03)同页可见。

6 状态流转

只读消费;不反灌状态机(口径 B 投影纪律)。

7 边界与异常
场景行为
SSE 丢失事件重连补拉 + REST 全量重算兜底
待办事项未实现(SRS F-CARE-003 列出,MVP 裁剪——登记 99-附录差异台账 DIF-F8-1)
阶段级推送通知未实现(EMAIL 仅注册/方案/支付三节点;trip 无 SSE——DIF-M7 ⑦ 明确不做清单)
8 权限与数据规则

pt JWT + patient_id 谓词;SSE 事件经会话 key 定向(不广播他人数据)。