const FORMAL_AUTH_DATE = '2099-09-09'; const TRIAL_AUTHORIZATION_TEXT = '试用'; const FORMAL_AUTHORIZATION_TEXT = ''; function normalizeDateValue(value: unknown) { return String(value ?? '').trim(); } function normalizeFieldKey(value: string) { return value.replace(/[^a-zA-Z0-9]/g, '').toLowerCase(); } function resolveAuthorizationSource(source?: unknown) { const raw = source && typeof source === 'object' ? (source as Record) : null; const rawData = raw?.data; const data = rawData && typeof rawData === 'object' ? (rawData as Record) : null; return { raw, rawData, data, }; } function getAuthorizationField(source: Record | null, keys: string[]) { if (!source) return ''; const matchedKey = keys.find((key) => Object.prototype.hasOwnProperty.call(source, key)); if (matchedKey) { return normalizeDateValue(source[matchedKey]); } const matchedNormalizedKey = Object.keys(source).find((key) => keys.some((item) => normalizeFieldKey(item) === normalizeFieldKey(key)), ); return matchedNormalizedKey ? normalizeDateValue(source[matchedNormalizedKey]) : ''; } function getAuthorizationValue(source: unknown, keys: string[]) { const { raw, data } = resolveAuthorizationSource(source); return getAuthorizationField(data, keys) || getAuthorizationField(raw, keys); } function getOverDateTimeValue(source?: unknown) { return getAuthorizationValue(source, ['overDateTime', 'overdatetime']); } function toDateNumber(value: string | undefined, fallback: number) { const parsed = Number(value); return Number.isFinite(parsed) ? parsed : fallback; } export function getAuthorizationExpirationTime(overDateTime?: unknown) { const normalized = normalizeDateValue(overDateTime); if (!normalized || isFormalAuthorization(normalized)) return null; const normalizedDate = normalized.replace(/\//g, '-'); const timezoneMatched = /(?:z|[+-]\d{2}:?\d{2})$/i.test(normalizedDate); if (timezoneMatched) { const timestamp = new Date(normalizedDate.replace(' ', 'T')).getTime(); return Number.isFinite(timestamp) ? timestamp : null; } const matched = normalizedDate.match(/^(\d{4})-(\d{1,2})-(\d{1,2})(?:[ T](\d{1,2}):(\d{1,2})(?::(\d{1,2}))?)?/); if (!matched) return null; const [, year, month, day, hour, minute, second] = matched; const isDateOnly = hour === undefined; const date = new Date( toDateNumber(year, 0), toDateNumber(month, 1) - 1, toDateNumber(day, 1), isDateOnly ? 23 : toDateNumber(hour, 0), isDateOnly ? 59 : toDateNumber(minute, 0), isDateOnly ? 59 : toDateNumber(second, 0), isDateOnly ? 999 : 0, ); const timestamp = date.getTime(); return Number.isFinite(timestamp) ? timestamp : null; } export function isAuthorizationExpired(overDateTime?: unknown, now: Date = new Date()) { const expirationTime = getAuthorizationExpirationTime(overDateTime); return expirationTime !== null && expirationTime < now.getTime(); } export function getAuthorizationExpiredMessage(overDateTime?: unknown) { const normalized = normalizeDateValue(overDateTime); return normalized ? `当前授权已于 ${normalized} 过期,请重新导入有效授权文件或联系管理员。` : '当前授权已过期,请重新导入有效授权文件或联系管理员。'; } export function isFormalAuthorization(overDateTime?: unknown) { const normalized = normalizeDateValue(overDateTime); return normalized.startsWith(FORMAL_AUTH_DATE); } export function getAuthorizationStatus(overDateTime?: unknown) { return isFormalAuthorization(overDateTime) ? 'formal' : 'trial'; } export function getAuthorizationLabel(overDateTime?: unknown) { const normalized = normalizeDateValue(overDateTime); if (!normalized) return ''; return isFormalAuthorization(normalized) ? FORMAL_AUTHORIZATION_TEXT : TRIAL_AUTHORIZATION_TEXT; } export function isTrialAuthorizationLabel(label?: unknown) { return normalizeDateValue(label).includes('试用'); } export function extractAuthorizationCache(source?: unknown) { const { rawData, data } = resolveAuthorizationSource(source); const overDateTime = getOverDateTimeValue(source); const authorizationUnit = getAuthorizationValue(source, ['unit']); const authorizationLabel = (typeof rawData === 'string' ? normalizeDateValue(rawData) : '') || normalizeDateValue(data?.authorizationLabel || data?.authorizationStatus || data?.authStatus || data?.message) || getAuthorizationLabel(overDateTime); return { authorizationLabel, overDateTime, authorizationUnit, }; }