Files
zyt/artifacts/prescription-enhancements/order-backend.md
2026-09-09 12:18:17 +08:00

42 lines
4.0 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 处方业务订单后端变更
## 交付行为
- 取消(fulfillment_status=4)和退款(10)的未删除历史订单不再占用处方。已有 10 状态数据立即兼容,无需回填 refund_amount 或删除关联。
- 列表与详情的 `has_prescription_order`、业务处方驳回角标、风险置顶、作废校验和订单创建校验使用同一状态常量。其余非删除订单(含已完成、拒收、保留药方)仍占用处方。
- 现有退款逻辑:全额退款或退款后已付余额归零进入状态 10;部分退款且仍有余额则保留原履约状态。因此部分退款不会提前释放处方。
- 已通过审核的处方可以在释放后直接重新创建业务订单;已作废、已删除处方仍禁止创建。退款不重置处方审核。
- 历史业务订单、prescription_id、支付单关联和药房编号保持原样。处方详情中的历史打印收件/金额仍可回看最近未取消订单,新订单建立后自然优先新订单。
- 创建过程先取得处方行锁,随后检查有效订单,写入业务订单、收款关联、代收快照与日志,同一事务提交。两个同时提交的创建请求只有一个成功。日志失败回滚创建,避免半成品订单占用处方。
## 前端接口
`POST /adminapi/tcm.prescriptionOrder/editTime`
请求:`{"id":123,"create_time":"2026-09-09 10:20:30"}`。日期必须为有效且完整的 `YYYY-MM-DD HH:mm:ss`,按应用现有服务器时区解释。id 为正整数。
权限:`tcm.prescriptionOrder/editTime`,超管或明确授予该权限的角色可用。逻辑层显式校验,因此未执行菜单 SQL 时不会因中间件默认放行而越权。
成功数据:`{"id":123,"create_time":1788920430}`,具体时间取决于服务器时区;INT 库保留时间戳,DATETIME 历史变体保留规范日期字符串。返回数据只有 id/create_time。
本接口不受履约状态或远端药房快照锁影响,可以修正退款、完成、发货等订单的创建时间;遵守现有业务订单访问规则。只更新 create_time、自动 update_time,并记录 `edit_time` 操作日志(操作者、旧时间、新时间)。日志失败回滚;重复提交相同时间不重复写日志。其他额外请求字段不参与更新。
处方前端继续用 `has_prescription_order === 0` 判断是否已有有效业务订单,并保留现有作废/权限条件即可;不需要根据 refund_amount 做前端猜测。
## SQL 部署
执行 `server/sql/1.9.20260909/add_prescription_order_edit_time_menu.sql`,默认表前缀 zyt_。脚本可重复执行,将“修改业务订单创建时间”按钮放在处方业务订单列表菜单下;不会给任何普通角色自动授予权限。再于角色管理中给指定角色勾选该权限。
退款释放不涉及表结构或业务数据迁移。没有运行任何业务数据库 SQL。
## 验证
- `server/tests/PrescriptionOrderReleaseAndTimeTest.php`112 项真实 ORM/MySQL 断言通过。覆盖旧退款/取消/软删历史、所有活跃状态、真实全退/部分退/剩余退款/撤回流程、审批不重置、支付与远端关联历史、作废/删除限制、创建及时间编辑日志失败回滚、缺失权限/授权角色、严格时间校验、INT/DATETIME、重复时间幂等、两条独立 PHP/数据库连接并发创建(有/无退款历史)。
- `server/tests/PrescriptionOrderUnlinkPayOrderTest.php`131 项断言通过。
- `server/tests/OrderEditTimeContractTest.php`:通过。
- 修改 PHP 文件语法检查通过;使用仓库现有换行风格,`git -c core.whitespace=cr-at-eol diff --check` 对订单相关改动通过。
验证只使用显式启动的 127.0.0.1:13379 临时 MySQL 5.7,不初始化应用配置,不连接业务数据库。测试自行创建随机名测试库并在 finally 删除,独立 MySQL 已关闭,临时数据目录已清理。
重新运行新测试:先启动独立 MySQL,然后在 PowerShell 设置 `$env:ZYT_RX_ORDER_TEST_MYSQL_PORT='独立端口'`,运行 `php server/tests/PrescriptionOrderReleaseAndTimeTest.php`