|
|
@@ -3397,6 +3397,9 @@ insertSysConfigSeed("gift_membership_pay_price", "198000", "送会员商品达
|
|
|
"BIGINT DEFAULT NULL COMMENT '关联商城商品 products.id,NULL=不可链接'");
|
|
|
// 迁移433: 家庭指标聚合方式配置表(五维能量汇总/珍珠图/章鱼图汇集配置)
|
|
|
createFamilyMetricAggConfigTable();
|
|
|
+
|
|
|
+ // 迁移434: SKU商品组合明细表 + 订单记录下单SKU(组合SKU识别)
|
|
|
+ migrateSkuCombo();
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -14529,6 +14532,39 @@ log.info("迁移298: 已为无 openid 的 child 账号补齐 family_members 记
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ // ==================== 迁移434:SKU 商品组合 ====================
|
|
|
+
|
|
|
+ void migrateSkuCombo() {
|
|
|
+ try {
|
|
|
+ jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS `product_sku_combo_items` ("
|
|
|
+ + "`id` BIGINT AUTO_INCREMENT PRIMARY KEY, "
|
|
|
+ + "`sku_id` BIGINT NOT NULL COMMENT '组合SKU ID(product_skus.id)', "
|
|
|
+ + "`child_product_id` BIGINT NOT NULL COMMENT '组成商品ID', "
|
|
|
+ + "`child_sku_id` BIGINT NULL COMMENT '组成商品SKU ID(组成商品有SKU时必填)', "
|
|
|
+ + "`quantity` INT NOT NULL DEFAULT 1 COMMENT '该组成商品数量', "
|
|
|
+ + "`created_at` DATETIME DEFAULT CURRENT_TIMESTAMP, "
|
|
|
+ + "INDEX `idx_sku` (`sku_id`), "
|
|
|
+ + "INDEX `idx_child_product` (`child_product_id`) "
|
|
|
+ + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='商品SKU组合明细'");
|
|
|
+ log.info("迁移434: 已创建 product_sku_combo_items 表");
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.warn("迁移434: 创建 product_sku_combo_items 表失败(可能已存在): {}", e.getMessage());
|
|
|
+ }
|
|
|
+ try {
|
|
|
+ Integer colExists = jdbcTemplate.queryForObject(
|
|
|
+ "SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'product_orders' AND COLUMN_NAME = 'sku_id'",
|
|
|
+ Integer.class);
|
|
|
+ if (colExists == null || colExists == 0) {
|
|
|
+ jdbcTemplate.execute("ALTER TABLE product_orders ADD COLUMN sku_id BIGINT NULL COMMENT '下单SKU ID(组合SKU识别用)' AFTER product_type");
|
|
|
+ log.info("迁移434: 已为 product_orders 增加 sku_id 列");
|
|
|
+ } else {
|
|
|
+ log.info("迁移434: product_orders.sku_id 列已存在,跳过");
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.warn("迁移434: 检查/添加 product_orders.sku_id 列失败: {}", e.getMessage());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
// ==================== 迁移429:用户关注指标收藏(T04 方案A) ====================
|
|
|
|
|
|
/**
|
|
|
@@ -14843,6 +14879,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) {
|