Commit fa71191b by luoqi

chore(web): 模拟登录对齐集团模型(品牌 vs 租户正名)

ruier/ruitai 注明为**品牌(source_unit)**,同属集团租户 ruier-grp;
类型 TenantSlug→BrandSlug。功能不变(slug 经后端 MOCK_PRESETS 映射为
tenantId=ruier-grp + sourceUnit)。正式 SSO 对外契约(host_id+group_id+
org_scope)待 host 接入时实现。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
parent df2271eb
......@@ -24,11 +24,17 @@ import { cn } from '@/lib/utils';
* 降级路径(名册拉不到 / mock 关闭):回退到通用网格(2 brand × 3 role 预制身份),保证永远能登录。
*
* 不可关闭(open=true 强制保持):未鉴权用户**必须选一个身份**才能进列表页。
*
* 集团模型(2026-06):ruier/ruitai 是**品牌(source_unit)**,同属一个集团租户 `ruier-grp`。
* 登录发的 slug 仍叫 `tenant`(后端 mock API 历史字段名),后端 MOCK_PRESETS 映射为
* { tenantId: 'ruier-grp', sourceUnit: '瑞尔'|'瑞泰', clinics, role }。
* 正式 SSO 对外契约(host_id + group_id + user + org_scope)待 host 接入时实现。
*/
type TenantSlug = 'ruier' | 'ruitai';
// 品牌 slug(= source_unit);同属集团 ruier-grp。API 字段名仍叫 tenant(后端契约,未改)。
type BrandSlug = 'ruier' | 'ruitai';
const TENANTS: { slug: TenantSlug; nameZh: string; tone: string }[] = [
const TENANTS: { slug: BrandSlug; nameZh: string; tone: string }[] = [
{ slug: 'ruier', nameZh: '瑞尔', tone: 'border-teal-200 bg-teal-50/40' },
{ slug: 'ruitai', nameZh: '瑞泰', tone: 'border-sky-200 bg-sky-50/40' },
];
......@@ -40,7 +46,7 @@ const ROLES: { key: UserRole; nameZh: string; desc: string }[] = [
];
// 降级网格的演示人名(需与后端 auth.service.MOCK_NAMES 一致)— 话术自报家门会用到
const MOCK_NAMES: Record<TenantSlug, Record<UserRole, string>> = {
const MOCK_NAMES: Record<BrandSlug, Record<UserRole, string>> = {
ruier: { staff: '小王', leader: '李莉', admin: '张敏' },
ruitai: { staff: '小陈', leader: '周琳', admin: '刘洋' },
};
......@@ -54,7 +60,7 @@ export function MockLoginDialog({ open }: { open: boolean }) {
const [busy, setBusy] = useState<string | null>(null);
const [csUsers, setCsUsers] = useState<MockUser[]>([]);
const [role, setRole] = useState<UserRole>('staff'); // 登录用的 RBAC 权限(默认员工)
const [tenantFilter, setTenantFilter] = useState<'all' | TenantSlug>('all');
const [tenantFilter, setTenantFilter] = useState<'all' | BrandSlug>('all');
const [query, setQuery] = useState('');
useEffect(() => {
......@@ -83,7 +89,7 @@ export function MockLoginDialog({ open }: { open: boolean }) {
};
// 降级路径:通用预制身份(无名册时)
const pickGeneric = async (tenant: TenantSlug, roleKey: UserRole) => {
const pickGeneric = async (tenant: BrandSlug, roleKey: UserRole) => {
const key = `${tenant}:${roleKey}`;
if (busy) return;
setBusy(key);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment