kuaifan 6b54b7b1c5 feat(todo): 聊天待办支持提醒时间(到点引用原消息+@提及)
给消息待办增加可选「提醒时间」,到点由 todo-alert 机器人对原消息发起
reply、正文 @ 仍在群内的被指派成员,完全复用原生回复/提及链路(定向未读、
红点、绕过会话免打扰、App 推送);被指派人全部退群则跳过发送并标记已提醒。
设/改/取消提醒的权限沿用 todo_set_permission 开关与 checkTodoOwnerPermission。

后端:
- 迁移:web_socket_dialog_msg_todos 增加 remind_at/reminded_at 及索引,
  注册为日期字段
- WebSocketDialogMsgTodo::dueReminders() 选取到点(未提醒/未完成)待办(limit 500)
- WebSocketDialogMsg::setTodoRemind() 纯数据写入(改时间重置 reminded_at),
  接入 toggleTodoMsg($remindAt) 与 msg__todo 透传
- 接口 msg__todoremind 设置/修改/取消提醒(权限闸门、消息类型校验、
  pushMsg 同步 todo_done)
- TodoRemindTask 到点按消息发提醒(reminded_at 防重复、迟发补发、原消息/
  会话删除兜底),buildRemindText 生成 <span class="mention user"> 文本,
  接入 crontab;登记 todo-alert 机器人
- msgJoinGroup 从提醒文本中提取被 @ 成员

前端:
- 设待办弹窗新增「提醒时间」(预设 + 自定义 DatePicker)
- 待办详情浮层每条待办可查看/修改/取消提醒:DatePicker on-clear「清空」
  二次确认后取消,无时间时仅关闭面板不发请求
- 待办浮层窄屏(≤500px)改为 待办/完成 tab 切换,宽屏维持双列;列表为空
  展示空状态占位;提醒时间用 Icon 替换 emoji
- 时间读写对齐项目任务时间的时区约定

测试:tests/Feature/TodoRemindTest(数据/选取/写入/权限决策/buildRemindText/
text mention 提取),TodoSetPermissionTest 无回归。

任务 #124 后续增强。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-01 12:08:34 +00:00
..
2024-10-31 16:39:08 +08:00
2024-10-17 14:03:51 +08:00
2024-10-17 14:03:51 +08:00

语言翻译工具说明

language/translate.php 脚本用于根据 original-web.txtoriginal-api.txt 中的内容,自动生成/更新 translate.json 以及前端使用的多语言文件。

使用步骤

  1. 在项目根目录 .env 文件中配置:

    OPENAI_API_KEY=你的OpenAI密钥
    OPENAI_BASE_URL=可选的自定义API地址
    OPENAI_PROXY_URL=可选的代理地址
    
  2. language 目录下执行:

    php translate.php
    
  3. 查看生成的翻译结果:

    • 翻译详情:language/translate.json
    • API 文件:public/language/api/*.json
    • Web 文件:public/language/web/*.js

注意事项

  • .env 未设置 OPENAI_API_KEY,脚本会直接退出。
  • OPENAI_PROXY_URL 可选,留空时不会设置代理。