package your.package.name;
import java.io.File;
import java.io.FileOutputStream;
import java.util.*;
<생략>
@BxmBean
@Scope("ZC001007C01")
@BxmCategory(type = "Bean", logicalName = "고객정보 엑셀생성", description = "고객 보증정보를 엑셀로 추출")
public class ZC001007C01 implements
ItemReader<ZC001001C0307010>,
ItemProcessor<ZC001001C0307010, ZC001001C0307010>,
ItemWriter<ZC001001C0307010>,
ItemStream {
final Logger logger = LoggerFactory.getLogger(this.getClass());
private DACIT10001 dacCIT10001;
private Iterator<ZC001001C0307010> iterator;
private int fetchCnt = 0;
private int writeCnt = 0;
private int failCnt = 0;
private Workbook workbook;
private Sheet sheet;
private int rowNum = 0;
private static final String SAVE_DIR = "/Attach/epower/batch/BR/ZBK14910/";
@BeforeStep
public void beforeStep(StepExecution stepExecution) {
workbook = new SXSSFWorkbook(100);
sheet = workbook.createSheet("고객정보");
Row header = sheet.createRow(rowNum++);
header.createCell(0).setCellValue("계약번호");
header.createCell(1).setCellValue("보증시작일자");
header.createCell(2).setCellValue("보증종료일자");
header.createCell(3).setCellValue("보증상태코드");
header.createCell(4).setCellValue("최근연체종류코드");
header.createCell(5).setCellValue("보증사유코드");
header.createCell(6).setCellValue("보증설정금액");
header.createCell(7).setCellValue("고객이름");
header.createCell(8).setCellValue("지난2년간연체건수");
header.createCell(9).setCellValue("총공사비");
header.createCell(10).setCellValue("설계비");
header.createCell(11).setCellValue("차액");
}
@Override
public void open(ExecutionContext executionContext) throws ItemStreamException {
try {
dacCIT10001 = (DACIT10001) BatchApplicationContext.getBean(DACIT10001.class);
String includeBDATA2 = BatchApplicationContext.getJobParameters().getString("includeBDATA2");
List<ZC001001C0307010In> inputList;
if ("Y".equalsIgnoreCase(includeBDATA2)) {
inputList = dacCIT10001.selectCustomerNumbs_12();
} else {
inputList = dacCIT10001.selectCustomerNumbs_1();
}
if (inputList == null || inputList.isEmpty()) {
throw new ItemStreamException("BATH007 테이블에서 고객번호를 찾을 수 없습니다.");
}
List<ZC001001C0307010> flatList = new ArrayList<>();
for (ZC001001C0307010In input : inputList) {
try {
List<ZC001001C0307010> customerList = dacCIT10001.selectCustomerDetailList(input.getCtnrNo());
if (customerList != null && !customerList.isEmpty()) {
flatList.addAll(customerList);
fetchCnt += customerList.size();
} else {
failCnt++;
}
} catch (Exception e) {
failCnt++;
logger.error("고객 상세조회 실패: {}", input.getCtnrNo(), e);
}
}
iterator = flatList.iterator();
} catch (Exception e) {
throw new ItemStreamException("고객번호 조회 중 에러: " + e.getMessage(), e);
}
}
@Override
public ZC001001C0307010 read() {
return (iterator != null && iterator.hasNext()) ? iterator.next() : null;
}
@Override
public ZC001001C0307010 process(ZC001001C0307010 input) {
return input;
}
@Override
public void write(List<? extends ZC001001C0307010> items) {
for (ZC001001C0307010 item : items) {
if (item == null) continue;
Row row = sheet.createRow(rowNum++);
row.createCell(0).setCellValue(defaultString(item.getCntNo()));
row.createCell(1).setCellValue(defaultString(item.getWrntStYmd()));
row.createCell(2).setCellValue(defaultString(item.getWrntEndYmd()));
row.createCell(3).setCellValue(defaultString(item.getWrntStatCd()));
row.createCell(4).setCellValue(defaultString(item.getLstDlqKndCd()));
row.createCell(5).setCellValue(defaultString(item.getWrntRsnCd()));
// 6번: 보증설정금액 BigDecimal -> double
row.createCell(6).setCellValue(item.getSetWrntAmt().doubleValue());
row.createCell(7).setCellValue(defaultString(item.getCusName()));
// 8번: 지난2년간연체건수 BigDecimal -> double
row.createCell(8).setCellValue(item.getDlqCnt2Year().doubleValue());
// 총공사비, 설계비, 차액 조회 및 셀 추가
double totalConstruction = 0d;
double designCost = 0d;
try {
String totalConstructionStr = dacCIT10001.selectTotalConstructionCost(item.getCntNo());
String designCostStr = dacCIT10001.selectDesignCost(item.getCntNo());
totalConstruction = Double.parseDouble(totalConstructionStr);
designCost = Double.parseDouble(designCostStr);
} catch (Exception e) {
logger.error("총공사비/설계비 조회 실패 - 계약번호:{}: {}", item.getCntNo(), e.getMessage());
}
row.createCell(9).setCellValue(totalConstruction);
row.createCell(10).setCellValue(designCost);
row.createCell(11).setCellValue(totalConstruction - designCost);
writeCnt++;
}
}
@Override
public void update(ExecutionContext executionContext) {}
@Override
public void close() throws ItemStreamException {
try {
String timestamp = BDateUtil.getNow("yyyyMMddHHmmss");
String fileName = "abc_" + timestamp + ".xlsx";
String filePath = SAVE_DIR + fileName;
File dir = new File(SAVE_DIR);
if (!dir.exists()) {
boolean created = dir.mkdirs();
if (!created) {
throw new ItemStreamException("저장 디렉토리를 생성할 수 없습니다: " + SAVE_DIR);
}
}
try (FileOutputStream fos = new FileOutputStream(filePath)) {
workbook.write(fos);
}
if (workbook instanceof SXSSFWorkbook) {
((SXSSFWorkbook) workbook).dispose();
}
String endTime = BDateUtil.getNow("yyyy-MM-dd HH:mm:ss");
logger.info("############################################");
logger.info("## PGM = ZC001007C01 END ##");
logger.info("## JOB PROCESS COUNT ##");
logger.info("############################################");
logger.info("## END TIME [{}]", endTime);
logger.info("## FETCH COUNT [{}]", fetchCnt);
logger.info("## WRITE COUNT [{}]", writeCnt);
logger.info("## FAIL COUNT [{}]", failCnt);
logger.info("############################################");
} catch (Exception e) {
throw new ItemStreamException("엑셀 저장 중 오류 발생: " + e.getMessage(), e);
}
}
private String defaultString(String str) {
return (str == null) ? "" : str;
}
}
'Sql' 카테고리의 다른 글
| 전체적인 시스템과 개발 생태계에 대한 이해 (3) | 2025.07.24 |
|---|---|
| ROWNUM = 1은 정렬 (0) | 2025.07.21 |
| SQL 프로그램없이 웹으로 실습하기 (1) | 2025.07.07 |
| 실무에서 SQL 쿼리를 초보자가 쉽게 이해하고 익히려면 (0) | 2025.07.07 |
| IN,BETWEEN,EXISTS (0) | 2025.07.07 |





