فهرست منبع

保留闪送主表历史货品字段并调整迁移说明

qmj 6 ساعت از هم اکنون
والد
کامیت
cc9bb20a45

+ 2 - 2
specs/024-flash-delivery/data-model.md

@@ -69,7 +69,7 @@
 ## 2026-11-09:取货站货品及商品图片
 
 - 货品唯一来源为 `flash_delivery_order_stop` 的 `package_type VARCHAR(32)`、`quantity INT`、`weight_range VARCHAR(24)`、`specification VARCHAR(255)`;四列允许 NULL,仅 PICKUP 使用。新请求要求各取货站类型和正整数数量必填;DELIVERY 四列为空。
-- `flash_delivery_order` 移除上述四列及实体字段。旧接口单点输入由服务适配到取货站,主表不再保存货品摘要。
+- `flash_delivery_order` 保留上述四个数据库列及历史值,调整为允许 NULL、默认 NULL;实体和 Mapper 不再读写这些列。旧接口单点输入由服务适配到取货站,主表不再保存货品摘要。
 - 商品图片复用 `flash_delivery_order_image`,`proof_type=SENDER` 且 `stop_id` 为所属取货站。每站最多 9 张,排序各自独立,不与骑手凭证混用。
 - 待接单改址同事务替换完整站点与 SENDER 图片,照片关联新站点 ID。旧单点仅改地址时保留该取货站商品图片。
-- 手动迁移将历史主表货品及未分站 SENDER 图片只挂到原顺序第一个 PICKUP,不复制到其他站;其他历史取货站可空。迁移、核对、最后删除主表四列分步执行,见 `updatesql/sql.md`。不得凭历史聚合数据推断多站分配。
+- 手动迁移将历史主表货品及未分站 SENDER 图片只挂到原顺序第一个 PICKUP,不复制到其他站;其他历史取货站可空。迁移、核对、调整主表旧列可空约束分步执行,保留旧列及历史值,见 `updatesql/sql.md`。不得凭历史聚合数据推断多站分配。

+ 1 - 1
specs/024-flash-delivery/plan.md

@@ -822,7 +822,7 @@ The staged list must not contain `.claude/homunculus/observations.jsonl`、`.tmp
 
 ## 2026-11-09 取货站货品迁移计划
 
-1. 将实体和 Mapper 货品列从主表移到站点表,v2 站点请求/响应沿用四个货品名称,并接入逐站 senderImageUrls;收货站拒绝非空货品值。
+1. 将实体和 Mapper 的货品读写从主表移到站点表,主表数据库旧列及历史值暂保留并调整为可空默认 NULL,v2 站点请求/响应沿用四个货品名称,并接入逐站 senderImageUrls;收货站拒绝非空货品值。
 2. 调整报价、创建、改址、详情和列表;报价校验每个取货站,落库和图片关联同事务完成,保持路线、权限、价格和骑手凭证流程。旧单点请求继续适配,新的 v2 整单货品字段不再接受。
 3. 更新已有测试与契约,补充两站不同货品和图片、收货不填/误填、参数边界、改址保留、详情脱敏及字段迁移检查;运行 JDK21 闪送定向测试、模块构建,检查差异。
 4. 在 updatesql/sql.md 提供人工迁移脚本,更新当前前端接入约定;不创建分支,不执行SQL,不修改缺失的骑手App。

+ 2 - 2
specs/024-flash-delivery/spec.md

@@ -451,8 +451,8 @@
 
 ## 2026-11-09 取货站独立货品(当前约定)
 
-只在 PICKUP 站点保存 packageType、quantity、weightRange、specification,沿用原订单级字段名称、类型及业务含义。类型和正整数数量必填,重量与规格选填;DELIVERY 不填写货品信息。v2 请求和响应不再使用整单货品字段,主表移除对应持久化字段。
+只在 PICKUP 站点保存 packageType、quantity、weightRange、specification,沿用原订单级字段名称、类型及业务含义。类型和正整数数量必填,重量与规格选填;DELIVERY 不填写货品信息。v2 请求和响应不再使用整单货品字段,主表四个数据库列及历史值暂保留,允许 NULL 且默认 NULL;新代码不再读写这些旧列。
 
 每个取货站支持 senderImageUrls,沿用现有图片 URL 格式和每站最多9张校验;使用图片表的 SENDER + stop_id 关联,不混用骑手 PICKUP/DELIVERY 凭证。改址提交完整站点和货品、图片,更新后图片重新绑定新站点;保留原订单运价快照、车型及路线计价规则。详情逐站返回货品与图片,接单前不向骑手返回商品图片,列表不额外加载图片。
 
-旧单点请求允许适配到首取货站;旧整单图片仅可用于单取货站,避免多站歧义。历史整单货品及无站点 SENDER 图片迁移至首个取货站,其他旧站货品缺省,不复制数量。SQL 仅提供脚本,先核对缺失站点和旧数据再迁移并删除主表列,不直接执行。
+旧单点请求允许适配到首取货站;旧整单图片仅可用于单取货站,避免多站歧义。历史整单货品及无站点 SENDER 图片迁移至首个取货站,其他旧站货品缺省,不复制数量。SQL 仅提供脚本,先核对缺失站点和旧数据再迁移,保留主表旧列及历史值并调整为可空默认 NULL,不直接执行。

+ 2 - 0
specs/024-flash-delivery/tasks.md

@@ -316,3 +316,5 @@ Phase 31 验证:新旧订单取送顺序及目标接口契约测试先出现
 验证记录:JDK 21 执行 `mvn -q -pl ruoyi-admin -am -Dtest=*FlashDelivery*Test,UnifiedOrderQueryServiceTest -Dsurefire.failIfNoSpecifiedTests=false package`,退出码 0;system 9 项、admin 272 项定向测试全部通过,模块打包成功。覆盖两取货站不同货品/图片、收货站误传、数量反序列化、图片上限/URL、改址重绑及待抢脱敏。差异检查通过;本次没有新增用户可见文案,复用已有四语言业务错误。前端通过现有上传接口取得商品图片 URL,页面按接入文档调整。
 
 未执行项:SQL 迁移、真实 MySQL 事务/并发、真实地图和 App 联调、全量后端回归。SQL 仅写入 `updatesql/sql.md`,上线前须由开发者按步骤执行。使用现有分支提交与推送,结果以 Git 记录为准;未创建分支。
+
+- [x] T149 按用户要求保留主表四个旧货品列及历史值,移除本次删除旧列步骤,改为可空且默认 NULL,兼容新代码省略旧字段的插入;同步规格、计划和数据模型。仅修改 SQL 文档与规格,差异检查通过;未执行数据库操作,本次未重复运行 Java 测试。

+ 8 - 8
updatesql/sql.md

@@ -2582,7 +2582,7 @@ ALTER TABLE `pos_order_invoice_print_job`
 
 ## 2026-11-09 闪送取货站独立货品和商品图片(024 Phase32)
 
-将主表 `package_type/quantity/weight_range/specification` 移至取货站;商品图片复用图片表 `stop_id`,`proof_type=SENDER`。本段仅登记,未执行,由开发者备份后手动执行。执行期间停止闪送写入并停用旧服务,核对成功、删除主表列、部署配套新服务后再开放;新旧版本不能混跑。
+将主表 `package_type/quantity/weight_range/specification` 移至取货站;商品图片复用图片表 `stop_id`,`proof_type=SENDER`。本段仅登记,未执行,由开发者备份后手动执行。执行期间停止闪送写入并停用旧服务,核对成功、调整旧列可空约束、部署配套新服务后再开放;新旧版本不能混跑。
 
 ### 1. 结构与数据预检
 
@@ -2644,7 +2644,7 @@ WHERE i.proof_type='SENDER' AND i.stop_id IS NULL;
 
 ### 3. 核对后手动提交
 
-以下三项均须为 0 行;否则执行 `ROLLBACK` 并排查,不得删除主表列。同一站合并后若有超过 9 张历史商品照片,另行人工核对,不直接删除照片。
+以下三项均须为 0 行;否则执行 `ROLLBACK` 并排查,不得继续部署。同一站合并后若有超过 9 张历史商品照片,另行人工核对,不直接删除照片。
 
 ```sql
 SELECT o.id FROM flash_delivery_order o
@@ -2668,16 +2668,16 @@ COMMIT;
 DROP TEMPORARY TABLE tmp_flash_first_pickup;
 ```
 
-### 4. 最后删除主表旧列
+### 4. 保留主表旧列并允许新订单不填写
 
-备份、迁移及核对通过后才执行以下独立步骤。随后部署配套代码并恢复服务;回退旧代码时必须从备份恢复原结构及资料,不能仅回退应用。
+主表四个旧列及其历史值暂时保留,不执行删除。新代码以取货站为货品来源,不再读写主表货品,因此将旧列调整为允许 NULL、默认 NULL,避免原 `weight_range NOT NULL` 等约束阻止新订单插入。以下步骤仅调整列定义,不清空已有值;由开发者核对实际结构后手动执行,再部署配套代码并恢复服务。保留旧列不表示可直接回退旧应用:上线后的新订单仅在取货站保存货品,回退前需核对数据兼容性。
 
 ```sql
 ALTER TABLE flash_delivery_order
-  DROP COLUMN package_type,
-  DROP COLUMN quantity,
-  DROP COLUMN weight_range,
-  DROP COLUMN specification;
+  MODIFY COLUMN package_type VARCHAR(32) NULL DEFAULT NULL COMMENT '历史整单物品类别,暂保留',
+  MODIFY COLUMN quantity INT NULL DEFAULT NULL COMMENT '历史整单物品数量,暂保留',
+  MODIFY COLUMN weight_range VARCHAR(24) NULL DEFAULT NULL COMMENT '历史整单物品重量范围,暂保留',
+  MODIFY COLUMN specification VARCHAR(255) NULL DEFAULT NULL COMMENT '历史整单物品规格,暂保留';
 ```
 
 图片表无需新列或索引,复用 `(order_id,stop_id,proof_type)`。骑手的 PICKUP/DELIVERY 凭证不参与本次数据更新。