diff --git a/app/api/schemas/auth.py b/app/api/schemas/auth.py index aac23bc..b411ab9 100644 --- a/app/api/schemas/auth.py +++ b/app/api/schemas/auth.py @@ -84,6 +84,9 @@ class UserProfile(BaseModel): # RBAC(登录/me 返回;update-profile 不重签时不返回权限明细) role: str = "opc_member" sub_role: str | None = None + # 账号类型(四种)与中文标签 —— 前端直接渲染文本,不做代码映射 + account_type: str = "service" + account_type_label: str = "服务方" org_id: str | None = None region_id: str | None = None permissions: list[str] = Field(default_factory=list) diff --git a/app/domain/account_types.py b/app/domain/account_types.py index 6d9c9d8..1eb78bd 100644 --- a/app/domain/account_types.py +++ b/app/domain/account_types.py @@ -14,7 +14,7 @@ """ from __future__ import annotations -ACCOUNT_TYPES = ("operator", "carrier", "opc", "service") +ACCOUNT_TYPES = ("operator", "carrier", "opc_member", "service") def account_type(role: str | None) -> str: @@ -25,17 +25,22 @@ def account_type(role: str | None) -> str: if r in ("carrier", "park", "park_staff", "carrier_staff"): return "carrier" if r in ("opc_member", "opc", "opc_certified", "opc_independent"): - return "opc" - # provider / enterprise / government / investor / ... 全部归 服务方 + return "opc_member" + # provider / enterprise / government / investor / developer / ... 全部归 服务方 return "service" def permission_role(atype: str) -> str: - """账号类型 → 用于查权限表( roles/ )的角色码。service 用 provider 基座。""" + """账号类型 → 用于查权限表( roles/ )的角色码。 + + 四种类型各自对应一个已种子的权限角色: + operator→operator, carrier→carrier, opc_member→opc_member, + service→provider(服务方基座权限, 后期扩 服务商/甲方企业 可在其上叠加)。 + """ return { "operator": "operator", "carrier": "carrier", - "opc": "opc_member", + "opc_member": "opc_member", "service": "provider", }.get(atype, "provider") @@ -45,6 +50,6 @@ def label(atype: str) -> str: return { "operator": "运营方", "carrier": "载体方", - "opc": "OPC", + "opc_member": "OPC", "service": "服务方", }.get(atype, "服务方") diff --git a/app/infrastructure/repositories.py b/app/infrastructure/repositories.py index 6432ceb..e9eb308 100644 --- a/app/infrastructure/repositories.py +++ b/app/infrastructure/repositories.py @@ -14,6 +14,7 @@ from sqlalchemy import delete, func, select, update from sqlalchemy.ext.asyncio import AsyncSession from .. import config +from ..domain.account_types import account_type as _acct_type, label as _acct_label from .models import ( Agent, AuditLog, @@ -583,7 +584,10 @@ class UserRepository: profile["status"] = user.get("opc_status", "") profile["topics"] = _parse_topics(user.get("topics", "")) profile["role"] = user.get("role", "opc_member") - profile["sub_role"] = user.get("sub_role") + profile["sub_role"] = None # 子角色已停用 + atype = user.get("account_type") or _acct_type(user.get("role")) + profile["account_type"] = atype + profile["account_type_label"] = user.get("account_type_label") or _acct_label(atype) profile["org_id"] = user.get("org_id") profile["region_id"] = user.get("region_id") profile["permissions"] = user.get("permissions", [])