Просмотр исходного кода

fix(backend): 迁移148 payment_orders.user_coupon_id 兜底添加

VirtualPayTimeoutTask 调度任务 selectList(PaymentOrder) 触发
Unknown column 'user_coupon_id' in 'field list':entity PaymentOrder
已声明 userCouponId 但部分库建表时缺失该列。

使用 ensureColumn 幂等添加。本地 MariaDB 与新 MySQL 8 远端已
有此列,迁移对它们为 no-op。schema.sql 已含 user_coupon_id,
无需同步。
Xiaogang Liao 1 месяц назад
Родитель
Сommit
bfc8c5e16c

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

@@ -7346,5 +7346,54 @@ private void runMigration100() {
 		} catch (Exception e) {
 			log.warn("创建five_dimension_self_checks表失败: {}", e.getMessage());
 		}
+
+		// 迁移147: virtual_goods_config 插入会员年卡道具映射(虚拟支付上线准备)
+		try {
+			jdbcTemplate.execute("INSERT IGNORE INTO virtual_goods_config (goods_type, biz_key, product_id, goods_name, status) " +
+					"VALUES ('MEMBERSHIP', 'member1314', 'TBD', '会员年卡', 1)");
+			log.info("已插入会员年卡道具映射: member1314");
+		} catch (Exception e) {
+			log.warn("插入会员年卡道具映射失败: {}", e.getMessage());
+		}
+
+		// 迁移148: 修复 membership_levels 表重复行 + 添加 UNIQUE KEY uk_level_code
+		// 原因:早期建表缺少 UNIQUE KEY uk_level_code,加上 INSERT IGNORE 在无唯一键时反复插入,
+		//       导致生产环境 FREE/FAMILY/PROVIDER 三个等级各 69 行重复,
+		//       MembershipService.createOrder() 调用 selectOne(level_code) 触发 TooManyResultsException。
+		try {
+			// 1) 删除重复行:保留每个 level_code 最早插入的(id 最小),其余删除
+			int deleted = jdbcTemplate.update(
+					"DELETE m1 FROM membership_levels m1 " +
+					"INNER JOIN membership_levels m2 " +
+					"ON m1.level_code = m2.level_code AND m1.id > m2.id");
+			log.info("已清理 membership_levels 重复行: 删除{}条", deleted);
+		} catch (Exception e) {
+			log.warn("清理 membership_levels 重复行失败: {}", e.getMessage());
+		}
+		try {
+			// 2) 添加 UNIQUE KEY(幂等:先查再 ADD)
+			Integer idxCount = jdbcTemplate.queryForObject(
+					"SELECT COUNT(*) FROM information_schema.statistics " +
+					"WHERE table_schema = DATABASE() AND table_name = 'membership_levels' AND index_name = 'uk_level_code'",
+					Integer.class);
+			if (idxCount == null || idxCount == 0) {
+				jdbcTemplate.execute("ALTER TABLE membership_levels ADD UNIQUE KEY uk_level_code (level_code)");
+				log.info("已添加 uk_level_code 唯一索引到 membership_levels 表");
+			} else {
+				log.info("uk_level_code 唯一索引已存在,跳过添加");
+			}
+		} catch (Exception e) {
+			log.warn("添加 uk_level_code 唯一索引失败: {}", e.getMessage());
+		}
+
+		// 迁移149: payment_orders表添加user_coupon_id列(VirtualPayTimeoutTask selectList 触发 Unknown column)
+		// 原因:旧库建表时缺少此列,entity PaymentOrder 已声明 userCouponId,导致 MyBatis-Plus 全列查询失败。
+		//      本地与远端新库已有,本迁移对它们幂等。
+		try {
+			ensureColumn("payment_orders", "user_coupon_id", "BIGINT COMMENT '使用的用户优惠券ID'");
+			log.info("已确保payment_orders.user_coupon_id列存在");
+		} catch (Exception e) {
+			log.warn("添加payment_orders.user_coupon_id列失败: {}", e.getMessage());
+		}
 	}
 }