import type { EventValueUnit } from "@/types/EventItem"; import type { PointRuleTierForm } from "@/types/Point"; import { formatCentValue, resolveCentValue } from "@/utils/eventValue"; export function resolveNonNegativeInteger(value: string): number | undefined { if (!value.trim()) { return undefined; } const numberValue = Number(value); return Number.isSafeInteger(numberValue) && !(numberValue < 0) ? numberValue : undefined; } /** * 按来源事件的存储单位解析分档边界。 * CENT 的表单值使用元,解析结果使用分;COUNT 直接使用整数次数。 */ export function resolveTierBoundaryValue(value: string, valueUnit?: EventValueUnit | null): number | undefined { return valueUnit === "CENT" ? resolveCentValue(value.trim()) : resolveNonNegativeInteger(value); } /** * 按来源事件的展示单位格式化分档边界。 */ export function formatTierBoundaryValue(value: number, valueUnit?: EventValueUnit | null): string { return valueUnit === "CENT" ? formatCentValue(value) : String(value); } export function getTierMinValue(tierList: PointRuleTierForm[], index: number, valueUnit?: EventValueUnit | null): number | undefined { if (index < 1) { return resolveTierBoundaryValue(tierList[0]?.minText || "", valueUnit); } const previousMax = resolveTierBoundaryValue(tierList[index - 1]?.maxText || "", valueUnit); if (previousMax === undefined || !Number.isSafeInteger(previousMax + 1)) { return undefined; } return previousMax + 1; } export function getTierMinText(tierList: PointRuleTierForm[], index: number, valueUnit?: EventValueUnit | null): string { const min = getTierMinValue(tierList, index, valueUnit); return min === undefined ? "待填写" : formatTierBoundaryValue(min, valueUnit); } export function isLastTier(tierList: PointRuleTierForm[], index: number): boolean { return index === tierList.length - 1; }