import PointAPI from "@/api/PointAPI"; import type { PointRule } from "@/types/Point"; /** * 查询一组事件可用的自定义积分范围,并返回所有规则范围的交集。 * * @param eventIdList 事件 ID 列表 * @returns 可用范围;没有完整有效的 SOURCE_VALUE 规则时返回 undefined */ export async function loadSourceValueRange(eventIdList: string[]): Promise<[number, number] | undefined> { if (!eventIdList.length) { return undefined; } const resultList = await Promise.all(eventIdList.map(eventId => PointAPI.ruleList({ index: 0, size: 1000, equalsExample: { eventId, status: "ACTIVE" } }))); const ruleList = resultList .flatMap(result => result.list || []) .filter(isSourceValueRule); if (!ruleList.length) { return undefined; } const rangeList = ruleList .map(rule => ({ min: rule.conditionJson?.min, max: rule.conditionJson?.max })) .filter((range): range is { min: number; max: number } => ( range.min !== undefined && range.max !== undefined && Number.isSafeInteger(range.min) && Number.isSafeInteger(range.max) && 0 < range.min && 0 < range.max )); if (rangeList.length !== ruleList.length) { return undefined; } const min = Math.max(...rangeList.map(range => range.min), 1); const max = Math.min(...rangeList.map(range => range.max)); return min <= max ? [min, max] : undefined; } function isSourceValueRule(rule: PointRule): boolean { return rule.status === "ACTIVE" && rule.triggerType === "SOURCE_VALUE" && rule.pointMode === "SOURCE_VALUE"; }