WORKER_ALARM_WINDOW_MINUTES
WORKER_ALARM_WINDOW_MINUTES = 60
worker 告警防重窗口(分钟):窗口内重复失联不再发
系统信息核心服务
职责:① 公告管理——草稿 CRUD、发布(target 快照展开 + 人数快照)、撤回、 物理删除(级联已读行);② 我的信息——列表(公告/系统通知双页签)、 未读差集、详情即已读、全部已读批量插入;③ 系统事件写入——定向用户、 biz_key 唯一索引幂等(重复事件自动忽略)。
┌────────────────── 分区导航(按此顺序阅读)──────────────────┐ 分区 1 · 管理线 paginate / show / store / update / destroy / publish / revoke 分区 2 · 个人线 myPaginate / myUnreadCount / myShow / myReadAll 分区 3 · 事件写入 sendSystemMessage / workerAlarmWithinWindow / superAdminIds 分区 4 · 内部辅助 applyVisibility / visibleQuery / expandDeptIds / targetCount └────────────────────────────────────────────────────────────┘
myPaginate(\App\Models\SysUser $user, string $tab, int $perPage) : \Illuminate\Contracts\Pagination\LengthAwarePaginator
我的消息分页(恒为本人可见集合;tab=announcement 公告 / system 系统通知)。
| \App\Models\SysUser | $user | |
| string | $tab | announcement | system |
| int | $perPage |
sendSystemMessage(array|int $userIds, string $type, string $title, string $content, ?string $bizKey = null, int $needRead = SysMessage::NEED_READ_YES) : ?\App\Models\SysMessage
发送系统事件消息(target_type=user,sender_id=0,立即可见)。 needRead 由事件携带(默认 1 跟踪已读;0=仅展示,不参与未读)。 biz_key 撞唯一索引时静默忽略(幂等:同事件只发一次)。
| array|int | $userIds | 目标用户 id(可单个或多个) |
| string | $type | |
| string | $title | |
| string | $content | |
| ?string | $bizKey | |
| int | $needRead | 是否需记录已读(SysMessage::NEED_READ_*) |
doSendSystemMessage(array|int $userIds, string $type, string $title, string $content, ?string $bizKey = null, int $needRead = SysMessage::NEED_READ_YES) : ?\App\Models\SysMessage
发送系统事件消息(target_type=user,sender_id=0,立即可见)。 biz_key 撞唯一索引时静默忽略(幂等:同事件只发一次)。
| array|int | $userIds | 目标用户 id(可单个或多个) |
| string | $type | |
| string | $title | |
| string | $content | |
| ?string | $bizKey | |
| int | $needRead | 是否需记录已读(SysMessage::NEED_READ_*) |
visibleQuery(\App\Models\SysUser $user) : \Illuminate\Database\Eloquent\Builder
我的可见通知查询(含 is_read 派生列,未读排序用)。
可见性实现:先预取本人任职(dept_id/post_id)与角色 id 集合(索引小查询), 再逐 id whereJsonContains 匹配 target_ids(Laravel 生成 PG jsonb @> / sqlite json_each,跨库兼容);无任职/角色的维度自动短路,避免空集合全表命中。
| \App\Models\SysUser | $user |