← 返回导航

IM 通知渠道对接实施计划

目标

在现有站内通知中心之上,增加企业微信、钉钉、飞书三个平台的外发通道:应用消息对指定成员推送、群机器人 Webhook 推送、成员账号绑定与发送记录留痕。

边界

核心规则

  1. 新模块 notification_channels,独立于 notifications(站内通知保持不动);业务模块不感知本模块(现状即直接落库 sys_notifications),分发由本模块轮询驱动。
  2. 通道分两类:app(对人:企微 message/send、钉钉工作通知、飞书 im/v1/messages)与 webhook(群机器人)。
  3. 凭证(Secret/Webhook/加签密钥)加密存储,接口不回显明文;三平台 access_token 统一缓存,提前 5 分钟刷新。
  4. 发送统一走 Celery 队列:群机器人限速企微/钉钉 20 条/分钟、飞书约 100 条/分钟且 5 条/秒(按平台分桶配置,默认取保守值);钉钉同人 500 条/天;失败按错误码重试(限网络/5xx,4xx 权限类不重试)。
  5. 用户绑定:手工绑定为主(审批人是小圈子),手机号批量匹配为辅(三平台均支持手机号换 userid/open_id),匹配失败不自动猜测;通知内容须过数据权限(金额/成本类仅授权角色可推)。
  6. 权限码:ntc.read(查看配置与记录)、ntc.manage(配置/绑定/测试/开关)。
  7. 页面:系统管理 → 通知渠道 → 企业微信/钉钉/飞书(三级菜单,每平台一页,Tab:基础信息/对人推送/群机器人/成员绑定/发送记录)。
  8. 分发触发:Celery beat 轮询 sys_notifications(30s 一轮),以 ntc_send_logs.idempotency_key 判重,通知随业务事务回滚则自然不投递;场景路由 key = {biz_module}.{biz_type}(无 biz 三元组回退 {notification_type}),业务侧无需打标。

交付顺序

2026-10-13 调整:飞书先行,首个业务场景 = 工单审批通知走飞书 app 通道;群机器人与企微/钉钉放后续批次。

第一批:飞书 app 通道 + 工单审批通知

  1. 前置:凭证加密工具(Fernet 对称加密,密钥经 settings 环境变量注入)+ 四张表迁移 + 权限码/菜单资源种子。
  2. 飞书 app 适配器:tenant_access_token 缓存与提前刷新 + im/v1/messages 发送 + 审批 interactive 卡片格式化(带 link_url 跳转按钮)。
  3. 发送链路:Celery 发送队列 + ntc_send_logs 落库 + beat 轮询分发任务(idempotency_key 判重)+ 场景路由配置(work_order.workflow_approval → feishu app)。
  4. 后端 API + 成员绑定(手工绑定为主,手机号批量 auto-match 为辅)。
  5. 前端飞书配置页(基础信息/对人推送/成员绑定/发送记录;群机器人 Tab 本批不做)。
  6. 验收:真实工单提交审批 → 审批人飞书收到卡片消息;审批结果通知同样触达;失败重试与幂等验证。

第二批:群机器人与其余平台

  1. 飞书群机器人 webhook 适配器(加签)+ 群机器人管理。
  2. 企微、钉钉适配器(app + webhook)与对应配置页;前端菜单补齐三平台。
  3. 发送记录页与当日总览、ntc_send_logs 90 天清理定时任务;限流分桶按平台差异化配置。