Compare commits

...

7 Commits

6 changed files with 35 additions and 9 deletions

View File

@ -6,6 +6,7 @@ import com.interplug.qcast.biz.displayItem.dto.BomSyncResponse;
import com.interplug.qcast.util.InterfaceQsp; import com.interplug.qcast.util.InterfaceQsp;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.Comparator;
import java.util.List; import java.util.List;
import org.springframework.batch.core.Job; import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobExecutionListener; import org.springframework.batch.core.JobExecutionListener;
@ -62,9 +63,16 @@ public class BomConfiguration implements JobExecutionListener {
this.bomSyncList = this.bomSyncList =
interfaceQsp.callApiData( interfaceQsp.callApiData(
HttpMethod.GET, qspInterfaceUrl, null, new TypeReference<List<BomSyncResponse>>() {}); HttpMethod.GET, qspInterfaceUrl, null, new TypeReference<List<BomSyncResponse>>() {});
return (bomSyncList != null) if (bomSyncList == null) {
? new ListItemReader<>(bomSyncList) return new ListItemReader<>(Collections.emptyList());
: new ListItemReader<>(Collections.emptyList()); }
// 2026-05-20 청크 경계에서 같은 A/D 분리되어 A 먼저 MERGE
// 다음 청크의 D 그것을 삭제해버리는 리스크를 차단하기 위해,
// 전체 리스트를 statCd='D' 우선으로 정렬한다. (Spring Batch 청크를 순차 처리하므로
// 모든 D 청크가 끝난 뒤에 A/U 청크가 시작되어 전역적으로 'A 이김' 보장됨)
bomSyncList.sort(
Comparator.comparingInt((BomSyncResponse b) -> "D".equals(b.getStatCd()) ? 0 : 1));
return new ListItemReader<>(bomSyncList);
} }
@Bean @Bean

View File

@ -1916,17 +1916,29 @@ public class EstimateService {
// schDrawingFlg / schWeightFlg(위쪽 분기) 선택된 부속 시트 // schDrawingFlg / schWeightFlg(위쪽 분기) 선택된 부속 시트
// (割付図系統図 / 架台図 / 発電シミュレーション / 重量算出シート ) 그대로 유지한다. // (割付図系統図 / 架台図 / 発電シミュレーション / 重量算出シート ) 그대로 유지한다.
if ("EXCEL2".equals(estimateRequest.getSchDownload())) { if ("EXCEL2".equals(estimateRequest.getSchDownload())) {
// 旧見積書書式: 양식 견적서 시트(見積書) 제거 , 양식(見積書.) 앞으로 이동 // 旧見積書書式: 양식 견적서 시트(見積書) 제거 , 양식(御見積書) 앞으로 이동
// 2026-06-01 시트명 변경: 見積書. 御見積書
safeRemoveSheet(workbook, "見積書"); safeRemoveSheet(workbook, "見積書");
if (workbook.getSheetIndex("見積書.") > 0) { if (workbook.getSheetIndex("見積書") > 0) {
workbook.setSheetOrder("見積書.", 0); workbook.setSheetOrder("見積書", 0);
} }
} else { } else {
// (통상) 견적서 양식: 양식 견적서 시트(見積書.) 제거 // (통상) 견적서 양식: 양식 견적서 시트(見積書) 제거
safeRemoveSheet(workbook, "見積書."); safeRemoveSheet(workbook, "見積書");
} }
safeRemoveSheet(workbook, "特異事項"); safeRemoveSheet(workbook, "特異事項");
// 2026-06-04 시트 제거/정렬 활성 시트가 시트가 아니게 되는 문제 보정
// 템플릿 시트(見積書) tabSelected 걸려 있어, EXCEL2 에서 해당 시트 제거
// 선택 상태가 사라져 다운로드 결과가 번째 시트부터 열림 시트로 강제 고정
if (workbook.getNumberOfSheets() > 0) {
for (int i = 0; i < workbook.getNumberOfSheets(); i++) {
workbook.getSheetAt(i).setSelected(false);
}
workbook.setActiveSheet(0);
workbook.getSheetAt(0).setSelected(true);
}
applyExcelNumberFormat(workbook); applyExcelNumberFormat(workbook);
// applyExcelFixedNumberFormat(workbook, Arrays.asList("H25", "C12"), "#,##0.00"); // applyExcelFixedNumberFormat(workbook, Arrays.asList("H25", "C12"), "#,##0.00");
// applyExcelFixedNumberFormat(workbook, Arrays.asList("X32", "I44"), "#,##0.00"); // applyExcelFixedNumberFormat(workbook, Arrays.asList("X32", "I44"), "#,##0.00");

View File

@ -197,6 +197,9 @@ public class EstimateResponse {
@Schema(description = "지역명") @Schema(description = "지역명")
private String areaName; private String areaName;
@Schema(description = "계약조건")
private String conType;
@Schema(description = "물건정보 비고") @Schema(description = "물건정보 비고")
private String objectRemarks; private String objectRemarks;

View File

@ -64,6 +64,7 @@
, B.SALE_STORE_ID AS SAP_SALE_STORE_ID , B.SALE_STORE_ID AS SAP_SALE_STORE_ID
, B.SAP_SALES_STORE_CD , B.SAP_SALES_STORE_CD
, OI.AREA_ID , OI.AREA_ID
, OI.CON_TYPE
, ISNULL(OI.COLD_REGION_FLG, '0') AS COLD_REGION_FLG , ISNULL(OI.COLD_REGION_FLG, '0') AS COLD_REGION_FLG
, ISNULL(OI.SALT_AREA_FLG, '0') AS SALT_AREA_FLG , ISNULL(OI.SALT_AREA_FLG, '0') AS SALT_AREA_FLG
, SS.FIRST_AGENT_ID , SS.FIRST_AGENT_ID
@ -466,7 +467,9 @@
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
) )
SELECT ROUND((SUM(MIN_VALUE) / 1000), 4) AS CERT_VOL_KW -- 2026-05-22: FLOAT ROUND 결과의 IEEE754 잔여(예: 5.5600000000000005) 차단 위해 DECIMAL 캐스팅
-- 2026-06-02: モジュール容量(totVolKw, setScale(3,FLOOR))과 동일 표시 위해 3자리 절사 + DECIMAL(18,3) 마감 (ROUND 3번째 인자=1 → 절사)
SELECT CAST(ROUND((SUM(MIN_VALUE) / 1000), 3, 1) AS DECIMAL(18,3)) AS CERT_VOL_KW
FROM CIRCUIT_AGG FROM CIRCUIT_AGG
]]> ]]>