# FT546WMS 影子 V3.3:升级和回滚 适用现场:WMS 已运行影子 V3/V3.1/V3.2,数据库包版本为 `2026-09-03-3`。 分支仍为 `test/ft546wms-shadow-v3-20260903`。这不是正式算法切换。 ## 这次改什么 自动出库影子请求的项目号改取出库明细 `spare4`,不再取仓库配置中的 `FT546`。 补齐产品、spare1/2/3、项目、fid 对电压、unit 对相别的可选筛选,以及库位锁定、状态、托盘一致性检查。 按计划数量减已分配数量观察。新旧输入通过 `predicate_version` 区分,不把历史样本重新认定为新版本通过。 共享规划器和 Legacy 存储过程、调用入口没有修改。升级只新增 `alg` 表的可空字段、替换影子刷新过程、使旧快照失效并更新影子包版本。保留决策日志和累计指标。 注意:影子后台仍会增加数据库读取和计算开销,不能承诺对性能绝对零影响。升级过程需要一次计划内短暂停机。 ## 第一步:先准备,不停程序 让服务器 AI 核实 IDEA 当前运行的 **WMS** 项目目录、分支、提交号、环境变量和日志目录,备份本地配置,并导出现有影子日志。 不要操作 WCS 或 WCS 影子程序,也不要因进程里有 `wcs` 字样就停止它。 在已经确认的 WMS 项目根目录打开 CMD,执行: ```cmd git status --short git branch --show-current git rev-parse HEAD git fetch origin ``` 保存当前提交号作为回退点。工作区有改动时先停止同步,让服务器 AI 保存和核对改动,不要强制覆盖。 获得本次已推送的交付提交号后,再执行 `git pull --ff-only` 并核对 `git rev-parse HEAD`。 本地未推送的代码不能靠服务器 `git pull` 获得,不要猜提交号。 IDEA 重新加载 Maven,使用当前可用的 JDK 17 和 Maven 3.9.11 编译测试。 首次可能需要下载 H2 测试依赖;H2 不进入运行包,依赖问题应在停机前解决。 程序运行期间不要点 Build Project、热替换或重启;可在独立准备目录做构建,确认完成后再安排维护窗口。 ## 第二步:先在数据库备份副本演练 本地 Java 测试和 SQL 2016 语法解析不能代替 SQL Server 实际升级验证。 让服务器 AI/DBA 在隔离 SQL Server 上恢复备份(数据库名保持 `FT546-wms`),先验证升级成功、重复执行无破坏、升级失败可回滚。 不要在生产库创建“测试作业”,不要触发业务回放。演练失败就不进入下一步。 ## 第三步:低峰时停止 WMS,升级影子表 1. 在 IDEA 停止当前那个 WMS 实例,确认其 PID 已退出。不要同时启动稳定 WMS 和影子 WMS。 2. 等待至少 130 秒,确认没有其他 WMS 影子实例仍在运行。 3. 在项目根目录的 CMD 执行下面命令(使用现有 Windows 集成认证): ```cmd call scripts\shadow-v3-install.cmd "10.6.22.6,1433" "FT546-wms" v33 ``` 必须看到 `V33_UPGRADE_OK`(重复执行为 `V33_ALREADY_INSTALLED`)和 `INSTALL_OK mode=v33`。 现场已有 V3,**不要用 `clean`,不要卸载后重装,不要执行旧版 v2 升级来绕过错误**。 遇到心跳、清单、字段或锁超时错误,保存完整输出并停止。脚本对本次变更执行事务回滚;不要修改 manifest 绕过检查。 ## 第四步:只启动一次,保持影子配置 沿用现场已有 Run Configuration,只核对下面两个值,其他连接、日志和限流设置不要随意覆盖: ```text FORTUCKY_SHADOW_ENABLED=true FORTUCKY_ALGORITHM_MODE=SHADOW ``` 在 IDEA 启动一次 WMS。记录启动时间和时区。不要设置 `ACTIVE`。 旧快照已失效,后台会重新生成;刚启动还没有新快照或样本,不代表需要再次重启。 先检查登录、查询,再由现场人员按正常流程验证入库、自动出库、手动出库。 让服务器 AI 仅做只读核对: ```sql SELECT package_id, package_version FROM alg.shadow_package_manifest; SELECT warehouse_id, snapshot_generation, snapshot_status, synchronized_at, last_error FROM alg.shadow_snapshot_state WHERE warehouse_id = '01'; SELECT TOP (20) stockout_detail_id, project_no, product_id, requested_quantity, allocated_quantity, predicate_version, synchronized_at FROM alg.shadow_outbound_request_snapshot WHERE warehouse_id = '01' ORDER BY synchronized_at DESC; SELECT TOP (30) * FROM alg.decision_log ORDER BY created_at DESC; ``` 包版本应为 `2026-09-07-33`,新快照应为 `PUBLISHED`,正常长度的请求输入应有 `predicate_version=1`。 实际自动出库产生后,新日志应包含 `predicateVersion=1`;可用建议还应有真实的 `proposedStock` 和 `selectedProject`。 快照刷新由事件触发,没业务时同步时间不连续推进,不要仅凭这个重启。 ## 出问题怎么回滚 最短路径:停止 WMS,在原 IDEA 配置里只把 `FORTUCKY_SHADOW_ENABLED` 改为 `false`,完整重启一次,再检查正常业务。 如仍异常,停止这个实例,使用第一步保留的原稳定源码和 Run Configuration 启动,仍保持影子关闭。 不要两个 WMS 同时运行;不要执行 `git reset --hard` 来覆盖现场配置。 紧急回滚不卸载数据库。新增的 `alg` 字段不参与 Legacy;保留它们和历史数据供排查。 若回到旧影子代码,也先关闭影子,避免用旧逻辑继续采集混杂样本。 确实需要完整卸载时,必须先备份影子数据、恢复稳定业务并停用影子,等待至少 130 秒,再由 DBA 执行: ```cmd call scripts\shadow-v3-uninstall.cmd "10.6.22.6,1433" "FT546-wms" CONFIRM_UNINSTALL ``` 卸载会删除全部本包 `alg` 对象及历史数据,只能从事先导出的证据/数据库备份恢复。它不是升级的必需步骤。 ## 后续怎样判断 重新记录 V3.3 开始时间,只分析此次重启后的自然业务样本,建议覆盖至少 7 天及高峰。 继续使用 `shadow-v3-export.cmd`,让服务器 AI 同时提供准确分支、提交、IDEA 配置核对结果、完整日志和本次升级输出。 累计性能指标包含旧版本,必须用升级前后导出差值,不能当成 V3.3 单独指标。 本版保守跳过:多项目/多产品候选、候选超过 200 行、建议不在合格候选集、一托多库存行、单条库存不足以覆盖剩余数量,以及托盘已有作业。 现场动态 SQL 参数限长 80 字节;超长原始条件保留在快照,但标记版本 0,不作为有效输入。不会截断条件来凑匹配。 这些跳过不算通过。`READY` 只表示受支持范围内的库存建议通过核验,不证明完整出库流程、FIFO 效果、性能或正式切换已验收。