完善定时提醒稳定性与管理能力

This commit is contained in:
2026-06-02 22:04:09 +08:00
parent c794e32023
commit 6c2926b57a
20 changed files with 1531 additions and 89 deletions
@@ -30,7 +30,7 @@
- AI 请求取消和对话清空
- 角色文件夹导入和角色切换
- 删除用户导入角色
- 本地一次性提醒、提醒列表、取消提醒和到点通知
- 本地一次性/重复提醒、提醒列表、取消提醒和到点通知
- 内置/用户提醒音效切换、导入、删除和试听
- Windows 打包脚本和 Inno Setup 安装器脚本
- Release exe 双击不弹控制台窗口
@@ -366,7 +366,7 @@ CommandDispatcher::dispatch(userText)
## 5.1 功能定位
实现本地一次性提醒功能。
实现本地一次性和基础重复提醒功能。
用户可以输入:
@@ -386,12 +386,19 @@ CommandDispatcher::dispatch(userText)
已新增 src/reminder/ 模块
已支持一次性提醒解析、JSON 持久化、启动后加载、到点触发和状态标记
已支持聊天创建 / 查询 / 取消提醒
已支持设置页按状态查看提醒、取消 pending 提醒、清理已触发/已取消历史
已支持设置页按状态查看提醒、取消 pending 提醒、编辑 pending 提醒、清理 20 天前已触发/已取消历史
已支持 reminder_default / reminder_soft 内置音效
已支持用户 wav 音效导入、删除、切换和试听
已限制用户音效删除路径,只允许删除用户音效目录内的安全 sound id
提醒触发时使用当前设置页选择的全局音效,ReminderItem.soundId 仅保留为历史兼容字段
已接入 Qt Multimedia / QSoundEffect 播放提醒音效
已预留 NotificationDispatcher,当前 Windows 仍由托盘通知承接
已支持每天 / 每周 / 每月重复提醒
已支持提醒触发后的“知道了”和“5分钟后再提醒”
已支持提醒数据原子保存
已支持多提醒可见队列,避免同时触发时互相覆盖
已支持 60 秒兜底扫描,覆盖睡眠唤醒、系统时间变化和长间隔 timer 延迟场景
通知后端不可用时会记录日志,不补气泡
```
## 5.2 第一版范围
@@ -400,6 +407,7 @@ CommandDispatcher::dispatch(userText)
```text
一次性提醒
每天 / 每周 / 每月重复提醒
本地保存
程序重启后提醒不丢
到点后触发气泡和托盘通知
@@ -411,7 +419,8 @@ CommandDispatcher::dispatch(userText)
暂不做:
```text
重复提醒
工作日提醒
自定义间隔重复提醒
农历提醒
复杂日历
跨设备同步
@@ -449,7 +458,20 @@ struct ReminderItem
QDateTime remindAt;
ReminderStatus status = ReminderStatus::Pending;
QDateTime createdAt;
QDateTime finishedAt; // triggered/canceled 记录的完成时间;旧数据缺失时按 remindAt 兼容
QString soundId; // 历史兼容字段,触发时不再读取
ReminderRecurrence recurrence;
};
struct ReminderRecurrence
{
ReminderRecurrenceType type = ReminderRecurrenceType::None; // None / Daily / Weekly / Monthly
int interval = 1;
int weekday = 0; // 1-7,仅 weekly 使用
int monthDay = 0; // 1-31,仅 monthly 使用
int hour = -1;
int minute = -1;
QDateTime lastTriggeredAt;
};
```
@@ -473,12 +495,26 @@ QStandardPaths::AppConfigLocation/reminders.json
"remindAt": "2026-06-01T20:00:00",
"status": "pending",
"createdAt": "2026-06-01T15:20:00",
"soundId": ""
"soundId": "",
"recurrence": {
"type": "none",
"interval": 1,
"weekday": 0,
"monthDay": 0,
"hour": -1,
"minute": -1
}
}
]
}
```
旧版 `reminders.json` 没有 `recurrence` 字段时按一次性提醒读取,继续兼容;没有 `finishedAt` 字段时,已触发/已取消历史按 `remindAt` 作为保留时间兜底。
提醒数据保存使用原子写入。写入失败时创建 / 取消会回滚内存变更,到点触发会保留 pending 并等待下次重试,不播放音效、不通知、不气泡。
历史记录默认只保留最近 20 天。自动清理和设置页“清理20天前历史”只删除超过 20 天的 triggered/canceled 记录,不删除 pending。
配置损坏时备份:
```text
@@ -511,9 +547,17 @@ reminders.broken.yyyyMMdd-HHmmss.json
1小时后
两小时后
2小时后
每天9点
每天提醒我9点打卡
每日晚上8点
每周一上午10点
每周一提醒我上午10点周会
每星期五下午3点
每月3号9点
每月3号提醒我9点交报告
```
如果规则解析失败,后续可以再接 AI 解析。包含“每天 / 每周 / 每 / 工作日 / 重复”等语义时,当前只返回“重复提醒尚未支持”,不创建一次性提醒。
如果规则解析失败,后续可以再接 AI 解析。当前重复提醒只支持每天 / 每周 / 每月。包含“工作日 / 每两天 / 每月最后一天 / 每季度 / 农历 / 自定义复杂规则”等语义时,返回明确暂不支持提示,不创建一次性提醒。
## 5.7 AI 辅助解析的设计边界
@@ -558,7 +602,12 @@ userText
```text
桌宠可见:播放当前全局音效,显示 ChatBubble + 切 happy,无 happy 时回退 talk,不发 Windows 通知
桌宠隐藏:播放当前全局音效,触发 Windows 托盘通知,不在下次显示时补气泡
AI 正在请求或流式回复:按隐藏场景处理,播放当前全局音效并发 Windows 通知,不显示气泡,不进入补气泡队列
Windows 托盘通知后端不可用:记录日志,不补气泡,不进入可见队列
用户拖动中:播放当前全局音效,不打断 drag,拖动结束后显示气泡,不发 Windows 通知
多条提醒同时触发:可见状态下进入队列逐条展示,避免后一条覆盖前一条
桌宠可见触发时显示轻量操作区:“知道了”关闭当前提示,“5分钟后再提醒”固定创建新的 5 分钟一次性提醒
重复提醒触发后先推进下一次 remindAt 并保存;稍后提醒不会影响原重复规则
```
提醒文案:
@@ -1020,8 +1069,8 @@ CustomSearchProvider
## 9.2 第二步:定时提醒
```text
当前已落地一次性提醒、提醒列表、取消提醒、到点气泡/托盘通知和提醒音效管理。
后续可继续补确认/稍后提醒、重复提醒和跨平台通知实现
当前已落地一次性提醒、每天/每周/每月重复提醒、提醒列表、取消提醒、编辑 pending 提醒、20 天历史保留、到点气泡/托盘通知、稍后提醒和提醒音效管理。
后续可继续补工作日/自定义间隔、跨平台通知实现和更复杂的提醒管理能力
```
## 9.3 第三步:天气查询