Преглед изворни кода

feat(bundle): product_bundle_items 新增 bundle_sku_id 列(定价套餐锚点,迁移427幂等)

- bundle_sku_id 非空=定价套餐行(套餐价取该SKU.price);空=仅出库联动行
- 放开 bundle_product_id 可空:定价行置NULL避免误触发出库联动
- 同步 schema.sql 与 ProductBundleItem entity
Xiaogang Liao пре 1 недеља
родитељ
комит
1ba19a9bfb

+ 14 - 0
cfc-backend/src/main/java/com/etotem/cfc/config/DatabaseInitializer.java

@@ -14843,6 +14843,20 @@ log.info("迁移298: 已为无 openid 的 child 账号补齐 family_members 记
         } catch (Exception e) {
             log.warn("迁移426: 创建 attribution_reports 表失败(可能已存在): {}", e.getMessage());
         }
+
+        // 迁移427: product_bundle_items 增加套餐SKU锚点列(订单套餐自动定价)
+        // bundle_sku_id 非空 = 定价套餐行(套餐价取该SKU.price,CartService/ProductOrderService 匹配用);
+        // 为空 = 仅出库联动行(InventoryService 语义,不参与定价)。
+        ensureColumn("product_bundle_items", "bundle_sku_id",
+                "BIGINT NULL COMMENT '套餐SKU锚点:非空=订单套餐自动定价(套餐价取该SKU.price);空=仅出库联动'");
+        // 同时放开 bundle_product_id 可空:定价套餐行置 NULL,避免 InventoryService
+        // (按 bundle_product_id 关联、仅 productType=bundle 商品)误触发出库联动。
+        try {
+            jdbcTemplate.execute("ALTER TABLE product_bundle_items MODIFY COLUMN bundle_product_id BIGINT NULL COMMENT '套餐商品ID(出库联动行=套餐商品ID;定价套餐行置NULL)'");
+            log.info("迁移427: product_bundle_items.bundle_product_id 已放开可空");
+        } catch (Exception e) {
+            log.warn("迁移427: 放开 bundle_product_id 可空失败(可能已放开): {}", e.getMessage());
+        }
     }
 
     private static String text(JsonNode row, String field) {

+ 2 - 0
cfc-backend/src/main/java/com/etotem/cfc/entity/ProductBundleItem.java

@@ -14,6 +14,8 @@ public class ProductBundleItem implements Serializable {
     @TableId(type = IdType.AUTO)
     private Long id;
     private Long bundleProductId;
+    /** 套餐SKU锚点:非空=定价套餐行(套餐价取该SKU.price,用于订单套餐自动定价匹配);为空=仅出库联动行 */
+    private Long bundleSkuId;
     private Long childProductId;
     private Long childSkuId;
     private Integer quantity;

+ 2 - 1
cfc-backend/src/main/resources/schema.sql

@@ -5583,7 +5583,8 @@ CREATE TABLE IF NOT EXISTS system_prompt_versions (
 -- 套餐商品组成明细表(套餐 = 商品 productType=bundle,子商品在 product_bundle_items 中配置)
 CREATE TABLE IF NOT EXISTS product_bundle_items (
     id BIGINT AUTO_INCREMENT PRIMARY KEY,
-    bundle_product_id BIGINT NOT NULL COMMENT '套餐商品ID',
+    bundle_product_id BIGINT DEFAULT NULL COMMENT '套餐商品ID(定价套餐行置NULL以避免误触发出库联动;出库联动行=$套餐商品ID)',
+    bundle_sku_id BIGINT DEFAULT NULL COMMENT '套餐SKU锚点:非空=定价套餐行(订单套餐自动定价,套餐价取该SKU.price);空=仅出库联动',
     child_product_id BIGINT NOT NULL COMMENT '子商品ID',
     child_sku_id BIGINT DEFAULT NULL COMMENT '子SKU ID(为空时直接扣 product.stock)',
     quantity INT NOT NULL DEFAULT 1 COMMENT '子商品数量',