WATER_ROUTING_STRATEGIES.md 5.4 KB

配送策略与模型

页面入口

  • /water-dispatch 右侧路线卡的“线路优化”:计算并比较当前完整路线;所有任务尚未出库时可确认应用站序。没有真实路线或包含已出库/结束任务时只预览。
  • “智能合单”先按片区、容量、时限分配批次,每批通过“选择策略并优化”取得优化站序,确认合单才保存。也允许沿用原分组站序。
  • 待派单任务的“配送计划”可填写出发地址、起止经纬度,并分别使用高德地图选点;只有保存计划才写入。

三种策略

service/routing/RouteStrategy.php 定义评分接口,RouteOptimizer 注入以下具体实现:

策略 目标与平局处理
ShortestDistanceStrategy 总距离、总完成用时、超时站数、超时秒数依次最小
FastestArrivalStrategy 总完成用时、距离、超时站数、超时秒数依次最小
DeadlinePriorityStrategy 超时站数、总超时秒数、总完成用时、距离依次最小

固定共同起点、既定批次成员、不返回仓库;最多8站穷举全部站序,求给定有向道路矩阵下的最优值。该结论不等于跨车辆、跨批次的全局最优,也不预测未来路况。超过8站明确要求拆批,不遗漏站点或悄悄退回直线。

总用时包含每站配送停留(0至120分钟);时限按预计完成配送时间计算,早到可直接配送,无最早服务时间窗。没有时限的站点不计超时;全部无时限时,时限策略等价于最快完成。

前后端交互

  1. 前端读取正式 dispatch/board 与 dispatch/route 接口,取得站序、起点、目的地、送达时限。
  2. 浏览器通过 collectWaterRoadMatrix 调用高德JS API:最短距离使用驾车策略2,其余策略0;逐对查询起点到各站、各站之间的有向道路成本。同位置为零成本但保留各个配送任务;无道路连接为null,网络/配额错误中止并提示。
  3. POST /core/water/dispatch,action=optimize:传入 task_ids/points/matrix/strategy/departure_at/service_minutes。后端从Eloquent模型重新读取任务,校验坐标、共同起点、片区、矩阵格式和上限,再执行策略。
  4. 返回原站序及优化后的里程、用时、逐站到达/完成时间、超时指标和10分钟预览token。高德数据由浏览器提供,属于调度估算输入;后端没有独立高德Web服务凭据或重新向高德核验矩阵。成本数据不用于扣款或库存数量计算。
  5. action=optimize_apply 携带 route_id/token 修改现有路线;合单通过原 plan_commit 的各组 optimization_token 引用预览。预览绑定操作员及任务状态/坐标/时限/站序指纹;过期、跨用户、漏站或任务变化均拒绝。
  6. 应用时按SKU→配送员→任务加锁,并复核状态和日期;仅更新站序及路线优化元数据,库存和权益不重复冻结。原合单的容量/片区/排班校验继续执行,原无策略请求哈希保持兼容。重复应用同token返回成功。

路线表 optimization 保存策略与当次估计,页面刷新后继续显示。底图用保存的策略重新查询道路,所以实时用时可能与保存时不同;地图用时不含配送停留,优化结果包含停留,页面已区分。

模型迁移

供水控制器、WaterBusiness、WaterDispatch、WaterLedger、WaterRoutePlanning及设备报告服务均通过 model/water 的Eloquent模型读写数据,不再使用Think ORM或直接 Db::table 查询业务表。模型包含配送、企业、商品、权益账户、路线、配送员、排班、订单、流水、套餐、代理、设备、内容及短期预览;配送/路线/账户定义模型关系。权限入口通过只读用途的WaterOperator/WaterOperatorRole模型读取原系统表。

WaterModel继承 support\Model,其底层为Illuminate Eloquent;固定模型白名单代替动态表名,统一搜索及分页口径。关闭自动时间戳,保留业务服务原 created_at/updated_at 更新规则。全部供水写入与事务使用同一Eloquent连接;测试和依赖业务服务的种子脚本也已迁移,防止两个ORM连接之间事务失效。框架原登录、菜单和其他业务模块仍保留既有Think实现。

运行与验证

  • 增量迁移:php scripts/migrate_water_routing.php --apply,新增可空 sa_water_route.optimization 和 sa_water_route_preview,不删除旧表、任务或账本。回退应用时保留元数据表列。
  • Eloquent需要原生mbstring。本机默认PHP未启用,可用 php -d extension=mbstring tests/water_routing_test.php;Windows用 scripts/start_water.ps1 启动,脚本按需通过进程级 PHP_INI_SCAN_DIR 加载 config/php/mbstring.ini,子进程继承,不修改全局php.ini。已有服务须先停止,避免重复监听。
  • 回归:69项供水业务、41项调度、30项库存流水、30项设备接入,以及24项策略/模型集成,共194项通过,测试业务事务回滚。前端 scripts/test-water-driving.mjs 覆盖有向道路矩阵、策略参数、取消、配额失败、不可达及分段不漏站。
  • 浏览器对生态园测试路线14验证三种策略调用成功,并应用时限优先;仅保存优化元数据及同一单站站序,当前仍5单34桶。测试路线为单站,站序不变属正常;独立三站测试已证明三种策略可给出不同顺序。