52 lines
1.5 KiB
TypeScript
52 lines
1.5 KiB
TypeScript
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";
|
|
}
|