消息是怎么发出去的

SalesRoomRe · 2026-08-04 · 现状链路 + 三层接口 + 页面配置该做什么

现在真实的发送链路(不是理想图)

会议管线跑完
会前准备 · 会后纪要

resolve_recipient_names
算出该让谁知道

写死的 3 个 admin
李荣会 Jeffery Alex

客户的 sales_owner
从 profile.md 读**名字**

is_authorized_recipient
这人收不收

_name_to_open_id
名字 → 邮箱 → open_id

逐人 send_file_content

Lark DM

环节现在靠什么状态
谁是 admin源码里三个人名,每个客户组织都发给 Sparticle 这三个❌ 待改
客户归谁跟profile.md 里的名字❌ 待改(数据已就位)
这人收不收config.yamlDB notify_level✅ 今天切完
名字 → 投递地址名字 → org-members.json 邮箱 → Lark 查 open_id❌ 待改
发完记录没有 —— 只有一行会滚掉的日志❌ 待做

接口是怎么设计的:三层,各管一件事

① 路由层
这件事该让谁知道

② 闸门
他愿不愿意收

③ 投递层
怎么送到他那

④ 台账
到底送到没有

输入 → 输出关键约束
事件 + 客户 → 人的列表 输出是「人」,不是 open_id —— 它不认识任何一家 IM
人 → 收 / 不收 是最后一道闸,不是路由的一部分。混在一起就分不清「他关了通知」还是「路由算掉了」
人 → 渠道账号 → 发 渠道类型是盒子级配置(一个组织一套 IM),不是人的属性
一人一行 一个人失败不影响其他人 —— 遍历的是互不相干的 N 个人,不是一个事务

①②③ 的实现都在 worker/lib/org_members.py(纯函数层), 和邮件那套 mail_query.py 同形 —— pipeline 直接调函数,Mio 走 MCP,前端走 HTTP,三条路调同一个函数

「怎么知道每个人是谁」—— 两段身份,不要混

是什么存哪
身份 这个人是谁(登录用)
邮箱 / 姓名 / 属于哪个组织
控制平面 control.db
每 10 分钟镜像进盒子
渠道账号 他在 Lark / Teams 里是哪个账号 盒子 runs.db channel_account_id

⚠️ 这两个必须分开,因为它们真的不一样。
prod 实测 28 人里 7 个的 Lark 是用私人邮箱注册的:
李荣会  rh.li@sparticle.com  ←→  dmkd3006@gmail.com
拿公司邮箱去 Lark 查这些人,一个都查不到。

你问的页面配置 —— 需要,而且现在一个都没有

要配什么谁来配现状
收不收 / 收什么
notify_level
本人 + 管理员 只能改数据库。原来在 config.yaml —— 也等于「只有工程能改」
渠道绑定
channel_account_id
本人自助 我用脚本一次性回填了 21/28,剩 7 个没有入口
客户归谁跟 管理员 只能改 profile.md 文件

放哪:用户设置弹窗,邮箱连接的旁边。形状我们上周刚做过一遍 —— 「连接工作邮箱」那个弹窗,加一块「通知设置」即可,不用新建页面。

⭐ 但绑定不能只是「填个账号」

没点

填 / 自动解析出账号

发一条确认消息

他点了确认

绑定成立
写 channel_bound_at

候选值
**不算已绑定**

「绑定成立」的定义是「消息真的送到了」,不是「填了个账号」。

和邮箱连接是同一条原则 —— 「已连接」是一个动词的结果,不是一个存下来的形容词
飞书日历那次停摆一个多月,正因为页面上的绿灯读的是存下来的状态,而 token 三周前就死了。

所以剩下的活,按顺序

1读侧再切 4 处(admin / 归属 / 名字→地址)进行中 1/5
2送达台账 —— 现在发没发出去查不到,
这正是「漏发几个月没人发现」的原因
待做
3页面配置 —— 通知设置 + 渠道绑定(带确认)待做 · 要 Mia
4投递层抽象 + Teams 骨架待做
5删掉旧的两份名单观察后
Generated as a visual answer · open in browser