|
|
@@ -10931,6 +10931,7 @@ log.info("迁移298: 已为无 openid 的 child 账号补齐 family_members 记
|
|
|
ensureHealthPlansTotalDaysColumn();
|
|
|
seedTaskReminderTemplate();
|
|
|
backfillHealthPlanTaskPrerequisite();
|
|
|
+ backfillTemplateInstanceFamilyMemberId();
|
|
|
|
|
|
// 迁移341: BASIC 体验会员 features JSON 补 referral_commission(迁移315 未包含,前端对比表已显示可参与)
|
|
|
try {
|
|
|
@@ -11545,6 +11546,29 @@ log.info("迁移298: 已为无 openid 的 child 账号补齐 family_members 记
|
|
|
* 这里补写依赖并把前置未完成的使用任务置为 locked。
|
|
|
* 幂等:每次启动只处理 prerequisite IS NULL / status=pending 的行,可重复执行。
|
|
|
*/
|
|
|
+ /**
|
|
|
+ * 迁移348: 回填周期实例的 family_member_id。
|
|
|
+ * RepeatTaskGenerator 过去未透传该字段,导致周期实例在"今日任务"列表查不到、
|
|
|
+ * 且 completeTask 抛 NPE。存量实例按其模板回填,模板缺失时按 child_id 兜底。
|
|
|
+ */
|
|
|
+ private void backfillTemplateInstanceFamilyMemberId() {
|
|
|
+ try {
|
|
|
+ int fromTpl = jdbcTemplate.update(
|
|
|
+ "UPDATE tasks i JOIN tasks tpl ON tpl.id = i.template_id " +
|
|
|
+ "SET i.family_member_id = tpl.family_member_id " +
|
|
|
+ "WHERE i.family_member_id IS NULL AND tpl.family_member_id IS NOT NULL");
|
|
|
+ int fromChild = jdbcTemplate.update(
|
|
|
+ "UPDATE tasks SET family_member_id = child_id " +
|
|
|
+ "WHERE family_member_id IS NULL AND child_id IS NOT NULL AND is_template = 0");
|
|
|
+ if (fromTpl > 0 || fromChild > 0) {
|
|
|
+ log.info("迁移348: 周期实例 family_member_id 回填 模板来源={}条 child_id兜底={}条",
|
|
|
+ fromTpl, fromChild);
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.warn("迁移348: 周期实例 family_member_id 回填失败: " + e.getMessage());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
private void backfillHealthPlanTaskPrerequisite() {
|
|
|
try {
|
|
|
int linked = jdbcTemplate.update(
|