本域总览见《账号计费中心 · 结构大纲》。本文为该域完整设计:定位与边界 / 角色与依赖 / 数据模型 / 核心流程 / 接口契约 / 关键约束与验收标准。
定位:工作区(租户)与成员归属的管理者。回答三个问题——「资源与费用归属谁」(工作区)、「谁可以操作」(成员与角色)、「用量如何切分」(组)。
核心概念
kind 区分:两者都有组织、成员关系、钱包、默认组,权限与计费链路上不引入第二套模型。边界
kind 语义(本域最关键的口径)
| kind | 语义 | 可变操作 |
|---|---|---|
personal |
只读身份锚点:kind 不可变、不可改名、不可邀请、不可退出、不可注销、不可转让;唯一成员 = 本人 Owner | 无 |
company |
可变租户 | 改名 / 联系方式 / 邀请 / 成员管理 / 组管理 / 转让 / 余额转回 / 注销 |
组织角色(三级):owner > admin > member。组织恒有主——Owner 唯一,且不可被移除、不可主动退出。
组内角色(两级):member / admin(组管理员),与组织角色相互独立:组织 Member 可以是某组的管理员;组管理员不因组内身份获得组织级权限。
能力矩阵
| 操作 | Owner | Admin | Member |
|---|---|---|---|
| 查看工作区列表 / 组织信息 | ✓ | ✓ | ✓ |
| 编辑企业资料 / 邀请成员 | ✓ | ✓ | ✗ |
| 普通成员角色升降 | ✓ | ✓ | ✗ |
| Admin 角色变更 / 移除 Admin | ✓ | ✗ | ✗ |
| 建组 / 停用启用 / 设组额度 | ✓ | ✓ | ✗ |
| 本组组管理员 | ✗(除自身组) | ✗(除自身组) | 仅可调本组普通成员 |
| 转让 Owner / 余额转回 / 注销企业 | ✓ | ✗ | ✗ |
| 退出组织 | ✗(须先转让) | ✓ | ✓ |
| 组织审计查询 | ✓ | ✓ | ✗ |
上游依赖
下游被依赖(谁引用本域)
| 引用方 | 引用内容 | 语义 |
|---|---|---|
| 钱包与账务域 | 工作区 → 钱包 1:1 | 工作区是计费与资金归属主体 |
| 订购与支付域 | 工作区、组 → 账户访问密钥 | 密钥归属某工作区,消耗归因落到某组 |
| 计量与计费域 | 工作区、组、成员(弱引用) | 用量归属三层切分:工作区 / 组 / 成员 |
| 发票域 | 工作区 | 发票主体与抬头归属 |
| 风控与合规域 | 工作区 | 企业实名核验与风险事件归属 |
| 账户状态与准入域 | 工作区状态 | 工作区关闭触发对应钱包的准入状态发布 |
| 运营管理 | 组织投影(只读) | 运营面按工作区视角查看成员与组,仅读不写 |
默认组的成员是派生视图(= 工作区全体成员),不落
group_members行——从模型层消灭「移出唯一组」的边界问题。
users 由本域引用(成员关系的用户侧),不入本域表清单。| 表 | 职责 | 关键字段 |
|---|---|---|
| organizations | 工作区(租户)主体,个人 / 企业同构 | kind / name / credit_code / status / real_name_status / identity_level / created_by |
| organization_memberships | 用户 × 工作区的成员关系与角色 | user_id / organization_id / org_kind / role / last_active_at |
| organization_invitations | 邀请(成员关系前置态) | contact_type / contact / role / code_hash / status / expires_at / accepted_user_id / code_encrypted |
| groups | 额度归因与准入执行锚点 | organization_id / name / description / is_default / status / quotas / rpm_limit / tpm_limit / alert_threshold |
| group_members | 自建组成员(默认组不落行) | group_id / user_id / role / added_by |
| organization_audit_logs | 组织视角留痕,Owner / Admin 可查 | organization_id / actor_user_id / action / target_type / target_id / detail / ip |
(用户, 工作区) 唯一,作为并发邀请竞态的兜底。/api/account)| 方法 | 路径 | 语义 |
|---|---|---|
| GET | /organizations |
我的工作区列表:个人工作区居首 + 已加入企业,按最近活跃降序 |
| POST | /organizations |
创建企业工作区(Owner 由创建人自动获得) |
| GET | /organization |
组织信息 + 成员列表(Member 可读,联系方式脱敏;响应带 kind 供前端分流) |
| PUT | /organization |
编辑企业资料(Owner / Admin;个人工作区拒绝) |
| PATCH | /organization/touch |
工作区活跃心跳(切换时调用,更新成员级最近活跃时间) |
| DELETE | /organization |
注销企业(仅 Owner;软关闭) |
| POST | /organization/leave |
退出组织(Admin / Member,可指定工作区) |
| POST | /organization/ownership-transfer |
转让 Owner(受让方须为同工作区成员) |
| POST | /organization/balance/transfer |
企业余额转回个人钱包(仅 Owner) |
/api/account)| 方法 | 路径 | 语义 |
|---|---|---|
| PUT | /organization/members |
成员角色变更(Owner 可调任意;Admin 仅可升降普通成员) |
| DELETE | /organization/members |
移除成员(Admin 仅可移除普通成员;不能移除自己 / Owner) |
| PUT | /members/{membership_id}/role |
角色变更(按成员关系定位的历史入口,内部换算后走同一业务校验) |
| DELETE | /members/{membership_id} |
移除成员(同上历史入口) |
/api/account)| 方法 | 路径 | 语义 |
|---|---|---|
| GET | /groups |
组列表:Owner / Admin 见全部,普通成员见默认组 + 所在组 |
| POST | /groups |
建组(组数上限 50、组名工作区内唯一、初始成员可选) |
| PATCH | /groups/{group_id} |
改名 / 描述 / 限速(显式 null = 清空不限) |
| POST | /groups/{group_id}/disable |
停用组(默认组不可停用;幂等) |
| POST | /groups/{group_id}/enable |
恢复启用 |
| GET | /groups/{group_id}/members |
组成员:默认组 = 全体成员派生,自建组 = 组内成员(工作区内只读) |
| PUT | /groups/{group_id}/members |
全量替换组成员(默认组拒绝;组管理员不可授予组管理员) |
| GET | /groups/{group_id}/quota |
组额度与限速查看 |
| PUT | /groups/{group_id}/quota |
组额度设置(限额必须带周期;显式清空 = 不限) |
/api/account)| 方法 | 路径 | 语义 |
|---|---|---|
| POST | /invitations |
批量邀请(邮件 / 短信;7 天有效;通知 best-effort) |
| POST | /invitations/link |
创建邀请链接(一次性令牌,随响应返回由前端拼链) |
| GET | /invitations |
邀请列表(待接受 / 已接受 / 已撤销 / 已过期;过期项就地标记) |
| POST | /invitations/{invitation_id}/revoke |
撤销邀请 |
| POST | /invitations/accept |
已有账号凭码入组 |
| POST | /register/organization |
企业注册(注册即建企业工作区,创建人 Owner) |
| POST | /register/invite |
受邀注册(注册即入组,一次请求完成建号与入组) |
/internal/organizations)| 方法 | 路径 | 语义 |
|---|---|---|
| GET | /internal/organizations |
工作区列表:含成员标识与 Owner 联系方式摘要,供运营面按工作区投影 |
| GET | /internal/organizations/{org_id} |
工作区详情:成员(联系方式脱敏)+ 组摘要 + 钱包锚点标识 |
| GET | /internal/organizations/{org_id}/groups |
工作区下全部组的额度口径(与单组查询同字段) |
| # | 验收口径 |
|---|---|
| 1 | 在营期间重复注册同一名称 / 同一执照 → 409;工作区注销后,同一名称与执照可重新注册成功 |
| 2 | 并发两次「接受同一邀请」:仅一人成功,另一人失败,且成员关系只有一行 |
| 3 | 同工作区并发两次转让:仅一次成功;任何时刻 owner 行数 ≤ 1 |
| 4 | 余额转回:企业侧现金清零、个人侧按原子自增入账;两侧各有且仅有一行流水且 ref 相同;重试不产生二次入账 |
| 5 | 存在负余额或欠费标记时,余额转回与注销均返回 409 |
| 6 | 工作区仍有余额时注销返回 409;清零后可注销,注销后成员关系全部解除、成员名下组织内密钥全部失效 |
| 7 | 个人工作区上调用改名 / 邀请 / 成员管理 / 转让 / 注销 / 余额转回 → 拒绝(非 5xx) |
| 8 | 组数达上限再建组 → 400;组名重复 → 400;默认组不可停用、不可直接设置成员 |
| 9 | 组管理员无法授予或撤销组管理员角色 |
| 10 | 邀请过期后接受 → 明确失效语义;列表查询将过期待接受项就地标记为已过期 |
| 11 | 普通成员查询组列表,只能看到默认组与自身所在组 |
| 12 | 内部投影接口无内部令牌不可访问;响应中联系方式为脱敏值;关闭态工作区可被列表感知 |
| 13 | 请求携带已关闭工作区标识时返回自愈语义(清选择回退),而非角色不足语义 |
| 14 | 创建企业后,个人钱包余额不变(无隐式内部转账) |