药房与发药流转(口径设计稿)
状态:已实装(2026-10-11)。与定稿口径的两处偏差:① 自动带出(代煎/膏方「已取」)流水操作人留空、note 写来源(定稿原文「取做操作用户」)——自动路径没有真人确认,留空更诚实;② 工作台检索合并为
customerKeyword单参数(姓名/手机同一模糊匹配)。测试落点与第五节一致(DispenseTest5 例 +DispenseHttpTest1 例)。 关联:服务端接口 处方组、数据模型prescriptions/decoction/paste、饮片出入库台账/api/v1/herb-stock、对齐清单 P1-32。
一、现状与缺口
中药处方链路已实装到「处方开出来 + 煎好可取 + 顾客领取」为止:
| 环节 | 现状 |
|---|---|
| 开方(药味/剂量/煎法/审方/计价) | 已实装 prescriptions + prescription_items |
| 代煎领取(待煎→可取→已取) | 已实装 decoction_status |
| 膏方领取(待制作→可取→已取) | 已实装 paste_status |
| 药房确认发药 | 无——顾客「取走」这一环没有落库动作,也没有操作人与时间 |
| 药房工作台 | 无——只能进处方查询页一条条翻 |
饮片出入库台账(/api/v1/herb-stock)已实装但为手工登记口径,与开方不联动;本稿不改变这一点。
二、口径(定稿)
- 发药 = 药房对处方的一次出库确认,落「谁在什么时候发出去的」,与钱无关(退费/收款在结算与 退费与日对账)。
- 状态机:
待发药(0) → 已发药(1),单向。重复发药报 400;不开放撤销(演示口径与代煎/膏方领取一致——单向流、无回退),发错由演示环境直接删处方处理。 - 两条既有子流自动带出发药,不要求药房重复点按钮:
- 代煎处方(
decoction_status推进到已取(3))→ 自动置已发药,流水记一条action=1、note=代煎领取自动发药; - 膏方(
paste_status推进到已取(3))→ 同上,note=膏方领取自动发药; - 两条自动流水不可逆:已取回不了头,发药也就回不了头。
- 代煎处方(
- 普通饮片处方(不代煎、非膏方)在药房工作台点「发药」,走
action=1手动流水。 - 发药不扣库存、不落金额快照:与既有计价口径一致(价格实时试算、未收录药名不计费),台账仍为手工登记。
- 药房工作台只处理中药处方:西药/成药处方未做,不在本稿范围。
数据
prescriptions 加三列:
dispense_status 0 待发药 / 1 已发药(默认 0)
dispense_time 发药时间(待发药为 NULL)
dispense_by 发药操作人 staff_id(自动带出时取做操作用户)
dispense_logs(发药流水,单向追加):
prescription_id 非空,索引
action 1 发药(本稿只有一种动作)
staff_id 操作人
note ≤100 字(自动带出时写明来源)
create_time / update_time索引:dispense_logs prescription_id、prescriptions dispense_status。无软删(演示口径无留痕)。
接口(需登录)
| 方法 | 路径 | 功能 |
|---|---|---|
| POST | /api/v1/prescription/{id}/dispense | 发药:待发药→已发药;已发药报 400「处方已发药」;处方不存在报 400 |
| GET | /api/v1/prescription/dispense/page | 药房工作台分页:dispenseStatus 可空(0 待发药 / 1 已发药)、customerName/phone 可模糊,id 倒序;联顾客姓名手机、代煎/膏方状态 |
三、非目标(本稿明确不做)
- 不做西药/中成药处方与药品目录(features.md「处方(西药/成药)」行仍为未实现)。
- 不做采购单据、盘点、报损、多库房(饮片库存仍为出入库台账口径)。
- 不做发药与开方的库存扣减联动。
- 不做退费/收款联动(归 退费与日对账)。
- 不做条码/扫码发药、分剂量分包、颗粒机对接。
四、web 落点
- 已实装
/prescription/dispensary(药房工作台,仅登录):待发药/已发药/全部三态切换带计数,顾客姓名/手机检索,列表=处方号/顾客(姓名+脱敏手机)/类型/剂数/药味数/代煎/膏方/发药状态与时间/开方时间,行操作「发药」(弹窗带可选备注 ≤100 字,单向确认;已发药行只读)。 - 处方查询页详情抽屉补发药状态与时间,附「确认发药」快捷按钮(带备注的发药走工作台);代煎/膏方推进「已取」即自动发药,无需重复点。
五、测试落点
DispenseTest:手动发药、重复发药 400、不存在 400、代煎领取自动带出发药、膏方领取自动带出发药、流水顺序与 note。DispenseHttpTest:发药 → 工作台分页过滤(dispenseStatus/customerName)→ 已发药不可重复发;未登录 401。