# backend/record Specification ## Purpose 定义服务机构端履约留痕域的后端行为——签到/签退/项目执行/照片/离线补传/垫付台账与结转。 ## Requirements ### Requirement: 签到 `POST /record/checkin` MUST 校验 L3(order 存在、order_status ∈ {assigned, serving}、elder/assignee 匹配);checkin_time 服务器取时(不接受客户端传入);定位失败 3002 不阻塞(locate_status=failed/denied);建 record(serving)并返回 record_id。 #### Scenario: 服务器取时 - **WHEN** 签到 - **THEN** checkin_time 由服务端生成,客户端传入被忽略 #### Scenario: 定位失败不阻塞 - **WHEN** 签到但定位失败 - **THEN** 标记 locate_status=failed,照常提交(3002) ### Requirement: 签退提交 `POST /record/checkout` MUST 校验必拍未拍(3001 硬拒 + 拒拍出路 is_refused_photo=1);checkout_time/duration_min 服务器取时;record_status 转 submitted;waiting_period 老人 is_prepaid=1、billable=0(3004 仅标记)。 #### Scenario: 必拍未拍硬拒 - **WHEN** 必拍项未拍照且未走拒拍出路 - **THEN** 返回 3001 拒绝签退 #### Scenario: 垫付标记 - **WHEN** 等待期老人签退 - **THEN** record.is_prepaid=1、billable=0,不计费 ### Requirement: 项目执行 `POST /record/item/save` MUST exec_result ∈ {done, undo_not_done, undo_refused};svc_id 落本机构 L4;photo_required 快照自 order.item_list。 #### Scenario: 措辞纪律 - **WHEN** 项目未执行 - **THEN** exec_result 用 undo_not_done(非 not_done) ### Requirement: 照片上传 `POST /record/photo/upload` MUST 校验文件 ≤500KB;visible_to_family=0;keep_until 补传后 ≥7 天。 #### Scenario: 超限拒绝 - **WHEN** 上传超过 500KB 的照片 - **THEN** 拒绝并提示压缩 ### Requirement: 离线补传 `POST /record/offline/sync` MUST 按 client_md5 幂等去重(重复提交返回已存在,静默不弹窗)。 #### Scenario: 去重 - **WHEN** 同 client_md5 重复补传 - **THEN** 幂等返回,不重复落库 ### Requirement: 垫付台账与结转 `waiting_period` 老人留痕 MUST `is_prepaid=1`、`billable=0`;`POST /record/prepaid/carryover` MUST 勾选若干 is_prepaid=1 记录 → 生成对应正式记录(复制、is_prepaid=0、source_prepaid_of=原 id),原记录保留只读、不改原始时间戳(签到时间/定位/照片仍是原始值)。 #### Scenario: 结转不改原始时间戳 - **WHEN** 结转垫付记录 - **THEN** 新记录签到时间/定位/照片仍为原始值,仅标记来源 ### Requirement: 留痕列表与详情 `GET /record/list`(admin B3,按 elder/assignee/日期/状态筛选)与 `GET /record/detail` MUST 返回留痕列表/详情(含项目、照片、异常、定位、垫付标记)。 #### Scenario: 质控查看留痕 - **WHEN** 质控员查询留痕列表与详情 - **THEN** 返回时间/项目/照片/异常/定位/垫付标记