import { getStoreData, setStoreData } from '@/utils/composition';
import { getGenericInfo } from '@/services/header/header.service';
import { RouterChangeReason } from '@/model/base-enum';
import { getRandomNumber } from '@/utils/utils';
import type { LocationQuery, RouteLocationNormalized } from 'vue-router';
* SystemIds 工具函数
*
* 提供systemId相关的公共逻辑,包括:
* 1. 获取有效的SystemIds数据
* 2. 验证systemId参数的有效性
* 3. 生成修正后的查询参数
* 4. 判断是否为多主机环境
*/
* 获取有效的SystemIds数据
*
* 优先使用store中的数据,如果没有则通过API获取
* 用于验证路由参数和配置多主机环境
*
* @returns Promise<number[]> - 返回有效的SystemIds数组
*/
export async function getValidSystemIds(): Promise<number[]> {
const storeSystemIds = getStoreData('loct', 'systemIds');
if (Array.isArray(storeSystemIds) && storeSystemIds.length > 0) {
return storeSystemIds;
}
try {
let apiSystemIds: number[] = [];
const res = await getGenericInfo();
apiSystemIds = res.SystemIds || [];
if (apiSystemIds.length > 0) {
setStoreData('loct', 'systemIds', apiSystemIds);
}
return apiSystemIds;
} catch (error) {
return [];
}
}
* 验证systemId参数并生成修正后的查询参数
*
* 根据SystemIds数据验证当前查询参数中的systemId是否有效
* 并返回修正后的查询参数对象
*
* @param currentQuery - 当前查询参数
* @param systemIds - 有效的SystemIds数组
* @returns 修正后的查询参数对象
*/
export function validateSystemIdQuery(
currentQuery: LocationQuery,
systemIds: number[]
): LocationQuery {
if (systemIds.length === 2) {
const routeSystemId = currentQuery.systemId;
if (routeSystemId && systemIds.includes(Number(routeSystemId))) {
return { ...currentQuery };
} else {
const defaultSystemId = systemIds[0];
return {
...currentQuery,
systemId: `${defaultSystemId}`
};
}
} else {
if (currentQuery.systemId) {
const { systemId, ...cleanQuery } = currentQuery;
return cleanQuery;
} else {
return { ...currentQuery };
}
}
}
* 获取当前有效的systemId值
*
* 根据SystemIds数据和当前查询参数,返回应该使用的systemId值
*
* @param currentQuery - 当前查询参数
* @param systemIds - 有效的SystemIds数组
* @returns 返回应该使用的systemId值(字符串),如果是单主机则返回null
*/
export function getCurrentSystemId(currentQuery: LocationQuery, systemIds: number[]): string {
if (systemIds.length === 2) {
const routeSystemId = currentQuery.systemId;
if (routeSystemId && systemIds.includes(Number(routeSystemId))) {
return String(routeSystemId);
} else {
return String(systemIds[0]);
}
} else {
return '1';
}
}
* 判断是否为多主机环境
*
* @param systemIds - SystemIds数组
* @returns true表示多主机环境(双主机),false表示单主机环境
*/
export function isMultiHostEnvironment(systemIds: number[]): boolean {
return systemIds.length === 2;
}
* 触发路由错误事件
*
* 用于处理systemId验证失败等场景
*/
export function triggerRouteError(): void {
setStoreData('event', 'routeChangeError', RouterChangeReason.invalid + getRandomNumber());
}
* SystemIds验证结果类型
*/
export interface SystemIdsValidationResult {
isMultiHost: boolean;
currentSystemId: string | null;
validatedQuery: LocationQuery;
validSystemIds: number[];
}
* 完整的SystemIds验证和查询参数修正
*
* 整合所有验证逻辑,提供一站式的systemId验证服务
*
* @param route - 当前路由对象
* @returns Promise<SystemIdsValidationResult> - 验证结果
*/
export async function validateSystemIds(
route: RouteLocationNormalized
): Promise<SystemIdsValidationResult> {
const validSystemIds = await getValidSystemIds();
const validatedQuery = validateSystemIdQuery(route.query, validSystemIds);
const currentSystemId = getCurrentSystemId(route.query, validSystemIds);
const isMultiHost = isMultiHostEnvironment(validSystemIds);
return {
isMultiHost,
currentSystemId,
validatedQuery,
validSystemIds
};
}