|
|
@@ -11205,5 +11205,48 @@ log.info("迁移298: 已为无 openid 的 child 账号补齐 family_members 记
|
|
|
|
|
|
// 迁移315: article_reading_records 添加 reading_completed 列(阅读达标后标记,用于推荐过滤)
|
|
|
ensureColumn("article_reading_records", "reading_completed", "TINYINT DEFAULT 0 COMMENT '是否已阅读达标(达到最低时长阈值)'");
|
|
|
+
|
|
|
+ // 迁移316: 创建 recommendation_rules 表(统一推荐规则配置)
|
|
|
+ try {
|
|
|
+ jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS recommendation_rules (" +
|
|
|
+ "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
|
|
|
+ "rule_type TINYINT NOT NULL COMMENT '1-5', " +
|
|
|
+ "rule_name VARCHAR(100) COMMENT '运营名称', " +
|
|
|
+ "trigger_product_id BIGINT COMMENT '触发商品ID', " +
|
|
|
+ "trigger_product_ids VARCHAR(1000) COMMENT '触发商品ID JSON 数组', " +
|
|
|
+ "target_product_id BIGINT COMMENT '目标商品ID', " +
|
|
|
+ "priority INT DEFAULT 10 COMMENT '优先级,越大越优', " +
|
|
|
+ "enabled TINYINT DEFAULT 1 COMMENT '启用 1/0', " +
|
|
|
+ "time_window_days INT COMMENT '回溯窗口(天)', " +
|
|
|
+ "delay_days INT COMMENT '复购延迟天数', " +
|
|
|
+ "scope VARCHAR(20) COMMENT 'family/individual', " +
|
|
|
+ "scene_codes VARCHAR(500) COMMENT '生效场景 JSON 数组', " +
|
|
|
+ "created_at DATETIME DEFAULT CURRENT_TIMESTAMP, " +
|
|
|
+ "updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP" +
|
|
|
+ ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='商品推荐规则配置'");
|
|
|
+ log.info("迁移316: 已创建recommendation_rules表");
|
|
|
+ } catch (Exception e) {
|
|
|
+ // 表已存在,忽略错误
|
|
|
+ }
|
|
|
+
|
|
|
+ // 迁移317: recommendation_rules 表索引
|
|
|
+ try {
|
|
|
+ jdbcTemplate.execute("CREATE INDEX idx_rules_enabled ON recommendation_rules(enabled)");
|
|
|
+ log.info("迁移317: 已创建idx_rules_enabled索引");
|
|
|
+ } catch (Exception e) {
|
|
|
+ // 索引已存在,忽略错误
|
|
|
+ }
|
|
|
+ try {
|
|
|
+ jdbcTemplate.execute("CREATE INDEX idx_rules_scene ON recommendation_rules(scene_codes)");
|
|
|
+ log.info("迁移317: 已创建idx_rules_scene索引");
|
|
|
+ } catch (Exception e) {
|
|
|
+ // 索引已存在,忽略错误
|
|
|
+ }
|
|
|
+ try {
|
|
|
+ jdbcTemplate.execute("CREATE INDEX idx_rules_priority ON recommendation_rules(priority)");
|
|
|
+ log.info("迁移317: 已创建idx_rules_priority索引");
|
|
|
+ } catch (Exception e) {
|
|
|
+ // 索引已存在,忽略错误
|
|
|
+ }
|
|
|
}
|
|
|
}
|