mirror of
https://github.com/kuaifan/dootask.git
synced 2026-06-11 18:02:22 +00:00
给消息待办增加可选「提醒时间」,到点由 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>
73 lines
2.8 KiB
PHP
73 lines
2.8 KiB
PHP
<?php
|
|
|
|
namespace App\Models;
|
|
|
|
use Carbon\Carbon;
|
|
|
|
/**
|
|
* App\Models\WebSocketDialogMsgTodo
|
|
*
|
|
* @property int $id
|
|
* @property int|null $dialog_id 对话ID
|
|
* @property int|null $msg_id 消息ID
|
|
* @property int|null $userid 接收会员ID
|
|
* @property \Illuminate\Support\Carbon|null $done_at 完成时间
|
|
* @property-read array|mixed $msg_data
|
|
* @method static \Illuminate\Database\Eloquent\Builder|AbstractModel cancelAppend()
|
|
* @method static \Illuminate\Database\Eloquent\Builder|AbstractModel cancelHidden()
|
|
* @method static \Illuminate\Database\Eloquent\Builder|AbstractModel change($array)
|
|
* @method static \Illuminate\Database\Eloquent\Builder|AbstractModel getKeyValue()
|
|
* @method static \Illuminate\Database\Eloquent\Builder|WebSocketDialogMsgTodo newModelQuery()
|
|
* @method static \Illuminate\Database\Eloquent\Builder|WebSocketDialogMsgTodo newQuery()
|
|
* @method static \Illuminate\Database\Eloquent\Builder|WebSocketDialogMsgTodo query()
|
|
* @method static \Illuminate\Database\Eloquent\Builder|AbstractModel remove()
|
|
* @method static \Illuminate\Database\Eloquent\Builder|AbstractModel saveOrIgnore()
|
|
* @method static \Illuminate\Database\Eloquent\Builder|WebSocketDialogMsgTodo whereDialogId($value)
|
|
* @method static \Illuminate\Database\Eloquent\Builder|WebSocketDialogMsgTodo whereDoneAt($value)
|
|
* @method static \Illuminate\Database\Eloquent\Builder|WebSocketDialogMsgTodo whereId($value)
|
|
* @method static \Illuminate\Database\Eloquent\Builder|WebSocketDialogMsgTodo whereMsgId($value)
|
|
* @method static \Illuminate\Database\Eloquent\Builder|WebSocketDialogMsgTodo whereUserid($value)
|
|
* @mixin \Eloquent
|
|
*/
|
|
class WebSocketDialogMsgTodo extends AbstractModel
|
|
{
|
|
protected $appends = [
|
|
'msg_data',
|
|
];
|
|
|
|
function __construct(array $attributes = [])
|
|
{
|
|
parent::__construct($attributes);
|
|
$this->timestamps = false;
|
|
}
|
|
|
|
/**
|
|
* 消息详情
|
|
* @return array|mixed
|
|
*/
|
|
public function getMsgDataAttribute()
|
|
{
|
|
if (!isset($this->appendattrs['msgData'])) {
|
|
$this->appendattrs['msgData'] = WebSocketDialogMsg::select(['id', 'type', 'msg'])->whereId($this->msg_id)->first()?->cancelAppend();
|
|
}
|
|
return $this->appendattrs['msgData'];
|
|
}
|
|
|
|
/**
|
|
* 取到点待提醒的待办行:有提醒时间、未提醒、未完成、提醒时间已到。
|
|
* 纯查询,无副作用,供 TodoRemindTask 使用。
|
|
* @return \Illuminate\Database\Eloquent\Collection
|
|
*/
|
|
public static function dueReminders()
|
|
{
|
|
return self::whereNotNull('remind_at')
|
|
->whereNull('reminded_at')
|
|
->whereNull('done_at')
|
|
->where('remind_at', '<=', Carbon::now())
|
|
->orderBy('msg_id')
|
|
->orderBy('id')
|
|
->limit(500)
|
|
->get();
|
|
}
|
|
}
|