Files
gao-customer-h5/src/utils/point.ts
T
2026-08-11 22:25:30 +08:00

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";
}