跳到主要内容

Wework 通知与跳转

右上角反馈按钮旁的铃铛显示通知和未读数。点击通知会标为已读;有关联地址时打开对应目标,没有地址时保留当前页面及通知内容。通知保存在 Backend,重新登录、切换设备或断线后仍可查看。

人工分配负责人时可以选择“通知对方”或“不通知”;保存分配后生效。按负责人分组拖动 Issue、新建 Issue 时指定负责人也使用此选择。重复分配给同一人不会重复通知。普通自分配不通知;AI 将任务交回当前用户时会通知。

通知会同时尝试推送到收件人已连接的私人 IM 会话。IM 不可用不影响已经保存的站内通知。通知不会改变 IM 当前正在继续的任务。

通知是 Wework 用户级能力,不依赖项目或看板。连接 Backend 后,在普通对话中说“给我发个通知,说你好”即可通过内置 wework-notifications 技能调用 wework_space.send_notification,将“你好”保存到自己的收件箱。省略收件人表示通知当前认证用户,无须提供项目或 Issue。项目和 Issue 仅作为可选来源;有关联来源时校验项目权限并生成跳转地址。给其他用户发通知仍需指定双方所属的 Backend 项目,以校验收件权限。例如:“如果验收失败,就通过内置通知我”。AI 分配负责人默认通知,无须再单独发送一遍;明确要求不通知时使用 notify_assignee: false

通知点击目标通过可选 url 指定,与项目来源独立。例如“给我发个你好的通知,然后点击打开看板页面”使用 { "title": "你好", "body": "你好", "url": "wework://boards" }。收到通知时页面不变,点击后打开看板首页;不需要指定项目。显式地址优先于来源生成的地址。

Scheme 地址

地址目标
wework://boards看板首页(无需绑定项目)
wework://boards/{projectId}Backend 看板
wework://boards/{projectId}/issues/{itemId}看板 Issue
wework://tasks/{deviceId}/{taskId}指定设备上的任务

每个地址段使用 URL 编码。应用内 Markdown 链接、通知入口和 Electron 外部唤起共用相同的目标解析。安装包注册 wework 协议;应用未启动时保留地址,待登录及工作台就绪后处理。访问目标仍需正常项目权限,链接不会执行命令、切换服务器或授予访问权限。

原生地址在 Electron 进程中排队,导航后才确认移除。界面重挂载或等待登录不会提前消费地址。

Issue 跳转在详情实际打开后才标记为已处理。等待项目数据期间或父组件重新渲染取消了待执行操作时,跳转请求会保留,避免点击通知后只显示看板而未打开详情。

实现边界

通知读取和已读操作按收件人隔离。版本冲突回滚分配及通知,回滚事务不调度发送。WebSocket 和 IM 是提交后的独立投递;应用会在重新连接、打开通知及周期刷新时重新查询数据库。

数据库存储

通知表所有字段均非空,字段带注释,索引采用 idx_ 前缀。无跳转地址在数据库中保存为空字符串;is_read 表示已读状态,read_status_changed_at 记录状态变更时间。接口仍以 url: null 表示无跳转,以 read_at: null 表示未读。迁移保留已有通知、跳转地址和实际已读时间;重复标记已读不会覆盖首次已读时间。