Platform Architecture & Business Design

BizLink · B端全链接商务对接平台

bizlinkbiz.com — 面向企业客户与知识主播的「内容分发 + O2O 培训会 + 项目资源链接 + 线下摊位招商」一体化平台。 本文为可直接进入开发的架构与业务设计基线,含业务架构图、技术架构图、领域模型、流程状态机、外部依赖核实结论与分期路线图。
版本 V1.0 2026-09-17 状态:评审稿 适用:架构评审 / 立项决策 / 一期开发 读者:创始人 + 技术负责人

00结论先行:这个项目能不能做、先做什么

能做,但不能按你现在列的 1→5 顺序平行推进。你这个需求本质上是四家公司叠在一起: 内容分发 SaaS、MICE 会议培训 O2O 交易平台、本地生活供应链(酒店/餐饮/停车)、AI 推荐引擎。 每一块单独都有成熟玩家。但把它们围绕「一场培训会」这条主线串起来,目前没有强竞争对手 —— 这是你唯一的、也是足够大的机会窗口。

0.1 五个需求的真实定位(重要,决定开发顺序)

需求你的描述 战略定位(我的判断)竞争强度建议顺序
需求2
O2O 培训会
场地 / 报名 / 就餐 / 住宿 / 停车全包 交易主干 & 现金流心脏。它天然带出学员(流量)、场地酒店(供应链)、摊位(变现)、项目对接(留存)。 所有其他需求都是它的挂件。MVP 核心
会小二已做10年、40万企业客户,但它只解决"找场地",不解决"学员+摊位+项目"
第 1 位
需求5
摊位招商
定制摊位数、服务商预订、对冲成本 差异化最强、最能收钱的一块。"用服务商摊位费对冲培训会成本"是一个真实的、别的平台没做的商业模型。 做成实时成本对冲看板就是你的护城河。杀手锏
会展招商系统多,但和"培训会成本模型"绑定在一起的没有
第 2 位
需求3 / 4
项目链接 + 现场咨询
学员项目资源、服务商摊位咨询 留存与复购引擎。技术上不难(撮合 + 商机登记 + CRM),价值在于把"一次性会议"变成"持续关系", 让客户第二年还回来。留存层 第 3 位
需求1
内容制作分发
制作并分发到各平台 获客前端,但自建 ROI 最低。成熟工具一大堆(易媒、新榜、蚁小二等), 且小红书/视频号根本没有发布 API(见第 1 节核实)。受限
红海,且 API 受制于人
第 4 位
AI 分析推荐 内容推荐、课程推荐 不是功能,是阶段产物。没有 3 万条以上真实业务数据之前,任何"AI 推荐"都是伪需求。 前期只做规则推荐 + 检索增强问答,把数据结构先攒好。后置 第 5 位
必须现在就承认的三个硬约束
  1. 最大的风险不是技术,是供给侧冷启动。你要的"每个城市的培训场地、会展搭建、视频拍摄、媒体机构" 全都没有公开 API,也没有可爬取的完整数据库。只能靠人去谈、去录。 这是成本中心,且在你写出第一行代码之前就得启动。会小二干了 10 年才攒到 9 万家场地。
  2. 美团 / 携程 API 不是注册开发者账号就能拿的。要商务合同、企业资质,酒店分销大概率要预付保证金或走第三方供应链 (详见第 1 节核实表)。把"AI 自动订酒店"写进一期计划 = 延期。
  3. "全球格局"和"国内地推冷启动"是两件完全不同量级的事。全球意味着多语言、多币种、跨境支付、 GDPR/数据出境合规、海外税务。建议:国内跑通模型后再外扩,但数据模型第一天就要为多语言多币种留字段 (改造成本极高,见 4.4)。

0.2 我建议的切入顺序(与你的原始顺序不同,理由已列)

P0 · 地基 多租户骨架 / IAM / 权限 服务商资源库(城市维度) 工作流引擎 / 消息 / 对象存储 3 个月 · 无对外收入 P1 · 交易主干 培训会全流程(需求2) 报名 / 餐饮 / 住宿 / 停车 全节点状态可视(Web+H5) 4 个月 · 开始收钱 P2 · 变现层 摊位定义 / 招商 / 预订(需求5) 成本对冲实时看板 项目资源 + 现场撮合(需求3/4) 4 个月 · 毛利结构成型 P3 · 获客前端 内容制作 / 审核 / 分发(需求1) 抖音·快手·YouTube 官方 API 小红书/视频号 → 半自动 4 个月 · 拉新管道 P4 · 智能化 向量检索 / 智能匹配 供应链 API 直连 推荐 / AI 客服 / 风控 持续 · 数据驱动 推进逻辑:先做「能收钱 + 别人做不了」的,再做「红海 + 受制于 API」的 P0 与「线下服务商地推」并行启动 —— 地推不等系统,系统先支持「人工录入 + 台账」即可 全程并行(不依赖系统,Day 1 就要启动):① 城市服务商地推与签约 ② 美团分销/道旅等供应链商务谈判 ③ 种子客户(大V/企业)锁定
图 0-1 建议推进顺序。与原始需求 1→5 的顺序不同:内容分发被后置,因为它技术受制于平台开放政策、商业上已是红海; 而"培训会 + 摊位招商"组合竞争真空且能立刻产生现金流。

0.3 一句话业务定义

BizLink 是什么 一个多租户的、以「线下培训会/展会」为交易单元的 O2O 商务操作系统。 左侧连接有学员的企业与大V客户,右侧连接城市级服务供给(场地/餐饮/住宿/停车/搭建/拍摄/媒体), 中间用摊位招商把成本中心翻转为利润中心,用项目资源撮合把一次性会议变成长期关系, 最终用内容分发反哺客户获客,形成闭环。

0.4 关键量级参考(用于判断投入产出,均为公开信息推算,需自行复核)

9 万+
会小二收录会议场地点位数
(深耕 10 年的结果)
30~50%
场地集采竞价带来的
采购成本下降区间
28 分钟
行业标杆的方案响应时效
(你的 SLA 必须对齐)
100 万+
第三方酒店聚合 API
可覆盖的全球酒店数

来源:会小二官网/百科公开数据、道旅(dida.com) 官网、美团分销平台官网。数千万级融资与 40 万企业客户为公开报道口径,非审计数据。

01外部依赖核实:哪些 API 真能用,哪些是幻觉

你说"不允许乱写",所以这一节的每一条我都去查了官方文档,标了来源。 这节决定了架构里哪些模块能自动、哪些必须人工。

1.1 结论汇总表

依赖项真实状态 官方口径 / 门槛(核实结论)架构对策
微信视频号
内容发布
无 API 面向普通第三方没有内容发布接口,无凭据可申请。只能用「视频号助手网页后台」人工发布。 半自动工作台:一键生成内容包(视频+封面+标题+话题)+ 发布任务清单 + 状态回填。不要承诺全自动。
小红书
笔记发布
无 API 开放平台面向企业号入驻与部分数据能力,无面向普通第三方的笔记发布接口。网传 `api.xiaohongshu.com/.../note/publish` 为非官方抓包接口,随时失效且有封号风险。 同上,半自动。产品中明确标注「需登录专业号后台完成发布」,把预期管理做在前面。
抖音
视频发布
可用 open.douyin.com,企业开发者主体 + 逐项权限审核(video.create)+ 账号 OAuth 授权。流程:申请上传 → 分片上传 → 完成合并 → 提交发布。access_token 约 30 天,需自动续期。 可全自动。设计统一 DistributionAdapter 接口,抖音作为第一个实现。注意视频 MD5 标准化与格式预检。
快手 可用 open.kuaishou.com,需企业开发者资质,审核周期较长,文档质量一般。能力结构与抖音类似。 第二优先接入,适配层复用。
B 站 受限 半开放,投稿相关能力受限,接入难度高。 排在抖音/快手之后,做成可插拔。
YouTube / TikTok 可用 YouTube Data API v3 的 videos.insert,需 OAuth + 应用审核;TikTok Content Posting API,审核通过前只能发私密。 做全球格局时的主要分发通道,P3 后期接入。
— — — 住宿 / 餐饮 / 停车 — — —
携程商旅
酒店
不适用 openapi.ctripbiz.com 是企业差旅模型:客户公司需预先把员工信息给携程,携程为每个员工指定携程卡号并绑定工号,再走 SSO。 不适合"给学员批量订房" —— 学员不是你公司员工。 ❌ 不要作为学员住宿通道。仅当客户企业本身有差旅需求时,可作为企业侧增值项。
携程开放平台
酒店分销
需商务协议 Trip.com 官方口径:建立直连合作必须签署商业合作协议,成为 Connectivity Partner,且要求全年房态/价格装载、完整支持 API 能力。门槛高。 列为 P4 目标。先走聚合商。
美团 · 酒店直连 不适用 openplatform-hotel.meituan.com 官方声明:「暂不接入 PMS 类供应商,仅与连锁酒店或酒店代理直连」。这是供给侧接口(你给它供房间),不是需求侧。 ❌ 走错门了。要用的是下面那个。
美团 · 酒店门票分销平台 正确入口 developer-distribution.meituan.com。这才是给分销商/第三方平台的:提供国内酒店 API、境外酒店 API、门票 API, 且支持「API 接口 / 唤起美团 App 小程序 / H5 嵌入 / 手工预订平台」四种模式,支持底价、返佣等结算。 流程:合作申请 → 商务对接 → 确认方案 → 开发测试 → 上线,需签商务合同 ✅ 住宿首选通道。且「手工预订平台」意味还没拿到 API 前就能先跑业务 —— 这是关键的过渡路径。
酒店聚合供应链
(备选/更快)
可用 · 道旅 dida.com:全球 100 万+ 酒店,Booking API + Content API,官方称「周级上线」,毫秒级响应、99.9% 可用性
· 龙腾捷旅「订房易」:大中华区 35 万+/全球 100 万酒店,支持协议酒店托管、365×24 客服
· 泰坦云「红色加力」:整合 50 万+ 酒店、1 万+ 自有协议酒店,支持大客户协议托管与统一结算
建议一期就走聚合商。理由:签约快(周~月级)、一个 API 覆盖全球、有客服兜底。 等单量起来后再叠加美团分销拿底价。架构上用 HotelSupplierAdapter 抽象,随时切换/多路比价。
餐饮(团餐/宴会) 无 API 美团/携程均无面向第三方的团餐批量预订 API。餐饮高度非标(人数、标准、忌口、包厢、开票)。 走「服务商入驻 + 结构化需求单 + 抢单/派单」模式(抄会小二的抢单逻辑)。 AI 的真实价值在这里是:把自然语言需求 → 结构化订单,而不是自动下单。
停车 无 API 无统一开放平台。捷停车/ETCP 等有部分能力,但不是为「会议预留车位」设计的。 作为场地资源的一个属性字段(车位数/是否可预留/价格),由场地方承诺,人工确认。别做自动化幻想。
培训/会议场地 无 API 没有任何开放的场地 API。行业标杆会小二的模式是:自建场地数据库(50 万点位数据 / 9 万深度合作)+ 酒店销售端 SaaS「会小二帮」抢单 + 人工顾问兜底。 照抄这个模式,不要幻想 API。VenueResource 自建库 + 服务商端抢单小程序 + 人工撮合后台。
核实来源(建议你亲自复核一遍,政策会变) 政策调整频繁,本表为 2026-09 口径,落地前请以各平台开放后台当前公示为准。

1.2 这三条核实结论如何改变架构

① 必须有「人工履约层」

凡是标 无 API 的(餐饮、停车、场地、小红书、视频号), 系统不能设计为"提交即完成",而要设计为 「生成结构化工单 → 派单/抢单 → 人工执行 → 状态回填」。 这一层是所有"AI 对接"的真相:AI 做的是结构化与派单,不是自动执行。

② 供应链必须做 Adapter 抽象

酒店可能来自美团分销、道旅、龙腾,或纯人工。HotelSupplier 必须定义成接口: search / quote / book / cancel / query,三种实现(API聚合 / 人工工单 / 协议价直采)并存, 上层业务只依赖接口。否则后期换供应链要重写业务代码。

③ 抢单机制是核心,不是附属

餐饮、场地、搭建这些非标供给,唯一被验证过的规模化撮合方式就是抢单(会小二「会小二帮」验证过)。 你的一期必须包含 服务商移动端抢单 + 报价,这是供给侧能否自运转的关键,不是"以后再说"的功能。

02业务架构

业务架构按 五层划分:渠道层(谁去拿资源/拿客户)→ 角色层(谁在用)→ 业务域层(系统做什么) → 平台能力层(通用能力复用)→ 数据智能层(沉淀什么)。 右侧两根竖轴是贯穿全局的横切关注点,必须在架构第一天就内置,后期补代价极高。

L1 渠道层 · 供给与客户从哪来 平台自营业务团队 城市渠道代理商(分佣) 服务商自助入驻 / 抢单 客户自助注册 / 邀请制 L2 角色层 · 六类主体,各自独立的门户与工作台 平台运营方 全局视图/审核/清算 渠道代理商 区域归属/业绩/佣金 客户(企业/大V) 租户主体·付钱的人 服务商 场地/餐饮/住宿/搭建… 学员 报名/签到/项目对接 项目方 发布项目/找学员 L3 业务域层 · 六个核心域(对应微服务/模块的拆分边界) ① 身份与租户域 租户 / 组织 / 角色 渠道商与归属关系 服务商授权关系 P0 ② 资源供给域 服务商入驻与资质 资源目录 / 档期库存 抢单 · 报价 · 评价 P0 ③ 活动运营域 培训会/展会项目 报名 · 审核 · 签到 餐饮/住宿/停车子单 P1 · 主干 ④ 交易与结算域 摊位定义 · 招商 · 预订 合同 / 订单 / 支付 分账 · 对账 · 发票 P2 ⑤ 项目与商机域 项目资源发布 学员申请 · 双向撮合 现场扫码 · 商机沉淀 P2 ⑥ 内容分发域 选题 · 拍摄 · 剪辑 审核 · 多平台适配 分发 · 数据回流 P3 L4 平台能力层 · 被所有业务域复用,禁止各域重复实现 工作流引擎 消息与通知 文件/对象存储 支付与分账 电子合同/签章 搜索与检索 OpenAPI/开放 L5 数据智能层 · 沉淀与放大(P4 才真正发力,但数据埋点 P0 就要做) 数据平台 埋点 · 指标 · 数仓 · 看板 AI 能力 LLM 网关 · 向量检索 · 推荐 · Agent 集成总线 外部 Adapter · 对账 · 补偿 基础设施 云资源 · DevOps · 可观测 · 安全 横切关注点(贯穿全部五层) ① 多租户与数据隔离 · 租户 ID 强制注入(ORM 拦截器) · 数据库行级安全(RLS)兜底 · 跨租户例外:服务商授权关系 · 渠道商按区域/归属隔离 → 后期改造成本极高,P0 必做 ② 全节点状态与进度可视 · 统一工作流引擎驱动状态机 · Web 与移动端同一套状态定义 · 每个节点:负责人/时限/凭证 · 超时自动升级与提醒 → 你的核心诉求,写进产品定义 ③ 审计 · 合规 · 全球化预留 · 全量操作审计日志(不可删) · 敏感数据加密 + 脱敏展示 · 多语言 / 多币种 / 多时区字段 · 数据出境与 GDPR 开关 → 字段级预留,不等于现在实现 三者都不是"功能模块", 而是写进框架底座的约束。 读图要点: 渠道层负责"资源从哪来"(这是你最重的运营成本);角色层决定六套门户与权限矩阵; 业务域层是系统拆分边界(③ 活动运营域是主干,其余都是它的挂件);L4 能力层必须强制复用,否则每个域各写一套通知/工作流必然失控。
图 2-1 BizLink 业务架构(五层 + 三根横切轴)。P0/P1/P2/P3 标注为期数建议,见第 10 节路线图。

2.1 六个业务域的职责边界(防止后期耦合失控)

核心职责(做什么)明确不做(边界)
① 身份与租户 租户生命周期、组织架构、角色权限、渠道商归属、服务商授权关系、SSO、审计日志 不做业务单据;权限只管"能不能看/能不能改",不管"流程走到哪"
② 资源供给 服务商入驻/资质审核、资源目录(场地/餐饮/住宿/停车/搭建/拍摄/媒体)、档期与库存、抢单与报价、服务评价与黑名单 不直接接单;不关心订单如何结算(交给交易域)
③ 活动运营 培训会/展会项目立项、需求结构化、场地匹配、行程编排、学员报名与审核、签到、现场执行、结项复盘 不做支付结算(发起结算单即可);不重复实现通知(调 L4)
④ 交易与结算 摊位定义与定价、招商发布、预订与合同、收付款、分账(平台/渠道商/服务商)、对账、发票、退款 不判断业务是否该成交(由活动域/业务规则决定);只负责钱与凭证
⑤ 项目与商机 项目资源发布、学员能力画像、双向意向与撮合、现场扫码建联、商机跟进(轻量 CRM)、成交登记与分佣 不做重型 CRM(直接集成或二次开发成熟开源 CRM,见 9.5)
⑥ 内容分发 选题/脚本/拍摄工单、素材管理、审核流、多平台适配、分发调度、数据回流与效果归因 不做专业剪辑工具(对接第三方或人工);无 API 的平台做半自动工作台

03技术架构

接入层 · 五端一体,复用同一套后端 API 与状态定义 客户 Web 工作台 租户视角 · PC 主战场 平台运营后台 审核 · 清算 · 风控 移动 H5 / 小程序 学员 · 现场 · 进度查询 服务商抢单端 接单 · 报价 · 交付回填 OpenAPI / Webhook 客户自有系统对接 网关层 · 横切逻辑全部前置,业务服务不重复实现鉴权与限流 CDN + WAF 静态加速 · 防刷 · 防注入 API 网关 路由·鉴权·租户识别·限流·灰度 BFF 聚合层 多端差异化裁剪与聚合 文件网关 直传签名·转码·水印·鉴权回放 应用服务层 · 模块化单体(Modular Monolith):单进程部署、域间接口调用、预留服务化拆分边界 iam-service 租户/组织/角色/授权 NestJS Module supply-service 服务商/资源/档期/抢单 NestJS Module event-service ★ 培训会/报名/行程/签到 主干 · 优先投入 trade-service 摊位/订单/支付/分账 NestJS Module match-service 项目/撮合/商机/分佣 NestJS Module content-service 素材/审核/分发/回流 NestJS Module workflow-engine 状态机/审批/超时升级 所有流程的唯一驱动 platform-kit 通知/文件/搜索/配置 强制复用,禁止各域重写 异步与集成层 · 外部不确定性全部隔离在这里(第三方挂了不能拖垮主流程) 消息队列 RabbitMQ / RocketMQ 领域事件 · 削峰 · 最终一致 任务调度 XXL-Job / BullMQ 定时同步 · 超时扫描 · 报表 外部 Adapter 集群 酒店 · 场地 · 餐饮 · 支付 · 地图 · 分发平台 统一接口 + 熔断降级 + 人工兜底通道 数据层 · 单一事实来源(PostgreSQL),其余皆为派生存储,可重建 PostgreSQL 主库 · 唯一事实源 RLS 行级安全 读写分离 Redis 缓存 · 分布式锁 会话 · 幂等 限流计数 对象存储 OSS / MinIO 课件 · 视频 · 合同 生命周期归档 搜索引擎 ES / Meilisearch 场地 · 课程 · 项目 可重建 向量库 pgvector / Milvus RAG · 语义匹配 P4 启用 数仓 ClickHouse 行为 · 指标 · 看板 P4 启用 可观测与运维 · 上线前必须就绪,否则出问题无法定位 日志(ELK / Loki) 指标(Prometheus) 链路追踪(Jaeger) 告警(分级值班) CI/CD + 蓝绿发布 AI 能力层(贯穿调用) LLM 网关 · 多模型统一抽象(国内/国外可切) · Prompt 版本管理与灰度 · Token 成本核算与配额 · 超时/降级/人工兜底 → 绝不硬编码单一厂商 Embedding / RAG · 课件/课程/服务商/项目向量化 · 租户级命名空间隔离 · 语义检索 + 结构化过滤混合 · 增量索引与重建 → 向量必须带 tenant_id 推荐与匹配 · 规则优先(冷启动无数据) · 协同过滤(数据量达标后) · 课程/服务商/项目推荐 · A/B 与效果归因 → 一期只做规则 + 检索 AI Agent(真正省钱的地方) ① 需求结构化:自然语言 → 结构化订单(最大价值) ② 智能派单:需求 → 候选服务商 排序 + 理由 + 自动询价 ③ 客服问答:基于租户知识库 (课件/规则/历史单) AI 不是"自动下单", 是"把非结构化变成结构化"。
图 3-1 BizLink 技术架构。核心设计取向:模块化单体起步(团队规模不足以支撑微服务), 外部依赖全部收敛到 Adapter 层并强制熔断降级,AI 能力作为独立侧挂而非侵入业务。

3.1 关键架构决策与理由

决策选择理由(以及不这么做的后果)
服务拆分粒度 模块化单体起步
单进程 + 域模块 + 明确接口
8 个域模块在 5~8 人团队下若拆成微服务,首年大量精力会耗在分布式事务、链路追踪、服务治理上, 而业务逻辑本身(状态机、撮合、结算)才是难点。做法:代码层面按域严格分包、禁止跨域直连数据表, 只能走模块导出接口 —— 这样未来要拆时是"搬代码"而不是"重写"。
流程驱动方式 统一工作流引擎
状态机定义化,非硬编码 if-else
你的核心诉求是"每个节点状态和进度在 Web 和手机端都能看到"。若各模块自己写状态字段, 前端要为每类单据写一套进度条,且无法统一做超时提醒与 SLA。做法:状态机用配置描述(JSON), 引擎负责流转、留痕、超时升级,前端用一套通用进度组件渲染。
外部依赖隔离 Adapter + 人工兜底双通道 酒店/场地/餐饮的可用性、接口稳定性、政策变化都不可控。每个外部能力必须定义 search / quote / book / cancel / query 五方法接口,且每个方法都要有"人工通道"实现。 API 失败时自动降级为工单,业务不中断。否则第三方一挂,你的核心流程就断了。
数据一致性 强一致用于交易(支付/库存),
最终一致用于协同(通知/统计/搜索)
摊位库存、档期锁定必须强一致(防超卖,用数据库行锁 + 唯一约束 + 幂等键); 搜索索引、统计报表、通知允许秒级延迟(走消息队列)。
移动端形态 H5 / 小程序为主,App 后置 你的场景是"学员扫码报名、服务商抢单、现场签到",都是低频+即时场景, 小程序与 H5 覆盖足够,且省掉审核与双端开发成本。若确需 App,用 Capacitor 复用同一套 H5 代码打包(与你现有技术栈一致)。
AI 接入方式 LLM 网关 + 多模型抽象,
Prompt 版本化
国内/海外模型政策与价格变动频繁,硬编码单一厂商会在涨价或下架时被迫返工。 网关层统一做鉴权、限流、成本核算、降级。
全球化预留 字段级预留,非功能级实现 P0 就要埋:locale / currency / timezone / country_code,所有金额存 最小货币单位整数 + 币种(绝不存 float)。但多语言切换 UI、跨境支付、GDPR 合规流程留到 P4。 这几处后期改造成本是前期的 5~10 倍,属于必须前置的一次性投入。

3.2 技术栈选型对比

两套都能做,差别在团队与生态。结合你现有的技术背景(Node.js / Strapi / 阿里云 ECS + Nginx), 我倾向 方案 A;若你团队 Java 人手充足且预期要做私有化大客户交付,选 方案 B

层次方案 A(推荐 · TypeScript 全栈)方案 B(Java 生态)
前端 WebReact 19 + Next.js(或 Vue3 + Nuxt)+ TypeScript + Ant Design / shadcn同上(前端与后端语言无关)
移动端同一套 H5 + 小程序(uni-app / Taro),需要 App 时用 Capacitor 打包同上
后端NestJS(模块化天然贴合"模块化单体")+ Prisma/TypeORMSpring Boot 3 + Java 21 + MyBatis-Plus / JPA
工作流自研轻量状态机 + BullMQ(需求不复杂,自研可控)Flowable / Camunda(成熟但重)
数据库PostgreSQL 16 + RLS + pgvectorPostgreSQL 16(或 MySQL 8)+ pgvector 需另配
缓存/队列Redis 7 + BullMQ(复用 Redis,运维简单)Redis + RocketMQ / RabbitMQ
文件阿里云 OSS + CDN(与你现有基础设施一致)同上
搜索Meilisearch(轻量、中文友好)或 ElasticsearchElasticsearch
部署Docker Compose(一期)→ K8s(单量起来后)同上
优势 前后端同一语言,5~8 人小团队协作损耗最小;你现有 Node 运维经验可直接复用;开发速度快 人才供给充足;大客户私有化交付时甲方更认可;生态中间件成熟
劣势 复杂事务与高并发场景需更小心;招到资深 NestJS 的人比 Java 难一些 开发效率略低;同样的功能需要更多人月;前后端语言割裂
适用 推荐 团队 5~8 人、以 SaaS 公有云为主、追求上线速度 团队 10 人以上、需要私有化部署给大客户、Java 人手充足
一个容易被忽略的选型陷阱 不要因为"要做很多系统(客服、CRM、AI 企业服务)"就自研全部。你提到的 客服系统、CRM、IM 都有成熟开源方案 (如 Chatwoot / 2345 客服类开源项目、EspoCRM —— 你已经在用 EspoCRM,可直接集成)。 自研这些通用系统的 ROI 极低,且会拖垮核心业务进度。 正确做法:核心交易链路(活动/摊位/结算/撮合)自研,通用系统用开源集成 + 单点登录打通, 对外统一呈现为"平台提供的软件"。这既降低了部署运维成本(你的目标),又不牺牲进度。

04多租户与权限设计

你的要求:"客户必须是多租户的模式,每个客户只能看见自己的客户和业务"。 这一节是整份文档里最不能出错的部分——它一旦做错,后期改造需要动所有查询、所有表、所有接口,成本相当于重写。

4.1 谁是"租户"

关键结论:租户 = 付钱的客户主体(企业 或 大V 团队),不是用户、不是服务商、不是学员

4.2 隔离方案选型

方案隔离强度成本说明与适用
A. 独立数据库
每租户一库
最强 最高 物理隔离,合规最好讲。但租户上百后,迁移、升级、运维是灾难(改一次表结构要跑 N 次)。 只用于少数要求物理隔离的大客户(独立部署版)。
B. 共享库 · 独立 Schema PostgreSQL schema 隔离,逻辑清晰。但跨租户统计查询麻烦,连接池与迁移工具复杂度上升。中大型租户数(数十~数百)可用。
C. 共享库 · 共享 Schema
+ tenant_id 行级隔离
中~强 最低 推荐默认方案所有业务表带 tenant_id三重保险:① ORM 全局拦截器自动注入过滤条件 ② PostgreSQL RLS 策略在数据库层兜底 ③ 代码扫描 CI 卡口禁止裸 SQL。 成本低、统计方便,配合 RLS 后安全性足够。
D. 混合(推荐最终形态) 默认走 C;对少数大客户或合规要求高的行业客户,支持一键切到 A/B(独立库)。 前提是你从第一天就把数据访问收口到 Repository 层、且数据源路由可配置。这是"架构上的期权",现在只花很小的代价买下。
三条硬性工程约束(写进代码规范,CI 强制执行)
  1. 所有业务表必须有 tenant_id 非空字段,且所有外键关联必须建立在 (tenant_id, id) 复合键上 —— 这能防止"A 租户的报名单关联到 B 租户的活动"这类越权引用。漏一个就是数据泄露事故。
  2. 禁止在业务代码里手写 SQL 拼 tenant_id。统一走 Repository + 全局拦截器从请求上下文取租户。 同时开启 PostgreSQL RLS 作为第二道防线,即使应用层出 bug 也查不到别人的数据。
  3. 向量库、搜索引擎、对象存储也必须带租户维度。这是最常被忽略的泄露点: 搜索索引不分租户 = 搜到别人的课件;向量检索不隔离 = AI 用别家数据回答。对象存储用租户级目录前缀 + 签名 URL,禁止公开读。

4.3 跨租户的三种合法场景(必须单独设计,否则业务跑不通)

场景处理方式可见范围
服务商服务多个客户 服务商是平台级主体(tenant_id = NULL,标记为平台共享)。 通过 ProviderEngagement(合作关联表)记录"哪个租户的哪个活动用了哪个服务商"。 服务商只能看到与自己有关联的活动单据的最小必要字段,看不到客户其他业务。 关联活动内的:需求明细、时间地点、联系人、结算金额。
看不到:客户其他活动、学员全量名单(除非业务需要,且需客户授权开关)。
学员参加多个老师的活动 学员身份全局唯一(按手机号/openid 归并),通过 Enrollment 关联到具体活动与租户。 学员在 A 租户留下的信息,B 租户默认不可见,除非学员主动授权共享。 学员自己:看到全部自己报名的活动。
租户:只能看到本租户活动下的学员。
渠道代理商看自己的盘子 Agent 绑定"归属关系":owned_tenants(发展的客户)+ owned_providers(拓展的服务商)+ 负责城市列表。 数据权限 = 归属维度 ∩ 地域维度。佣金按关联订单计算。 自己发展的客户与服务商 + 负责城市的资源库。
看不到:其他代理商的盘子、非负责城市的资源。
平台运营方 独立后台,全局视图 + 敏感数据脱敏(身份证、联系方式按需解密,留审计)。 所有查看敏感数据的操作记审计日志。 全局(含审核、清算、风控、纠纷处理)。

4.4 全球化字段预留(P0 埋点,P4 启用)

预留项做法不做的后果
金额最小货币单位的整数(分)+ currency_code(ISO 4217)。禁止 float 存钱。 多币种一上就出现精度错误与对账差异
时间统一存 UTC(timestamptz)+ 用户时区字段,展示层转换。 跨时区活动的档期、签到、 reminders 全错
多语言内容可翻译字段(课程名、场地描述、课件标题)不直接写入主表, 用 xxx_i18n(JSONB) 或独立翻译表 {entity_id, locale, field, value} 后期要加语言 = 全表加列 + 数据迁移
地区与合规country_code / region_code / data_residency(数据驻留地) 无法支持数据分域存储,GDPR 合规无从谈起
编号与序列订单号、合同号不要依赖自增 ID,用「业务前缀 + 日期 + 序列」生成,且序列按租户/地区隔离。 多区域部署时主键冲突

4.5 权限模型:RBAC + 数据域(Data Scope)

纯 RBAC 不够用——同一个"活动经理"角色,在 A 租户只能看自己负责的活动,在平台侧要能看全局。 所以采用 RBAC(功能权限)+ Data Scope(数据范围)双维度

// 权限判定伪代码 —— 两个维度同时满足才放行
function canAccess(user, action, resource) {
  // ① 功能权限:角色是否包含该操作
  if (!user.roles.some(r => r.permissions.includes(action))) return false;

  // ② 数据范围:该资源是否落在用户的数据域内
  const scope = user.dataScope;   // 见下表
  switch (scope.type) {
    case 'TENANT':    return resource.tenantId === user.tenantId;
    case 'OWN':       return resource.ownerId  === user.id;
    case 'ORG_TREE':  return orgTreeContains(user.orgId, resource.orgId);
    case 'AGENT':     return user.ownedTenants.includes(resource.tenantId)
                       && user.cities.includes(resource.cityCode);
    case 'PROVIDER':  return hasEngagement(user.providerId, resource.eventId);
    case 'PLATFORM':  return true;  // 记录审计日志
  }
}
Data Scope适用角色范围
PLATFORM平台运营、平台管理员、财务、风控全局(敏感字段脱敏 + 审计)
AGENT城市渠道代理商、业务员自己发展的客户 + 拓展的服务商 ∩ 负责城市
TENANT客户管理员(企业主 / 大V 本人)本租户全部数据
ORG_TREE部门负责人本部门及下级部门
OWN普通员工、执行人员仅自己创建/负责的数据
PROVIDER服务商账号与自己有 Engagement 关联的单据(最小必要字段)
TRAINEE学员自己报名的活动、自己的项目申请、自己的商机

05数据模型(领域模型)

下图为 核心实体关系图,共 21 个核心实体、分 4 个域带。 橙色字段为外键(FK),几乎所有业务表都带 tenant_id —— 这是 4.2 节隔离方案的落地体现。

图例: 主键 PK 外键 FK 状态机字段 普通字段 带内实线 = 直接关联;跨带关系见实体内 FK 字段与下方关系说明 ① 身份与租户域 tenant / user / role / org_unit / agent agent渠道商/业务员 id user_id level 等级 cities[] 负责城市 commission_rate parent_id(上级代理) tenant租户(客户主体)★隔离单位 id name 名称 type 企业 | 大V plan / status locale / currency / tz data_residency 数据驻留 user用户账号 id tenant_id org_id phone / email / openid identity_id 全局身份 status / last_login_at role角色与权限 id tenant_id(NULL=平台级) code / name data_scope 数据范围 permissions[] 见 4.5 双维度判定 org_unit组织/部门 id tenant_id / parent_id name / path 路径 level 层级 manager_id 支持 ORG_TREE 数据域 ② 资源供给域 service_provider / resource_item / resource_calendar / provider_engagement service_provider服务商(平台级共享) id tenant_id = NULL(平台级) agent_id 拓展人 category 类别 / city_code qualification_status 资质 resource_item资源项(场地/餐饮/住宿…) id provider_id type 场地|餐饮|住宿|停车|搭建|拍摄|媒体 capacity 容量 / city_code attrs JSON 扩展属性 resource_calendar档期与库存(防超卖) id resource_id date + slot 时段 status 可订|锁定|已售 price(最小单位整数+币种) provider_engagement合作关联(跨租户桥)★ id tenant_id + provider_id + event_id status 邀请|接受|履约|终止 visible_fields[] 最小必要字段 rating / remark ③ 活动运营 + 交易结算域(核心主干) training_event / enrollment / trainee / event_service_order / booth / booth_order / settlement training_event 培训会 / 展会 ★主干 id tenant_id / course_id title / city_code start_at / end_at (UTC) headcount 预计人数 status 状态机(见 6.1) enrollment 学员报名 id tenant_id / event_id trainee_id ticket_type 票种 status 待审|通过|驳回|取消 checkin_at 签到时间 trainee 学员(全局身份+租户关联) id tenant_id / identity_id name / phone(加密) company / position tags[] 能力画像 source 来源渠道 event_service_order 服务子单(餐饮/住宿/停车) id tenant_id / event_id resource_id / provider_id type / spec JSON 规格 status 状态机(见 6.3) fulfil_mode API | MANUAL booth 摊位 id tenant_id / event_id code 编号 / zone 区域 size 尺寸 / position price 定价 status 招商中|已定|保留 booth_order 摊位预订 id booth_id / provider_id amount 金额(分+币种) contract_id 合同 pay_status 支付状态 status 状态机(见 6.5) settlement 结算与分账 id order_id / tenant_id party 平台|渠道商|服务商 amount / rate 比例 status 待结算|已结|争议 invoice_no 票号 ④ 课程 / 内容分发 / 项目商机域 course / courseware / content_asset / distribution_task / project_resource / project_application course课程 id tenant_id title_i18n JSON 多语言 outline / duration tags[] 标签 → 被 training_event 引用 courseware课件/讲义 id tenant_id / course_id file_url(签名访问) version / size status 草稿|审核|发布 → 向量化后供 RAG 检索 content_asset内容素材 id tenant_id / event_id type 视频|图文|直播切片 file_url / cover / duration meta JSON(标签/摘要) 源文件 + 转码规格分离存储 distribution_task分发任务 id tenant_id / asset_id channel 抖音|快手|B站|YT… channel_account_id status 状态机(见 6.6) metrics JSON 数据回流 project_resource项目资源(需求3) id tenant_id / provider_id title / industry 行业 requirements JSON budget_range 预算区间 可由服务商/项目方发布 project_application 项目申请 / 撮合记录 id project_id / trainee_id match_score 匹配度 status 状态机(见 6.4) deal_amount / commission
图 5-1 核心实体关系图(21 个实体)。跨带关键关系: tenant 1:N training_event / trainee / course(同租户隔离); agent 1:N service_provider(渠道拓展); resource_item 的 resource_calendar 被 event_service_order 占用(档期锁定,防超卖); provider_engagement 是服务商跨租户服务的唯一合法桥梁; booth 从属于 training_event,booth_order 产生 settlement 分账; trainee 通过 project_application 与 project_resource 撮合。

5.1 表清单与索引策略

租户隔离关键索引 / 约束(性能与安全的落点)
tenant本表即租户uk(name);status 用于停用即冻结全部子账号
useruk(tenant_id, phone)idx(identity_id) 支持跨租户身份归并
service_provider平台级idx(category, city_code, qualification_status) —— 这是匹配查询的主路径
resource_item平台级idx(provider_id)idx(type, city_code);attrs 用 GIN 索引(JSONB)
resource_calendar继承uk(resource_id, date, slot) 唯一约束 —— 这是防超卖的最后一道防线idx(resource_id, date, status)
provider_engagement是(桥梁表)uk(tenant_id, provider_id, event_id) 防重复关联
training_eventidx(tenant_id, status, start_at)idx(city_code, start_at, status) 供平台侧调度
enrollmentuk(event_id, trainee_id) 防重复报名idx(tenant_id, event_id, status)
traineeuk(tenant_id, phone_hash);phone 字段加密存储,检索用哈希;tags GIN 索引
event_service_orderidx(event_id, type, status)idx(resource_id, date);幂等键 uk(request_id)
boothuk(event_id, code)idx(event_id, status)
booth_orderuk(booth_id) 在 status=已定时生效(部分唯一索引)防一摊两卖;幂等键
settlementidx(order_id)idx(party, status, created_at) 供对账
distribution_taskidx(status, scheduled_at) 供调度器拉取;uk(asset_id, channel, channel_account_id)
project_applicationuk(project_id, trainee_id)idx(project_id, status, match_score)
支撑表(通用,所有域共用)
workflow_instanceL4状态机实例:定义 ID / 当前节点 / 上下文 / SLA 到期时间。所有需要"进度可视"的单据都挂它
workflow_taskL4节点任务:处理人 / 状态 / 时限 / 凭证附件 / 超时升级记录
audit_logL4只增不改不删,含敏感数据访问记录;分区表按月分区
notificationL4站内信 / 短信 / 邮件 / 微信模板消息统一出口,带已读与重试状态
file_objectL4对象存储映射表,租户目录前缀隔离 + 签名 URL,禁止公开读
三个最容易出事故的数据库设计点
  1. 防超卖不能只靠应用层。档期锁与摊位锁必须在数据库层有唯一约束或部分唯一索引兜底。 应用层加锁在高并发和分布式部署下一定会有漏网之鱼,而这类事故直接表现为"同一个摊位卖给了两家", 是业务上无法挽回的信任损失。
  2. 金额字段用 BIGINT(分)+ currency_code,绝不用 FLOAT/DOUBLE。 这是财务系统的铁律。浮点数累加误差会在对账时暴露,且排查极难。
  3. 所有写接口必须带幂等键(request_id)。 支付回调、第三方 API 重试、用户重复点击都会造成重复下单。幂等键 + 唯一约束是唯一可靠解法。

06业务流程与状态机设计

这一节回答你的硬要求:"所有流程都要让客户在 Web 和手机端都可以看到每个节点状态和进度"。 做法是:所有需要进度可视的单据,统一挂在 workflow_instance 上,由工作流引擎驱动状态机, 前端用同一套进度组件渲染。这样不用为每个流程单独写进度条,也保证 Web/H5 状态定义绝对一致。

状态机图例

图形含义
正常节点主流程状态,实线箭头表示正常流转
异常/终态终止、取消、失败等旁路状态,虚线箭头进入
人工节点该节点必须由人工处理(无 API 可用,见第 1 节)

6.1 主干流程:培训会 / 展会全周期(需求 2)

training_event 状态机(10 个主状态 + 1 个终止态) DRAFT 需求草稿 客户自建 MATCHING 资源匹配中 AI+人工 QUOTED 方案报价中 3~6 套方案 CONFIRMED 客户已确认 锁定报价 LOCKED 档期已锁定 定金/合同 ENROLLING 报名进行中 开放报名 PREPARING 会前准备中 餐饮/住宿/车 ONGOING 活动进行中 现场签到 SETTLING 结算中 对账/开票 CLOSED 已完成结项 复盘归档 CANCELLED 已取消 需填写原因 + 走违约金/退款规则 虚线 = 可从多个节点取消(越晚取消,违约金比例越高) 注:LOCKED 之后才允许开放报名与摊位招商;CLOSED 触发复盘报告生成与服务商评价推送。
图 6-1 培训会主状态机。注意 MATCHING / QUOTED 是人工+AI 混合节点(橙), 因为场地餐饮住宿停车均无可用 API(见第 1 节),系统只能做到"需求结构化 + 候选排序 + 派单/抢单",最终确认必须人工。

流程节点明细(这张表就是开发任务清单,也是前端进度条的数据源)

#阶段节点 负责人建议时限系统动作可见角色(Web + H5 同步)
1DRAFT提交培训会需求客户 表单 + AI 结构化(自然语言→结构化需求单)客户(全部)、运营
2MATCHING资源匹配(场地/住宿)系统 + 运营4 小时 按城市/人数/预算/档期筛选 + AI 排序 + 生成候选清单客户、运营、相关服务商(仅自己的报价)
3MATCHING需求派发与服务商抢单服务商28 分钟响应 推送到服务商端;抢单池;超时未响应自动扩大范围客户(看到响应数)、运营、服务商
4QUOTED生成方案与比价运营 / 客户自助24 小时 多方案对比(价格/位置/容量/评分);成本测算客户、运营
5CONFIRMED客户确认方案客户 冻结报价;生成待签合同;触发定金账单客户、运营、中选服务商
6LOCKED签约 + 付定金 + 锁档期客户 / 运营48 小时 电子合同;支付;写 resource_calendar 锁定档期(强一致)客户、运营、服务商(自己档期)
7ENROLLING开启报名(生成报名页/H5)客户 生成报名二维码/H5 链接;配置票种与表单字段客户、学员(公开链接)
8ENROLLING学员报名与资格审核客户 / 系统逐单 自动校验(重复报名/黑名单)+ 人工审核;短信通知客户、学员(自己状态)
9PREPARING餐饮需求确认餐饮服务商会前 7 天 生成 event_service_order(MANUAL 通道);人数/标准/忌口/包厢客户、运营、餐饮服务商
10PREPARING住宿预订系统 / 人工会前 7 天 API 通道(酒店聚合 Adapter);失败降级为人工工单客户、学员(自己的房间)、运营
11PREPARING停车需求确认场地方会前 3 天 作为场地资源属性确认;无 API,人工回填凭证客户、运营、场地方
12PREPARING物料/搭建/拍摄/媒体确认各服务商会前 3 天 子单派发 + 交付物上传(凭证附件)客户、运营、各服务商
13ONGOING现场签到与执行客户 / 服务商活动期 扫码签到(H5);实时出勤看板;现场异常上报客户、运营、学员(签到确认)
14SETTLING费用核对与结算分账运营 / 财务会后 7 天 生成 settlement;平台/渠道商/服务商三方分账客户、运营、服务商(自己的结算单)
15CLOSED复盘报告 + 服务商评价系统 + 客户会后 14 天 自动生成复盘(成本/转化/满意度);双向评价入库客户、运营、服务商(自己的评分)
这一条流程跑通 = 你的 MVP 成立 上表 15 个节点里,真正需要"AI 全自动"的只有节点 1(需求结构化)和节点 2/3 的候选排序。 其余都是"系统管状态 + 人做决策"。这个认知很重要:它能让你把一期范围砍掉一半,提前 2~3 个月上线。 不要试图让系统替人做报价决策——非标服务的报价在可见的未来仍需人工。

6.2 学员报名与签到流程(需求 2 的分支)

enrollment 状态机(学员视角,H5 为主战场) SUBMITTED 已提交报名 扫码/链接 REVIEWING 资格审核中 人工/自动 APPROVED 审核通过 生成席位 PAID 费用已结清 免费票自动过 CHECKED_IN 已签到 扫码/定位 ATTENDED 已参训 出勤统计 FEEDBACK 已完成反馈 触发推荐 REJECTED 驳回(附原因) CANCELLED 取消(退款规则) 自动规则: · 同手机号/身份重复报名 → 唯一约束拦截 · 免费票 APPROVED → 自动 PAID(跳过支付)
图 6-2 学员报名状态机。设计要点:报名表单字段由租户自定义(不同客户要收集的信息不同), 用 enrollment.form_data JSONB 存扩展字段,不要为每个客户加列。

6.3 服务子单流程:餐饮 / 住宿 / 停车 / 搭建(需求 2 的执行层)

event_service_order 状态机(四种子单共用一套,用 type 区分)+ 双履约通道 DRAFT 子单草稿 从主单派生 DISPATCHING 派单/抢单中 AI 排序候选 QUOTING 服务商报价 可多轮 CONFIRMED 已确认 锁定库存 FULFILLING 履约中 按通道分流 DELIVERED 已交付 凭证已上传 SETTLED 已结算 分账完成 FULFILLING 内部按 fulfil_mode 分流 API 通道 酒店/支付等有接口 MANUAL 通道 餐饮/停车/搭建 API 失败 / 超时 / 无库存 → 自动降级为 MANUAL 工单,业务不中断(关键设计) 四种子单的差异(共用状态机,type 区分,spec JSON 存差异字段) 餐饮:人数 / 餐标 / 忌口 / 包厢 / 开餐时间 | 住宿:房型 / 间数 / 入住人名单 / 入离日期 停车:车位数 / 是否预留 / 大巴位 / 收费方式 | 搭建:展具清单 / 进场时间 / 图纸附件 → 差异全部塞进 spec JSONB,主表保持稳定 → 住宿是唯一有 API 通道的(酒店聚合 Adapter),其余三种走 MANUAL
图 6-3 服务子单状态机与双履约通道。这是把第 1 节核实结论落到代码的关键设计fulfil_mode 字段决定走 API 还是人工工单,且 API 通道必须能在运行时自动降级——第三方挂掉时, 订单自动转成人工工单并通知运营,客户感知到的只是"处理中",而不是"系统错误"。

6.4 项目资源撮合流程(需求 3、需求 4)

project_application 状态机(学员 ↔ 项目资源 双向撮合) PUBLISHED 项目已发布 租户/服务商均可发 APPLIED 学员已申请 附带能力画像 MATCHED 系统判定匹配 match_score ≥ 阈值 INTERVIEWING 双向沟通中 站内沟通/线下约 DEALT 已成交登记 金额/凭证 SETTLED 佣金已结算 平台分佣 REJECTED 不匹配 / 名额满 CLOSED 项目关闭 需求 4 · 现场咨询建联入口(摊位二维码) 学员扫码 → 交换名片 + 需求登记 → 自动进商机池 → 后续跟进 一次扫码 = 一条 ProjectApplication(type=CONSULT) match_score 计算:一期用规则(行业/地域/能力标签/预算区间加权),二期叠加向量相似度,三期再上协同过滤。
图 6-4 项目资源撮合状态机。需求 3(项目资源)与需求 4(现场咨询)在数据层合并为同一张 project_application,用 type 区分来源(APPLY 主动申请 / CONSULT 现场扫码)。 这样现场扫码产生的线索不会散落在系统外,能直接进入商机池被跟进——这是"让培训会变成长期关系"的技术前提。

6.5 摊位招商与预订流程(需求 5 —— 你的杀手锏)

booth / booth_order 状态机(摊位从定义到结算) DEFINED 摊位已定义 按场馆平面图 OPEN 招商中 对外发布 RESERVED 已锁定(未付) 15 分钟占位 BOOKED 已付款 占位生效 CONTRACTED 已签合同 电子签章 BUILT 已搭建交付 现场确认 SETTLED 已结算 计入对冲 超时未付 → 自动释放回 OPEN 定时任务扫描,释放后通知候补服务商 防超卖三道锁:① 占位时 RESERVED 状态 + 过期时间 ② 支付时校验状态仍为 RESERVED(乐观锁) ③ DB 层部分唯一索引兜底 一个摊位同一时刻只能有一条 BOOKED/CONTRACTED 的 booth_order —— 这是业务信任的底线,不允许任何例外
图 6-5 摊位招商状态机。RESERVED 是有超时时间的中间态(建议 15 分钟), 超时由定时任务自动释放并通知候补——这是会展招商系统的标准做法,能显著提升摊位成交率。

6.5.1 成本对冲模型(这是整个平台最值得做的差异化功能)

你的原话:"支持学员从事的工作的项目落地的服务商可以预定摊位,来实现线下成本的支出对冲"。 把它做成一个实时看板,就是客户续费的最大理由。

// 培训会成本对冲实时模型(每次摊位成交/每笔支出变动时重算)

  总支出 Cost
    = 场地费 + 餐饮费 + 住宿费 + 停车费
    + 搭建物料 + 拍摄/媒体 + 人员差旅 + 平台服务费

  对冲收入 Offset
    = Σ 摊位费(booth_order.amount)
    + Σ 赞助/广告位收入
    + Σ 项目撮合佣金分成(客户方分成部分)

  净成本 NetCost   = Cost - Offset
  对冲率 OffsetRate = Offset / Cost × 100%

// 关键产品化动作:把这三个数字做成实时卡片,放在客户工作台首屏
┌──────────────┬──────────────┬──────────────┐
│  总支出       │  对冲收入     │   净成本      │
│  ¥ 186,000   │  ¥ 152,000   │  ¥ 34,000    │
│              │  对冲率 81.7% │  ↓ 较上届 -44%│
└──────────────┴──────────────┴──────────────┘
   招商进度 ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░  34/40 个摊位已定
   距成本打平还差 2 个摊位(¥ 8,000)  ← 这句是促成交的关键提示
看板要素作用开发优先级
实时成本/收入三卡客户首屏看到"这场会我还亏多少",是整个产品的情绪锚点P2 必做
招商进度条 + 打平提示"还差 2 个摊位就能打平" —— 这是最有效的促成交话术,可直接给业务员用P2 必做
摊位定价建议基于历史成交、城市、摊位位置(出入口/主通道/角落)给出建议价与成交概率P4(需数据)
上届对比同一客户历届活动成本/对冲率/成交数对比,用于复购决策P2 顺带
服务商侧反向看板服务商看到"这个摊位预计触达多少学员、历届转化率",提升其付费意愿P2 必做
为什么这是你最该先做的差异化 会小二能帮你找场地、能砍价,但它不管你的成本怎么收回来。 "用服务商摊位费对冲培训会成本"这件事,把平台从"采购工具"变成了"经营工具"—— 客户用你不是为了省钱,是为了把一场会做成一门生意。这个价值主张的付费意愿完全不同量级。

6.6 内容制作与分发流程(需求 1)

distribution_task 状态机(每个"内容 × 平台"一条任务) PLANNING 选题策划 AI 辅助选题 PRODUCING 拍摄制作中 对接拍摄机构 EDITING 剪辑后期 人工为主 REVIEWING 客户审核 可打回 ADAPTING 平台适配 尺寸/标题/话题 SCHEDULED 定时待发 按流量高峰 PUBLISHING 发布中 轮询审核态 PUBLISHED 已发布 数据回流 关键约束(来自第 1 节核实):ADAPTING → PUBLISHED 这一段,不同平台能力完全不同 ✅ 全自动(官方 API):抖音、快手、YouTube、TikTok、B站(受限) → 走 Adapter 自动发布 + 轮询状态 ⚠️ 半自动(无 API):微信视频号、小红书 → 生成内容包 + 发布清单 + 引导跳转后台,状态由人工回填 ADAPTING 平台适配规则(各平台差异极大,必须做成配置表而非硬编码) 抖音:竖版 720×1280 · 标题 ≤100 字 · 10 个话题 · 需 MD5 标准化避免重复上传失败 B站:横版为主 · 标题 ≤50 字 | 小红书:标题 ≤20 字 · ≤9 图 · 需清除图片 EXIF(GPS 会触发拦截)
图 6-6 内容分发状态机。产品上必须诚实:对小红书和视频号不要宣传"一键发布", 而是做"一键生成待发包 + 一键跳转后台 + 状态回填"。把做不到的事说清楚,反而建立信任。

6.7 统一工作流引擎:让"进度可视"成为平台能力而非重复开发

你有五条主流程、约 50 个节点。如果每个模块自己写状态字段和进度逻辑,前端要做 5 套进度条, 且超时提醒、SLA 统计、催办都要重写五遍。做法:所有需要进度可视的单据,统一挂载 workflow_instance。

状态机定义(配置驱动,非硬编码)

// workflow_definition —— 用 JSON 描述,支持版本管理与热更新
{
  "code": "training_event_v1",
  "version": 1,
  "bizType": "TRAINING_EVENT",
  "states": [
    { "code": "DRAFT",      "name": "需求草稿",   "type": "START" },
    { "code": "MATCHING",   "name": "资源匹配中", "assignee": "ROLE:OPERATOR",
      "slaHours": 4,  "escalateTo": "ROLE:OPS_LEAD" },
    { "code": "QUOTED",     "name": "方案报价中", "slaHours": 24 },
    { "code": "CONFIRMED",  "name": "客户已确认", "assignee": "ROLE:CUSTOMER" },
    { "code": "LOCKED",     "name": "档期已锁定",
      "onEnter": ["freezeQuote", "lockResourceCalendar", "openBoothSale"] },
    /* ... 其余状态省略 ... */
    { "code": "CLOSED",     "name": "已完成结项",
      "type": "END", "onEnter": ["generateReviewReport", "pushProviderRating"] },
    { "code": "CANCELLED",  "name": "已取消", "type": "END" }
  ],
  "transitions": [
    { "from": "DRAFT",      "to": "MATCHING",  "on": "SUBMIT",       "guard": "requirementComplete" },
    { "from": "MATCHING",   "to": "QUOTED",    "on": "QUOTE_READY" },
    { "from": "QUOTED",     "to": "CONFIRMED", "on": "CUSTOMER_CONFIRM" },
    { "from": "CONFIRMED",  "to": "LOCKED",    "on": "PAY_DEPOSIT", "guard": "contractSigned" },
    { "from": "LOCKED",     "to": "ENROLLING", "on": "OPEN_ENROLL" },
    { "from": "CONFIRMED",  "to": "CANCELLED", "on": "CANCEL", "guard": "penaltyRule" },
    { "from": "LOCKED",     "to": "CANCELLED", "on": "CANCEL", "guard": "penaltyRule" }
  ]
}
引擎要素说明实现建议
流转applyTransition(instanceId, event, payload) 统一入口;内部做 guard 校验 + 当前状态校验 + 乐观锁乐观锁(version 字段)防并发流转
副作用 onEnter进入某状态时自动执行的动作(锁档期、开招商、生成复盘),用事件发布,异步执行走消息队列,失败可重试
节点任务每个状态可生成 workflow_task:处理人、时限、表单、凭证附件支持会签/或签(双人确认场景)
SLA 与超时升级每个状态配 slaHours,超时自动:① 站内提醒 ② 升级到上级角色 ③ 计入服务考核定时任务每分钟扫描临近/已超时任务
留痕每次流转写入 workflow_transition_log:谁、何时、从什么状态到什么状态、附言、附件只增不改,用于纠纷追溯
版本管理流程定义修改后新开版本,老实例继续用老版本跑完,避免改流程导致进行中的单据错乱必做 否则改一次流程出一次事故

6.8 "全节点进度可视"的产品实现(你的硬要求)

核心思路:Web 和 H5 调用同一个接口、同一份数据契约,前端用同一套组件渲染。 下面是统一的进度数据结构——后端只需要为每种单据实现一次"生成这个结构"的方法。

// GET /api/v1/progress/{bizType}/{bizId} —— Web 与 H5 共用同一接口
{
  "bizType": "TRAINING_EVENT",
  "bizId": "EVT20260901001",
  "title": "2026 秋季智能制造总裁班(上海站)",
  "currentState": { "code": "PREPARING", "name": "会前准备中" },
  "overallPercent": 62,
  "slaRisk": "NORMAL",          // NORMAL | WARNING | OVERDUE
  "nodes": [
    { "code": "DRAFT",     "name": "需求草稿",   "status": "DONE",    "at": "2026-09-01T10:12:00Z" },
    { "code": "MATCHING",  "name": "资源匹配中", "status": "DONE",    "at": "2026-09-01T14:30:00Z" },
    { "code": "QUOTED",    "name": "方案报价中", "status": "DONE",    "at": "2026-09-02T09:05:00Z" },
    { "code": "CONFIRMED", "name": "客户已确认", "status": "DONE",    "at": "2026-09-03T11:20:00Z" },
    { "code": "LOCKED",    "name": "档期已锁定", "status": "DONE",    "at": "2026-09-04T16:00:00Z" },
    { "code": "ENROLLING", "name": "报名进行中", "status": "DONE",    "at": "2026-09-05T09:00:00Z" },
    { "code": "PREPARING", "name": "会前准备中", "status": "CURRENT",
      "subTasks": [
        { "name": "餐饮需求确认", "status": "DONE",      "assignee": "服务商·锦江餐饮" },
        { "name": "住宿预订",     "status": "PROCESSING", "assignee": "系统·API通道", "dueAt": "2026-09-20T00:00:00Z" },
        { "name": "停车需求确认", "status": "PENDING",    "assignee": "场地方·张江中心" },
        { "name": "搭建与物料",   "status": "PENDING",    "assignee": "服务商·XX会展" }
      ]
    },
    { "code": "ONGOING",   "name": "活动进行中", "status": "PENDING" },
    { "code": "SETTLING",  "name": "结算中",     "status": "PENDING" },
    { "code": "CLOSED",    "name": "已完成结项", "status": "PENDING" }
  ]
}
Web 端渲染

横向步骤条 + 右侧子任务清单 + 甘特视图(多活动并行时)。支持导出进度报告 PDF 发给客户领导。

H5 / 小程序渲染

纵向时间轴 + 卡片式子任务 + 一键催办。扫码即看,无需登录也可查公开进度(凭单号+手机号后四位)。

状态变更即推送

每次流转触发通知:站内 + 短信/微信模板消息。关键节点必推(确认、锁定、报名开启、结算)。

通知与超时升级规则

时机通知对象渠道规则
状态流转下一节点处理人 + 单据关注人站内 + 微信/短信关键节点强制推送,普通节点仅站内
SLA 剩余 25%当前处理人站内温和提醒
SLA 超时处理人 + 其上级 + 运营站内 + 短信自动升级,计入服务考核
服务商未响应抢单候选服务商池微信模板消息28 分钟未响应则扩大候选范围(对齐行业 SLA)
API 通道失败降级运营值班站内 + 短信必须告警:降级意味着要人工介入,不能静默
摊位占位将到期预订服务商站内 + 短信到期前 5 分钟提醒,超时自动释放

07服务资源库与供给侧运营

你说要"收集每个城市的培训场地、会展部署机构、视频拍摄机构、媒体传播机构", 并让"业务员或每个市的渠道代理商去对接这些服务机构"。 先说结论:这是整个项目最贵、最慢、最不可绕过的一环,且它不是技术问题。 会小二做到 9 万家深度合作场地用了约 10 年。你必须在动工第一天就并行启动地推, 系统只负责让录入快、让撮合成、让结算准。

7.1 七类资源的采集字段模板(直接给地推人员用)

不同类型资源差异极大,统一用 resource_item 主表 + attrs JSONB 存差异。 下表是必须采集的核心字段——字段太少匹配不准,太多地推不愿填。建议:标 ★ 为必填,其余后补。

资源类型必填核心字段(★)重要选填(影响匹配质量)
培训场地 ★名称 ★城市+区县 ★详细地址 ★经纬度 ★最大容纳人数 ★可容纳教室数/最大单间容量 ★日租价格区间 ★是否含投影音响 宴会厅/教室/多功能厅类型、层高、是否有柱、货梯尺寸、 是否可进场搭建、周边餐饮、停车位数量、发票类型、历史合作评价
住宿酒店 ★名称 ★星级/档次 ★城市+区县 ★距场地距离 ★协议价/门市价 ★大床房与标间数量 ★是否含早 会议室是否可打包、团队入住政策、取消政策、发票、是否可挂账、停车
餐饮/团餐 ★名称 ★城市 ★可承接人数区间 ★餐标档位(元/人)★菜系 ★是否可送餐到场地 ★包厢数量 忌口处理能力、清真/素食、宴会厅容量、是否含酒水、开票、食品安全资质
停车 ★所属场地/酒店 ★车位总数 ★是否可预留 ★大巴位数 ★收费标准 限高(大巴)、是否含在场地费内、充电桩、过夜政策
会展搭建 ★名称 ★城市 ★服务范围(展台/舞台/灯光/LED)★是否可异地作业 ★参考报价方式(按平米/按项) 进场时间要求、资质证书、过往案例图、是否含设计、搭建工期
视频拍摄 ★名称 ★城市 ★可承接类型(课程录制/活动纪实/宣传片/直播) ★设备等级(单机/多机/导播台)★成片周期 ★报价方式 是否含剪辑、是否含字幕、样片链接、团队规模、是否可出差
媒体传播 ★名称 ★覆盖渠道(行业媒体/公众号/短视频/垂类社群)★受众画像 ★粉丝量/阅读量量级 ★报价方式 行业垂类、过往客户、投放形式(软文/视频/直播/社群)、效果数据口径
采集的残酷现实与对策 不要试图一次性采集齐全。地推人员填 60 个字段的表单,结果只会是敷衍填报或干脆不填。 正确做法:分三级采集——
  1. L1 建档(必填 8 项):名称、城市、地址、联系人、电话、类型、容量、参考价。够用即可入库,5 分钟能录完一条。
  2. L2 接单激活:当该资源真的被派单/抢单时,由服务商自己在接单过程中补全详细字段——他有动力填,因为填了才能接到更多单。
  3. L3 沉淀画像:合作过 1 次以上后,系统自动沉淀真实成交价、履约评分、响应速度,这些行为数据比任何人工填报都准

7.2 冷启动:资源从哪来(可执行的六条路径)

路径成本速度具体做法与注意点
① 从已有活动反推 首选 先接几场真实培训会(哪怕人工撮合), 把合作过的场地/餐饮/酒店全部录入库。这些是已验证资源,质量最高,且带真实成交价与评价。 不要等资源库建完再接单——反过来,用订单倒逼资源入库。
② 酒店集团/连锁 华住、锦江、亚朵、希尔顿、万豪等都有会议销售团队与协议价体系, 一个集团谈一次可覆盖数十个城市数百家门店。这是性价比最高的一条路。
③ 会展/会务公司 各城市本地的会务公司本身就是"资源聚合商",一家公司往往握有几十个场地资源。 把他们发展成平台服务商(而非竞争对手),让他们用你的系统接单。
④ 行业协会/园区 各行业的协会、商会、产业园区都有自己的活动场地和会员资源,且自带客户。 谈成合作等于同时拿到供给侧和需求侧。
⑤ 公开信息采集 可从公开渠道(地图 POI、企业信息平台、行业展会官网、酒店官网会议页)批量获取 L1 基础信息。 注意合规:仅采集公开的企业信息,采集后必须由地推电话核实才能激活,避免侵权与无效数据。
⑥ 渠道代理商地推 你提到的模式,适合二三线城市下沉。成本高、管理难,建议只在有明确需求的城市开。 先做 3~5 个重点城市验证模型,再谈全国铺开。

7.3 渠道代理商体系设计

分级与权益

城市合伙人(独家,有区域保护 + 年度考核指标)
金牌代理(非独家,高分佣 + 优先派单)
普通代理/业务员(按单计佣,无区域保护)
信息员(只报线索不跟进,拿线索费)

分佣规则(建议)

客户侧成交:按服务费/摊位流水的 5%~15%(按级别与是否独家)
服务商拓展:该服务商产生流水的 1%~3%(长期分成,激励维护)
纯线索:成交后一次性 线索费
结算周期:月结,T+15,对账透明可查

系统能力说明(这些是代理商愿意跟你干的前提)
归属与保护客户/服务商归属到人,有保护期(如 6 个月未跟进自动释放到公海),防止"抢单内耗"。
业绩看板代理商能看到自己发展的客户数、活动数、流水、佣金、回款状态。佣金不透明是代理商流失的头号原因。
移动端录入业务员在手机上 5 分钟完成一条资源建档(L1),支持拍照识别名片、定位自动填地址。这是使用率的关键。
冲突仲裁同一资源被多人录入时的归属判定规则(先到先得 + 谁先产生订单),必须事先写清楚,否则必吵架。
线上化结算佣金自动计算 + 提现 + 开票。月结超时未到账会直接摧毁信任。

7.4 服务商入驻与抢单

服务商生命周期:入驻 → 激活 → 接单 → 沉淀 → 分层 ① 入驻申请 自助注册 / 代理代录 L1 基础信息 ② 资质审核 营业执照/行业资质 人工审核 + 平台备案 ③ 资源建档 补全能力标签与档期 决定是否进候选池 ④ 抢单/派单 推送 + 抢单池 + 报价 28 分钟响应 SLA ⑤ 履约交付 按节点上传凭证 每步状态可视 ⑥ 评价沉淀 双向评分 + 行为数据 进入匹配权重 关键:抢单池的排序权重 = 匹配度(40%) + 历史评分(25%) + 响应速度(20%) + 价格竞争力(15%) 评分低的服务商自然下沉,不用人工淘汰 —— 用机制代替管理,这是平台能规模化的核心。
图 7-1 服务商生命周期。⑥ 评价沉淀必须回流到 ④ 的排序权重, 否则抢单池会被劣币占据——这是所有撮合平台死于体验问题的共同原因。

08AI 能力设计:做什么、不做什么、什么时候做

你的描述里有"通过 AI 对接美团和携程""AI 进行分析、内容推荐、课程推荐"。 我必须客观地说:这里面只有一部分是 AI 能做的,其余是工程问题或运营问题。 把 AI 放在正确的位置,能省大量成本;放错位置,会做出没人用的花瓶功能。

8.1 四个真实落点(按 ROI 排序)

落点ROIAI 到底做什么何时做
① 需求结构化
自然语言 → 结构化订单
最高 客户说"下个月上海,80 人左右,三天两晚,预算 20 万以内,要能停车和住宿", AI 抽取成 {city, headcount, days, budget, needs:[venue, hotel, parking]} 并预填表单。 这是唯一能立刻省人力、且技术成熟的点。 P1 就能上
② 智能派单排序
需求 → 候选服务商排序
不是"AI 决定给谁",而是AI 给出候选排序 + 每条的推荐理由,人做最终决定。 规则打底(城市/类型/容量/档期硬匹配),AI 负责软性因素排序(历史评价、响应率、风格匹配)。 P1 规则版
P4 模型版
③ 租户知识库问答
RAG 客服
把课件、活动规则、历史工单、服务标准向量化,做客服问答与学员自助答疑。 价值真实但需要内容量,且要严格按租户隔离(第 4 节强调过)。 P2 试水
P4 完善
④ 内容与课程推荐
学员 → 课程/项目推荐
中(后期) 冷启动阶段没有数据,协同过滤无从谈起。 一期只能做"基于标签的规则推荐"(学员标签 ∩ 课程标签 ∩ 行业 ∩ 地域)。 数据量达标(见 8.3)后再上模型。 P4
以下三件事 AI 做不到,别浪费预算
❌ AI 自动订酒店/餐饮 不是 AI 的问题,是没有 API(第 1 节已核实)。餐饮完全没有,酒店要商务合同。 AI 能做的是"生成询价单 + 比价 + 催单",不是"自动下单"。
❌ AI 自动报价 非标服务报价依赖人际关系、档期松紧、历史议价,AI 给不了可信报价。 硬上会导致报价离谱、服务商不认、客户不信任。
❌ AI 全自动运营 纠纷处理、临时改期、现场突发,这些必须人上。AI 可以做辅助话术与预案推荐。

8.2 落点①详解:需求结构化(P1 就做,立刻省人力)

// 输入(客户在 H5/Web 里的一句话,或语音转文字)
"我下个月中想在上海办一场智能制造的培训,大概 80 人,三天两晚,
  场地要有投影和一个能分组讨论的小会议室,住宿要离场地近一点,
  最好能安排停车位,总预算控制在 20 万以内。"

// 输出(结构化 JSON,直接预填培训会需求表单,客户确认即可提交)
{
  "city": "上海",
  "startWindow": { "earliest": "2026-10-11", "latest": "2026-10-20" },
  "duration": { "days": 3, "nights": 2 },
  "headcount": 80,
  "budget": { "amount": 20000000, "currency": "CNY" },  // 单位:分
  "requirements": {
    "venue": { "capacityMin": 80, "needProjector": true,
               "breakoutRoomsMin": 1, "layout": "分组讨论" },
    "hotel":  { "roomsEstimate": 40, "preferNearVenue": true },
    "parking": { "needReserve": true }
  },
  "confidence": { "city": 0.99, "headcount": 0.95,
                  "budget": 0.88, "startWindow": 0.72 },  // 低置信项高亮让客户确认
  "missingFields": ["dining.mealStandard", "venue.city_district"]
}
为什么这个最值钱 它是唯一一个"AI 替代人"而非"AI 辅助人"的场景:原来需要业务员电话沟通 20 分钟才能录入的需求, 现在客户自己 30 秒说完、系统生成、客户点确认。而且低置信字段会被高亮要求确认, 错误不会静默流入后续流程。这是你能在 P1 就看到 AI 价值的唯一功能,务必优先做。

8.3 落点④的数据门槛:什么时候才配谈"推荐"

阶段数据量门槛(经验值)可用的方法预期效果
冷启动
0 ~ 1000 单
用户 < 1k,行为 < 10k 纯规则:标签匹配 + 热度排序 + 人工运营位。不要上模型,上了也没用。 能用,不惊喜
早期
1k ~ 1 万单
用户 1k~10k,行为 10k~100k 内容相似度(向量):课程/项目/服务商的语义相似度匹配;学员画像相似度。 明显好于规则
成长期
1 万 ~ 10 万单
用户 10k+,行为 100 万+ 协同过滤(ItemCF/UserCF)+ 向量召回,引入实时行为特征。 有商业价值
成熟期
10 万单以上
行为 1000 万+ 深度学习排序(双塔/DIN)+ 多目标优化(报名率、成交率、留存)。 核心竞争壁垒

门槛值为行业经验数量级,非精确阈值;实际以你自己的 A/B 实验结果为准。结论:P1~P3 不要碰推荐算法,把精力放在把数据结构和埋点做对。

8.4 落点③:RAG 知识库(租户隔离是红线)

// 向量化的对象与隔离策略
可向量化内容:
  · 课件 / 讲义(courseware)        → 学员问答、课程推荐
  · 项目资源描述(project_resource) → 学员-项目语义匹配
  · 服务商能力描述(resource_item)  → 需求-资源语义匹配
  · 历史工单与处理方案              → 客服问答
  · 活动规则 / 服务标准 / FAQ        → 通用问答

强制约束:
  ① 每条向量必须带 tenant_id,检索时作为硬性过滤条件(不是相似度权重)
  ② 平台级内容(如通用服务标准)用 tenant_id = NULL,检索时并入
  ③ 服务商敏感信息(底价、内部备注)禁止入向量库
  ④ 内容删除时必须同步删除向量,否则会造成"删了还能搜到"的合规事故
  ⑤ 向量库只是派生存储,可从主库全量重建 —— 主库才是事实来源

8.5 LLM 网关:不要把命运交给单一厂商

网关职责为什么必须有
多模型路由国内/海外模型政策、价格、可用性变动频繁。统一抽象后可按场景路由: 简单抽取用小模型(便宜),复杂推理用大模型,海外用户走海外模型(合规)。
Prompt 版本管理Prompt 改了效果变差要能秒级回滚。把 Prompt 当代码管(版本 + 灰度 + A/B)。
成本核算按租户/功能统计 Token 消耗。否则会出现某个客户把你月度 AI 预算烧光而你还不知道。
降级与超时LLM 超时或报错时,返回"已记录,稍后由人工处理",绝不能让主流程失败
结果校验结构化输出必须通过 JSON Schema 校验,不合格则重试(最多 2 次)后转人工。禁止直接信任模型输出写库。
成本量级提示(务必自行实测,以下仅为估算口径) 需求结构化这类抽取任务,单条约数千 token 级别。若日均 1000 次调用, 月度成本量级在数百到数千元(取决于模型选型与是否做缓存)。 真正的成本风险不在单价,而在无节制调用——必须做:缓存(相似需求复用)、配额(按租户限流)、 小模型优先(能用小的不用大的)。这些在网关层做,业务层不用关心。

09工程落地:可以直接开工的部分

9.1 仓库结构与模块划分(monorepo)

bizlinkbiz/
├── apps/
│   ├── web-customer/        # 客户工作台 (Next.js) —— 租户视角,PC 主战场
│   ├── web-admin/           # 平台运营后台 —— 审核/清算/风控/全局视图
│   ├── web-provider/        # 服务商工作台(Web 版,可选)
│   ├── h5/                  # 移动端 H5(学员/服务商/代理商共用,uni-app 或 Taro)
│   └── api/                 # 后端单一应用(模块化单体)
│       └── src/
│           ├── modules/
│           │   ├── iam/         # 租户/用户/角色/组织/代理商
│           │   ├── supply/      # 服务商/资源/档期/抢单
│           │   ├── event/       # ★ 培训会/报名/行程/签到(主干)
│           │   ├── trade/       # 摊位/订单/合同/支付/结算
│           │   ├── match/       # 项目/撮合/商机/分佣
│           │   ├── content/     # 素材/审核/分发
│           │   ├── workflow/    # 状态机引擎(被所有域依赖)
│           │   └── platform/    # 通知/文件/搜索/配置(禁止其他域重复实现)
│           ├── adapters/        # ★ 外部依赖隔离层(见 9.3)
│           │   ├── hotel/       # HotelSupplier 接口 + dida/美团/人工 三种实现
│           │   ├── venue/       # 场地:仅人工实现(无 API)
│           │   ├── catering/    # 餐饮:仅人工实现
│           │   ├── parking/     # 停车:仅人工实现
│           │   ├── distribution/# 抖音/快手/B站/YouTube/小红书(半自动)/视频号(半自动)
│           │   ├── payment/     # 微信/支付宝(国内)+ Stripe/PayPal(海外)
│           │   ├── contract/    # 电子签章
│           │   └── llm/         # LLM 网关(多模型抽象)
│           ├── common/          # 租户上下文/异常/幂等/日志/审计
│           └── infra/          # 数据库/缓存/队列/对象存储/搜索
├── packages/
│   ├── shared-types/        # 前后端共享的 TS 类型(状态枚举、DTO)
│   ├── ui/                  # 组件库(含通用进度条 —— Web/H5 复用同一份状态定义)
│   └── workflow-schema/     # 状态机定义 JSON + 校验器
├── deploy/
│   ├── docker-compose.yml   # 一期:单机/双机 Compose 即可
│   └── nginx/               # 与你现有 Nginx 运维经验一致
└── docs/
    ├── api/                 # OpenAPI(自动生成)
    └── workflows/           # 各流程状态机定义(本文 6.x 节的 JSON 落地)

9.2 核心 API 清单(按域,一期范围)

方法路径说明
iamPOST/api/v1/auth/login多端登录,返回租户上下文
GET/api/v1/tenants/:id/members成员与角色管理
POST/api/v1/agents/:id/bindings代理商归属绑定(客户/服务商)
supplyPOST/api/v1/providers服务商入驻(含资质附件)
GET/api/v1/resources/match资源匹配查询(主路径):type/city/date/capacity/budget
POST/api/v1/resources/:id/calendar/lock档期锁定(强一致,幂等)
event ★POST/api/v1/events创建培训会(可从自然语言生成草稿)
POST/api/v1/events/:id/transitions统一状态流转入口(event = SUBMIT/CONFIRM/…)
POST/api/v1/events/:id/service-orders生成餐饮/住宿/停车子单
POST/api/v1/events/:id/enrollments学员报名(幂等键防重复)
tradePOST/api/v1/events/:id/booths批量定义摊位(支持平面图坐标)
POST/api/v1/booths/:id/reserve占位(15 分钟超时,防超卖)
GET/api/v1/events/:id/cost-offset成本对冲实时看板数据
matchPOST/api/v1/projects发布项目资源
GET/api/v1/projects/:id/candidates候选学员排序(规则版/模型版可切)
workflowGET/api/v1/progress/:bizType/:bizIdWeb/H5 共用进度接口(见 6.8)
POST/api/v1/workflow/tasks/:id/complete完成节点任务(含凭证附件)
contentPOST/api/v1/assets/:id/distribute创建分发任务(按平台拆多条)

9.3 外部 Adapter 的统一接口(这是架构中最值钱的一段抽象)

// 所有外部供给能力实现同一接口 —— 换供应链不改业务代码
interface SupplierAdapter {
  search(req: SearchRequest):  Promise<SearchResult[]>;   // 查询可用资源
  quote(req: QuoteRequest):    Promise<Quote>;            // 询价
  book(req: BookRequest):      Promise<BookResult>;       // 下单(幂等)
  cancel(req: CancelRequest):  Promise<CancelResult>;     // 取消
  query(req: QueryRequest):    Promise<OrderStatus>;      // 查状态
}

// 三种实现,按配置动态路由
class HotelApiAdapter    implements SupplierAdapter { /* 道旅 / 美团分销 / 协议价直采 */ }
class HotelManualAdapter implements SupplierAdapter { /* 生成工单,人工处理并回填 */ }
class CateringManualAdapter implements SupplierAdapter { /* 餐饮只有人工实现 */ }

// 带熔断降级的调用包装 —— 业务层无感知
async function callWithFallback(order: ServiceOrder) {
  try {
    return await circuitBreaker.execute(() => adapter.book(order));
  } catch (e) {
    await downgradeToManual(order, e);   // 自动转人工工单
    await alertOps(order, e);            // 告警运营(不可静默)
    return { accepted: true, mode: 'MANUAL' };  // 业务继续,客户看到"处理中"
  }
}

9.4 编码规范(CI 强制执行,这四条能省掉未来 80% 的返工)

9.5 通用系统(客服 / CRM / IM):集成优先,不要自研

你提到"平台提供大量的有用的软件,客服系统、CRM系统、AI企业服务"。自研这三样会吃掉你至少一半的研发资源, 且做出来大概率不如成熟的开源方案。

系统建议集成方式
客服系统集成开源方案用成熟开源客服/工单系统,通过 SSO 单点登录 + iframe/微前端嵌入工作台; 工单与平台业务单据(活动/订单)通过 bizType + bizId 双向关联。你在用的 EspoCRM 本身就带工单与客服模块,可优先考虑复用。
CRM复用 EspoCRM你已经熟悉 EspoCRM。让 EspoCRM 承担客户/商机/跟进, 平台只负责"把业务事件(报名、摊位成交、项目撮合)推送成商机"。避免两套客户数据打架。
IM / 消息短期用第三方,长期可自研一期:站内消息 + 微信模板消息足够。若确需 IM,接入即时通讯云服务比自研便宜得多。
AI 企业服务包装平台已有能力不要另起炉灶。把你已有的"需求结构化、匹配排序、知识库问答"开放成 API, 就是最好的 AI 企业服务。

9.6 部署拓扑与成本量级(阿里云,估算区间,需自行核算)

阶段部署形态月成本量级说明
P0~P1
验证期
2 台 ECS(应用 + 数据库分离)+ Redis + OSS + CDN
Docker Compose 部署
约 ¥1,000 ~ 2,500 / 月 规格示例:4C8G ×2。够支撑数十家租户、日均数百单。不要一开始就上 K8s。
P2
成长期
应用横向扩容 + RDS 主备 + 独立 Redis + 搜索引擎 约 ¥3,000 ~ 8,000 / 月 引入托管数据库(RDS),自己做主从不如托管省心;搜索可先不上,用 PG 全文检索顶住。
P3~P4
规模期
K8s 集群 + 只读副本 + 向量库 + 数仓 约 ¥10,000 ~ 30,000+ / 月 此时成本已被业务收入覆盖;重点转向稳定性与多区域部署。

成本为公开定价推算的量级区间,未含人力、短信、AI Token、第三方 API 调用费; 实际请以云厂商当前报价与你自己的压测结果为准。短信与 AI 调用是可变成本,务必设置月度预算上限与告警。

9.7 团队配置建议(按阶段)

角色P0~P1P2~P3职责重心
后端主程23领域模型、工作流引擎、结算(结算逻辑最易出错,需要最强的人
前端23Web 工作台 + H5/小程序(含通用进度组件)
产品/设计12必须懂线下会务业务,否则流程设计会脱离实际
测试12重点覆盖状态机流转、金额、幂等
运维/DevOps0.5(你兼)1你已有 Nginx/云服务器经验,初期可自担
运营/地推2~35~10最关键 资源拓展与客户拓展,技术团队再强也替代不了
合计(技术)6~7 人11~12 人

10分期路线图与 MVP 边界

10.1 五阶段总览

阶段周期目标交付物(可验收)
P0
地基
3 个月 多租户底座 + 资源库 + 工作流引擎 · 租户/组织/角色/权限(含 RLS 行级隔离)
· 服务商入驻与资质审核
· 七类资源库(L1 建档)+ 移动端快速录入
· 统一工作流引擎 + 通用进度组件
此时无对外收入,但决定了后面能不能快
P1
主干
4 个月 培训会全流程跑通,开始收钱 · 需求提交 + AI 结构化(最高 ROI 的 AI 功能)
· 资源匹配 → 派单/抢单 → 报价 → 确认
· 档期锁定 + 电子合同 + 支付
· 学员报名/审核/签到(H5)
· 餐饮/住宿/停车子单(API + 人工双通道)
· Web + H5 全节点进度可视
· 结算与分账
P2
变现
4 个月 摊位招商 + 撮合,毛利结构成型 · 摊位定义/招商发布/占位/预订/合同
· 成本对冲实时看板(含"还差几个摊位打平")
· 项目资源发布 + 学员撮合
· 现场扫码建联 + 商机沉淀
· 服务商评价与抢单权重
P3
获客
4 个月 内容制作分发,形成拉新管道 · 素材管理 + 审核流
· 平台适配规则引擎
· 抖音/快手/YouTube 官方 API 自动发布
· 小红书/视频号半自动工作台
· 数据回流与效果看板
P4
智能
持续 数据驱动 + 供应链直连 + 全球化 · 向量检索 / RAG 客服
· 推荐系统(数据量达标后)
· 酒店供应链 API 直连(美团分销 / 携程)
· 多语言多币种跨境支付
· 数据合规(GDPR / 数据出境)

10.2 MVP 边界:必须严格守住(决定你能否在 7 个月内上线收钱)

✅ P0+P1 必须做
  • 多租户 + 权限 + 数据隔离
  • 服务商入驻与资源库(先只做 2~3 个城市
  • 培训会主流程(图 6-1 的 15 个节点)
  • 报名 + 签到(H5)
  • 餐饮/住宿/停车子单(人工通道为主
  • 档期与库存锁定(防超卖)
  • Web + H5 进度可视
  • 基础结算与对账
  • AI 只用在一处:需求结构化
❌ MVP 阶段坚决不做
  • 内容分发(P3 再做,API 受制于人)
  • 推荐算法(没数据,做了也是假的)
  • 自研客服/CRM/IM(集成即可)
  • 美团/携程 API 直连(商务谈判周期长)
  • App 原生开发(H5/小程序足够)
  • 微服务拆分(团队规模不够)
  • 多语言/跨境支付(字段预留即可)
  • 全国铺开(先跑通 2~3 城模型)

10.3 关键里程碑(可用于内部考核)

时间点里程碑验收标准(可量化)
第 3 个月末地基交付2 个租户完整跑通权限隔离;资源库录入 ≥ 200 条真实资源;工作流引擎支持 3 条流程定义
第 5 个月末第一场真实活动不追求系统完美,用人工兜底完成 1 场真实培训会(场地+报名+餐饮+住宿全流程)
第 7 个月末P1 上线线上完成 ≥ 5 场活动;客户可在 Web/H5 看到全部节点状态;结算零差错
第 11 个月末P2 上线≥ 3 场活动启用摊位招商;至少 1 场实现对冲率 > 50%(这是商业模式验证成功的关键指标)
第 15 个月末P3 上线内容分发跑通 ≥ 3 个平台;内容带来的报名线索可归因
第 18 个月规模化决策点复盘单城模型是否跑通,决定是否全国铺开与引入外部融资
最重要的一条建议 第 5 个月末那场"人工兜底的真实活动",比任何系统功能都重要。 很多平台项目的死法是一样的:系统做了 12 个月,上线后发现流程设计和真实会务业务对不上,全部返工。 先用最土的方式(微信群 + 表格 + 电话)跑通一场真实的培训会,把真实流程记下来,再让系统去承载它。 系统应该是"把已验证的流程自动化",而不是"边开发边猜流程"。

11风险清单(按严重度排序)

#风险概率影响缓解措施
1供给侧冷启动失败
资源库建不起来,撮合无从谈起
致命 ① 用订单倒逼入库(先接单后补资源);② 重点攻克酒店集团与本地会务公司(一家覆盖多城); ③ 前 2~3 个城市做深做透,不全国铺开;④ 创始人亲自跑前 50 家资源,不要外包给代理商。
2需求侧与供给侧双冷启动死锁
没客户就没资源,没资源就没客户
致命 先只做一头。建议锁定 3~5 个大V/企业客户做深度共建(免费或低价服务换流程共建与案例), 用真实需求拉动资源入库。不要试图同时冷启动双边。
3多租户数据隔离出事故 致命 三重保险:ORM 拦截器 + PG RLS + CI 扫描;搜索/向量/对象存储同样隔离; 上线前必须做跨租户越权专项测试(写一个自动化用例集,每次发版跑)。
4结算分账出错
金额错误引发信任崩塌
金额一律 BIGINT 分;所有写操作幂等;结算走对账任务(日终对账 + 差异告警); 初期人工复核每一笔分账,跑顺 3 个月后再自动化。
5流程设计与真实业务脱节 第 5 个月必须用人工方式跑通一场真实活动(见 10.3); 产品经理必须有会务行业经验或长期跟场;每个流程上线前找 2 个真实客户走查。
6外部依赖政策变化
平台 API 收紧、供应链涨价/停服
Adapter 抽象 + 人工兜底通道(第 9.3 节); 任何外部能力都不能是业务的唯一路径;关键供应链至少备选两家。
7范围蔓延,久攻不下 严格执行 10.2 的 MVP 边界;任何新需求先记入 backlog,不在当前迭代插入; 你和 20 年经验都清楚这一点,但大项目最容易在这里失守。
8渠道代理商管理失控 归属规则与冲突仲裁机制提前写死(7.3);佣金透明可查、按时结算; 先在 1 个城市试点代理模式,验证后再复制。
9AI 成本失控 / 效果不及预期 LLM 网关做配额与成本核算(按租户限流);结果过 Schema 校验; 效果不达标时快速降级为纯人工,不阻塞业务。
10合规风险
个人信息、数据出境、预付资金
学员手机号等个人信息加密存储 + 脱敏展示 + 最小化采集; 预收摊位费/培训费要注意资金存管与预付卡合规要求,务必咨询专业法律意见; 全球化前完成 GDPR 与数据出境评估。
11竞争:会小二等切入同一人群 差异化不在"找场地",而在"培训会成本对冲 + 学员资产沉淀 + 项目撮合"—— 这是他们不做、也很难快速补的。把护城河建在客户的数据资产(学员库、项目库、历史成交)上, 客户迁移成本越高越安全。

12需要你确认的 8 个问题

这份设计里有 8 处我做了假设。这些假设会实质影响架构与排期,建议你逐条确认后再进入开发。

  1. 首批城市选哪 2~3 个? 决定资源库范围与地推投入。建议选你或团队有人脉、且培训需求密集的城市。
  2. 首批客户从哪来? 你手上是否已有 3~5 个愿意共建的大V/企业客户?如果没有,这会是比开发更大的瓶颈。
  3. 技术栈选 A(NestJS/TS)还是 B(Spring Boot/Java)? 取决于你现有团队构成。
  4. 支付与资金:是否涉及向学员/服务商预收资金? 涉及预收就有资金存管与合规要求,架构上要引入分账与对账,需提前咨询法律意见。
  5. 是否接受"餐饮/停车在前 18 个月都靠人工撮合"? 这是现实约束,若坚持要自动化,项目会延期。
  6. CRM 是否直接用你已有的 EspoCRM? 复用能省 3~4 个月,但要接受它与平台的数据同步成本。
  7. 渠道代理商是自营团队还是外部合作? 影响分佣系统复杂度与税务处理方式。
  8. "全球格局"的时间点? 建议 P4(18 个月后)。但若你有明确的海外客户来源,需要提前规划,我可以单独出一版国际化设计。
一句话总结 这是一个真实存在市场空间、但极重运营的项目。 技术上没有不可逾越的难点,真正的胜负手在三件事① 能不能在 3 个城市把供给侧做深;② 能不能先跑通一场真实活动再写代码; ③ 能不能死守 MVP 边界不蔓延。 把"成本对冲"做成杀手锏,把"进度可视"做成体验底线,剩下的靠执行力。