|
|
@@ -3406,6 +3406,9 @@ insertSysConfigSeed("gift_membership_pay_price", "198000", "送会员商品达
|
|
|
|
|
|
// 迁移437: T35 活动管理团队 —— activities.team_id + activity_team/activity_team_member/service_assignment 表
|
|
|
migrateActivityTeam();
|
|
|
+ // 迁移440: 套餐内容明细表(套餐=独立商品,内容=子商品SKU×数量,挂套餐SKU级)
|
|
|
+ migrateProductComboItems();
|
|
|
+
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -3611,6 +3614,30 @@ insertSysConfigSeed("gift_membership_pay_price", "198000", "送会员商品达
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 迁移440:套餐内容明细表 product_combo_items。
|
|
|
+ * <p>套餐=独立商品(product_type='bundle'),内容=套餐包含哪些子商品(精确到子商品SKU)×数量;
|
|
|
+ * 内容挂套餐SKU级(combo_sku_id)。下单/支付只动套餐SKU自身库存,不扣子商品库存。
|
|
|
+ * <p>幂等:CREATE TABLE IF NOT EXISTS + 异常兜底。
|
|
|
+ */
|
|
|
+ private void migrateProductComboItems() {
|
|
|
+ try {
|
|
|
+ jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS `product_combo_items` ("
|
|
|
+ + "`id` BIGINT NOT NULL AUTO_INCREMENT, "
|
|
|
+ + "`combo_sku_id` BIGINT NOT NULL COMMENT '套餐SKU ID(product_skus.id),内容挂SKU级', "
|
|
|
+ + "`child_product_id` BIGINT NOT NULL COMMENT '子商品ID', "
|
|
|
+ + "`child_sku_id` BIGINT NOT NULL COMMENT '子商品SKU ID(精确到规格,必填)', "
|
|
|
+ + "`quantity` INT NOT NULL DEFAULT 1 COMMENT '该子商品数量', "
|
|
|
+ + "`created_at` DATETIME DEFAULT CURRENT_TIMESTAMP, "
|
|
|
+ + "PRIMARY KEY (`id`), "
|
|
|
+ + "UNIQUE KEY `uk_combo_sku_child` (`combo_sku_id`, `child_sku_id`) "
|
|
|
+ + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='套餐内容明细(套餐商品包含的子商品SKU×数量)'");
|
|
|
+ log.info("迁移440: 已创建 product_combo_items 表");
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.warn("迁移440: 创建 product_combo_items 表失败(可能已存在): {}", e.getMessage());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
private void migrateHealthDimensionsTable() {
|
|
|
try {
|
|
|
if (tableExists("health_dimension_score")) {
|