[2311] 인증용량 CONN_VOL_W 재활성 + 안전조건 3종
- selectEstimateRoofCertVolKw: COALESCE(NULLIF(CONN_VOL_W,0), SUM(SPEC_X_QTY))
비0 저장값은 유닛별 접속용량으로 우선, NULL·0이면 위치기반 합으로 폴백.
기존 데이터·거짓0 저장 건 모두 롤백판과 동일하게 동작 보장.
- getPcsCircuitList: 빈 itemId 회로 아이템({}) 선제 제거.
단일 PCS+다회로를 [{PCS},{},{}]로 보낸 경우 단일 PCS 분기로 올바르게 진입.
- sumModuleSpecW: 모듈 W 합이 0이면 "0" 대신 null 반환.
CONN_VOL_W=0 저장(=거짓 0)을 원천 차단하여 쿼리 NULLIF 폴백이 동작하게 함.
Co-Authored-By: Claude Opus 4 <noreply@anthropic.com>
This commit is contained in:
parent
4765f533a9
commit
7f98473945
@ -2939,6 +2939,19 @@ public class EstimateService {
|
|||||||
return pcsItemList;
|
return pcsItemList;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 2026-07-07 안전조건: itemId 없는 빈 회로 아이템({}) 제거.
|
||||||
|
// 프론트가 단일 PCS 다회로를 [{PCS},{},{}] 형태(빈 placeholder 포함)로 보내면,
|
||||||
|
// 빈 항목이 ITEM_ID 없는 회로 행으로 저장되어 인증용량 쿼리의 PNOW_W 조회가 실패하고
|
||||||
|
// 그 회로에 배선된 모듈이 통째로 탈락(과소계산)한다. 유효 itemId 만 남겨,
|
||||||
|
// 남은 개수에 따라 아래 단일/다중 PCS 분기가 올바른 PCS 로 매칭되게 한다.
|
||||||
|
pcsItemList = pcsItemList.stream()
|
||||||
|
.filter(p -> !StringUtils.isEmpty(p.getItemId()))
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
|
||||||
|
if (pcsItemList.isEmpty()) {
|
||||||
|
return new ArrayList<ItemRequest>();
|
||||||
|
}
|
||||||
|
|
||||||
// circuit 괄호 제거 (예: "(1-1)" -> "1-1")
|
// circuit 괄호 제거 (예: "(1-1)" -> "1-1")
|
||||||
if (moduleList != null) {
|
if (moduleList != null) {
|
||||||
for (ItemRequest module : moduleList) {
|
for (ItemRequest module : moduleList) {
|
||||||
@ -3063,6 +3076,13 @@ public class EstimateService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// 2026-07-07 안전조건: 합이 0(모듈 spec 이 전부 비었거나 비숫자)이면 거짓 0 대신 null 반환.
|
||||||
|
// CONN_VOL_W=0 은 인증용량 쿼리에서 MIN(0, PNOW_W)=0 으로 그 유닛 모듈을 통째로 탈락시킨다.
|
||||||
|
// null 로 남겨 쿼리 폴백(위치기반 POS_W)이 동작하게 하고, 거짓 0 저장을 원천 차단한다.
|
||||||
|
// CONN_VOL_W 는 정의상 그 유닛 모듈 W 합(=モジュール容量)과 같아야 하며 0 은 비정상값이다.
|
||||||
|
if (sum.compareTo(java.math.BigDecimal.ZERO) == 0) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
return sum.toPlainString();
|
return sum.toPlainString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -407,6 +407,7 @@
|
|||||||
SELECT
|
SELECT
|
||||||
cie.CIRCUIT_NO, cie.OBJECT_NO, cie.PLAN_NO,
|
cie.CIRCUIT_NO, cie.OBJECT_NO, cie.PLAN_NO,
|
||||||
cie.ITEM_ID AS CIRCUIT_ITEM_ID, cie.CIRCUIT_CFG,
|
cie.ITEM_ID AS CIRCUIT_ITEM_ID, cie.CIRCUIT_CFG,
|
||||||
|
cie.CONN_VOL_W, -- 2026-07-07: 저장 시점 유닛별 접속용량(W). 비NULL·비0 이면 위치기반 합보다 우선(동일 PCS 모델 다중 유닛 대응). NULL·0 이면 위치기반 폴백
|
||||||
(SELECT SUM(CAST(LTRIM(RTRIM(x.X.value('.','VARCHAR(10)'))) AS INT))
|
(SELECT SUM(CAST(LTRIM(RTRIM(x.X.value('.','VARCHAR(10)'))) AS INT))
|
||||||
FROM (SELECT CAST('<X>'+REPLACE(cie.CIRCUIT_CFG,',','</X><X>')+'</X>' AS XML) AS d) t
|
FROM (SELECT CAST('<X>'+REPLACE(cie.CIRCUIT_CFG,',','</X><X>')+'</X>' AS XML) AS d) t
|
||||||
CROSS APPLY t.d.nodes('/X') AS x(X)
|
CROSS APPLY t.d.nodes('/X') AS x(X)
|
||||||
@ -441,7 +442,7 @@
|
|||||||
),
|
),
|
||||||
ALLOC AS (
|
ALLOC AS (
|
||||||
SELECT
|
SELECT
|
||||||
cc.CIRCUIT_NO, cc.CIRCUIT_ITEM_ID, cc.CIRCUIT_CFG, cc.CIRCUIT_SUM,
|
cc.CIRCUIT_NO, cc.CIRCUIT_ITEM_ID, cc.CIRCUIT_CFG, cc.CIRCUIT_SUM, cc.CONN_VOL_W,
|
||||||
rc.ROOF_ITEM_NO, rc.ROOF_ITEM_ID, rc.SPEC, rc.PC_ITEM_ID,
|
rc.ROOF_ITEM_NO, rc.ROOF_ITEM_ID, rc.SPEC, rc.PC_ITEM_ID,
|
||||||
-- 할당량 = MIN(끝,끝) - MAX(시작,시작)
|
-- 할당량 = MIN(끝,끝) - MAX(시작,시작)
|
||||||
CASE WHEN cc.CUM_END < rc.CUM_END THEN cc.CUM_END ELSE rc.CUM_END END
|
CASE WHEN cc.CUM_END < rc.CUM_END THEN cc.CUM_END ELSE rc.CUM_END END
|
||||||
@ -452,23 +453,25 @@
|
|||||||
),
|
),
|
||||||
DETAIL AS (
|
DETAIL AS (
|
||||||
SELECT
|
SELECT
|
||||||
a.CIRCUIT_NO, a.CIRCUIT_ITEM_ID, a.CIRCUIT_CFG, a.CIRCUIT_SUM,
|
a.CIRCUIT_NO, a.CIRCUIT_ITEM_ID, a.CIRCUIT_CFG, a.CIRCUIT_SUM, a.CONN_VOL_W,
|
||||||
a.ROOF_ITEM_NO, a.ROOF_ITEM_ID, a.ALLOCATED_QTY,
|
a.ROOF_ITEM_NO, a.ROOF_ITEM_ID, a.ALLOCATED_QTY,
|
||||||
ROUND(a.SPEC, 3) * a.ALLOCATED_QTY AS SPEC_X_QTY,
|
ROUND(a.SPEC, 3) * a.ALLOCATED_QTY AS SPEC_X_QTY,
|
||||||
(SELECT mi.PNOW_W FROM M_ITEM mi WHERE mi.ITEM_ID = a.CIRCUIT_ITEM_ID) AS PNOW_W
|
(SELECT mi.PNOW_W FROM M_ITEM mi WHERE mi.ITEM_ID = a.CIRCUIT_ITEM_ID) AS PNOW_W
|
||||||
FROM ALLOC a
|
FROM ALLOC a
|
||||||
),
|
),
|
||||||
CIRCUIT_AGG AS (
|
CIRCUIT_AGG AS (
|
||||||
|
-- 2026-07-07: 회로(유닛)별 접속용량 CONN_W 결정 —
|
||||||
|
-- NULLIF(CONN_VOL_W,0) 으로 저장값이 비0 일 때만 채택, NULL·0 이면 위치기반 합(SUM(SPEC_X_QTY))으로 폴백.
|
||||||
|
-- → 신규/재저장 건은 정확한 유닛별 접속용량, 기존·거짓0 데이터는 롤백판(위치기반)과 동일 동작.
|
||||||
SELECT
|
SELECT
|
||||||
CIRCUIT_NO, CIRCUIT_ITEM_ID, CIRCUIT_CFG, CIRCUIT_SUM,
|
CIRCUIT_NO, CIRCUIT_ITEM_ID, CIRCUIT_CFG, CIRCUIT_SUM, PNOW_W,
|
||||||
SUM(SPEC_X_QTY) AS SUM_SPEC_X_QTY, PNOW_W,
|
COALESCE(NULLIF(CONN_VOL_W, 0), SUM(SPEC_X_QTY)) AS CONN_W
|
||||||
CASE WHEN SUM(SPEC_X_QTY) <= PNOW_W THEN SUM(SPEC_X_QTY) ELSE PNOW_W END AS MIN_VALUE
|
|
||||||
FROM DETAIL
|
FROM DETAIL
|
||||||
GROUP BY CIRCUIT_NO, CIRCUIT_ITEM_ID, CIRCUIT_CFG, CIRCUIT_SUM, PNOW_W
|
GROUP BY CIRCUIT_NO, CIRCUIT_ITEM_ID, CIRCUIT_CFG, CIRCUIT_SUM, PNOW_W, CONN_VOL_W
|
||||||
)
|
)
|
||||||
|
|
||||||
-- 2026-06-05: SQL 은 W 합만 DECIMAL 로 정확히 반환. kW 변환·3자리 절사(FLOOR)는 모듈용량(totVolKw)과 동일하게 Java BigDecimal 에서 수행 → FLOAT 나눗셈 잔여(5.6899999999999995 / 5.339) 원천 차단
|
-- 2026-06-05: SQL 은 W 합만 DECIMAL 로 정확히 반환. kW 변환·3자리 절사(FLOOR)는 모듈용량(totVolKw)과 동일하게 Java BigDecimal 에서 수행 → FLOAT 나눗셈 잔여(5.6899999999999995 / 5.339) 원천 차단
|
||||||
SELECT CAST(SUM(MIN_VALUE) AS DECIMAL(18,3)) AS CERT_VOL_W
|
SELECT CAST(SUM(CASE WHEN CONN_W <= PNOW_W THEN CONN_W ELSE PNOW_W END) AS DECIMAL(18,3)) AS CERT_VOL_W
|
||||||
FROM CIRCUIT_AGG
|
FROM CIRCUIT_AGG
|
||||||
|
|
||||||
]]>
|
]]>
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user