BizLink · bizlinkbiz.com · 总体设计 V2.0

总体业务设计与技术架构

本版是收敛后的唯一基准,取代此前各补充件中与之冲突的表述。 业务侧按核实到的行业惯例重做(收费模式、渠道结构、收入重心); 技术侧按开源件真实边界重排(许可证、功能缺口、部署形态、版本治理)。 所有关键结论均标注来源或推算口径,凡未核实的一律标明。

2026-09-17V2.0 收敛版业务设计 + 技术架构 行业惯例已核实许可证边界已核实成本为量级估算

00前置约束:本设计建立在以下客观事实之上

这一节是整份文档的地基。后面每一处设计决策都能追溯到这里的某一条。 凡标注「已核实」的来自官方文档或公开判例;标注「量级」的是估算。 如果某一条将来发生变化,对应的设计需要重新评估——这是本表存在的意义。

00.1 市场与行业惯例(决定业务设计)

事实状态对本设计的约束
活动执行方的收费惯例已核实 支出百分比法 10~20% of total event cost;成本加成法 net cost + 12~18%; DMC 惯例 15~25% 项目成本 或净价 + 15~30%。基数一律是采购成本/支出,不是利润。 → 承办方报酬改用 cost-plus,不用利润分成
按利润分成在渠道合作中罕见已核实 利润不可验证、诱导做假账、风险收益不匹配。 「利润的 15%」≈ GMV 的 2.25%(按行业净利率 15~20% 换算),仅为常规的 1/5~1/7
活动公司盈利水平已核实 毛利 25~45%、净利 10~20%;企业活动类毛利 35~50%、净利 15~20%。 → 承办方不是暴利行业,分成过低必然不投入
SaaS 渠道分成惯例已核实 推荐伙伴 10~15% 首年 ARR;转售商 20~30% + 续费 5~8%;MSP/代理 20~35%。 → 代理商与业务员的提成按此设定默认值
单一城市可承接的场次有限量级 二线城市全年百人级付费培训会量级约 50 场(推算,误差可能 ±50%)。 → 承办方数量必须与场次挂钩,第 1 年每城 1 家

00.2 监管红线(决定资金与渠道设计)

事实状态对本设计的约束
资金二清(央行 217 号文)红线 代收后转付 = 无证资金清算。→ 自营收入平台自收;撮合资金走二级商户 + 分账指令。 后果含法人征信标记与关联惩罚
微信分账默认上限 30%红线 本场景需分出约 85%,是上限的近 3 倍。→ 申请突破是项目唯一硬阻塞项
商业特许经营红线 收加盟费/保证金 + 统一经营模式 → 需「两店一年」+ 备案。 → 零前置费用、标准写进系统不写进合同;走官方明文豁免(仅提供平台服务并收服务费)
爬取企业/个人信息红线 判例 (2019)闽0524刑初397号:爬企查查/天眼查联系方式 41.5 万条,认定侵犯公民个人信息罪。 → 供给侧采集走地图 POI + 官方平台 + 自助入驻,不爬数据平台
高德 POI 翻页上限 200 条已核实 官方原文「不支持返回全量数据」。→ 采集目标是头部供给而非全量,量级从几十万降到几千
AI 外呼需 B24 牌照受限 → AI 只生成话术与接住回复,发送动作由人或合规通道完成

00.3 开源件真实边界(决定技术架构)

组件许可证 / 边界状态本设计的用法
DifyModified Apache 2.0:禁止未经书面授权运营 multi-tenant;1 workspace = 1 tenant 受限只做内部运营 AI,单 workspace、纯 API、不开放前端
EspoCRMAGPLv3:修改后的程序经网络提供服务须公开源码 可用有条件 独立部署 + REST API + 绝不 fork 改 PHP + 部署附 AGPL 声明与源码途径。收运维费合法
ChatwootMIT 主体,但白标/角色权限/SSO/SLA/Captain 在商业 enterprise/ 目录 可用有条件 内部客服台 + 给客户部署收运维费;对客 widget 自建(顺带规避 Captain AI 数据出境)
n8nSustainable Use License(fair-code),转售需商业授权 不用自动化编排改用自建调度器,避免许可证风险

说明:EspoCRM/Chatwoot「收运维部署费」在 AGPL/MIT 下合法(Red Hat 模式)——自由≠免费, 许可证禁止的是不给源码,不是禁止收费。前一版文档中"建议弃用 EspoCRM"的判断已在本版撤回。

00.4 平台 API 能力现状(决定哪些能自动化)

能力可用性本设计的应对
酒店预订(道旅 Dida)可用 Basic Auth(Content) + 请求体传参(Booking);四步链路;IP 白名单;商务 1~3 周 + 开发 2~3 周
视频号 / 小红书发布无 API 需求 1 改为任务派发 + 交付物跟踪,不做自动发布
餐饮 / 停车核销无 API 统一核销码协议:平台发码 → 对方扫码 → 记账 → 月结对账
培训场地无 API 自建场地库(头部供给,非全量)+ 承办方实地核价
达人数据(星图/蒲公英/花火/聚星)官方平台免费 不爬取;走官方平台 + 业务员工作台 + 收益测算器

01业务设计

1.1 定位与价值主张

定位 「让主播和企业办一场不花钱的线下培训会」
用服务商摊位招商对冲办会成本,用一套系统管住从场地、餐饮、住宿、停车到摊位结算的每个环节, 并让客户在手机上看得见每一步。

这一定位把四件事统一成一句:客户价值(不花钱)= 独特能力(摊位对冲)= 系统价值(全链路可视)= 收入来源(摊位抽成)。 它同时也是销售话术——竞品(会小二这类)能帮你找场地、砍价,但不管你的成本怎么收回来。

对客户(主播 / 企业)

办会不用自己找场地、订餐、订房、管停车;摊位招商把成本赚回来;手机上能看到每个环节的进度。

对服务商

获得精准的线下获客场景(摊位)、稳定的订单(场馆/餐饮/拍摄)、以及一套不用开发的核销方式。

对承办方(渠道)

获得增量订单、平台带来的协议价资源、以及引入资源的长期分成——不需要为平台单独养团队。

1.2 角色图谱

角色系统内身份付费/收钱关键诉求与平台的关系
客户
主播 / 企业
租户(Tenant)付费方 办会省心、成本可控、学员体验好、进度可见 签主协议,平台直接对其负责
学员C 端用户付学费 报名、签到、课程资料、会后资源对接 学费不进平台(C1),平台只提供报名与通知能力
服务商
场馆/餐饮/住宿/拍摄/媒体/停车
平台级主体收款方 订单稳定、结算及时、不要做二次开发 平台签约、跨租户共享;对接方式是核销码而非 API
承办方
城市渠道
平台级主体收服务费 增量订单、能吃饱、资源可用 零加盟费零保证金;报酬 cost-plus + 节约奖励 + 资源分成
代理商平台级主体收分销佣金 AI 产品线可卖、佣金清晰只分销 AI 产品,不参与线下交付
业务员
自营
内部员工提成 只做 KA,不做本地交付拉来的单也必须派给承办方执行
角色设计里最关键的一条:服务商与承办方是「平台级主体」,不是租户 它们跨租户共享(A 客户和 B 客户可以用同一家场馆),这与"每个客户只看自己的数据"并不矛盾—— 客户看到的是"这个场馆",看不到"这个场馆还服务了谁"。 实现上用 provider_engagement 桥梁表记录"某租户与某服务商发生过关系", 而不是把服务商数据复制进租户空间。这一点如果做错(把服务商复制进每个租户), 后期的数据维护和价格同步会变成灾难。

1.3 业务全景

角色 · 平台 · 资金流 客户(主播/企业) 租户 · 办会需求 学员 报名 · 签到 · 会后 BizLink 平台 ① 培训会全流程引擎 ② 摊位招商 + 对冲看板 ③ 资源库 + 核销码 ④ 结算与分账 ⑤ 渠道管理与派单 ⑥ 合规内建(资金/数据) 承办方 本地执行 · 引入资源 服务商 场馆/餐/宿/拍/停 ✓ 自营收入(平台自收) 摊位费 ← 服务商 AI 订阅费 ← 客户 ✓ 撮合资金(分账指令) 场馆/餐/宿/拍摄 → 供应商二级商户号 承办方服务费 → 其商户号 ✕ 禁止 平台代收后再转付 = 二清 收入重心(按毛利与可规模化排序) L1 企业 AI 服务 · 现金流 订阅制、可规模化、你现在就有能力 L2 摊位招商抽成 · 主收入 边际成本近零、不受二清约束、竞品没有 L3 培训会执行 · 规模与数据 毛利低,别指望它养团队
图 1 · 业务全景。注意右侧资金分三类:绿色(自营,平台直接收)、蓝色(撮合,二级商户分账)、 红色(禁止)。毛利率最高的摊位费恰好在绿色区——这是本设计最重要的一个结构性优势。

1.4 业务域划分(收敛后 6 个)

#业务域一期职责边界不做什么
D1活动(Event)核心 需求采集 → 方案 → 场地/餐饮/住宿/拍摄 → 报名 → 现场执行 → 结算 → 复盘。 全流程状态机在这里不做会场内的讲师管理、不做课程内容本身
D2摊位招商(Booth)核心 摊位定价、招商、服务商认购、现场布置、成本对冲看板、摊位费结算 不做展具搭建施工管理
D3资源(Resource)核心 场馆/餐饮/住宿/拍摄/媒体/停车的档案、协议价、可用性、评价;核销码签发与对账 不做资源自身的经营系统(如酒店 PMS)
D4渠道(Channel)二期 承办方招募、分档、评分、派单、代理商、业务员、撞单规则、佣金计算 不做承办方的人事/财务系统
D5结算(Settlement)核心 参数配置、快照、分账指令、对账、发票三流合一、审计 不做账务核算总账(对接财务软件)
D6AI 与获客(Growth)分期 供给侧采集工作台(SAE)、大V 库与收益测算器、对客 AI 产品、内部运营 AI 不做 AI 外呼(需 B24 牌照)
为什么需求 3(学员项目资源链接)没有独立成域 它与需求 4(服务商摊位)本质是同一件事的线上版与线下版(R1)。 合并进 D2/D3:线下发生在会期(摊位),线上是长尾延续(会后对接)。 共用同一套服务商档案、标签与匹配规则,只是触发时机不同 —— 省一半开发量, 还让"摊位"从一次性活动变成长期关系的起点。

1.5 核心业务流程:培训会全生命周期

这是 D1 的主干状态机。你要求的"每个节点客户在 Web 和手机端都能看到状态和进度", 就是由这一条状态机 + 一个统一进度接口实现的(技术方案见 2.7)。

① 需求提交 客户 / 业务员 ② 方案与报价 平台 + 承办方 ③ 摊位招商 与 ② 并行,越早越好 ④ 资源锁定 场地/餐/宿/拍摄 ⑤ 学员报名 学费不进平台 ⑥ 现场执行 签到/餐/宿/停车 ⑦ 结算与复盘 对账 / 分账 / 评分 每个节点对外暴露的四件事(客户 Web/H5 看到的全部内容) status pending / doing / blocked / done / cancelled 状态机统一定义,禁止各模块自造 owner + sla_due_at 谁负责(平台/承办方/服务商) 什么时候该完成 超时自动升级告警 blockers[] 卡在哪、缺什么材料 由谁解决 不要只显示"处理中" evidence[] 凭证:合同/照片/签收/核销记录 争议时以凭证为准 结算与评分都依赖它 ⚠ 顺序约束 ⑤ 学员报名必须早于 ④ 资源锁定的付款节点 —— 报名费是覆盖定金最自然的资金流(平台不垫资,见 1.8)。
图 2 · 培训会全生命周期状态机 + 每个节点的对外契约。 ③ 摊位招商与 ② 并行且越早越好——它是成本对冲的前提,也是客户决定"办不办"的关键输入。

1.6 渠道体系

主体职责报酬数量策略
城市承办方本地交付执行 + 引入本地资源 + 实地核价 cost-plus 15% + 成本节约奖励 30% + 资源分成 1.5%(24个月) 按城市年场次分档,不是固定 2~3 家
第 1 年一律 1 家;≥12 场/年可加第 2 家; ≥36 场/年可到第 3 家。一线城市可提前一档
代理商只分销 AI 产品线,不参与线下交付 首年 ARR 25% + 续费 5% 不限,但需防撞单(见下)
自营业务员只做 KA 与跨城客户,不做本地交付 毛利分成 10% 按区域配置
三条撞单规则(必须在系统里强制,不能靠口头约定) ① 按客户类型划线,不按地域划线:跨城连锁 / 年办 5 场以上 = 自营 KA;本地单场 = 承办方; 只要 AI 产品 = 代理商。
② 客户归属先报备先得owner_type + owner_id + 保护期 90 天, 到期未产生订单自动释放。
③ 业务员拉来的单也必须派给承办方执行,并按约定计入承办方业绩。 这条最关键——否则业务员会变成承办方的竞争对手,渠道体系从内部崩掉。
招募标准(比数量更重要) 只招已经有存量业务的活动/会展公司。BizLink 必须是它的增量渠道而不是主业。 原因见 00.1:第 1 年一个城市只有约 5 场,按 cost-plus 15% 算承办方年收入不足 4 万—— 这个数字不足以让任何人把它当回事。招一家靠它吃饭的公司,结果是它要么不做,要么飞单。

1.7 结算与分佣

承办方是交付方不是销售方,行业惯例拿"管理费/成本加成"而非"佣金"。三个组成部分:

组成默认区间作用与理由
① 执行服务费
contractor.service_rate
15%12~20% 在其承接的采购成本上加成。8 万成本 → 1.2 万。主体收入
② 成本节约奖励
contractor.saving_share
30%20~40% 必须配。cost-plus 的固有缺陷是承办方没动力砍价(成本越高它 15% 越多), 与"帮客户降本"直接冲突。定基准成本,低于基准的部分 30% 奖励给它
③ 资源引入分成
contractor.resource_share
1.5%1~2% 它引入的场馆/餐饮/酒店每被用一次按 GMV 分成,持续 24 个月。 按"实际被使用"计酬而非一次性录入奖励,否则会换来一批低质量录入
cost-plus 还有一个额外好处:天然规避二清 提成模式:钱先进平台,再由平台切给承办方 → 容易落入二清。
cost-plus 模式:承办方的加价直接体现在给客户的报价里, 支付机构的分账指令把这一块直接分给承办方的二级商户号,平台不经手。
所以它不只是行业惯例,还是合规设计的一部分。

平台侧收入参数

参数默认区间说明
platform.service_fee10%8~15%对客服务费率(在采购成本之外)
platform.booth_commission20%15~25% 摊位招商抽成 —— 平台主收入。必须覆盖收入端,否则客户降本会稀释你的基数(E4)
agent.ai_subscription_share25%20~30%代理商分销 AI 产品:首年 ARR
agent.renewal_share5%3~8%续费分成,促其维护客户而非只拉新
sales.gross_margin_share10%8~15% 业务员提成。此处用毛利分成是合适的——内部员工,数据可信、可审计

1.8 合规内建(不是上线前检查,是设计约束)

合规项设计约束违反后果
资金二清 自营收入(摊位费/AI 订阅/会员)平台自收;撮合资金(场馆/餐/宿/拍摄/学费) 走二级商户 + 分账指令。平台不垫资 没收 + 罚款 10~100 万 + 通道关停 + 法人征信标记 + 关联惩罚
分账 30% 上限 本场景需分出约 85%,必须申请突破,有审批周期 系统写完才发现分不了账,资金流全部返工
特许经营 零加盟费、零保证金、不授权商标与统一形象;培训限缩为"平台操作 + 质量标准"且免费; 标准写进系统(必填节点/时效/校验/评分)而不是写进合同 没收违法所得 + 罚款 10~50 万(有 33 万全额没收的真实判例)
数据跨租户 L1 公开/聚合可跨租户;L2 业务明细仅租户内;L3 个人信息需单独授权。 聚合特征可学,明细不可见 损失的不只是一个客户,是"深入企业内部"这个商业模式本身
收益承诺 测算器与销售材料禁止出现保底收益 广告法 + 特许经营条例,罚 3~30 万
开源许可证 Dify 不开放前端;EspoCRM 不 fork、部署附声明;Chatwoot 不得启用 EE 功能(SSO/白标)除非已订阅 被迫公开源码 / 侵权索赔

02技术架构

2.1 相对前一版的 6 处实质调整

#调整项前一版本版依据
1EspoCRM 去留建议不用(AGPL 风险) 撤回,恢复可用:独立部署 + REST API + 绝不 fork + 部署附 AGPL 声明。 收运维费在 AGPL 下合法00.3 / 用户补充前提
2Chatwoot 定位降为内部客服台 可给客户部署并收运维费,但白标/SSO 是硬缺口 → 对客 widget 仍自建00.3
3技术栈数量Node + PHP + Ruby + Python(三套数据库) 砍到两套:Node/TS(业务主体)+ Python(AI 侧),一套 PostgreSQLS4 运维复杂度
4部署形态只考虑 SaaS 多租户 SaaS + 私有化双形态,同一套代码;私有化必须做集中管控 + 强制自动升级用户要给客户部署
5AI 侧Dify 用于运营 + 对客自建 不变,但明确对客 AI 的 RAG 用 pgvector 自建,不引入独立向量库(减一套组件)私有化交付要少组件
6结算佣金比例写死在业务逻辑里 抽出结算引擎:参数可配置 + 下单快照 + 影响模拟器 + 双人复核 + 全量审计08.4/08.5

2.2 总体分层架构

分层架构(Node/TS 主体 + Python AI 侧,一套 PostgreSQL) 接入层 客户 Web(管理后台) H5(学员报名/进度/签到) 承办方/服务商工作台 运营后台(含参数配置) OpenAPI API 网关 / BFF 鉴权 JWT · tenant_id 注入 · 限流 · 审计日志 · 幂等键 H5 与 Web 共用一套进度接口(统一契约,不做两套) 业务域层(模块化单体,禁止跨模块直连表) D1 活动 状态机主干 报名/签到/执行 D2 摊位招商 对冲看板 主收入来源 D3 资源 档案/协议价 核销码签发 D4 渠道 分档/评分/派单 撞单规则 D5 结算 参数+快照 分账/对账/审计 D6 AI 与获客 SAE 工作台 大V库/测算器 平台能力层(横切,各域共用) 工作流引擎(统一状态机) IAM / 多租户 / RBAC 核销码服务(UVCP) 规则/参数引擎 通知(短信/企微/站内) 外部依赖适配层(Adapter)—— 每个接口必须有人工兜底通道 道旅酒店 API 支付/分账(微信收付通) 地图 POI 短信/企微 对象存储 人工兜底:降级为工单 fulfil_mode 数据层(一套 PostgreSQL) 业务库:租户行级隔离(ORM 拦截器 + PG RLS 双保险) 向量:pgvector(对客 AI 知识库,不引入独立向量库) 缓存/队列:Redis · 对象存储:S3 兼容 · 搜索:PG 全文(一期够用) 外挂开源件(独立部署,不进主体) Dify(内部运营 AI,单 workspace,不开放前端) EspoCRM(独立部署 + REST API,绝不 fork 改 PHP) Chatwoot(内部客服台 / 给客户部署,不启用 EE 功能)
图 3 · 分层架构。注意最下面两块:主体只用一套 PostgreSQL; 三个开源件全部独立部署在架构外侧——这是同时拿到"开源省事"与"许可证安全"的唯一办法。

2.3 技术栈与开源件边界

组件选型位置边界与理由
后端主体NestJS / TypeScript核心 模块化单体。模块化靠纪律不靠微服务:禁跨模块直连表、跨模块写走领域事件、ESLint 卡 import
前端React(Web) + H5核心 H5 与 Web 共用进度接口,不做两套状态逻辑
数据库PostgreSQL + pgvector核心 一套库。向量需求用 pgvector,减一个组件(私有化交付时尤为重要)
AI 侧Python核心 对客 AI 自建(RAG + 对话管理);Dify 只做内部运营
队列/缓存Redis + BullMQ核心 异步任务、核销回调、定时任务(如道旅 HCN 补查)
DifyPython 独立部署外侧 单 workspace + 纯 API + 不开放前端。规避 multi-tenant 条款与 LOGO 条款
EspoCRMPHP 独立部署外侧 REST API 集成,绝不 fork;部署附 AGPL 声明 + 源码途径; 只给真需要私有化的大客户部署,SaaS 客户用自研模块
ChatwootRuby 独立部署外侧 内部客服台 + 给客户部署(收运维费)。不得出现 SSO 登录页(那说明在跑 EE 代码)
为什么坚持「外侧」这三个字 把开源件放在架构外侧、通过 API 通信,有两个不可替代的作用:
① 许可证隔离。进程间通过 API 通信通常不构成"衍生作品",这是 AGPL 下最稳妥的用法。 一旦你把它们 fork 进主代码库,AGPL 的传染性就有了明确的抓手。
② 可替换。哪天许可证变了、厂商收费了、或者你自研好了,换掉的是一个适配器,不是半个系统。
反面做法:为了"省事"直接改它们的源码加功能——省下的是两周,付出的是整个产品的 IP 确定性。

2.4 部署形态与版本治理

你要同时支撑 SaaS 多租户和给客户私有化部署。必须同一套代码,否则版本必然分裂。

一套代码 · 两种部署形态 · 单一版本轨道 形态 A · SaaS 多租户 deployment_mode = saas tenant_id 可变 · 共享库行级隔离 面向:绝大多数客户 形态 B · 私有化单租户 deployment_mode = private tenant_id 恒为固定值 · 独立库 面向:真需数据不出内网的客户 差异只在这三处 ① deployment_mode 常量 ② 功能开关按 license 启用 ③ 私有化禁用多租户相关 UI 私有化的真正难题不是安装,是版本碎片化 100 家企业各部署一套,若版本各异,运维成本是 100 倍 —— 这会直接击穿"通过规模降低运维成本"的假设。 单一版本轨道 只允许最新版 + N-1 超期版本停止支持 强制自动升级 可预约维护窗口 但有时限,逾期强制 遥测回传 心跳/版本/健康度 不含业务数据 集中管控台 license/版本/远程诊断 一个台管所有实例 升级前备份+回滚 自动快照 失败自动回退 交付物 单一容器镜像 + Helm/Compose 编排 + 一键安装脚本 + 升级编排器 —— 做不到"一键安装 + 自动升级",就不要卖私有化,那会变成项目制外包(第 3 件风险①)。
图 4 · 部署形态与版本治理。私有化能不能赚钱,取决于这五条能不能做到—— 它们决定了新增一个客户的边际交付工时是否趋近于零。

2.5 模块边界规则(业务线长的唯一解法)

你有 6 个业务域,业务线确实长。但长不等于要拆微服务——5~8 人团队拆开, 首年精力会耗在分布式事务上,而真正的难点在状态机和结算。正确解法是在单体内部划死边界

规则一:禁止跨模块直连表

模块只能通过本模块的 Repository 访问自己的表。需要别人的数据 → 走模块暴露的 Service 接口。 用 ESLint 自定义规则卡 import 路径,CI 拦截。

规则二:跨模块写操作走领域事件

D1 活动完成 → 发 EventCompleted → D5 结算监听并生成账单。 禁止直接调用对方的写方法,否则事务边界会糊掉。

规则三:共享实体归平台层

租户、用户、服务商、消息、文件、规则参数属于平台能力层, 不被任一业务域私有。避免每个域各存一份"服务商"。

// 目录结构(模块内自洽,模块间靠接口与事件)
src/
  platform/          // 横切能力:iam, workflow, rule, verification_code, notify
  modules/
    event/           // D1 活动:controller / service / repository / state-machine
    booth/           // D2 摊位招商
    resource/        // D3 资源与核销
    channel/         // D4 渠道与派单
    settlement/      // D5 结算与分账
    growth/          // D6 AI 与获客
  adapters/          // 外部依赖:dida, wechat-pay, amap, sms, oss
  shared/            // 通用工具

// ESLint 边界规则(CI 强制)
"no-restricted-imports": {
  "patterns": [{
    "group": ["**/modules/*/repository/**"],
    "message": "禁止跨模块直接访问 Repository,请通过模块 Service 接口"
  }]
}

2.6 多租户与数据分级

层级内容跨租户实现
L1 公开/聚合行业统计、城市均价区间、类目完课率允许 预计算聚合表,不含任何可识别主体的明细
L2 业务明细租户的客户、学员、报价、合同、结算禁止 tenant_id 行级隔离:ORM 拦截器 + PG RLS 双保险 + CI 扫描(三重)
L3 个人信息学员手机号、身份证、人脸签到需授权 单独授权记录 + 加密存储 + 最短留存期
P 平台级服务商档案、承办方档案跨租户共享 不属于任何租户;用 provider_engagement 桥梁表记录"某租户与某服务商的关系"
最容易出错的一处:服务商不能复制进租户空间 服务商是平台级共享主体(A 和 B 都能用同一家场馆)。若为了"隔离"把它复制进每个租户, 价格调整、资质到期、评价更新都要同步 N 份 —— 数据一致性必然崩。 正确做法:服务商表不带 tenant_id;客户看到的是"这个场馆",看不到"它还服务了谁"。

2.7 工作流引擎与统一进度接口

你要的"Web 和手机端都能看到每个节点状态和进度",靠一套引擎 + 一个接口实现,不做五套。 这是整个产品体验一致性的前提,也是渠道管控的实现方式(节点的时效与质量被记录并计分)。

// 状态机用数据定义,不写死在代码里 —— 流程会变,改配置不改代码
{
  "flow": "training_event",
  "nodes": [
    { "id": "requirement",  "name": "需求提交", "owner_role": "customer",   "sla_hours": 24 },
    { "id": "proposal",     "name": "方案与报价", "owner_role": "platform",   "sla_hours": 72 },
    { "id": "booth_sales",  "name": "摊位招商", "owner_role": "contractor", "sla_hours": 336 },
    { "id": "resource_lock","name": "资源锁定", "owner_role": "contractor", "sla_hours": 120 },
    { "id": "enrollment",   "name": "学员报名", "owner_role": "customer",   "sla_hours": 168 },
    { "id": "on_site",      "name": "现场执行", "owner_role": "contractor", "sla_hours": 48 },
    { "id": "settlement",   "name": "结算复盘", "owner_role": "platform",   "sla_hours": 168 }
  ]
}

// 统一进度接口 —— H5 与 Web 共用,响应结构完全一致
GET /api/v1/progress/:aggregate_id
{
  "aggregate_type": "training_event",
  "overall": { "percent": 62, "status": "doing", "next_node": "resource_lock" },
  "nodes": [{
    "id": "resource_lock",
    "status": "blocked",
    "owner": { "type": "contractor", "name": "XX会展" },
    "sla_due_at": "2026-10-02T18:00:00+08:00",
    "blockers": [{ "code": "VENUE_DEPOSIT_UNPAID", "desc": "场馆定金未付", "resolver": "customer" }],
    "evidence": [{ "type": "contract", "url": "..." }]
  }]
}
这个接口同时解决两件事,是你整个体系里性价比最高的一个设计 ① 客户体验:进度可见、卡点明确、责任清晰。
② 渠道管控:节点时效与质量被系统记录 → 自动计分 → 计分决定派单权重。 你要的"轻资产 + 强管控",唯一出路就是把管控写进系统,而不是写进合同(这同时也规避了 C4 的特许经营风险)。

2.8 结算引擎

三条硬规则(不做则后期全是纠纷) ① 下单时快照。订单创建时把当次生效的规则集序列化进 settlement_snapshot, 结算读快照不读当前配置。反面案例:调参导致已交付场次被重算 → 承办方当月对账全崩 → 信任崩塌。
② 只能未来生效。effective_from 最早次日 00:00,禁止"立即生效";变更进待生效队列可撤销; 提供影响模拟器(改前先跑"近 90 天订单按新规则算出多少钱")。
③ 全量审计 + 双人复核。记录谁/何时/从多少到多少/影响范围/审批人; 偏离默认值 ±3 个百分点需第二人复核。这个后台是全公司最接近钱的页面,按财务系统标准做权限。
// 参数覆盖优先级:单向覆盖,禁止多级相乘(连乘算出来的数没人看得懂,对账必吵架)
resolve_rate(contractor_id, city_code, event_id) {
  if (r = rule.find(event_id))           return r   // 单场特批
  if (r = rule.find(contractor.grade))   return r   // 承办方等级
  if (r = rule.find(city_code))          return r   // 城市
  return GLOBAL_DEFAULT                          // 全局默认 15%
}

// 快照结构(订单创建时冻结,之后永不随配置变化)
settlement_snapshot = {
  "service_rate":      0.15,   // cost-plus
  "saving_share":      0.30,   // 成本节约奖励
  "resource_share":    0.015,  // 资源引入分成
  "platform_fee":      0.10,
  "booth_commission":  0.20,
  "rule_version":      "2026-09-17T10:00:00Z",
  "resolved_by":       "city:GZ"
}

2.9 外部依赖 Adapter 与人工兜底

你对接的外部能力有一半不可靠或不存在(00.4)。核心原则是:每一个外部调用都必须有一条人工通道

// 统一 Adapter 契约:每个外部依赖实现同样五个方法
interface SupplierAdapter {
  search(req):       Promise<Offer[]>   // 查询
  confirm(ref):      Promise<Hold>      // 锁价/锁库存
  book(hold):        Promise<Order>     // 下单
  cancel(orderId):   Promise<void>      // 取消
  query(orderId):    Promise<Status>    // 查单(含补查)
}

// 履约双通道:API 失败或超时 → 自动降级为工单,客户看到"处理中"而不是"系统错误"
fulfil_mode: 'API' | 'MANUAL'

try   { return await adapter.book(hold) }
catch(e) {
  await ticket.create({ type:'MANUAL_FULFIL', payload:hold, reason:e.code })
  return { status:'processing', fulfil_mode:'MANUAL' }   // 业务不中断
}
依赖可用性兜底通道
道旅酒店API 超时/失败 → 工单转人工代订;HCN 未返回 → 定时任务入住前 3 天补查
支付/分账API 分账失败 → 挂起并告警,禁止人工转账绕过(那会构成二清)
餐饮/停车/场地无 API 统一核销码:平台发码 → 对方用小程序扫 → 记账 → 月结对账。当天可用,哪怕手写停车票的小车场
内容发布无 API 改为任务派发 + 交付物归档,由客户或服务商自行发布

2.10 AI 侧架构

对客 AI(自建)

pgvector 知识库 + 自建对话管理 + JS widget + 复用 IAM 与 tenant_id。
为什么自建:白标需求、Dify 多租户条款、RAG 本身不复杂、SLA 与计费自建更简单、 且私有化交付时少一个组件

内部运营 AI(Dify)

供给侧初筛打标、话术生成、会话摘要、报表问答。
约束:单 workspace、纯 API 调用、不开放前端。用户是内部员工,不触碰多租户条款。

两条产品线必须分开命名、分开定价(S5):

产品线目标用户定价形态
企业办公 AI企业客户付费 S 版 SaaS / P 版企业云 VPC / E 版真本地机房。三档按需求与预算分,不得混称
主播学员运营 AI主播客户免费/低价 招生文案、课纲生成、学员答疑、会后跟进 —— 获客钩子,用来降低办会门槛
「免费」与「私有化」不能出现在同一个产品承诺里 免费只对应 S 版(多租户 SaaS);私有化是 P/E 版的交付形态,一家 50 人企业真私有化首年约 5~15 万(量级)。 把 S 版描述成"私有化"是虚假宣传,也是对你自己最危险的一句话。

2.11 可观测性与运维

维度要求
链路追踪每个请求带 tenant_id + trace_id,跨服务与跨开源件(Dify/EspoCRM 调用)都要透传
业务告警节点 SLA 超时、分账失败、核销异常、Adapter 连续失败、参数变更(参数变更必须告警到负责人
对账任务每日:平台流水 ↔ 支付机构流水 ↔ 内部账单三方对账;差异自动挂账并告警
数据一致性跨系统(主体 ↔ EspoCRM ↔ Chatwoot)实体同步要有对账任务与修复脚本,否则数据必然漂移
备份PG 每日全备 + WAL 归档;私有化实例升级前自动快照

03核心数据模型

核心实体关系(简版,只列决定架构走向的实体) tenant 租户(客户) event 培训会(聚合根) booth 摊位(主收入) provider 服务商(平台级) contractor 承办方(平台级) enrollment 学员报名 fulfil_order 履约子单(含快照) verification_code 统一核销码 settlement_rule 结算参数(可配置) workflow_node 流程节点实例 provider_engagement 租户↔服务商桥梁表 settlement_bill 账单(三流合一) 关键字段约定 · 所有业务表带 tenant_id(provider / contractor / settlement_rule 除外,平台级) · 金额一律最小货币单位整数存储 + currency_code · 时间一律 timestamptz + timezone
图 5 · 核心实体。红色两块最容易被做错: provider_engagement 是"服务商跨租户共享"的正确实现方式; settlement_bill 必须满足订单流/资金流/发票流三流合一(税务要求)。
实体带 tenant_id关键字段与要点
tenantid, name, type(主播/企业), owner_type, owner_id(撞单归属), plan, status
event id, tenant_id, contractor_id, city_code, status, flow_version, start_at, end_at, headcount
booth id, event_id, provider_id, size, price, status(招商中/已认购/已付/已入场), commission_rate(快照)
provider 平台级共享。id, type, name, city_code, contact, price_level, rating, source(POI/入驻/人工)
contractor 平台级。id, city_code, grade, score, service_rate, bankless(二级商户号标识)
enrollment 学员报名。学费不进平台,只记录报名与签到状态;手机号属 L3 需授权
fulfil_order 履约子单(场馆/餐饮/住宿/拍摄各一条)。含 settlement_snapshot、fulfil_mode(API/MANUAL)、 外部订单号、ClientReference(幂等键)
verification_code 统一核销码:code, type(停车/餐饮/住宿/签到/摊位), provider_id, status, used_at, used_by
settlement_rule scope(全局/城市/等级/单场), key, value, effective_from, created_by, approved_by
settlement_bill 账单与分账指令。三流合一:订单流 / 资金流 / 发票流必须能对上
workflow_node aggregate_id, node_id, status, owner_type, owner_id, sla_due_at, blockers[], evidence[]

04交付路线图

阶段目标关键动作完成判据(可验证)
P0
第 0~1 月
不写代码
三个阻塞项同时启动 ① 申请微信支付服务商资质 + 分账限额突破
② 法务审阅渠道协议措辞
③ 给 3 家关系最好的客户打电话,只问现状不推销
拿到受理回执;法务书面意见; 3 家中至少 2 家确认"今年有办会计划且当前流程麻烦"
P1
第 2~5 月
人工跑通一场真实培训会 ① 微信群 + 表格 + 电话跑通 1 场,逐步记录真实流程
② 同期只建 4 个技术底座:IAM/多租户、工作流引擎、核销码、统一进度接口
AI 产品线继续接单赚钱(现金流)
一场真实活动交付完成,流程文档经当事人确认无遗漏节点。 系统应自动化已验证的流程,不是边开发边猜流程
P2
第 6~10 月
系统承载 + 摊位招商上线 ① 把 P1 记录的流程搬进系统
摊位招商与对冲看板优先于任何其他功能
③ 打通分账(若 P0 已获批)
④ 单城市签约 1 家承办方
同城完成 3 场以上,其中至少 1 场实现摊位费覆盖部分成本; 客户能在手机上看完整进度
P3
第 11~18 月
单城打透 + 复制第二城 ① 单城做到 12 场/年以上再考虑加第 2 家承办方
② 道旅酒店 API 接入(商务应已完成)
③ 复制模式到第 2 城
单城年场次 ≥12;承办方从平台获得年收入 ≥10 万(存活线); 单位 economics 为正
P4
第 18 月+
才轮到这些 企业 AI 私有化 P/E 版、大V 库与收益测算器、AI 推荐、代理商体系、全球(多币种/多语言)
P1 那一步是我在整个项目里最坚持的一条 「先用微信群 + 表格 + 电话跑通一场真实培训会」看起来很土,但它同时验证四件事: 真实流程长什么样、客户愿不愿意付费、承办方能不能找到、摊位能不能招到。 这四件任何一件不成立,后面 12 个月开发都是沉没成本。而且它只要 3~4 个月,成本几乎为零。

05成本量级

以下均为量级估算,用于判断结构是否合理,不可直接用于预算。 实际数字随城市、薪资水平、谈判结果变化很大。

项目量级(年)说明
技术团队 6 人约 ¥180 万含社保,二线城市薪资水平
运营 + 地推 4 人约 ¥80 万城市经理 + 运营
服务器 / 中间件约 ¥12 万PG + Redis + 对象存储 + 监控
第三方 API约 ¥8 万地图 POI(免费额度内)、工商核验、AI token、短信
年固定成本合计约 ¥280 万不含你的机会成本
单场收入(平台)保守乐观说明
执行服务端服务费¥6,000¥10,00010 万支出中平台留存 6~10%
摊位招商抽成¥4,000¥10,000 保守 4 摊 ×5000×20%;乐观 10 摊。高毛利、边际成本近零
拍摄/媒体自营差价¥1,000¥3,000取决于是否自营
单场合计¥11,000¥23,000中位约 1.5 万
盈亏平衡所需场次约 190 场/年 按中位 1.5 万计。第 1 年不可能达到
这个数字的政策含义 第 1 年平台不可能盈利,必须由 AI 产品线供养。这不是悲观,是必须写进预算的前提—— 不然到时候才发现,就会在"要不要继续投"这个问题上做出情绪化的决定。 同时它也解释了为什么收入重心必须放在摊位招商(毛利高、边际成本低)而不是执行服务费。
私有化交付成本(单客户)量级说明
S 版 SaaS 多租户边际成本 ≈ 0免费/低价档必须是这一档
P 版 企业云 VPC年费数万满足绝大多数"要安全"的诉求,应主推
E 版 真本地机房 + GPU首年 ¥5~15 万 50 人企业量级。7B~8B INT4 约 6~8GB 显存,单张 24GB 卡够办公场景

判断公式(决定是否自建 GPU):「每月 API 账单 × 18~24 个月」 vs 「GPU 整机价 + 电费」。 前者大则自建划算。大多数办公场景在单客户规模下API 更划算——真私有化的价值在数据合规而非省钱,这两件事要分开算。

06红线清单(上线前逐条复核)

#红线后果复核方式
1平台代收后转付刑事风险 代码扫描:是否存在"平台账户 → 转账给他人"的路径。人工转账绕过同样违规
2分账超 30% 未获批功能不可用 上线前用真实金额跑通一笔完整分账
3收取加盟费/保证金没收+罚款 合同与收款科目审查:换名字没用,看实质
4承诺保底收益罚款 3~30 万 销售材料、测算器输出、聊天话术全面检查
5跨租户数据泄露模式崩塌 RLS 断言测试 + 渗透测试 + CI 扫描未带 tenant_id 的查询
6fork 开源件改源码被迫开源 依赖审查:EspoCRM/Chatwoot 是否为原版镜像 + 配置,无代码改动
7启用 Chatwoot EE 功能侵权 检查部署是否出现 SSO 登录页;白标是否已购授权
8爬取个人信息/数据平台刑事风险 采集源审查:只用地图 POI、官方平台、自助入驻
9SaaS 版宣称"私有化"虚假宣传 对外文案与合同条款审查
10AI 自动外呼无牌照违规 确认外呼动作由人或合规通道完成,AI 只生成话术

07待你拍板

#问题我的建议影响
1能否接受:零加盟费、零保证金,只用业务手段约束承办方? 接受。防飞单靠"让它吃饱 + 资源签平台 + 虚拟号隔离 + 系统评分" 合规地基。不接受则整套架构重来
2承办方报酬改为 cost-plus 15% + 节约奖励 30%? 改。原"利润 15%"≈ GMV 2.25%,只有常规的 1/5~1/7 决定 D5 结算与 D4 渠道的数据模型
3第 1 年做几个城市?1 个(最多 2 个,且必须是你关系最密的) 决定资源投放密度与承办方存活率
4能否接受第 1 年平台不盈利,由 AI 产品线供养? 接受,并把这写进预算而非到时候再决定 决定现金流规划与止损线
5免费 AI 的受众:A(主播学员运营)还是 B(企业办公)? 选 A。企业办公 AI 继续付费,两条产品线分开命名 决定 D6 的产品形态与定价
6EspoCRM 是否保留?保留的话是否只给私有化大客户部署? 可保留,但SaaS 客户用自研模块,避免每客户一套实例的运维黑洞 决定运维成本模型
7学员报名费是否由平台代收?不由平台代收。学员付给主播,平台只收服务费涉及预收资金与存管要求
8是否今天就启动分账限额突破申请?是。这是唯一的硬阻塞项,有审批周期且结果不确定 不启动则 P2 全部卡住
优先级 1、2、3、8 最先定——它们分别是合规地基、结算口径、资源密度、硬阻塞项。 4、5、6、7 属于产品与财务安排,可在 P1 期间逐步明确。

07.1 本件未能验证的部分(不掩饰)