From 9fed34e1bcb35ba94ee09d5ed697347e60a960f1 Mon Sep 17 00:00:00 2001 From: hyojin kim Date: Tue, 20 Jan 2026 10:09:59 +0900 Subject: [PATCH] =?UTF-8?q?:fire:=20Risk&Compliance=20Current/History=20?= =?UTF-8?q?=EC=88=98=EC=A7=91=20=EB=B0=A9=EC=8B=9D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...CompanyComplianceImportRangeJobConfig.java | 30 +-- .../ComplianceImportRangeJobConfig.java | 30 +-- .../CompanyComplianceRepository.java | 1 + .../CompanyComplianceRepositoryImpl.java | 29 ++- .../repository/ComplianceRepository.java | 1 + .../repository/ComplianceRepositoryImpl.java | 29 ++- .../writer/CompanyComplianceDataWriter.java | 1 + .../batch/writer/ComplianceDataWriter.java | 1 + .../config/RiskImportRangeJobConfig.java | 26 +- .../risk/batch/repository/RiskRepository.java | 1 + .../batch/repository/RiskRepositoryImpl.java | 240 +++++++----------- .../risk/batch/writer/RiskDataWriter.java | 1 + 12 files changed, 154 insertions(+), 236 deletions(-) diff --git a/src/main/java/com/snp/batch/jobs/compliance/batch/config/CompanyComplianceImportRangeJobConfig.java b/src/main/java/com/snp/batch/jobs/compliance/batch/config/CompanyComplianceImportRangeJobConfig.java index e66ed2c..495a402 100644 --- a/src/main/java/com/snp/batch/jobs/compliance/batch/config/CompanyComplianceImportRangeJobConfig.java +++ b/src/main/java/com/snp/batch/jobs/compliance/batch/config/CompanyComplianceImportRangeJobConfig.java @@ -91,9 +91,8 @@ public class CompanyComplianceImportRangeJobConfig extends BaseMultiStepJobConfi protected Job createJobFlow(JobBuilder jobBuilder) { return jobBuilder .start(companyComplianceImportRangeStep()) // 1단계 실행 - .next(currentCompanyComplianceUpdateStep()) // 2단계 실행 (1단계 실패 시 실행 안 됨) - .next(companyComplianceHistoryValueChangeManageStep()) // 3단계 실행 (2단계 실패 시 실행 안 됨) - .next(companyComplianceLastExecutionUpdateStep()) // 4단계: 모두 완료 시, BATCH_LAST_EXECUTION 마지막 성공일자 업데이트 + .next(companyComplianceHistoryValueChangeManageStep()) // 2단계 실행 (2단계 실패 시 실행 안 됨) + .next(companyComplianceLastExecutionUpdateStep()) // 3단계: 모두 완료 시, BATCH_LAST_EXECUTION 마지막 성공일자 업데이트 .build(); } @@ -131,30 +130,9 @@ public class CompanyComplianceImportRangeJobConfig extends BaseMultiStepJobConfi public Step companyComplianceImportRangeStep() { return step(); } - /** - * 2단계: Current Company Compliance 업데이트 - */ - @Bean - public Tasklet currentCompanyComplianceUpsertTasklet() { - return (contribution, chunkContext) -> { - log.info(">>>>> Company Compliance Upsert 프로시저 호출 시작"); - - // PostgreSQL 기준 프로시저 호출 (CALL) - jdbcTemplate.execute("CALL new_snp.upsert_current_company_compliance()"); - - log.info(">>>>> Company Compliance Upsert 프로시저 호출 완료"); - return RepeatStatus.FINISHED; - }; - } - @Bean(name = "CurrentCompanyComplianceUpdateStep") - public Step currentCompanyComplianceUpdateStep() { - return new StepBuilder("CurrentCompanyComplianceUpdateStep", jobRepository) - .tasklet(currentCompanyComplianceUpsertTasklet(), transactionManager) - .build(); - } /** - * 3단계: Compliance History Value Change 관리 + * 2단계: Compliance History Value Change 관리 */ @Bean public Tasklet companyComplianceHistoryValueChangeManageTasklet() { @@ -204,7 +182,7 @@ public class CompanyComplianceImportRangeJobConfig extends BaseMultiStepJobConfi } /** - * 4단계: 모든 스텝 성공 시 배치 실행 로그(날짜) 업데이트 + * 3단계: 모든 스텝 성공 시 배치 실행 로그(날짜) 업데이트 */ @Bean public Tasklet companyComplianceLastExecutionUpdateTasklet() { diff --git a/src/main/java/com/snp/batch/jobs/compliance/batch/config/ComplianceImportRangeJobConfig.java b/src/main/java/com/snp/batch/jobs/compliance/batch/config/ComplianceImportRangeJobConfig.java index 8fc7f4d..612e821 100644 --- a/src/main/java/com/snp/batch/jobs/compliance/batch/config/ComplianceImportRangeJobConfig.java +++ b/src/main/java/com/snp/batch/jobs/compliance/batch/config/ComplianceImportRangeJobConfig.java @@ -87,9 +87,8 @@ public class ComplianceImportRangeJobConfig extends BaseMultiStepJobConfig { - log.info(">>>>> Compliance Upsert 프로시저 호출 시작"); - - // PostgreSQL 기준 프로시저 호출 (CALL) - jdbcTemplate.execute("CALL new_snp.upsert_current_compliance()"); - - log.info(">>>>> Compliance Upsert 프로시저 호출 완료"); - return RepeatStatus.FINISHED; - }; - } - @Bean(name = "CurrentComplianceUpdateStep") - public Step currentComplianceUpdateStep() { - return new StepBuilder("CurrentComplianceUpdateStep", jobRepository) - .tasklet(currentComplianceUpsertTasklet(), transactionManager) - .build(); - } /** - * 3단계: Compliance History Value Change 관리 + * 2단계: Compliance History Value Change 관리 */ @Bean public Tasklet complianceHistoryValueChangeManageTasklet() { @@ -200,7 +178,7 @@ public class ComplianceImportRangeJobConfig extends BaseMultiStepJobConfig items); + void saveCompanyComplianceHistoryAll(List items); } diff --git a/src/main/java/com/snp/batch/jobs/compliance/batch/repository/CompanyComplianceRepositoryImpl.java b/src/main/java/com/snp/batch/jobs/compliance/batch/repository/CompanyComplianceRepositoryImpl.java index a8571ae..13fe748 100644 --- a/src/main/java/com/snp/batch/jobs/compliance/batch/repository/CompanyComplianceRepositoryImpl.java +++ b/src/main/java/com/snp/batch/jobs/compliance/batch/repository/CompanyComplianceRepositoryImpl.java @@ -40,15 +40,19 @@ public class CompanyComplianceRepositoryImpl extends BaseJdbcRepository { + try { + setUpdateParameters(ps, entity); + } catch (Exception e) { + log.error("배치 수정 파라미터 설정 실패", e); + throw new RuntimeException(e); + } + }); + log.info("{} 전체 저장 완료: 수정={} 건", getEntityName(), items.size()); + } + + @Override + public void saveCompanyComplianceHistoryAll(List items) { + if (items == null || items.isEmpty()) { + return; + } + jdbcTemplate.batchUpdate(getUpdateSql("tb_company_compliance_hstry", "owcode, lastupdated"), items, items.size(), (ps, entity) -> { try { setUpdateParameters(ps, entity); diff --git a/src/main/java/com/snp/batch/jobs/compliance/batch/repository/ComplianceRepository.java b/src/main/java/com/snp/batch/jobs/compliance/batch/repository/ComplianceRepository.java index 0656693..7712a22 100644 --- a/src/main/java/com/snp/batch/jobs/compliance/batch/repository/ComplianceRepository.java +++ b/src/main/java/com/snp/batch/jobs/compliance/batch/repository/ComplianceRepository.java @@ -6,4 +6,5 @@ import java.util.List; public interface ComplianceRepository { void saveComplianceAll(List items); + void saveComplianceHistoryAll(List items); } diff --git a/src/main/java/com/snp/batch/jobs/compliance/batch/repository/ComplianceRepositoryImpl.java b/src/main/java/com/snp/batch/jobs/compliance/batch/repository/ComplianceRepositoryImpl.java index 0df9aec..68585c0 100644 --- a/src/main/java/com/snp/batch/jobs/compliance/batch/repository/ComplianceRepositoryImpl.java +++ b/src/main/java/com/snp/batch/jobs/compliance/batch/repository/ComplianceRepositoryImpl.java @@ -41,8 +41,12 @@ public class ComplianceRepositoryImpl extends BaseJdbcRepository { + try { + setUpdateParameters(ps, entity); + } catch (Exception e) { + log.error("배치 수정 파라미터 설정 실패", e); + throw new RuntimeException(e); + } + }); + log.info("{} 전체 저장 완료: 수정={} 건", getEntityName(), items.size()); + } + + @Override + public void saveComplianceHistoryAll(List items) { + if (items == null || items.isEmpty()) { + return; + } + jdbcTemplate.batchUpdate(getUpdateSql("compliance_history", "lrimoshipno, dateamended"), items, items.size(), (ps, entity) -> { try { setUpdateParameters(ps, entity); diff --git a/src/main/java/com/snp/batch/jobs/compliance/batch/writer/CompanyComplianceDataWriter.java b/src/main/java/com/snp/batch/jobs/compliance/batch/writer/CompanyComplianceDataWriter.java index 7127ab6..eff49cb 100644 --- a/src/main/java/com/snp/batch/jobs/compliance/batch/writer/CompanyComplianceDataWriter.java +++ b/src/main/java/com/snp/batch/jobs/compliance/batch/writer/CompanyComplianceDataWriter.java @@ -20,5 +20,6 @@ public class CompanyComplianceDataWriter extends BaseWriter items) throws Exception { complianceRepository.saveCompanyComplianceAll(items); + complianceRepository.saveCompanyComplianceHistoryAll(items); } } diff --git a/src/main/java/com/snp/batch/jobs/compliance/batch/writer/ComplianceDataWriter.java b/src/main/java/com/snp/batch/jobs/compliance/batch/writer/ComplianceDataWriter.java index fbba771..50e6e8f 100644 --- a/src/main/java/com/snp/batch/jobs/compliance/batch/writer/ComplianceDataWriter.java +++ b/src/main/java/com/snp/batch/jobs/compliance/batch/writer/ComplianceDataWriter.java @@ -19,5 +19,6 @@ public class ComplianceDataWriter extends BaseWriter { @Override protected void writeItems(List items) throws Exception { complianceRepository.saveComplianceAll(items); + complianceRepository.saveComplianceHistoryAll(items); } } diff --git a/src/main/java/com/snp/batch/jobs/risk/batch/config/RiskImportRangeJobConfig.java b/src/main/java/com/snp/batch/jobs/risk/batch/config/RiskImportRangeJobConfig.java index 19a372c..9ca38a2 100644 --- a/src/main/java/com/snp/batch/jobs/risk/batch/config/RiskImportRangeJobConfig.java +++ b/src/main/java/com/snp/batch/jobs/risk/batch/config/RiskImportRangeJobConfig.java @@ -85,8 +85,7 @@ public class RiskImportRangeJobConfig extends BaseMultiStepJobConfig { - log.info(">>>>> Risk Upsert 프로시저 호출 시작"); - - // PostgreSQL 기준 프로시저 호출 (CALL) - jdbcTemplate.execute("CALL new_snp.upsert_current_risk()"); - - log.info(">>>>> Risk Upsert 프로시저 호출 완료"); - return RepeatStatus.FINISHED; - }; - } - @Bean(name = "CurrentRiskUpdateStep") - public Step currentRiskUpdateStep() { - return new StepBuilder("CurrentRiskUpdateStep", jobRepository) - .tasklet(currentRiskUpsertTasklet(), transactionManager) - .build(); - } /** - * 3단계: 모든 스텝 성공 시 배치 실행 로그(날짜) 업데이트 + * 2단계: 모든 스텝 성공 시 배치 실행 로그(날짜) 업데이트 */ @Bean public Tasklet riskLastExecutionUpdateTasklet() { diff --git a/src/main/java/com/snp/batch/jobs/risk/batch/repository/RiskRepository.java b/src/main/java/com/snp/batch/jobs/risk/batch/repository/RiskRepository.java index 795a052..aea972b 100644 --- a/src/main/java/com/snp/batch/jobs/risk/batch/repository/RiskRepository.java +++ b/src/main/java/com/snp/batch/jobs/risk/batch/repository/RiskRepository.java @@ -6,4 +6,5 @@ import java.util.List; public interface RiskRepository { void saveRiskAll(List items); + void saveRiskHistoryAll(List items); } diff --git a/src/main/java/com/snp/batch/jobs/risk/batch/repository/RiskRepositoryImpl.java b/src/main/java/com/snp/batch/jobs/risk/batch/repository/RiskRepositoryImpl.java index 8968d12..3818507 100644 --- a/src/main/java/com/snp/batch/jobs/risk/batch/repository/RiskRepositoryImpl.java +++ b/src/main/java/com/snp/batch/jobs/risk/batch/repository/RiskRepositoryImpl.java @@ -40,116 +40,76 @@ public class RiskRepositoryImpl extends BaseJdbcRepository imp @Override protected String getUpdateSql() { + return null; + } + + protected String getUpdateSql(String targetTable, String targetIndex) { return """ - INSERT INTO new_snp.risk_history ( - lrno, lastupdated, riskdatamaintained, dayssincelastseenonais, dayssincelastseenonaisnarrative, - daysunderais, daysunderaisnarrative, imocorrectonais, imocorrectonaisnarrative, sailingundername, - sailingundernamenarrative, anomalousmessagesfrommmsi, anomalousmessagesfrommmsinarrative, - mostrecentdarkactivity, mostrecentdarkactivitynarrative, portcalls, portcallsnarrative, portrisk, - portrisknarrative, stsoperations, stsoperationsnarrative, driftinghighseas, driftinghighseasnarrative, - riskevents, riskeventnarrative, riskeventnarrativeextended, flagchanges, flagchangenarrative, - flagparismouperformance, flagparismouperformancenarrative, flagtokyomoupeformance, flagtokyomoupeformancenarrative, - flaguscgmouperformance, flaguscgmouperformancenarrative, uscgqualship21, uscgqualship21narrative, - timesincepscinspection, timesincepscinspectionnarrative, pscinspections, pscinspectionnarrative, - pscdefects, pscdefectsnarrative, pscdetentions, pscdetentionsnarrative, currentsmccertificate, - currentsmccertificatenarrative, docchanges, docchangesnarrative, currentclass, currentclassnarrative, - currentclassnarrativeextended, classstatuschanges, classstatuschangesnarrative, pandicoverage, - pandicoveragenarrative, pandicoveragenarrativeextended, namechanges, namechangesnarrative, gbochanges, - gbochangesnarrative, ageofship, ageofshipnarrative, iuufishingviolation, iuufishingnarrative, - draughtchanges, draughtchangesnarrative, mostrecentsanctionedportcall, mostrecentsanctionedportcallnarrative, - singleshipoperation, singleshipoperationnarrative, fleetsafety, fleetsafetynarrative, fleetpsc, - fleetpscnarrative, specialsurveyoverdue, specialsurveyoverduenarrative, ownerunknown, ownerunknownnarrative, - russianportcall, russianportcallnarrative, russianownerregistration, russianownerregistrationnarrative, - russiansts, russianstsnarrative - ) - VALUES ( - ?, ?::timestamptz, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? - ) - ON CONFLICT (lrno, lastupdated) - DO UPDATE SET - riskdatamaintained = EXCLUDED.riskdatamaintained, - dayssincelastseenonais = EXCLUDED.dayssincelastseenonais, - dayssincelastseenonaisnarrative = EXCLUDED.dayssincelastseenonaisnarrative, - daysunderais = EXCLUDED.daysunderais, - daysunderaisnarrative = EXCLUDED.daysunderaisnarrative, - imocorrectonais = EXCLUDED.imocorrectonais, - imocorrectonaisnarrative = EXCLUDED.imocorrectonaisnarrative, - sailingundername = EXCLUDED.sailingundername, - sailingundernamenarrative = EXCLUDED.sailingundernamenarrative, - anomalousmessagesfrommmsi = EXCLUDED.anomalousmessagesfrommmsi, - anomalousmessagesfrommmsinarrative = EXCLUDED.anomalousmessagesfrommmsinarrative, - mostrecentdarkactivity = EXCLUDED.mostrecentdarkactivity, - mostrecentdarkactivitynarrative = EXCLUDED.mostrecentdarkactivitynarrative, - portcalls = EXCLUDED.portcalls, - portcallsnarrative = EXCLUDED.portcallsnarrative, - portrisk = EXCLUDED.portrisk, - portrisknarrative = EXCLUDED.portrisknarrative, - stsoperations = EXCLUDED.stsoperations, - stsoperationsnarrative = EXCLUDED.stsoperationsnarrative, - driftinghighseas = EXCLUDED.driftinghighseas, - driftinghighseasnarrative = EXCLUDED.driftinghighseasnarrative, - riskevents = EXCLUDED.riskevents, - riskeventnarrative = EXCLUDED.riskeventnarrative, - riskeventnarrativeextended = EXCLUDED.riskeventnarrativeextended, - flagchanges = EXCLUDED.flagchanges, - flagchangenarrative = EXCLUDED.flagchangenarrative, - flagparismouperformance = EXCLUDED.flagparismouperformance, - flagparismouperformancenarrative = EXCLUDED.flagparismouperformancenarrative, - flagtokyomoupeformance = EXCLUDED.flagtokyomoupeformance, - flagtokyomoupeformancenarrative = EXCLUDED.flagtokyomoupeformancenarrative, - flaguscgmouperformance = EXCLUDED.flaguscgmouperformance, - flaguscgmouperformancenarrative = EXCLUDED.flaguscgmouperformancenarrative, - uscgqualship21 = EXCLUDED.uscgqualship21, - uscgqualship21narrative = EXCLUDED.uscgqualship21narrative, - timesincepscinspection = EXCLUDED.timesincepscinspection, - timesincepscinspectionnarrative = EXCLUDED.timesincepscinspectionnarrative, - pscinspections = EXCLUDED.pscinspections, - pscinspectionnarrative = EXCLUDED.pscinspectionnarrative, - pscdefects = EXCLUDED.pscdefects, - pscdefectsnarrative = EXCLUDED.pscdefectsnarrative, - pscdetentions = EXCLUDED.pscdetentions, - pscdetentionsnarrative = EXCLUDED.pscdetentionsnarrative, - currentsmccertificate = EXCLUDED.currentsmccertificate, - currentsmccertificatenarrative = EXCLUDED.currentsmccertificatenarrative, - docchanges = EXCLUDED.docchanges, - docchangesnarrative = EXCLUDED.docchangesnarrative, - currentclass = EXCLUDED.currentclass, - currentclassnarrative = EXCLUDED.currentclassnarrative, - currentclassnarrativeextended = EXCLUDED.currentclassnarrativeextended, - classstatuschanges = EXCLUDED.classstatuschanges, - classstatuschangesnarrative = EXCLUDED.classstatuschangesnarrative, - pandicoverage = EXCLUDED.pandicoverage, - pandicoveragenarrative = EXCLUDED.pandicoveragenarrative, - pandicoveragenarrativeextended = EXCLUDED.pandicoveragenarrativeextended, - namechanges = EXCLUDED.namechanges, - namechangesnarrative = EXCLUDED.namechangesnarrative, - gbochanges = EXCLUDED.gbochanges, - gbochangesnarrative = EXCLUDED.gbochangesnarrative, - ageofship = EXCLUDED.ageofship, - ageofshipnarrative = EXCLUDED.ageofshipnarrative, - iuufishingviolation = EXCLUDED.iuufishingviolation, - iuufishingnarrative = EXCLUDED.iuufishingnarrative, - draughtchanges = EXCLUDED.draughtchanges, - draughtchangesnarrative = EXCLUDED.draughtchangesnarrative, - mostrecentsanctionedportcall = EXCLUDED.mostrecentsanctionedportcall, - mostrecentsanctionedportcallnarrative = EXCLUDED.mostrecentsanctionedportcallnarrative, - singleshipoperation = EXCLUDED.singleshipoperation, - singleshipoperationnarrative = EXCLUDED.singleshipoperationnarrative, - fleetsafety = EXCLUDED.fleetsafety, - fleetsafetynarrative = EXCLUDED.fleetsafetynarrative, - fleetpsc = EXCLUDED.fleetpsc, - fleetpscnarrative = EXCLUDED.fleetpscnarrative, - specialsurveyoverdue = EXCLUDED.specialsurveyoverdue, - specialsurveyoverduenarrative = EXCLUDED.specialsurveyoverduenarrative, - ownerunknown = EXCLUDED.ownerunknown, - ownerunknownnarrative = EXCLUDED.ownerunknownnarrative, - russianportcall = EXCLUDED.russianportcall, - russianportcallnarrative = EXCLUDED.russianportcallnarrative, - russianownerregistration = EXCLUDED.russianownerregistration, - russianownerregistrationnarrative = EXCLUDED.russianownerregistrationnarrative, - russiansts = EXCLUDED.russiansts, - russianstsnarrative = EXCLUDED.russianstsnarrative - """; + INSERT INTO new_snp.%s ( + lrno, lastupdated, + riskdatamaintained, dayssincelastseenonais, daysunderais, imocorrectonais, sailingundername, + anomalousmessagesfrommmsi, mostrecentdarkactivity, portcalls, portrisk, stsoperations, + driftinghighseas, riskevents, flagchanges, flagparismouperformance, flagtokyomoupeformance, + flaguscgmouperformance, uscgqualship21, timesincepscinspection, pscinspections, pscdefects, + pscdetentions, currentsmccertificate, docchanges, currentclass, classstatuschanges, + pandicoverage, namechanges, gbochanges, ageofship, iuufishingviolation, + draughtchanges, mostrecentsanctionedportcall, singleshipoperation, fleetsafety, fleetpsc, + specialsurveyoverdue, ownerunknown, russianportcall, russianownerregistration, russiansts + ) + VALUES ( + ?, ?::timestamptz, + ?, ?, ?, ?, ?, + ?, ?, ?, ?, ?, + ?, ?, ?, ?, ?, + ?, ?, ?, ?, ?, + ?, ?, ?, ?, ?, + ?, ?, ?, ?, ?, + ?, ?, ?, ?, ?, + ?, ?, ?, ?, ? + ) + ON CONFLICT (%s) + DO UPDATE SET + riskdatamaintained = EXCLUDED.riskdatamaintained, + dayssincelastseenonais = EXCLUDED.dayssincelastseenonais, + daysunderais = EXCLUDED.daysunderais, + imocorrectonais = EXCLUDED.imocorrectonais, + sailingundername = EXCLUDED.sailingundername, + anomalousmessagesfrommmsi = EXCLUDED.anomalousmessagesfrommmsi, + mostrecentdarkactivity = EXCLUDED.mostrecentdarkactivity, + portcalls = EXCLUDED.portcalls, + portrisk = EXCLUDED.portrisk, + stsoperations = EXCLUDED.stsoperations, + driftinghighseas = EXCLUDED.driftinghighseas, + riskevents = EXCLUDED.riskevents, + flagchanges = EXCLUDED.flagchanges, + flagparismouperformance = EXCLUDED.flagparismouperformance, + flagtokyomoupeformance = EXCLUDED.flagtokyomoupeformance, + flaguscgmouperformance = EXCLUDED.flaguscgmouperformance, + uscgqualship21 = EXCLUDED.uscgqualship21, + timesincepscinspection = EXCLUDED.timesincepscinspection, + pscinspections = EXCLUDED.pscinspections, + pscdefects = EXCLUDED.pscdefects, + pscdetentions = EXCLUDED.pscdetentions, + currentsmccertificate = EXCLUDED.currentsmccertificate, + docchanges = EXCLUDED.docchanges, + currentclass = EXCLUDED.currentclass, + classstatuschanges = EXCLUDED.classstatuschanges, + pandicoverage = EXCLUDED.pandicoverage, + namechanges = EXCLUDED.namechanges, + gbochanges = EXCLUDED.gbochanges, + ageofship = EXCLUDED.ageofship, + iuufishingviolation = EXCLUDED.iuufishingviolation, + draughtchanges = EXCLUDED.draughtchanges, + mostrecentsanctionedportcall = EXCLUDED.mostrecentsanctionedportcall, + singleshipoperation = EXCLUDED.singleshipoperation, + fleetsafety = EXCLUDED.fleetsafety, + fleetpsc = EXCLUDED.fleetpsc, + specialsurveyoverdue = EXCLUDED.specialsurveyoverdue, + ownerunknown = EXCLUDED.ownerunknown, + russianportcall = EXCLUDED.russianportcall, + russianownerregistration = EXCLUDED.russianownerregistration, + russiansts = EXCLUDED.russiansts + """.formatted(targetTable, targetIndex); } @Override @@ -164,86 +124,44 @@ public class RiskRepositoryImpl extends BaseJdbcRepository imp ps.setString(idx++, entity.getLastUpdated()); ps.setObject(idx++, entity.getRiskDataMaintained(), java.sql.Types.INTEGER); ps.setObject(idx++, entity.getDaysSinceLastSeenOnAIS(), java.sql.Types.INTEGER); - ps.setString(idx++, entity.getDaysSinceLastSeenOnAISNarrative()); ps.setObject(idx++, entity.getDaysUnderAIS(), java.sql.Types.INTEGER); - ps.setString(idx++, entity.getDaysUnderAISNarrative()); ps.setObject(idx++, entity.getImoCorrectOnAIS(), java.sql.Types.INTEGER); - ps.setString(idx++, entity.getImoCorrectOnAISNarrative()); ps.setObject(idx++, entity.getSailingUnderName(), java.sql.Types.INTEGER); - ps.setString(idx++, entity.getSailingUnderNameNarrative()); ps.setObject(idx++, entity.getAnomalousMessagesFromMMSI(), java.sql.Types.INTEGER); - ps.setString(idx++, entity.getAnomalousMessagesFromMMSINarrative()); ps.setObject(idx++, entity.getMostRecentDarkActivity(), java.sql.Types.INTEGER); - ps.setString(idx++, entity.getMostRecentDarkActivityNarrative()); ps.setObject(idx++, entity.getPortCalls(), java.sql.Types.INTEGER); - ps.setString(idx++, entity.getPortCallsNarrative()); ps.setObject(idx++, entity.getPortRisk(), java.sql.Types.INTEGER); - ps.setString(idx++, entity.getPortRiskNarrative()); ps.setObject(idx++, entity.getStsOperations(), java.sql.Types.INTEGER); - ps.setString(idx++, entity.getStsOperationsNarrative()); ps.setObject(idx++, entity.getDriftingHighSeas(), java.sql.Types.INTEGER); - ps.setString(idx++, entity.getDriftingHighSeasNarrative()); ps.setObject(idx++, entity.getRiskEvents(), java.sql.Types.INTEGER); - ps.setString(idx++, entity.getRiskEventNarrative()); - ps.setString(idx++, entity.getRiskEventNarrativeExtended()); ps.setObject(idx++, entity.getFlagChanges(), java.sql.Types.INTEGER); - ps.setString(idx++, entity.getFlagChangeNarrative()); ps.setObject(idx++, entity.getFlagParisMOUPerformance(), java.sql.Types.INTEGER); - ps.setString(idx++, entity.getFlagParisMOUPerformanceNarrative()); ps.setObject(idx++, entity.getFlagTokyoMOUPeformance(), java.sql.Types.INTEGER); - ps.setString(idx++, entity.getFlagTokyoMOUPeformanceNarrative()); ps.setObject(idx++, entity.getFlagUSCGMOUPerformance(), java.sql.Types.INTEGER); - ps.setString(idx++, entity.getFlagUSCGMOUPerformanceNarrative()); ps.setObject(idx++, entity.getUscgQualship21(), java.sql.Types.INTEGER); - ps.setString(idx++, entity.getUscgQualship21Narrative()); ps.setObject(idx++, entity.getTimeSincePSCInspection(), java.sql.Types.INTEGER); - ps.setString(idx++, entity.getTimeSincePSCInspectionNarrative()); ps.setObject(idx++, entity.getPscInspections(), java.sql.Types.INTEGER); - ps.setString(idx++, entity.getPscInspectionNarrative()); ps.setObject(idx++, entity.getPscDefects(), java.sql.Types.INTEGER); - ps.setString(idx++, entity.getPscDefectsNarrative()); ps.setObject(idx++, entity.getPscDetentions(), java.sql.Types.INTEGER); - ps.setString(idx++, entity.getPscDetentionsNarrative()); ps.setObject(idx++, entity.getCurrentSMCCertificate(), java.sql.Types.INTEGER); - ps.setString(idx++, entity.getCurrentSMCCertificateNarrative()); ps.setObject(idx++, entity.getDocChanges(), java.sql.Types.INTEGER); - ps.setString(idx++, entity.getDocChangesNarrative()); ps.setObject(idx++, entity.getCurrentClass(), java.sql.Types.INTEGER); - ps.setString(idx++, entity.getCurrentClassNarrative()); - ps.setString(idx++, entity.getCurrentClassNarrativeExtended()); ps.setObject(idx++, entity.getClassStatusChanges(), java.sql.Types.INTEGER); - ps.setString(idx++, entity.getClassStatusChangesNarrative()); ps.setObject(idx++, entity.getPandICoverage(), java.sql.Types.INTEGER); - ps.setString(idx++, entity.getPandICoverageNarrative()); - ps.setString(idx++, entity.getPandICoverageNarrativeExtended()); ps.setObject(idx++, entity.getNameChanges(), java.sql.Types.INTEGER); - ps.setString(idx++, entity.getNameChangesNarrative()); ps.setObject(idx++, entity.getGboChanges(), java.sql.Types.INTEGER); - ps.setString(idx++, entity.getGboChangesNarrative()); ps.setObject(idx++, entity.getAgeOfShip(), java.sql.Types.INTEGER); - ps.setString(idx++, entity.getAgeofShipNarrative()); ps.setObject(idx++, entity.getIuuFishingViolation(), java.sql.Types.INTEGER); - ps.setString(idx++, entity.getIuuFishingNarrative()); ps.setObject(idx++, entity.getDraughtChanges(), java.sql.Types.INTEGER); - ps.setString(idx++, entity.getDraughtChangesNarrative()); ps.setObject(idx++, entity.getMostRecentSanctionedPortCall(), java.sql.Types.INTEGER); - ps.setString(idx++, entity.getMostRecentSanctionedPortCallNarrative()); ps.setObject(idx++, entity.getSingleShipOperation(), java.sql.Types.INTEGER); - ps.setString(idx++, entity.getSingleShipOperationNarrative()); ps.setObject(idx++, entity.getFleetSafety(), java.sql.Types.INTEGER); - ps.setString(idx++, entity.getFleetSafetyNarrative()); ps.setObject(idx++, entity.getFleetPSC(), java.sql.Types.INTEGER); - ps.setString(idx++, entity.getFleetPSCNarrative()); ps.setObject(idx++, entity.getSpecialSurveyOverdue(), java.sql.Types.INTEGER); - ps.setString(idx++, entity.getSpecialSurveyOverdueNarrative()); ps.setObject(idx++, entity.getOwnerUnknown(), java.sql.Types.INTEGER); - ps.setString(idx++, entity.getOwnerUnknownNarrative()); ps.setObject(idx++, entity.getRussianPortCall(), java.sql.Types.INTEGER); - ps.setString(idx++, entity.getRussianPortCallNarrative()); ps.setObject(idx++, entity.getRussianOwnerRegistration(), java.sql.Types.INTEGER); - ps.setString(idx++, entity.getRussianOwnerRegistrationNarrative()); ps.setObject(idx++, entity.getRussianSTS(), java.sql.Types.INTEGER); - ps.setString(idx++, entity.getRussianSTSNarrative()); } @Override @@ -256,7 +174,25 @@ public class RiskRepositoryImpl extends BaseJdbcRepository imp if (items == null || items.isEmpty()) { return; } - jdbcTemplate.batchUpdate(getUpdateSql(), items, items.size(), + jdbcTemplate.batchUpdate(getUpdateSql("risk", "lrno"), items, items.size(), + (ps, entity) -> { + try { + setUpdateParameters(ps, entity); + } catch (Exception e) { + log.error("배치 수정 파라미터 설정 실패", e); + throw new RuntimeException(e); + } + }); + + log.info("{} 전체 저장 완료: 수정={} 건", getEntityName(), items.size()); + } + + @Override + public void saveRiskHistoryAll(List items) { + if (items == null || items.isEmpty()) { + return; + } + jdbcTemplate.batchUpdate(getUpdateSql("risk_history", "lrno, lastupdated"), items, items.size(), (ps, entity) -> { try { setUpdateParameters(ps, entity); diff --git a/src/main/java/com/snp/batch/jobs/risk/batch/writer/RiskDataWriter.java b/src/main/java/com/snp/batch/jobs/risk/batch/writer/RiskDataWriter.java index a1360be..05ba743 100644 --- a/src/main/java/com/snp/batch/jobs/risk/batch/writer/RiskDataWriter.java +++ b/src/main/java/com/snp/batch/jobs/risk/batch/writer/RiskDataWriter.java @@ -19,5 +19,6 @@ public class RiskDataWriter extends BaseWriter { @Override protected void writeItems(List items) throws Exception { riskRepository.saveRiskAll(items); + riskRepository.saveRiskHistoryAll(items); } }