feat(aihr): add tenant organization governance

This commit is contained in:
2026-07-23 15:58:38 +08:00
parent 6a90fd977c
commit 06322c994b
20 changed files with 1619 additions and 3 deletions
@@ -0,0 +1,101 @@
import request from '@/utils/request';
type ApiResult<T> = {
code: number;
msg: string;
data: T;
};
export type OrgDirectoryNode = {
externalId: string;
parentExternalId?: string;
nodeType: 'GROUP' | 'COMPANY' | 'PROJECT' | 'DEPARTMENT';
name: string;
bindable: boolean;
children: OrgDirectoryNode[];
};
export type OrgDirectoryTree = {
sourceCode: string;
directoryVersion: string;
nodeCount: number;
roots: OrgDirectoryNode[];
};
export type TenantOrgBinding = {
id?: number;
tenantId: string;
tenantName: string;
sourceCode?: string;
rootExternalId?: string;
rootName?: string;
rootNodeType?: string;
mode?: 'EXCLUSIVE' | 'AGGREGATE_ONLY';
status: 'UNBOUND' | 'DRAFT' | 'ACTIVE' | 'DISABLED';
directoryVersion?: string;
lastSyncAt?: string;
};
export type TenantOrgBindingOverview = {
activeTenantCount: number;
boundTenantCount: number;
pendingTenantCount: number;
conflictCount: number;
bindings: TenantOrgBinding[];
};
export type TenantOrgBindingRequest = {
tenantId?: string;
rootExternalId?: string;
mode?: 'EXCLUSIVE' | 'AGGREGATE_ONLY';
status?: 'DRAFT' | 'ACTIVE' | 'DISABLED';
};
export type ScopeConflict = {
tenantId: string;
tenantName: string;
rootExternalId: string;
rootName: string;
reason: string;
};
export type BindingPrecheck = {
canActivate: boolean;
rootName: string;
rootNodeType: string;
conflicts: ScopeConflict[];
};
export type AggregateView = {
bindingId: number;
coveredTenantCount: number;
syncedPersonCount: number;
};
export function getOrgDirectoryTree(): Promise<ApiResult<OrgDirectoryTree>> {
return request({ url: '/api/aihr/platform/org-directory/tree', method: 'get' });
}
export function refreshOrgDirectory(): Promise<ApiResult<{ sourceCode: string; directoryVersion: string; nodeCount: number; warnings: string[] }>> {
return request({ url: '/api/aihr/platform/org-directory/refresh', method: 'post', headers: { repeatSubmit: false } });
}
export function listTenantOrgBindings(): Promise<ApiResult<TenantOrgBindingOverview>> {
return request({ url: '/api/aihr/platform/tenant-org-bindings', method: 'get' });
}
export function precheckTenantOrgBinding(data: TenantOrgBindingRequest): Promise<ApiResult<BindingPrecheck>> {
return request({ url: '/api/aihr/platform/tenant-org-bindings/precheck', method: 'post', data, headers: { repeatSubmit: false } });
}
export function createTenantOrgBinding(data: TenantOrgBindingRequest): Promise<ApiResult<TenantOrgBinding>> {
return request({ url: '/api/aihr/platform/tenant-org-bindings', method: 'post', data, headers: { repeatSubmit: false } });
}
export function updateTenantOrgBinding(id: number, data: TenantOrgBindingRequest): Promise<ApiResult<TenantOrgBinding>> {
return request({ url: `/api/aihr/platform/tenant-org-bindings/${id}`, method: 'patch', data, headers: { repeatSubmit: false } });
}
export function getTenantOrgAggregate(id: number): Promise<ApiResult<AggregateView>> {
return request({ url: `/api/aihr/platform/tenant-org-bindings/${id}/aggregate`, method: 'get' });
}