package memory import ( "yunyan/comm" "yunyan/lego/sys/mysql" ) /* 存量修正:把被 gorm 的 `default:` 标签吞掉的会议待办标记改回来。 起因见 model.go 的 addItem —— 2026-09-18 之前 ExtractMeetingTodos 写的 DateCertain:false / RemindAhead:0 一条都没落进库,测试库里 16 条会议待办 全是 date_certain=1 / remind_ahead=5。代码修好之后**新数据**才对, 已经写歪的这些得单独扶正,否则用户的日历里那批待办照旧在 08:55 响提醒。 三条刻意的边界: - **只碰 source='meeting' 且 user_edited=0 的行**。用户改过的项已经是他自己的东西, 哪怕当初的值来自 bug,也不该在他背后再改一次。 - **助手闹钟那批 remind_ahead=5 不动**。当初用户到底有没有选「不提醒」现在已无从知道, 而 5 分钟正是产品默认值,改了反而可能把用户设过的提醒抹掉。 - **date_certain 只回退「有 due_raw 却仍落在会议当天」的那些**。当初真从原文推算出 截止日的项本来就该是 1,无法与被吞掉的那批区分,所以只挑这个能确定判错的子集。 幂等:条件里带了「当前值不等于目标值」,跑第二遍影响 0 行。 不写 next_remind_at:全项目没有任何地方读它(只有 recalcRemind 在写), 动它只会扩大这次修正的影响面。 */ // fixSwallowedDefaults 修正存量会议待办被默认值覆盖的两列,返回改动行数。 func (this *modelComp) fixSwallowedDefaults() (int64, error) { var total int64 // 会议待办一律不提醒 tx := mysql.Table(comm.TableMemoryItem). Where("source = ? AND user_edited = ? AND remind_ahead <> ?", comm.MemorySrcMeeting, false, 0). Update("remind_ahead", 0) if tx.Error != nil { return total, tx.Error } total += tx.RowsAffected // 有截止原文、却没推算出具体日期(= 仍落在会议当天)→ 该进「待定日期」分组 tx = mysql.Table(comm.TableMemoryItem). Where("source = ? AND user_edited = ? AND due_raw <> ? AND date_certain = ?", comm.MemorySrcMeeting, false, "", true). Update("date_certain", false) if tx.Error != nil { return total, tx.Error } total += tx.RowsAffected return total, nil }