实施日期:2026-09-11。适用于平台后台供水配送,不执行支付、退款或外部消息发送。
正常路径:待派单 → 已派单 → 配送中 → 已签收 → 路线返仓结算。
异常路径:配送中 → 部分签收/拒收(待退回核对)→ 仓库收回完好及破损货物(已退回)→ 路线返仓结算。已退回任务可为全部未送达桶数创建关联重送任务,重送重新走建单、派单、出库、签收流程。
empty_in_vehicle。有正式路线时,客户交空桶不代表仓库已入库。good_qty + damaged_qty = quantity - delivered_qty。完好满桶恢复可用,破损转入 sku.damaged_qty 隔离,全部未送达权益解除冻结,不扣除。任务变为 returned,释放有效任务键。实际交空桶 + 差异损失 = 车载待交空桶。实交进入仓库空桶,损失累计至 empty_lost_qty,必须填写核对说明。禁止缺行、多行、重复规格或未解释数量差异。WaterFulfillment:应用层命令服务,负责事务、锁、持久化和审计;统一承接旧 complete 入口的实际签收结算,移除 WaterBusiness 中重复的签收账务。fulfillment/DeliveryState:显式状态策略;异常处理限定合法来源状态,禁止已出库直接取消。fulfillment/DeliverySettlement:无数据库副作用的数量计算,分别计算实收及退回的库存、权益变动。WaterDelivery 提供原任务、重送及履约事件关联。redelivery_of 唯一索引保证每次失败尝试最多生成一个关联重送;重送再次失败可延续链条。新任务仍校验企业/规格启用状态、可用权益和可用库存。WaterDeliveryEvent 由业务入口只追加,保存规范化请求、哈希、操作人、时间及账务快照。相同操作同内容重试成功,内容不同明确拒绝;不覆盖原签收数据。事件键由服务端动作和任务/路线ID组成,不依赖客户端随机值。POST /core/water/dispatch:
| action | 主要字段 | 权限 |
|---|---|---|
| receive | id, accepted_qty, empty_returned, receiver, reason | dispatch:write |
| return_receive | id, good_qty, damaged_qty, note | dispatch:write + inventory:write |
| redeliver | id(原任务), date, note | dispatch:write |
| route_settle | route_id, items:[{sku_id,actual,lost}], note | dispatch:write + inventory:write |
以上权限均带 water: 前缀,由 WaterController 核对启用账号、角色及菜单权限;不自动扩大代理权限。
GET /core/water/dispatch/history?id=...:dispatch:read,返回任务履约及路线交接记录。GET /core/water/dispatch/route?id=...:新增 fulfillment(state/can_settle/empty_items)及 settled_at/by/note。settlement_routes。待退回计入跨日待办,当天签收/退回的逾期任务继续留在当天列表供查询或重送;任务池桶数按剩余未送达桶数计算。返仓列表展示所选日期及之前全部未结算路线,明确不随任务池关键词/片区过滤,以免漏掉已结束任务的路线。在 server 目录执行 php -d extension=mbstring scripts/migrate_water_fulfillment.php --apply。默认不带 --apply 只输出计划。
增量增加字段、索引和事件表,不重算历史库存/权益,不伪造历史实收。历史已签收任务没有 received_at 时显示“历史已签收”,原签收重试不会再入账。旧 complete API仍兼容;正式页面使用需填写收货人的 receive。
迁移把具有已登记配送员、尚未关联路线的旧 assigned/transit 任务归档到独立 LEGACY-FULFILL-<任务ID> 路线,并保存系统迁移事件(actor_id=0)。本地任务10/11已关联,原状态、桶数、地址和资金/库存/权益不变。缺少已登记配送员时迁移明确中止数据关联事务,需先修复档案。重复执行不重复关联。内部历史服务测试中无路线的直接签收保留旧空桶入仓语义;所有当前实际在途任务已具备正式路线。
部署顺序:迁移 → 加载后端新代码 → 构建前端。当前本地HTTP进程已通过监控加载,8787实测新接口正常;前端4173提供生产构建。回退不能只换旧代码:新 returning/returned、车载空桶和未结算路线需要新逻辑,已产生新履约数据后禁止直接删除字段或回退到旧状态机。