# 032 计划(历史评估与双地图实施) ## 2026-10-23 实施计划(当前) **Goal:** 普通/多店外卖、自配送运费和闪送双地图可切换回滚。 **Architecture:** 统一选择器与自部署 HTTP 客户端;外卖矩阵和闪送有序路线保持独立,Google 原实现保留。新选址通过后端聚合。 **Tech Stack:** JDK21 / Spring Boot / HttpClient4 / fastjson2;Flask / OSRM。 **Spec:** [spec.md](spec.md) 当日实施契约覆盖旧评估计划及历史假设。 ### 约束 后端沿用当前新分支,地图沿用 master;不另建 worktree。按已确认方案继续实施,无需重复确认。App 代码不改,交付接入文档。不自动提交/推送/部署/执行 SQL。外卖车型默认 car 保持现有口径;闪送按用户车型。外卖失败拒绝,闪送直线估时降级;历史订单不重算,改价提示重报。 ### Review Focus 切回 Google 后三类订单均恢复;矩阵顺序/重复/部分失败;车型与鉴权正确;旧订单与v2的距离/运费快照一致;地址反查不替换点选坐标。 ### 实施任务(每批先补失败测试,再实现,再运行相关回归) 1. 共同配置与算路:新增 `app/map/MapSourceSelector`、`SelfHostedMapClient`,修改闪送两个提供器;新增外卖 SelfHosted/DistanceSource 矩阵提供器。客户端接口 `getObject(String, Map)`、`getArray(String, Map)`、`post(String, Object)`;统一超时/鉴权,严格解析距离,显式传 profile。 2. 计价与旧接口:修改 FoodDeliveryPromotionQuoteService/UserOrderController/OrderPromotionHelper/PromotionCalcResponse;报价返回道路米数,普通单保存真实 jvli,旧单金额差异拒绝;旧路线接口转换 legs/distance/duration/overview_polyline。 3. 选址:新增 app/map/MapLocationController、MapLocationService、DTO 与测试;两来源搜索/详情/反查/附近返回统一字段,显式 token/参数、国际化错误;编写 frontend-app-integration.md。 4. 地图配套和商家同步:地图侧补启用读保护缺令牌启动前拒绝;后端手动平台同步稳定门店ID/停用,提供索引发布步骤,不引入默认外部写入任务。 5. 收口:JDK21 定向与模块构建、Python/页面测试、diff/凭据检查,更新文档;真实部署/地址体检/路段/性能/App联调分别记录未执行,不能勾完成。 ### 历史评估计划(保留备查) ### 2026-10-28 追加计划 1. 在 `app/map/LegacyMapLocationControllerTest`、`MapLegacyLocationServiceTest` 覆盖旧入口的 SELF_HOSTED 成功/空结果/非法坐标/服务异常、无 Google/Baidu/Redis 调用,以及 GOOGLE 回滚原结构/语言。先观察旧控制器仍调用 Google 的失败。 2. 新增 `MapLegacyLocationService` 专门转换旧地址响应,使用既有 `SelfHostedMapClient`;`SysFileInfoController` 在旧外部调用前判断共用来源。只在地图 `app.py` 放宽已受限 nearby 最大半径到10km并补边界测试,保留旧10km搜索范围。 3. JDK21 定向检查通过后执行合并后的完整 reactor package,地图 Python/前端既有测试;核查源码、分支及凭据差异。前端只读,不修改页面,不自动切流或执行 SQL。 4. 只读核对 tokyo-map 的运行版本、路网/数据集、schema、双车型和矩阵;形成真实发布差距与受控操作方案。未执行的部署、存量数据体检、法规和负载验收保留明确状态,不能以本地测试代替。 ### 2026-10-26 执行记录与实现决策 最终本地验证:完整reactor测试1484项(admin1314/system168/framework2)0失败/错误/跳过,package成功;地图64项及页面测试通过。I001–I008本地交付,V001–V003保留真实部署验收。无提交/推送/迁移/部署。 - 按既有新分支原地实施,没有创建额外worktree;地图既有master脏修改保留。未自动提交、推送、部署或执行迁移。 - 外卖/闪送及新地址统一选择器;外卖独立矩阵,闪送有序路线,服务端令牌/超时统一。Google代码保留。 - 普通旧请求核对道路运费并保存jvli;父子type不一致直接拒绝,防止子外送绕过。v2持久化同源公里数。 - 旧getyunfei改为道路矩阵,保留响应字段。旧getluxianjvli按当前唯一结算调用方的“收货点在前、门店在后”参数转为配送方向;绘图保留,计价米数用同源矩阵,避免Directions与矩阵选路差异。这一兼容接口暂多一次请求,新完整报价不增加。 - 新地址使用命名空间ID,切换后详情仍按ID来源;逆查保留点选坐标和近似精度。旧Google地址端点/画面保留,App未改。 - 商家同步由有权限管理员明确触发,稳定门店ID;普通营业休息不作为删除依据,索引发布须独立手动完成。 - 复核发现的三个Important均补回归:父子类型绕过、直线报价与道路校验不一致、旧结算坐标反向。测试中缺Spring国际化容器按现有静态测试方式隔离,不改变业务错误返回。 - 发布验收范围固定为真实OSRM/PostGIS、存量地址、机车法规、性能和前端联调;本地构建通过不代表这些已经完成。 > 执行方式:在当前会话直接完成用户已确认的四项评估;不创建分支,不交付生产实现。本文件是研究与隔离试验计划,不是地图全量切换实施计划。 **Goal:** 确定现有 OSRM v5.27.1 是否足以承载当前配送机车规则,以及借鉴 Valhalla 的最小范围和明确限制。 **Architecture:** 以已部署机车 Lua 的文件指纹和固定上游提交为基线;使用合成小路网及临时 OSRM 容器验证规则。测试候选只在临时目录生成,不覆盖地图仓库或服务器正式文件。 **Tech Stack:** Python 标准库、SSH、OSRM v5.27.1 Docker、OSM XML 夹具、Lua API v4。 **Spec:** [osm-requirements-assessment.md](osm-requirements-assessment.md)。用户于 2026-10-12 同意执行其中基线核对、规则对照、小样本验证和最终结论四项工作。 ## 约束 - 不修改生产 Lua、foodie 业务源码、App 或数据库;不重建台湾全境路网、不部署 Valhalla、不切换线上流量。 - 临时容器只绑定服务器回环地址,限 CPU/内存,测试结束停止;不操作既有服务容器生命周期。 - 不读取或记录数据库密码、地图管理令牌等凭据。SSH 使用既有登录配置,不把私钥纳入文件。 - 固定 Valhalla 源码提交和 OSRM 镜像版本;候选参数仅是可行性探针,不是运营批准参数。 - 仅验证技术规则和合成样本,不宣称台湾全境合法通行、两段式转弯、真实 ETA 或生产 P99 已达标。 ## 核验重点 1. 本地 master、双车型分支、部署源文件及容器内文件是否一致。 2. 机车禁行优先于路线偏好,不以“降低优先级”替代禁止通行。 3. 路线权重与行驶时间分别设置,软偏好不直接把 ETA 放大。 4. 单行、车型转向限制、吸附失败和不可达应保持明确语义。 5. 动态时间限制、交通、坡度/密度与两段式转弯不能仅凭 Lua 名称或常量复制就认定支持。 ## 任务与文件 - 基线及规则评估:记录于 `model-evaluation.md`,包含固定版本、文件哈希、规则对照和结论。 - 可复现小样本:`evaluation/run_model_probe.py`,生成隔离夹具和一次性候选 Lua,执行真实 OSRM 请求。 - 机器证据:`evaluation/model-probe-results.json`,由脚本生成,包含验证结果、来源哈希及清理结果,不含凭据。 - 状态追踪:[tasks.md](tasks.md),只标记本次四项评估,不把评估通过当作生产实现完成。 执行顺序:先固定来源和部署指纹,再对照规则,随后运行隔离试验,最后依据实际结果写出结论和未验证项。脚本命令为: ```powershell & 'C:/Users/99029/.cache/codex-runtimes/codex-primary-runtime/dependencies/python/python.exe' specs/032-self-hosted-map-integration/evaluation/run_model_probe.py ``` 验收:四项均有可审计证据;失败样本明确分类;原有生产文件指纹和服务容器保持不变;不自动提交或推送。