Files
2026-09-09 12:18:17 +08:00

4.0 KiB
Raw Permalink Blame History

处方业务订单后端变更

交付行为

  • 取消(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.php112 项真实 ORM/MySQL 断言通过。覆盖旧退款/取消/软删历史、所有活跃状态、真实全退/部分退/剩余退款/撤回流程、审批不重置、支付与远端关联历史、作废/删除限制、创建及时间编辑日志失败回滚、缺失权限/授权角色、严格时间校验、INT/DATETIME、重复时间幂等、两条独立 PHP/数据库连接并发创建(有/无退款历史)。
  • server/tests/PrescriptionOrderUnlinkPayOrderTest.php131 项断言通过。
  • 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