通知体系与更新日志
通知通道
- 站内通知:顶栏铃铛,按接收人定向——需求完成/关闭、决策分变动(验收 +5 / 下线 -15)、功能下线待移除提醒等。
- 飞书/企微群:需求进度卡片(完成/关闭都推)、出图结果推群、API Key 余额告警。
- 邮件:需求完成/关闭时通知提出人(提出人邮箱即登录名)。
- 更新日志:顶栏「更新日志」查看全部版本;检测到新版本号时对每个用户自动弹一次版本弹窗(数据源
public/CHANGELOG.md,发版时需同步更新版本条目)。
推送服务架构(2026-08-10 重构)
两条业务线,各自形态保留,不强行合并:
- A 线(
functions/api/notify.js):出图推送,图片形态,带重试(fetchWithRetry 2 次)+push_logs日志 + SSRF 校验 + IM API 兜底。生产关键路径。 - B 线(
functions/api/_notify-service.js):运营通知(机器人推送/需求变更/余额告警),卡片形态,fire-and-forget。 - 共享 helper:
getTenantToken(飞书 token)、resolveFeishuOpenId(@提到的 open_id 查询)在_notify-service.js导出,A/B 线复用。
推送目标(账户级绑定)
- 推送只认 webhook + 平台(飞书/企微)。群名(group_name)创建时必填用于定位,owner 字段记负责人。
- 没有全局默认:每个账号在「个人资料」页自助绑定自己的通知通道(
admin_users.default_push_groups)。 - 路由靠
webhook_configs.scope:image-gen(出图推送)vsproject-progress(运营通知)。notify_type 已废弃,只保留兼容旧数据。 - 配置入口:设置 → 通知管理(管理员维护 webhook);个人资料 → 我的通知通道(每个人选自己的)。
推送可观测性
- 每次 A 线推送写
push_logs表(record_id / event / platform / target / status / http_status / attempts)。 - 失败指数退避重试 2 次(1s/3s),结果摘要回写
generation_records.trace(如studio:done 12s; pushed 2/2)。 - 排查"图出了但没进群":查 push_logs 表 + 看 trace 里的 pushed N/M。
企业飞书绑定
登录页「企业飞书扫码登录」和「个人资料 → 绑定企业飞书」走同一条 OAuth。回调校验本公司 tenant_key,把本应用的 open_id / union_id 写入 admin_users。个人飞书或其他企业账号直接拒绝。未绑定时 @ 功能静默失效,不影响群推送。
