[st] - 입력단 메뉴 작업중
This commit is contained in:
@@ -43,6 +43,65 @@ export function createAvgValueCallback(fieldNames: string[]): DataFieldValueCall
|
||||
};
|
||||
}
|
||||
|
||||
function sumFieldValues(
|
||||
fields: string[],
|
||||
fieldNamesArr: string[],
|
||||
values: unknown[],
|
||||
): number {
|
||||
let sum = 0;
|
||||
for (const f of fields) {
|
||||
const idx = fieldNamesArr.indexOf(f);
|
||||
if (idx >= 0) sum += toNum(values[idx]);
|
||||
}
|
||||
return sum;
|
||||
}
|
||||
|
||||
/** halfSumOfSums 한 건 — (sum(first) + sum(second)) / 2, 소수 내림 */
|
||||
function computeHalfSumOfSums(
|
||||
firstSumFields: string[],
|
||||
secondSumFields: string[],
|
||||
fieldNamesArr: string[],
|
||||
values: unknown[],
|
||||
): number {
|
||||
const firstSum = sumFieldValues(firstSumFields, fieldNamesArr, values);
|
||||
const secondSum = sumFieldValues(secondSumFields, fieldNamesArr, values);
|
||||
return Math.floor((firstSum + secondSum) / 2);
|
||||
}
|
||||
|
||||
export type HalfSumOfSumsGroup = {
|
||||
firstSumFields: string[];
|
||||
secondSumFields: string[];
|
||||
};
|
||||
|
||||
/** 두 그룹 합계의 평균 — (sum(first) + sum(second)) / 2 */
|
||||
export function createHalfSumOfSumsValueCallback(
|
||||
firstSumFields: string[],
|
||||
secondSumFields: string[],
|
||||
): DataFieldValueCallback {
|
||||
return (_prod, _dataRow, _fieldName, fieldNamesArr, values) =>
|
||||
computeHalfSumOfSums(firstSumFields, secondSumFields, fieldNamesArr, values);
|
||||
}
|
||||
|
||||
/** halfSumOfSums 2건의 합 — (B+C)/2 + (E+F)/2 */
|
||||
export function createSumOfTwoHalfSumOfSumsValueCallback(
|
||||
firstGroup: HalfSumOfSumsGroup,
|
||||
secondGroup: HalfSumOfSumsGroup,
|
||||
): DataFieldValueCallback {
|
||||
return (_prod, _dataRow, _fieldName, fieldNamesArr, values) =>
|
||||
computeHalfSumOfSums(
|
||||
firstGroup.firstSumFields,
|
||||
firstGroup.secondSumFields,
|
||||
fieldNamesArr,
|
||||
values,
|
||||
) +
|
||||
computeHalfSumOfSums(
|
||||
secondGroup.firstSumFields,
|
||||
secondGroup.secondSumFields,
|
||||
fieldNamesArr,
|
||||
values,
|
||||
);
|
||||
}
|
||||
|
||||
/** 차이값: fields[0] − fields[1] (예: 매설연장 − 철거연장) */
|
||||
export function createDifferenceValueCallback(fields: string[]): DataFieldValueCallback {
|
||||
const a = fields[0] ?? "";
|
||||
@@ -179,6 +238,21 @@ export function createSwrgInstlrtRateValueCallback(
|
||||
};
|
||||
}
|
||||
|
||||
/** 처리효율: (유입BOD − 방류BOD) / 유입BOD */
|
||||
export function createBodPrcsRtValueCallback(
|
||||
inflwField: string,
|
||||
dschgField: string,
|
||||
): DataFieldValueCallback {
|
||||
return (_prod, _dataRow, _fieldName, fieldNamesArr, values) => {
|
||||
const inflwIdx = fieldNamesArr.indexOf(inflwField);
|
||||
const dschgIdx = fieldNamesArr.indexOf(dschgField);
|
||||
const inflw = inflwIdx >= 0 ? toNum(values[inflwIdx]) : 0;
|
||||
const dschg = dschgIdx >= 0 ? toNum(values[dschgIdx]) : 0;
|
||||
if (inflw === 0) return 0;
|
||||
return (inflw - dschg) / inflw;
|
||||
};
|
||||
}
|
||||
|
||||
/** 총양수량: Σ(펌프대수 + 예비펌프대수) × 대당 양수량 */
|
||||
export function createPumpGrossPpqtyValueCallback(
|
||||
pumpGroups: Array<{
|
||||
@@ -202,6 +276,44 @@ export function createPumpGrossPpqtyValueCallback(
|
||||
};
|
||||
}
|
||||
|
||||
/** (a/b) / (c/d) × 100 — 각 quotient 분모 0이면 0 */
|
||||
export function createQuotientRatioPercentValueCallback(
|
||||
numeratorQuotient: [string, string],
|
||||
denominatorQuotient: [string, string],
|
||||
): DataFieldValueCallback {
|
||||
const [numField, numDenField] = numeratorQuotient;
|
||||
const [denNumField, denDenField] = denominatorQuotient;
|
||||
return (_prod, _dataRow, _fieldName, fieldNamesArr, values) => {
|
||||
const getVal = (field: string) => {
|
||||
const idx = fieldNamesArr.indexOf(field);
|
||||
return idx >= 0 ? toNum(values[idx]) : 0;
|
||||
};
|
||||
const numDen = getVal(numDenField);
|
||||
const denDen = getVal(denDenField);
|
||||
const denNum = getVal(denNumField);
|
||||
if (numDen === 0 || denDen === 0 || denNum === 0) return 0;
|
||||
const numerator = getVal(numField) / numDen;
|
||||
const denominator = denNum / denDen;
|
||||
if (denominator === 0) return 0;
|
||||
return (numerator / denominator) * 100;
|
||||
};
|
||||
}
|
||||
|
||||
/** 나눗셈: fields[0] / fields[1] (분모 0이면 0) */
|
||||
export function createQuotientValueCallback(fields: string[]): DataFieldValueCallback {
|
||||
const numeratorField = fields[0] ?? "";
|
||||
const denominatorField = fields[1] ?? "";
|
||||
return (_prod, _dataRow, _fieldName, fieldNamesArr, values) => {
|
||||
if (!numeratorField || !denominatorField) return 0;
|
||||
const numIdx = fieldNamesArr.indexOf(numeratorField);
|
||||
const denIdx = fieldNamesArr.indexOf(denominatorField);
|
||||
const numerator = numIdx >= 0 ? toNum(values[numIdx]) : 0;
|
||||
const denominator = denIdx >= 0 ? toNum(values[denIdx]) : 0;
|
||||
if (denominator === 0) return 0;
|
||||
return numerator / denominator;
|
||||
};
|
||||
}
|
||||
|
||||
/** 연산 타입에 맞는 valueCallback 반환 */
|
||||
export function getComputedValueCallback(config: ComputedFieldConfig): DataFieldValueCallback {
|
||||
switch (config.type) {
|
||||
@@ -213,11 +325,28 @@ export function getComputedValueCallback(config: ComputedFieldConfig): DataField
|
||||
return createMaxValueCallback(config.fields);
|
||||
case 'difference':
|
||||
return createDifferenceValueCallback(config.fields);
|
||||
case 'quotient':
|
||||
return createQuotientValueCallback(config.fields);
|
||||
case 'quotientRatioPercent':
|
||||
return createQuotientRatioPercentValueCallback(
|
||||
config.numeratorQuotient,
|
||||
config.denominatorQuotient,
|
||||
);
|
||||
case 'differenceOfSums':
|
||||
return createDifferenceOfSumsValueCallback(
|
||||
config.minuendFields,
|
||||
config.subtrahendFields,
|
||||
);
|
||||
case 'halfSumOfSums':
|
||||
return createHalfSumOfSumsValueCallback(
|
||||
config.firstSumFields,
|
||||
config.secondSumFields,
|
||||
);
|
||||
case 'sumOfTwoHalfSumOfSums':
|
||||
return createSumOfTwoHalfSumOfSumsValueCallback(
|
||||
config.firstHalfSum,
|
||||
config.secondHalfSum,
|
||||
);
|
||||
case 'maxOfFieldAndSum':
|
||||
return createMaxOfFieldAndSumValueCallback(
|
||||
config.baseField,
|
||||
@@ -234,5 +363,7 @@ export function getComputedValueCallback(config: ComputedFieldConfig): DataField
|
||||
return createSwrgInstlrtRateValueCallback(config.numeratorFields, config.denominatorFields, config.thirdFields);
|
||||
case 'pumpGrossPpqty':
|
||||
return createPumpGrossPpqtyValueCallback(config.pumpGroups);
|
||||
case 'bodPrcsRt':
|
||||
return createBodPrcsRtValueCallback(config.inflwField, config.dschgField);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user