From b8392e2c2030a3356567abb4eee05ff3b7daaba8 Mon Sep 17 00:00:00 2001 From: ddshi <8811906+ddshi@user.noreply.gitee.com> Date: Tue, 3 Mar 2026 20:27:48 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=BE=AA=E7=8E=AF?= =?UTF-8?q?=E6=8F=90=E9=86=92=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 后端创建时自动计算next_reminder_date - 勾选完成时新提醒使用正确的reminder_times和next_reminder_date Co-Authored-By: Claude Opus 4.6 --- src/routes/events.ts | 50 +++++++++++++++++++++++++++++++++++++------- 1 file changed, 42 insertions(+), 8 deletions(-) diff --git a/src/routes/events.ts b/src/routes/events.ts index 3a4f0d2..8bc25fc 100644 --- a/src/routes/events.ts +++ b/src/routes/events.ts @@ -153,8 +153,27 @@ router.post( // 直接存储前端发送的原始日期字符串,不做 toISOString 转换(避免时区问题) const dateValue = data.date || null; const repeatInterval = data.repeat_type === 'weekly' ? (data.repeat_interval || 1) : null; - // 如果前端传了 next_reminder_date 就使用它,否则根据 repeat_type 计算 - const nextReminderDate = data.next_reminder_date || null; + // 如果前端传了 next_reminder_date 就使用它,否则根据 repeat_type 自动计算 + let nextReminderDate = data.next_reminder_date; + if (!nextReminderDate && data.repeat_type !== 'none' && dateValue) { + // 根据 repeat_type 计算下一个提醒日期 + const date = new Date(dateValue); + switch (data.repeat_type) { + case 'daily': + date.setDate(date.getDate() + 1); + break; + case 'weekly': + date.setDate(date.getDate() + 7); + break; + case 'monthly': + date.setMonth(date.getMonth() + 1); + break; + case 'yearly': + date.setFullYear(date.getFullYear() + 1); + break; + } + nextReminderDate = date.toISOString(); + } // 存储 reminder_times 为 JSON 字符串 // 如果有循环类型且 reminder_times 为空,自动设置为 [date] let reminderTimes = data.reminder_times; @@ -278,17 +297,32 @@ router.put( // 创建新的提醒事件 const newEventId = crypto.randomUUID(); const newDateValue = nextDate.toISOString(); - // 新的 reminder_times 应该是原日期,用于下一次完成时再次创建 - // reminder_times 在数据库中是 JSON 字符串 - let reminderTimesValue = currentEvent.reminder_times; - if (!reminderTimesValue) { - reminderTimesValue = JSON.stringify([currentEvent.date]); + + // 计算新的 next_reminder_date + const newNextDate = new Date(nextDate); + switch (currentEvent.repeat_type) { + case 'daily': + newNextDate.setDate(newNextDate.getDate() + 1); + break; + case 'weekly': + newNextDate.setDate(newNextDate.getDate() + 7 * (currentEvent.repeat_interval || 1)); + break; + case 'monthly': + newNextDate.setMonth(newNextDate.getMonth() + 1); + break; + case 'yearly': + newNextDate.setFullYear(newNextDate.getFullYear() + 1); + break; } + const newNextReminderDate = newNextDate.toISOString(); + + // reminder_times 存储下一个周期的日期,用于下一次完成时再次创建 + const reminderTimesValue = JSON.stringify([newDateValue]); await db.execute({ sql: `INSERT INTO events (id, user_id, type, title, content, date, is_lunar, repeat_type, repeat_interval, next_reminder_date, is_holiday, is_completed, priority, reminder_times, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 0, ?, ?, datetime('now'), datetime('now'))`, - args: [newEventId, req.user!.userId, currentEvent.type, currentEvent.title, currentEvent.content, newDateValue, currentEvent.is_lunar, currentEvent.repeat_type, currentEvent.repeat_interval, currentEvent.next_reminder_date, currentEvent.is_holiday, currentEvent.priority, reminderTimesValue], + args: [newEventId, req.user!.userId, currentEvent.type, currentEvent.title, currentEvent.content, newDateValue, currentEvent.is_lunar, currentEvent.repeat_type, currentEvent.repeat_interval, newNextReminderDate, currentEvent.is_holiday, currentEvent.priority, reminderTimesValue], }); newEventCreated = true; console.log('[Complete Repeat] Created new reminder:', newEventId, 'date:', newDateValue);