能做,但不能按你现在列的 1→5 顺序平行推进。你这个需求本质上是四家公司叠在一起: 内容分发 SaaS、MICE 会议培训 O2O 交易平台、本地生活供应链(酒店/餐饮/停车)、AI 推荐引擎。 每一块单独都有成熟玩家。但把它们围绕「一场培训会」这条主线串起来,目前没有强竞争对手 —— 这是你唯一的、也是足够大的机会窗口。
| 需求 | 你的描述 | 战略定位(我的判断) | 竞争强度 | 建议顺序 |
|---|---|---|---|---|
| 需求2 O2O 培训会 |
场地 / 报名 / 就餐 / 住宿 / 停车全包 | 交易主干 & 现金流心脏。它天然带出学员(流量)、场地酒店(供应链)、摊位(变现)、项目对接(留存)。 所有其他需求都是它的挂件。MVP 核心 | 中 会小二已做10年、40万企业客户,但它只解决"找场地",不解决"学员+摊位+项目" |
第 1 位 |
| 需求5 摊位招商 |
定制摊位数、服务商预订、对冲成本 | 差异化最强、最能收钱的一块。"用服务商摊位费对冲培训会成本"是一个真实的、别的平台没做的商业模型。 做成实时成本对冲看板就是你的护城河。杀手锏 | 低 会展招商系统多,但和"培训会成本模型"绑定在一起的没有 |
第 2 位 |
| 需求3 / 4 项目链接 + 现场咨询 |
学员项目资源、服务商摊位咨询 | 留存与复购引擎。技术上不难(撮合 + 商机登记 + CRM),价值在于把"一次性会议"变成"持续关系", 让客户第二年还回来。留存层 | 低 | 第 3 位 |
| 需求1 内容制作分发 |
制作并分发到各平台 | 获客前端,但自建 ROI 最低。成熟工具一大堆(易媒、新榜、蚁小二等), 且小红书/视频号根本没有发布 API(见第 1 节核实)。受限 | 高 红海,且 API 受制于人 |
第 4 位 |
| AI 分析推荐 | 内容推荐、课程推荐 | 不是功能,是阶段产物。没有 3 万条以上真实业务数据之前,任何"AI 推荐"都是伪需求。 前期只做规则推荐 + 检索增强问答,把数据结构先攒好。后置 | — | 第 5 位 |
来源:会小二官网/百科公开数据、道旅(dida.com) 官网、美团分销平台官网。数千万级融资与 40 万企业客户为公开报道口径,非审计数据。
你说"不允许乱写",所以这一节的每一条我都去查了官方文档,标了来源。 这节决定了架构里哪些模块能自动、哪些必须人工。
| 依赖项 | 真实状态 | 官方口径 / 门槛(核实结论) | 架构对策 |
|---|---|---|---|
| 微信视频号 内容发布 |
无 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 自建库 + 服务商端抢单小程序 + 人工撮合后台。 |
video.create 权限审核:各平台开放平台官方口径openapi.ctripbiz.com 接口契约说明(GetTicket / Login)connect.trip.com/doc/trip "Our requirements for Connectivity Partners"developer.meituan.com 接入流程页developer-distribution.meituan.comdida.com/zh/solutions/api;龙腾捷旅/泰坦云:公开资料huixiaoer.com凡是标 无 API 的(餐饮、停车、场地、小红书、视频号), 系统不能设计为"提交即完成",而要设计为 「生成结构化工单 → 派单/抢单 → 人工执行 → 状态回填」。 这一层是所有"AI 对接"的真相:AI 做的是结构化与派单,不是自动执行。
酒店可能来自美团分销、道旅、龙腾,或纯人工。HotelSupplier 必须定义成接口:
search / quote / book / cancel / query,三种实现(API聚合 / 人工工单 / 协议价直采)并存,
上层业务只依赖接口。否则后期换供应链要重写业务代码。
餐饮、场地、搭建这些非标供给,唯一被验证过的规模化撮合方式就是抢单(会小二「会小二帮」验证过)。 你的一期必须包含 服务商移动端抢单 + 报价,这是供给侧能否自运转的关键,不是"以后再说"的功能。
业务架构按 五层划分:渠道层(谁去拿资源/拿客户)→ 角色层(谁在用)→ 业务域层(系统做什么) → 平台能力层(通用能力复用)→ 数据智能层(沉淀什么)。 右侧两根竖轴是贯穿全局的横切关注点,必须在架构第一天就内置,后期补代价极高。
| 域 | 核心职责(做什么) | 明确不做(边界) |
|---|---|---|
| ① 身份与租户 | 租户生命周期、组织架构、角色权限、渠道商归属、服务商授权关系、SSO、审计日志 | 不做业务单据;权限只管"能不能看/能不能改",不管"流程走到哪" |
| ② 资源供给 | 服务商入驻/资质审核、资源目录(场地/餐饮/住宿/停车/搭建/拍摄/媒体)、档期与库存、抢单与报价、服务评价与黑名单 | 不直接接单;不关心订单如何结算(交给交易域) |
| ③ 活动运营 | 培训会/展会项目立项、需求结构化、场地匹配、行程编排、学员报名与审核、签到、现场执行、结项复盘 | 不做支付结算(发起结算单即可);不重复实现通知(调 L4) |
| ④ 交易与结算 | 摊位定义与定价、招商发布、预订与合同、收付款、分账(平台/渠道商/服务商)、对账、发票、退款 | 不判断业务是否该成交(由活动域/业务规则决定);只负责钱与凭证 |
| ⑤ 项目与商机 | 项目资源发布、学员能力画像、双向意向与撮合、现场扫码建联、商机跟进(轻量 CRM)、成交登记与分佣 | 不做重型 CRM(直接集成或二次开发成熟开源 CRM,见 9.5) |
| ⑥ 内容分发 | 选题/脚本/拍摄工单、素材管理、审核流、多平台适配、分发调度、数据回流与效果归因 | 不做专业剪辑工具(对接第三方或人工);无 API 的平台做半自动工作台 |
| 决策 | 选择 | 理由(以及不这么做的后果) |
|---|---|---|
| 服务拆分粒度 | 模块化单体起步 单进程 + 域模块 + 明确接口 |
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 倍,属于必须前置的一次性投入。 |
两套都能做,差别在团队与生态。结合你现有的技术背景(Node.js / Strapi / 阿里云 ECS + Nginx), 我倾向 方案 A;若你团队 Java 人手充足且预期要做私有化大客户交付,选 方案 B。
| 层次 | 方案 A(推荐 · TypeScript 全栈) | 方案 B(Java 生态) |
|---|---|---|
| 前端 Web | React 19 + Next.js(或 Vue3 + Nuxt)+ TypeScript + Ant Design / shadcn | 同上(前端与后端语言无关) |
| 移动端 | 同一套 H5 + 小程序(uni-app / Taro),需要 App 时用 Capacitor 打包 | 同上 |
| 后端 | NestJS(模块化天然贴合"模块化单体")+ Prisma/TypeORM | Spring Boot 3 + Java 21 + MyBatis-Plus / JPA |
| 工作流 | 自研轻量状态机 + BullMQ(需求不复杂,自研可控) | Flowable / Camunda(成熟但重) |
| 数据库 | PostgreSQL 16 + RLS + pgvector | PostgreSQL 16(或 MySQL 8)+ pgvector 需另配 |
| 缓存/队列 | Redis 7 + BullMQ(复用 Redis,运维简单) | Redis + RocketMQ / RabbitMQ |
| 文件 | 阿里云 OSS + CDN(与你现有基础设施一致) | 同上 |
| 搜索 | Meilisearch(轻量、中文友好)或 Elasticsearch | Elasticsearch |
| 部署 | Docker Compose(一期)→ K8s(单量起来后) | 同上 |
| 优势 | 前后端同一语言,5~8 人小团队协作损耗最小;你现有 Node 运维经验可直接复用;开发速度快 | 人才供给充足;大客户私有化交付时甲方更认可;生态中间件成熟 |
| 劣势 | 复杂事务与高并发场景需更小心;招到资深 NestJS 的人比 Java 难一些 | 开发效率略低;同样的功能需要更多人月;前后端语言割裂 |
| 适用 | 推荐 团队 5~8 人、以 SaaS 公有云为主、追求上线速度 | 团队 10 人以上、需要私有化部署给大客户、Java 人手充足 |
你的要求:"客户必须是多租户的模式,每个客户只能看见自己的客户和业务"。 这一节是整份文档里最不能出错的部分——它一旦做错,后期改造需要动所有查询、所有表、所有接口,成本相当于重写。
| 方案 | 隔离强度 | 成本 | 说明与适用 |
|---|---|---|---|
| A. 独立数据库 每租户一库 |
最强 | 最高 | 物理隔离,合规最好讲。但租户上百后,迁移、升级、运维是灾难(改一次表结构要跑 N 次)。 只用于少数要求物理隔离的大客户(独立部署版)。 |
| B. 共享库 · 独立 Schema | 强 | 中 | PostgreSQL schema 隔离,逻辑清晰。但跨租户统计查询麻烦,连接池与迁移工具复杂度上升。中大型租户数(数十~数百)可用。 |
| C. 共享库 · 共享 Schema + tenant_id 行级隔离 |
中~强 | 最低 | 推荐默认方案所有业务表带 tenant_id,
三重保险:① ORM 全局拦截器自动注入过滤条件 ② PostgreSQL RLS 策略在数据库层兜底 ③ 代码扫描 CI 卡口禁止裸 SQL。
成本低、统计方便,配合 RLS 后安全性足够。 |
| D. 混合(推荐最终形态) | — | — | 默认走 C;对少数大客户或合规要求高的行业客户,支持一键切到 A/B(独立库)。 前提是你从第一天就把数据访问收口到 Repository 层、且数据源路由可配置。这是"架构上的期权",现在只花很小的代价买下。 |
tenant_id 非空字段,且所有外键关联必须建立在 (tenant_id, id) 复合键上
—— 这能防止"A 租户的报名单关联到 B 租户的活动"这类越权引用。漏一个就是数据泄露事故。| 场景 | 处理方式 | 可见范围 |
|---|---|---|
| 服务商服务多个客户 | 服务商是平台级主体(tenant_id = NULL,标记为平台共享)。
通过 ProviderEngagement(合作关联表)记录"哪个租户的哪个活动用了哪个服务商"。
服务商只能看到与自己有关联的活动单据的最小必要字段,看不到客户其他业务。 |
关联活动内的:需求明细、时间地点、联系人、结算金额。 看不到:客户其他活动、学员全量名单(除非业务需要,且需客户授权开关)。 |
| 学员参加多个老师的活动 | 学员身份全局唯一(按手机号/openid 归并),通过 Enrollment 关联到具体活动与租户。
学员在 A 租户留下的信息,B 租户默认不可见,除非学员主动授权共享。 |
学员自己:看到全部自己报名的活动。 租户:只能看到本租户活动下的学员。 |
| 渠道代理商看自己的盘子 | Agent 绑定"归属关系":owned_tenants(发展的客户)+ owned_providers(拓展的服务商)+ 负责城市列表。
数据权限 = 归属维度 ∩ 地域维度。佣金按关联订单计算。 |
自己发展的客户与服务商 + 负责城市的资源库。 看不到:其他代理商的盘子、非负责城市的资源。 |
| 平台运营方 | 独立后台,全局视图 + 敏感数据脱敏(身份证、联系方式按需解密,留审计)。 所有查看敏感数据的操作记审计日志。 | 全局(含审核、清算、风控、纠纷处理)。 |
| 预留项 | 做法 | 不做的后果 |
|---|---|---|
| 金额 | 存 最小货币单位的整数(分)+ currency_code(ISO 4217)。禁止 float 存钱。 |
多币种一上就出现精度错误与对账差异 |
| 时间 | 统一存 UTC(timestamptz)+ 用户时区字段,展示层转换。 |
跨时区活动的档期、签到、 reminders 全错 |
| 多语言内容 | 可翻译字段(课程名、场地描述、课件标题)不直接写入主表,
用 xxx_i18n(JSONB) 或独立翻译表 {entity_id, locale, field, value}。 |
后期要加语言 = 全表加列 + 数据迁移 |
| 地区与合规 | country_code / region_code / data_residency(数据驻留地) |
无法支持数据分域存储,GDPR 合规无从谈起 |
| 编号与序列 | 订单号、合同号不要依赖自增 ID,用「业务前缀 + 日期 + 序列」生成,且序列按租户/地区隔离。 | 多区域部署时主键冲突 |
纯 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 | 学员 | 自己报名的活动、自己的项目申请、自己的商机 |
下图为 核心实体关系图,共 21 个核心实体、分 4 个域带。
橙色字段为外键(FK),几乎所有业务表都带 tenant_id —— 这是 4.2 节隔离方案的落地体现。
| 表 | 域 | 租户隔离 | 关键索引 / 约束(性能与安全的落点) |
|---|---|---|---|
tenant | ① | 本表即租户 | uk(name);status 用于停用即冻结全部子账号 |
user | ① | 是 | uk(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_event | ③ | 是 | idx(tenant_id, status, start_at);idx(city_code, start_at, status) 供平台侧调度 |
enrollment | ③ | 是 | uk(event_id, trainee_id) 防重复报名;idx(tenant_id, event_id, status) |
trainee | ③ | 是 | uk(tenant_id, phone_hash);phone 字段加密存储,检索用哈希;tags GIN 索引 |
event_service_order | ③ | 是 | idx(event_id, type, status);idx(resource_id, date);幂等键 uk(request_id) |
booth | ③ | 是 | uk(event_id, code);idx(event_id, status) |
booth_order | ③ | 是 | uk(booth_id) 在 status=已定时生效(部分唯一索引)防一摊两卖;幂等键 |
settlement | ③ | 是 | idx(order_id);idx(party, status, created_at) 供对账 |
distribution_task | ④ | 是 | idx(status, scheduled_at) 供调度器拉取;uk(asset_id, channel, channel_account_id) |
project_application | ④ | 是 | uk(project_id, trainee_id);idx(project_id, status, match_score) |
| 支撑表(通用,所有域共用) | |||
workflow_instance | L4 | 是 | 状态机实例:定义 ID / 当前节点 / 上下文 / SLA 到期时间。所有需要"进度可视"的单据都挂它 |
workflow_task | L4 | 是 | 节点任务:处理人 / 状态 / 时限 / 凭证附件 / 超时升级记录 |
audit_log | L4 | 是 | 只增不改不删,含敏感数据访问记录;分区表按月分区 |
notification | L4 | 是 | 站内信 / 短信 / 邮件 / 微信模板消息统一出口,带已读与重试状态 |
file_object | L4 | 是 | 对象存储映射表,租户目录前缀隔离 + 签名 URL,禁止公开读 |
request_id)。
支付回调、第三方 API 重试、用户重复点击都会造成重复下单。幂等键 + 唯一约束是唯一可靠解法。
这一节回答你的硬要求:"所有流程都要让客户在 Web 和手机端都可以看到每个节点状态和进度"。
做法是:所有需要进度可视的单据,统一挂在 workflow_instance 上,由工作流引擎驱动状态机,
前端用同一套进度组件渲染。这样不用为每个流程单独写进度条,也保证 Web/H5 状态定义绝对一致。
| 图形 | 含义 |
|---|---|
| 正常节点 | 主流程状态,实线箭头表示正常流转 |
| 异常/终态 | 终止、取消、失败等旁路状态,虚线箭头进入 |
| 人工节点 | 该节点必须由人工处理(无 API 可用,见第 1 节) |
| # | 阶段 | 节点 | 负责人 | 建议时限 | 系统动作 | 可见角色(Web + H5 同步) |
|---|---|---|---|---|---|---|
| 1 | DRAFT | 提交培训会需求 | 客户 | — | 表单 + AI 结构化(自然语言→结构化需求单) | 客户(全部)、运营 |
| 2 | MATCHING | 资源匹配(场地/住宿) | 系统 + 运营 | 4 小时 | 按城市/人数/预算/档期筛选 + AI 排序 + 生成候选清单 | 客户、运营、相关服务商(仅自己的报价) |
| 3 | MATCHING | 需求派发与服务商抢单 | 服务商 | 28 分钟响应 | 推送到服务商端;抢单池;超时未响应自动扩大范围 | 客户(看到响应数)、运营、服务商 |
| 4 | QUOTED | 生成方案与比价 | 运营 / 客户自助 | 24 小时 | 多方案对比(价格/位置/容量/评分);成本测算 | 客户、运营 |
| 5 | CONFIRMED | 客户确认方案 | 客户 | — | 冻结报价;生成待签合同;触发定金账单 | 客户、运营、中选服务商 |
| 6 | LOCKED | 签约 + 付定金 + 锁档期 | 客户 / 运营 | 48 小时 | 电子合同;支付;写 resource_calendar 锁定档期(强一致) | 客户、运营、服务商(自己档期) |
| 7 | ENROLLING | 开启报名(生成报名页/H5) | 客户 | — | 生成报名二维码/H5 链接;配置票种与表单字段 | 客户、学员(公开链接) |
| 8 | ENROLLING | 学员报名与资格审核 | 客户 / 系统 | 逐单 | 自动校验(重复报名/黑名单)+ 人工审核;短信通知 | 客户、学员(自己状态) |
| 9 | PREPARING | 餐饮需求确认 | 餐饮服务商 | 会前 7 天 | 生成 event_service_order(MANUAL 通道);人数/标准/忌口/包厢 | 客户、运营、餐饮服务商 |
| 10 | PREPARING | 住宿预订 | 系统 / 人工 | 会前 7 天 | API 通道(酒店聚合 Adapter);失败降级为人工工单 | 客户、学员(自己的房间)、运营 |
| 11 | PREPARING | 停车需求确认 | 场地方 | 会前 3 天 | 作为场地资源属性确认;无 API,人工回填凭证 | 客户、运营、场地方 |
| 12 | PREPARING | 物料/搭建/拍摄/媒体确认 | 各服务商 | 会前 3 天 | 子单派发 + 交付物上传(凭证附件) | 客户、运营、各服务商 |
| 13 | ONGOING | 现场签到与执行 | 客户 / 服务商 | 活动期 | 扫码签到(H5);实时出勤看板;现场异常上报 | 客户、运营、学员(签到确认) |
| 14 | SETTLING | 费用核对与结算分账 | 运营 / 财务 | 会后 7 天 | 生成 settlement;平台/渠道商/服务商三方分账 | 客户、运营、服务商(自己的结算单) |
| 15 | CLOSED | 复盘报告 + 服务商评价 | 系统 + 客户 | 会后 14 天 | 自动生成复盘(成本/转化/满意度);双向评价入库 | 客户、运营、服务商(自己的评分) |
enrollment.form_data JSONB 存扩展字段,不要为每个客户加列。fulfil_mode 字段决定走 API 还是人工工单,且 API 通道必须能在运行时自动降级——第三方挂掉时,
订单自动转成人工工单并通知运营,客户感知到的只是"处理中",而不是"系统错误"。project_application 表,用 type 区分来源(APPLY 主动申请 / CONSULT 现场扫码)。
这样现场扫码产生的线索不会散落在系统外,能直接进入商机池被跟进——这是"让培训会变成长期关系"的技术前提。RESERVED 是有超时时间的中间态(建议 15 分钟),
超时由定时任务自动释放并通知候补——这是会展招商系统的标准做法,能显著提升摊位成交率。你的原话:"支持学员从事的工作的项目落地的服务商可以预定摊位,来实现线下成本的支出对冲"。 把它做成一个实时看板,就是客户续费的最大理由。
// 培训会成本对冲实时模型(每次摊位成交/每笔支出变动时重算) 总支出 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 必做 |
你有五条主流程、约 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:谁、何时、从什么状态到什么状态、附言、附件 | 只增不改,用于纠纷追溯 |
| 版本管理 | 流程定义修改后新开版本,老实例继续用老版本跑完,避免改流程导致进行中的单据错乱 | 必做 否则改一次流程出一次事故 |
核心思路: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" } ] }
横向步骤条 + 右侧子任务清单 + 甘特视图(多活动并行时)。支持导出进度报告 PDF 发给客户领导。
纵向时间轴 + 卡片式子任务 + 一键催办。扫码即看,无需登录也可查公开进度(凭单号+手机号后四位)。
每次流转触发通知:站内 + 短信/微信模板消息。关键节点必推(确认、锁定、报名开启、结算)。
| 时机 | 通知对象 | 渠道 | 规则 |
|---|---|---|---|
| 状态流转 | 下一节点处理人 + 单据关注人 | 站内 + 微信/短信 | 关键节点强制推送,普通节点仅站内 |
| SLA 剩余 25% | 当前处理人 | 站内 | 温和提醒 |
| SLA 超时 | 处理人 + 其上级 + 运营 | 站内 + 短信 | 自动升级,计入服务考核 |
| 服务商未响应抢单 | 候选服务商池 | 微信模板消息 | 28 分钟未响应则扩大候选范围(对齐行业 SLA) |
| API 通道失败降级 | 运营值班 | 站内 + 短信 | 必须告警:降级意味着要人工介入,不能静默 |
| 摊位占位将到期 | 预订服务商 | 站内 + 短信 | 到期前 5 分钟提醒,超时自动释放 |
你说要"收集每个城市的培训场地、会展部署机构、视频拍摄机构、媒体传播机构", 并让"业务员或每个市的渠道代理商去对接这些服务机构"。 先说结论:这是整个项目最贵、最慢、最不可绕过的一环,且它不是技术问题。 会小二做到 9 万家深度合作场地用了约 10 年。你必须在动工第一天就并行启动地推, 系统只负责让录入快、让撮合成、让结算准。
不同类型资源差异极大,统一用 resource_item 主表 + attrs JSONB 存差异。
下表是必须采集的核心字段——字段太少匹配不准,太多地推不愿填。建议:标 ★ 为必填,其余后补。
| 资源类型 | 必填核心字段(★) | 重要选填(影响匹配质量) |
|---|---|---|
| 培训场地 | ★名称 ★城市+区县 ★详细地址 ★经纬度 ★最大容纳人数 ★可容纳教室数/最大单间容量 ★日租价格区间 ★是否含投影音响 | 宴会厅/教室/多功能厅类型、层高、是否有柱、货梯尺寸、 是否可进场搭建、周边餐饮、停车位数量、发票类型、历史合作评价 |
| 住宿酒店 | ★名称 ★星级/档次 ★城市+区县 ★距场地距离 ★协议价/门市价 ★大床房与标间数量 ★是否含早 | 会议室是否可打包、团队入住政策、取消政策、发票、是否可挂账、停车 |
| 餐饮/团餐 | ★名称 ★城市 ★可承接人数区间 ★餐标档位(元/人)★菜系 ★是否可送餐到场地 ★包厢数量 | 忌口处理能力、清真/素食、宴会厅容量、是否含酒水、开票、食品安全资质 |
| 停车 | ★所属场地/酒店 ★车位总数 ★是否可预留 ★大巴位数 ★收费标准 | 限高(大巴)、是否含在场地费内、充电桩、过夜政策 |
| 会展搭建 | ★名称 ★城市 ★服务范围(展台/舞台/灯光/LED)★是否可异地作业 ★参考报价方式(按平米/按项) | 进场时间要求、资质证书、过往案例图、是否含设计、搭建工期 |
| 视频拍摄 | ★名称 ★城市 ★可承接类型(课程录制/活动纪实/宣传片/直播) ★设备等级(单机/多机/导播台)★成片周期 ★报价方式 | 是否含剪辑、是否含字幕、样片链接、团队规模、是否可出差 |
| 媒体传播 | ★名称 ★覆盖渠道(行业媒体/公众号/短视频/垂类社群)★受众画像 ★粉丝量/阅读量量级 ★报价方式 | 行业垂类、过往客户、投放形式(软文/视频/直播/社群)、效果数据口径 |
| 路径 | 成本 | 速度 | 具体做法与注意点 |
|---|---|---|---|
| ① 从已有活动反推 | 低 | 快 | 首选 先接几场真实培训会(哪怕人工撮合), 把合作过的场地/餐饮/酒店全部录入库。这些是已验证资源,质量最高,且带真实成交价与评价。 不要等资源库建完再接单——反过来,用订单倒逼资源入库。 |
| ② 酒店集团/连锁 | 低 | 中 | 华住、锦江、亚朵、希尔顿、万豪等都有会议销售团队与协议价体系, 一个集团谈一次可覆盖数十个城市数百家门店。这是性价比最高的一条路。 |
| ③ 会展/会务公司 | 中 | 中 | 各城市本地的会务公司本身就是"资源聚合商",一家公司往往握有几十个场地资源。 把他们发展成平台服务商(而非竞争对手),让他们用你的系统接单。 |
| ④ 行业协会/园区 | 低 | 慢 | 各行业的协会、商会、产业园区都有自己的活动场地和会员资源,且自带客户。 谈成合作等于同时拿到供给侧和需求侧。 |
| ⑤ 公开信息采集 | 低 | 快 | 可从公开渠道(地图 POI、企业信息平台、行业展会官网、酒店官网会议页)批量获取 L1 基础信息。 注意合规:仅采集公开的企业信息,采集后必须由地推电话核实才能激活,避免侵权与无效数据。 |
| ⑥ 渠道代理商地推 | 高 | 慢 | 你提到的模式,适合二三线城市下沉。成本高、管理难,建议只在有明确需求的城市开。 先做 3~5 个重点城市验证模型,再谈全国铺开。 |
城市合伙人(独家,有区域保护 + 年度考核指标)
金牌代理(非独家,高分佣 + 优先派单)
普通代理/业务员(按单计佣,无区域保护)
信息员(只报线索不跟进,拿线索费)
客户侧成交:按服务费/摊位流水的 5%~15%(按级别与是否独家)
服务商拓展:该服务商产生流水的 1%~3%(长期分成,激励维护)
纯线索:成交后一次性 线索费
结算周期:月结,T+15,对账透明可查
| 系统能力 | 说明(这些是代理商愿意跟你干的前提) |
|---|---|
| 归属与保护 | 客户/服务商归属到人,有保护期(如 6 个月未跟进自动释放到公海),防止"抢单内耗"。 |
| 业绩看板 | 代理商能看到自己发展的客户数、活动数、流水、佣金、回款状态。佣金不透明是代理商流失的头号原因。 |
| 移动端录入 | 业务员在手机上 5 分钟完成一条资源建档(L1),支持拍照识别名片、定位自动填地址。这是使用率的关键。 |
| 冲突仲裁 | 同一资源被多人录入时的归属判定规则(先到先得 + 谁先产生订单),必须事先写清楚,否则必吵架。 |
| 线上化结算 | 佣金自动计算 + 提现 + 开票。月结超时未到账会直接摧毁信任。 |
你的描述里有"通过 AI 对接美团和携程""AI 进行分析、内容推荐、课程推荐"。 我必须客观地说:这里面只有一部分是 AI 能做的,其余是工程问题或运营问题。 把 AI 放在正确的位置,能省大量成本;放错位置,会做出没人用的花瓶功能。
| 落点 | ROI | AI 到底做什么 | 何时做 |
|---|---|---|---|
| ① 需求结构化 自然语言 → 结构化订单 |
最高 | 客户说"下个月上海,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 可以做辅助话术与预案推荐。 | — |
// 输入(客户在 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"] }
| 阶段 | 数据量门槛(经验值) | 可用的方法 | 预期效果 |
|---|---|---|---|
| 冷启动 0 ~ 1000 单 |
用户 < 1k,行为 < 10k | 纯规则:标签匹配 + 热度排序 + 人工运营位。不要上模型,上了也没用。 | 能用,不惊喜 |
| 早期 1k ~ 1 万单 |
用户 1k~10k,行为 10k~100k | 内容相似度(向量):课程/项目/服务商的语义相似度匹配;学员画像相似度。 | 明显好于规则 |
| 成长期 1 万 ~ 10 万单 |
用户 10k+,行为 100 万+ | 协同过滤(ItemCF/UserCF)+ 向量召回,引入实时行为特征。 | 有商业价值 |
| 成熟期 10 万单以上 |
行为 1000 万+ | 深度学习排序(双塔/DIN)+ 多目标优化(报名率、成交率、留存)。 | 核心竞争壁垒 |
门槛值为行业经验数量级,非精确阈值;实际以你自己的 A/B 实验结果为准。结论:P1~P3 不要碰推荐算法,把精力放在把数据结构和埋点做对。
// 向量化的对象与隔离策略 可向量化内容: · 课件 / 讲义(courseware) → 学员问答、课程推荐 · 项目资源描述(project_resource) → 学员-项目语义匹配 · 服务商能力描述(resource_item) → 需求-资源语义匹配 · 历史工单与处理方案 → 客服问答 · 活动规则 / 服务标准 / FAQ → 通用问答 强制约束: ① 每条向量必须带 tenant_id,检索时作为硬性过滤条件(不是相似度权重) ② 平台级内容(如通用服务标准)用 tenant_id = NULL,检索时并入 ③ 服务商敏感信息(底价、内部备注)禁止入向量库 ④ 内容删除时必须同步删除向量,否则会造成"删了还能搜到"的合规事故 ⑤ 向量库只是派生存储,可从主库全量重建 —— 主库才是事实来源
| 网关职责 | 为什么必须有 |
|---|---|
| 多模型路由 | 国内/海外模型政策、价格、可用性变动频繁。统一抽象后可按场景路由: 简单抽取用小模型(便宜),复杂推理用大模型,海外用户走海外模型(合规)。 |
| Prompt 版本管理 | Prompt 改了效果变差要能秒级回滚。把 Prompt 当代码管(版本 + 灰度 + A/B)。 |
| 成本核算 | 按租户/功能统计 Token 消耗。否则会出现某个客户把你月度 AI 预算烧光而你还不知道。 |
| 降级与超时 | LLM 超时或报错时,返回"已记录,稍后由人工处理",绝不能让主流程失败。 |
| 结果校验 | 结构化输出必须通过 JSON Schema 校验,不合格则重试(最多 2 次)后转人工。禁止直接信任模型输出写库。 |
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 落地)
| 域 | 方法 | 路径 | 说明 |
|---|---|---|---|
| iam | POST | /api/v1/auth/login | 多端登录,返回租户上下文 |
| GET | /api/v1/tenants/:id/members | 成员与角色管理 | |
| POST | /api/v1/agents/:id/bindings | 代理商归属绑定(客户/服务商) | |
| supply | POST | /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 | 学员报名(幂等键防重复) | |
| trade | POST | /api/v1/events/:id/booths | 批量定义摊位(支持平面图坐标) |
| POST | /api/v1/booths/:id/reserve | 占位(15 分钟超时,防超卖) | |
| GET | /api/v1/events/:id/cost-offset | 成本对冲实时看板数据 | |
| match | POST | /api/v1/projects | 发布项目资源 |
| GET | /api/v1/projects/:id/candidates | 候选学员排序(规则版/模型版可切) | |
| workflow | GET | /api/v1/progress/:bizType/:bizId | Web/H5 共用进度接口(见 6.8) |
| POST | /api/v1/workflow/tasks/:id/complete | 完成节点任务(含凭证附件) | |
| content | POST | /api/v1/assets/:id/distribute | 创建分发任务(按平台拆多条) |
// 所有外部供给能力实现同一接口 —— 换供应链不改业务代码 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' }; // 业务继续,客户看到"处理中" } }
tenant_id 且非空 —— CI 扫描 migration 文件,缺失直接失败request_id 幂等键 —— 缺失则 CI 报警你提到"平台提供大量的有用的软件,客服系统、CRM系统、AI企业服务"。自研这三样会吃掉你至少一半的研发资源, 且做出来大概率不如成熟的开源方案。
| 系统 | 建议 | 集成方式 |
|---|---|---|
| 客服系统 | 集成开源方案 | 用成熟开源客服/工单系统,通过 SSO 单点登录 + iframe/微前端嵌入工作台;
工单与平台业务单据(活动/订单)通过 bizType + bizId 双向关联。你在用的 EspoCRM 本身就带工单与客服模块,可优先考虑复用。 |
| CRM | 复用 EspoCRM | 你已经熟悉 EspoCRM。让 EspoCRM 承担客户/商机/跟进, 平台只负责"把业务事件(报名、摊位成交、项目撮合)推送成商机"。避免两套客户数据打架。 |
| IM / 消息 | 短期用第三方,长期可自研 | 一期:站内消息 + 微信模板消息足够。若确需 IM,接入即时通讯云服务比自研便宜得多。 |
| AI 企业服务 | 包装平台已有能力 | 不要另起炉灶。把你已有的"需求结构化、匹配排序、知识库问答"开放成 API, 就是最好的 AI 企业服务。 |
| 阶段 | 部署形态 | 月成本量级 | 说明 |
|---|---|---|---|
| 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 调用是可变成本,务必设置月度预算上限与告警。
| 角色 | P0~P1 | P2~P3 | 职责重心 |
|---|---|---|---|
| 后端主程 | 2 | 3 | 领域模型、工作流引擎、结算(结算逻辑最易出错,需要最强的人) |
| 前端 | 2 | 3 | Web 工作台 + H5/小程序(含通用进度组件) |
| 产品/设计 | 1 | 2 | 必须懂线下会务业务,否则流程设计会脱离实际 |
| 测试 | 1 | 2 | 重点覆盖状态机流转、金额、幂等 |
| 运维/DevOps | 0.5(你兼) | 1 | 你已有 Nginx/云服务器经验,初期可自担 |
| 运营/地推 | 2~3 | 5~10 | 最关键 资源拓展与客户拓展,技术团队再强也替代不了 |
| 合计(技术) | 6~7 人 | 11~12 人 | — |
| 阶段 | 周期 | 目标 | 交付物(可验收) |
|---|---|---|---|
| P0 地基 | 3 个月 | 多租户底座 + 资源库 + 工作流引擎 | · 租户/组织/角色/权限(含 RLS 行级隔离) · 服务商入驻与资质审核 · 七类资源库(L1 建档)+ 移动端快速录入 · 统一工作流引擎 + 通用进度组件 此时无对外收入,但决定了后面能不能快 |
| P1 主干 | 4 个月 | 培训会全流程跑通,开始收钱 | · 需求提交 + AI 结构化(最高 ROI 的 AI 功能) · 资源匹配 → 派单/抢单 → 报价 → 确认 · 档期锁定 + 电子合同 + 支付 · 学员报名/审核/签到(H5) · 餐饮/住宿/停车子单(API + 人工双通道) · Web + H5 全节点进度可视 · 结算与分账 |
| P2 变现 | 4 个月 | 摊位招商 + 撮合,毛利结构成型 | · 摊位定义/招商发布/占位/预订/合同 · 成本对冲实时看板(含"还差几个摊位打平") · 项目资源发布 + 学员撮合 · 现场扫码建联 + 商机沉淀 · 服务商评价与抢单权重 |
| P3 获客 | 4 个月 | 内容制作分发,形成拉新管道 | · 素材管理 + 审核流 · 平台适配规则引擎 · 抖音/快手/YouTube 官方 API 自动发布 · 小红书/视频号半自动工作台 · 数据回流与效果看板 |
| P4 智能 | 持续 | 数据驱动 + 供应链直连 + 全球化 | · 向量检索 / RAG 客服 · 推荐系统(数据量达标后) · 酒店供应链 API 直连(美团分销 / 携程) · 多语言多币种跨境支付 · 数据合规(GDPR / 数据出境) |
| 时间点 | 里程碑 | 验收标准(可量化) |
|---|---|---|
| 第 3 个月末 | 地基交付 | 2 个租户完整跑通权限隔离;资源库录入 ≥ 200 条真实资源;工作流引擎支持 3 条流程定义 |
| 第 5 个月末 | 第一场真实活动 | 不追求系统完美,用人工兜底完成 1 场真实培训会(场地+报名+餐饮+住宿全流程) |
| 第 7 个月末 | P1 上线 | 线上完成 ≥ 5 场活动;客户可在 Web/H5 看到全部节点状态;结算零差错 |
| 第 11 个月末 | P2 上线 | ≥ 3 场活动启用摊位招商;至少 1 场实现对冲率 > 50%(这是商业模式验证成功的关键指标) |
| 第 15 个月末 | P3 上线 | 内容分发跑通 ≥ 3 个平台;内容带来的报名线索可归因 |
| 第 18 个月 | 规模化决策点 | 复盘单城模型是否跑通,决定是否全国铺开与引入外部融资 |
| # | 风险 | 概率 | 影响 | 缓解措施 |
|---|---|---|---|---|
| 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 个城市试点代理模式,验证后再复制。 |
| 9 | AI 成本失控 / 效果不及预期 | 中 | 中 | LLM 网关做配额与成本核算(按租户限流);结果过 Schema 校验; 效果不达标时快速降级为纯人工,不阻塞业务。 |
| 10 | 合规风险 个人信息、数据出境、预付资金 |
中 | 高 | 学员手机号等个人信息加密存储 + 脱敏展示 + 最小化采集; 预收摊位费/培训费要注意资金存管与预付卡合规要求,务必咨询专业法律意见; 全球化前完成 GDPR 与数据出境评估。 |
| 11 | 竞争:会小二等切入同一人群 | 中 | 中 | 差异化不在"找场地",而在"培训会成本对冲 + 学员资产沉淀 + 项目撮合"—— 这是他们不做、也很难快速补的。把护城河建在客户的数据资产(学员库、项目库、历史成交)上, 客户迁移成本越高越安全。 |
这份设计里有 8 处我做了假设。这些假设会实质影响架构与排期,建议你逐条确认后再进入开发。