fix: 修复循环提醒逻辑
- 后端创建时自动计算next_reminder_date - 勾选完成时新提醒使用正确的reminder_times和next_reminder_date Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
1e97f0d957
commit
b8392e2c20
@ -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);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user