feat(saas): implement marketplace and tenant onboarding
This commit is contained in:
@@ -49,7 +49,7 @@ Tenant Active
|
||||
+ DataScope / Resource Scope
|
||||
```
|
||||
|
||||
实现说明:固定 `ProductModuleCatalog`、`PlanModuleEntitlement`、可审计 `TenantModuleOverride` 与 `ICapabilityAccessEvaluator` 已进入数据库授权 Handler;未知或缺失目录模块 fail-closed。平台接口可替换套餐模块权益和设置带原因的租户覆盖,变更在同一事务写审计与 outbox 事件。迁移仅为从未配置权益的存量套餐补齐固定目录,已有显式权益不会被扩权。
|
||||
实现说明:`SaasFeature`、显式 `PermissionModule.RequiredFeatureCode`、不可变套餐版本、`TenantFeatureOverride` 与 `IFeatureAccessService` 已进入数据库授权链路。未知 Feature、未购买模块和失效订阅均 fail-closed;角色绑定保留历史权限,但鉴权和菜单只使用当前有效权限。
|
||||
|
||||
验收:
|
||||
|
||||
|
||||
@@ -6,11 +6,9 @@
|
||||
|
||||
现有后端已经具备继续开发的基础:Host 租户解析、强租户隔离、共享与私有题库、RBAC、Provider 解耦、租户前端运行时配置、学生练习闭环、交易基础和 Worker 基座均已落地。
|
||||
|
||||
后续重点应从“迁移旧 URL”转为“补齐 SaaS 产品闭环”。当前主要缺口是:
|
||||
第九阶段已经完成 SaaS 产品与交付闭环。当前主要缺口是:
|
||||
|
||||
- 平台向租户销售套餐的商城、订单、支付、订阅和计量闭环。
|
||||
- 教师发布作业、考试、批阅和查看班级结果的教学闭环。
|
||||
- 套餐业务能力、后台权限模块和前端菜单仍需彻底分层。
|
||||
- Provider 自助配置、公共题库运营和高流量查询读模型仍需完善。
|
||||
|
||||
## 三端边界
|
||||
@@ -55,8 +53,8 @@
|
||||
| 概念 | 用途 |
|
||||
| --- | --- |
|
||||
| `SaaSFeature` | 平台可销售的业务能力 |
|
||||
| `PlanFeatureEntitlement` | 套餐包含哪些业务能力 |
|
||||
| `FeatureLimit` | 员工席位、学生数、题目数、存储、导出和 AI 用量 |
|
||||
| `SaasOfferingVersionFeature` | 不可变套餐版本包含哪些业务能力 |
|
||||
| `SaasOfferingVersionLimit` | 套餐版本的员工、学生、题目、存储、导出和 AI 额度 |
|
||||
| `PermissionModule` | 后台权限页面的业务分组 |
|
||||
| `BackendPermission` | `view/create/update/import/export/approve/retry` 等操作权限 |
|
||||
| `BackendMenu` | 根据有效权限生成的前端导航,不作为鉴权依据 |
|
||||
@@ -114,16 +112,14 @@
|
||||
|
||||
两类订单、支付账号、回调地址、审计和对账不得共用业务表或服务。
|
||||
|
||||
## 缺失接口与模块
|
||||
## 已完成的 SaaS 商城与交付接口
|
||||
|
||||
### 平台 SaaS 商城
|
||||
|
||||
- 业务模块 CRUD、发布和下架。
|
||||
- 套餐 CRUD、不可变套餐版本、价格版本和套餐对比。
|
||||
- 附加包和额度定义。
|
||||
- 租户侧套餐目录、报价、结算、下单和支付。
|
||||
- 试用转正式、续费、升级、降级和取消。
|
||||
- SaaS 订单、支付、退款、账单、发票、用量和超额计费后台。
|
||||
- 平台模块、额度定义、基础套餐、附加包和不可变版本统一在 `/api/platform-admin/saas/**`。
|
||||
- 租户目录、报价、下单、支付、订阅变更、续费、取消、用量和发票统一在 `/api/tenant-billing/**`。
|
||||
- 人工、微信和支付宝平台收款使用平台主体 Provider,订单和回调与学生商城分离。
|
||||
- `/api/tenant-onboarding/status` 汇总 Owner、订阅、域名、登录方式、Provider 和前端发布状态。
|
||||
|
||||
租户自助账务接口建议统一在 `/api/tenant-billing/**`:
|
||||
|
||||
@@ -188,34 +184,13 @@ POST /api/tenant-admin/providers/secrets/rotate
|
||||
|
||||
## 实施顺序
|
||||
|
||||
### 9A:产品能力模型
|
||||
### 9A~9C:已完成
|
||||
|
||||
- 拆分套餐业务能力、权限模块、菜单和额度。
|
||||
- 定义核心能力、可售卖能力和附加包。
|
||||
- 套餐改为不可变版本,并引入统一 `IFeatureAccessService`。
|
||||
- 所有租户后台授权同时经过套餐能力和 RBAC 判断。
|
||||
- 重新生成 OpenAPI 迁移清单,替换已过时的接口比较结果。
|
||||
|
||||
退出标准:套餐决定租户买了什么,角色决定员工能做什么,菜单只表达前端展示。
|
||||
|
||||
### 9B:平台 SaaS 商城
|
||||
|
||||
- 套餐、模块、附加包和价格后台。
|
||||
- 租户报价、下单、支付和订阅变更。
|
||||
- SaaS 订单、退款、账单、发票、用量和催缴。
|
||||
- 平台支付与租户学生支付彻底分离。
|
||||
|
||||
退出标准:租户可从选择套餐到支付开通自动完成。
|
||||
|
||||
### 9C:租户自助初始化
|
||||
|
||||
- 创建 Owner、选择套餐、创建订阅。
|
||||
- 域名验证和激活。
|
||||
- 登录、SMS、OSS、支付和通知 Provider 配置与连通性测试。
|
||||
- 品牌、主题、导航和首页发布。
|
||||
- 账务中心、用量、续费和升级。
|
||||
|
||||
退出标准:平台不需要直接修改数据库即可交付新租户。
|
||||
- `SaasFeature`、`PermissionModule`、`BackendPermission`、`BackendMenu` 已分层。
|
||||
- `SaasOfferingVersion` 发布后由 Application 和 PostgreSQL guard 双重禁止修改。
|
||||
- `IFeatureAccessService` 统一处理租户、订阅、Feature、覆盖、额度与权限过滤。
|
||||
- PlatformBilling 与 TenantCommerce 使用独立订单、支付、回调和 Provider 配置。
|
||||
- 平台创建租户及 Owner 后,租户可完成购买、开通和 onboarding。
|
||||
|
||||
### 9D:教师教学与考试
|
||||
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
- 后台底座:平台/租户 RBAC、菜单、审计、平台后台、租户后台、交易运营、Worker 任务模型。
|
||||
- 学生体验:视频搜索/播放/进度、题目解析视频、签到、积分流水、内容导入异步化。
|
||||
- AI 基础:已引入 SK 包到 Infrastructure,已固定 provider-neutral 对话存储方向;业务功能仍待实现。
|
||||
- SaaS 商城:可售卖 Feature、不可变套餐版本、独立 PlatformBilling、租户自助账务、业务额度、订阅周期 Worker 和 onboarding 已落地。
|
||||
|
||||
阶段归档:
|
||||
|
||||
@@ -33,6 +34,7 @@
|
||||
- [第五阶段:后台能力与 Worker 基座](migration/phase-5-backoffice-worker-operations.md)
|
||||
- [第七阶段:学生端体验与内容消费闭环](migration/phase-7-student-experience-and-content-consumption.md)
|
||||
- [第八阶段:AI 底座与教师端对话](migration/phase-8-ai-foundation.md)
|
||||
- [第九阶段:SaaS 模块商城与租户交付闭环](migration/phase-9-saas-marketplace-and-onboarding.md)
|
||||
- [API 契约基线](migration/contracts/README.md)
|
||||
|
||||
后续产品化开发统一按 [SaaS 题库产品边界与后续接口路线](architecture/saas-product-and-api-roadmap.md) 执行。该文档定义三端边界、平台 SaaS 商城与租户学生商城的双交易域、套餐能力与 RBAC 分层,以及阶段 9A~9F。
|
||||
@@ -62,7 +64,13 @@
|
||||
- `commerce_reconciliation` 接真实 provider bill downloader。
|
||||
- `tenant_domain_recheck` 周期调度和告警联动。
|
||||
|
||||
### 4. 后台运营细化
|
||||
### 4. 教师教学闭环
|
||||
|
||||
- 作业、考试、班级发布、批阅和教学报告。
|
||||
- 学生断点续答、自动交卷、主观题复核和成绩分析。
|
||||
- 教学导出通过 Worker 和对象存储交付。
|
||||
|
||||
### 5. 后台运营细化
|
||||
|
||||
- 租户 secrets 通用后台管理。
|
||||
- 租户监督规则、跟进报表和洞察报表。
|
||||
@@ -70,7 +78,7 @@
|
||||
- 操作审计覆盖率补齐。
|
||||
- 发票、催缴、佣金联动调账。
|
||||
|
||||
### 5. 旧路径兼容评估
|
||||
### 6. 旧路径兼容评估
|
||||
|
||||
只有前端明确依赖且重写成本高时,才增加薄兼容 Controller。兼容层不得恢复:
|
||||
|
||||
|
||||
50
docs/migration/phase-9-saas-marketplace-and-onboarding.md
Normal file
50
docs/migration/phase-9-saas-marketplace-and-onboarding.md
Normal file
@@ -0,0 +1,50 @@
|
||||
# 第九阶段:SaaS 模块商城与租户交付闭环
|
||||
|
||||
## 目标
|
||||
|
||||
- 套餐决定租户购买的业务 Feature。
|
||||
- 角色决定员工可执行的 Permission,菜单只用于导航展示。
|
||||
- 平台 SaaS 收费与租户学生商城完全分离。
|
||||
- 平台创建租户和 Owner 后,租户可自助购买、开通并完成学生端初始化。
|
||||
|
||||
## 已完成
|
||||
|
||||
- `SaasFeature`、`PermissionModule`、`SaasOffering` 与不可变 `SaasOfferingVersion`。
|
||||
- 基础套餐、附加包、模块清单、额度定义、租户覆盖和原子用量记录。
|
||||
- `IFeatureAccessService` 统一读写状态、Feature、权限过滤和额度判断。
|
||||
- 题库、词汇、手册、视频、分数线和站点内容使用独立 `PermissionModule` 与后台权限点,单独购买、授权和生成菜单。
|
||||
- `/api/platform-admin/saas/**` 商品、订单、支付、订阅、发票、催缴和人工收款管理。
|
||||
- `/api/tenant-billing/**` 目录、幂等报价、幂等下单、支付、续费、变更、取消、用量和发票。
|
||||
- `/api/platform-billing/callbacks/{provider}` 独立平台收款回调。
|
||||
- 平台创建租户与 Owner 的事务化开户,以及 `/api/tenant-onboarding/status`。
|
||||
- runtime/UI bootstrap 返回有效 Feature、登录方式、权限、菜单、订阅和额度摘要。
|
||||
- 员工、学生、私有题、存储、导入、导出和短信额度已接入真实写路径;当前量由 Worker 定期按业务事实校准。
|
||||
- Worker 自动应用周期末降级、取消、Trial 到期、PastDue 和 Expired 状态转换,多 Worker 通过乐观并发保证幂等。
|
||||
- 旧 `ProductModule`、可变套餐、旧订阅和重复平台发票模型已删除。
|
||||
|
||||
## 数据库边界
|
||||
|
||||
- 当前仓库只有一个 greenfield `InitialSchema`。
|
||||
- 发布套餐版本、Feature 清单和额度清单不可修改。
|
||||
- 订阅基础项必须引用基础套餐;订阅项类型必须匹配 Offering 类型。
|
||||
- 订阅项可绑定产生它的 `PlatformBillingOrderItem` 价格快照。
|
||||
- 平台支付事件按租户、Provider 和 Provider Event ID 幂等。
|
||||
- 每个订阅最多一个 Active 基础套餐项和一个 Scheduled 基础套餐项,周期末原子切换。
|
||||
- 报价、订单和支付均保存租户内唯一幂等键,客户端不能提交最终价格。
|
||||
|
||||
## 验收
|
||||
|
||||
```bash
|
||||
dotnet build TIKU-BACKEND.slnx --no-restore
|
||||
dotnet test Tiku.UnitTests/Tiku.UnitTests.csproj --no-build
|
||||
dotnet test Tiku.IntegrationTests/Tiku.IntegrationTests.csproj --no-build
|
||||
dotnet ef migrations script --project Tiku.Infrastructure --startup-project Tiku.DbMigrator
|
||||
dotnet ef migrations has-pending-model-changes --project Tiku.Infrastructure --startup-project Tiku.DbMigrator
|
||||
git diff --check
|
||||
```
|
||||
|
||||
真实 PostgreSQL 测试覆盖套餐发布不可变、报价与订单幂等、人工/微信/支付宝收款、签名与金额拒绝、重复回调、跨租户订单隔离、未购模块权限拒绝、额度写路径与事实校准、订阅周期转换和 onboarding ready。
|
||||
|
||||
## 后续
|
||||
|
||||
第十阶段实现教师作业、考试、批阅和教学报告。教师 AI 对话与题目反馈审核继续独立排期。
|
||||
Reference in New Issue
Block a user