diff --git a/src/main/java/com/snp/batch/common/util/JsonChangeDetector.java b/src/main/java/com/snp/batch/common/util/JsonChangeDetector.java index f600491..989adc4 100644 --- a/src/main/java/com/snp/batch/common/util/JsonChangeDetector.java +++ b/src/main/java/com/snp/batch/common/util/JsonChangeDetector.java @@ -23,7 +23,7 @@ public class JsonChangeDetector { // TreeMap을 사용하여 키를 알파벳 순으로 정렬할 수도 있지만, 여기서는 HashMap을 사용하고 final로 만듭니다. Map map = new HashMap<>(); // List 필드명 // 정렬 기준 복합 키 (JSON 필드명, 쉼표로 구분) - map.put("OwnerHistory", "OwnerCode,EffectiveDate"); + map.put("OwnerHistory", "OwnerCode,EffectiveDate,Sequence"); map.put("CrewList", "ID"); map.put("StowageCommodity", "Sequence,CommodityCode,StowageCode"); map.put("GroupBeneficialOwnerHistory", "EffectiveDate,GroupBeneficialOwnerCode,Sequence"); @@ -44,6 +44,9 @@ public class JsonChangeDetector { map.put("StatusHistory", "Sequence,StatusCode,StatusDate"); map.put("SpecialFeature", "Sequence,SpecialFeatureCode"); map.put("Thrusters", "Sequence"); + map.put("DarkActivityConfirmed", "Lrno,Mmsi,Dark_Time,Dark_Status"); + map.put("CompanyComplianceDetails", "OwCode"); + map.put("CompanyVesselRelationships", "LRNO"); LIST_SORT_KEYS = Collections.unmodifiableMap(map); } diff --git a/src/main/java/com/snp/batch/jobs/shipdetail/batch/config/ShipDetailUpdateJobConfig.java b/src/main/java/com/snp/batch/jobs/shipdetail/batch/config/ShipDetailUpdateJobConfig.java index 20d345c..225971c 100644 --- a/src/main/java/com/snp/batch/jobs/shipdetail/batch/config/ShipDetailUpdateJobConfig.java +++ b/src/main/java/com/snp/batch/jobs/shipdetail/batch/config/ShipDetailUpdateJobConfig.java @@ -103,7 +103,7 @@ public class ShipDetailUpdateJobConfig extends BaseJobConfig thrusters; + + /** + * 선박과 연관된 회사 정보 List + * API: CompanyVesselRelationships + */ + @JsonProperty("CompanyVesselRelationships") + private List CompanyVesselRelationships; + + /** + * 회사 컴플라이언스 정보 List + * API: CompanyComplianceDetails + */ + @JsonProperty("CompanyComplianceDetails") + private List CompanyComplianceDetails; + + /** + * 다크활동이력 정보 List + * API: DarkActivityConfirmed + */ + @JsonProperty("DarkActivityConfirmed") + private List darkActivityConfirmed; + } diff --git a/src/main/java/com/snp/batch/jobs/shipdetail/batch/dto/ShipDetailUpdate.java b/src/main/java/com/snp/batch/jobs/shipdetail/batch/dto/ShipDetailUpdate.java index f998552..7081936 100644 --- a/src/main/java/com/snp/batch/jobs/shipdetail/batch/dto/ShipDetailUpdate.java +++ b/src/main/java/com/snp/batch/jobs/shipdetail/batch/dto/ShipDetailUpdate.java @@ -43,4 +43,7 @@ public class ShipDetailUpdate { private final List statusHistoryEntityList; private final List specialFeatureEntityList; private final List thrustersEntityList; + private final List darkActivityConfirmedEntityList; + private final List companyComplianceEntityList; + private final List companyVesselRelationshipEntityList; } \ No newline at end of file diff --git a/src/main/java/com/snp/batch/jobs/shipdetail/batch/entity/CompanyComplianceEntity.java b/src/main/java/com/snp/batch/jobs/shipdetail/batch/entity/CompanyComplianceEntity.java new file mode 100644 index 0000000..af4025d --- /dev/null +++ b/src/main/java/com/snp/batch/jobs/shipdetail/batch/entity/CompanyComplianceEntity.java @@ -0,0 +1,33 @@ +package com.snp.batch.jobs.shipdetail.batch.entity; + +import com.snp.batch.common.batch.entity.BaseEntity; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +@Data +@SuperBuilder +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +public class CompanyComplianceEntity extends BaseEntity { + private String datasetversion; + private String owcode; + private String shortcompanyname; + private String companyonofacsanctionlist; + private String companyonunsanctionlist; + private String companyoneusanctionlist; + private String companyonbessanctionlist; + private String companyinofacsanctionedcountry; + private String companyinfatfjurisdiction; + private String companyoverallcompliancestatus; + private String companyonaustraliansanctionlist; + private String companyoncanadiansanctionlist; + private String companyonswisssanctionlist; + private String companyonofacssilist; + private String companyonofacnonsdnsanctionlist; + private String companyonuaesanctionlist; + private String parentcompanycompliancerisk; +} \ No newline at end of file diff --git a/src/main/java/com/snp/batch/jobs/shipdetail/batch/entity/CompanyVesselRelationshipEntity.java b/src/main/java/com/snp/batch/jobs/shipdetail/batch/entity/CompanyVesselRelationshipEntity.java new file mode 100644 index 0000000..e799e31 --- /dev/null +++ b/src/main/java/com/snp/batch/jobs/shipdetail/batch/entity/CompanyVesselRelationshipEntity.java @@ -0,0 +1,39 @@ +package com.snp.batch.jobs.shipdetail.batch.entity; + +import com.snp.batch.common.batch.entity.BaseEntity; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +@Data +@SuperBuilder +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +public class CompanyVesselRelationshipEntity extends BaseEntity { + private String datasetversion; + private String doccode; + private String doccompany; + private String groupbeneficialowner; + private String groupbeneficialownercode; + private String lrno; + private String operator; + private String operatorcode; + private String registeredowner; + private String registeredownercode; + private String shipmanager; + private String shipmanagercode; + private String technicalmanager; + private String technicalmanagercode; + private String docgroup; + private String docgroupcode; + private String operatorgroup; + private String operatorgroupcode; + private String shipmanagergroup; + private String shipmanagergroupcode; + private String technicalmanagergroup; + private String technicalmanagergroupcode; + private String vesselid; +} \ No newline at end of file diff --git a/src/main/java/com/snp/batch/jobs/shipdetail/batch/entity/DarkActivityConfirmedEntity.java b/src/main/java/com/snp/batch/jobs/shipdetail/batch/entity/DarkActivityConfirmedEntity.java new file mode 100644 index 0000000..ae4c70a --- /dev/null +++ b/src/main/java/com/snp/batch/jobs/shipdetail/batch/entity/DarkActivityConfirmedEntity.java @@ -0,0 +1,44 @@ +package com.snp.batch.jobs.shipdetail.batch.entity; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.snp.batch.common.batch.entity.BaseEntity; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +@Data +@SuperBuilder +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +public class DarkActivityConfirmedEntity extends BaseEntity { + private String datasetversion; + private String lrno; + private String mmsi; + private String vessel_name; + private String dark_hours; + private String dark_activity; + private String dark_status; + private String area_id; + private String area_name; + private String dark_time; + private String dark_latitude; + private String dark_longitude; + private String dark_speed; + private String dark_heading; + private String dark_draught; + private String nextseen; + private String nextseen_speed; + private String nextseen_draught; + private String nextseen_heading; + private String dark_reported_destination; + private String last_port_of_call; + private String last_port_country_code; + private String last_port_country; + private String nextseen_latitude; + private String nextseen_longitude; + private String nextseen_reported_destination; + private String vesselid; +} \ No newline at end of file diff --git a/src/main/java/com/snp/batch/jobs/shipdetail/batch/processor/ShipDetailDataProcessor.java b/src/main/java/com/snp/batch/jobs/shipdetail/batch/processor/ShipDetailDataProcessor.java index 339b4d2..c4080bc 100644 --- a/src/main/java/com/snp/batch/jobs/shipdetail/batch/processor/ShipDetailDataProcessor.java +++ b/src/main/java/com/snp/batch/jobs/shipdetail/batch/processor/ShipDetailDataProcessor.java @@ -59,6 +59,9 @@ public class ShipDetailDataProcessor extends BaseProcessor statusHistoryEntityList = makeStatusHistoryEntityList(comparisonData.getStructuredDto().getStatusHistory()); List specialFeatureEntityList = makeSpecialFeatureEntityList(comparisonData.getStructuredDto().getSpecialFeature()); List thrustersEntityList = makeThrustersEntityList(comparisonData.getStructuredDto().getThrusters()); + List darkActivityConfirmedEntityList = makeDarkActivityConfirmedEntityList(comparisonData.getStructuredDto().getDarkActivityConfirmed()); + List companyComplianceEntityList = makeCompanyComplianceEntityList(comparisonData.getStructuredDto().getCompanyComplianceDetails()); + List companyVesselRelationshipEntityList = makeCompanyVesselRelationshipEntityList(comparisonData.getStructuredDto().getCompanyVesselRelationships()); // 3. 최종 업데이트 DTO 생성 (Writer에 전달) return ShipDetailUpdate.builder() @@ -88,6 +91,9 @@ public class ShipDetailDataProcessor extends BaseProcessor makeCompanyVesselRelationshipEntityList(List dtoList){ + List entityList = new ArrayList<>(); + if (dtoList == null || dtoList.isEmpty()) { + return entityList; + } + for (CompanyVesselRelationshipDto dto : dtoList) { + String datasetVersion = (dto.getDataSetVersion() != null) ? dto.getDataSetVersion().getDataSetVersion() : null; + CompanyVesselRelationshipEntity entity = CompanyVesselRelationshipEntity.builder() + .datasetversion(datasetVersion) + .doccode(dto.getDocCode()) + .doccompany(dto.getDocCompany()) + .groupbeneficialowner(dto.getGroupBeneficialOwner()) + .groupbeneficialownercode(dto.getGroupBeneficialOwnerCode()) + .lrno(dto.getLrno()) + .operator(dto.getOperator()) + .operatorcode(dto.getOperatorCode()) + .registeredowner(dto.getRegisteredOwner()) + .registeredownercode(dto.getRegisteredOwnerCode()) + .shipmanager(dto.getShipManager()) + .shipmanagercode(dto.getShipManagerCode()) + .technicalmanager(dto.getTechnicalManager()) + .technicalmanagercode(dto.getTechnicalManagerCode()) + .docgroup(dto.getDocGroup()) + .docgroupcode(dto.getDocGroupCode()) + .operatorgroup(dto.getOperatorGroup()) + .operatorgroupcode(dto.getOperatorGroupCode()) + .shipmanagergroup(dto.getShipManagerGroup()) + .shipmanagergroupcode(dto.getShipManagerGroupCode()) + .technicalmanagergroup(dto.getTechnicalManagerGroup()) + .technicalmanagergroupcode(dto.getTechnicalManagerGroupCode()) + .vesselid(dto.getLrno()) // LRNO를 VesselID로 매핑 + .build(); + entityList.add(entity); + } + return entityList; + } + + private List makeDarkActivityConfirmedEntityList(List dtoList){ + List entityList = new ArrayList<>(); + if (dtoList == null || dtoList.isEmpty()) { + return entityList; + } + for (DarkActivityConfirmedDto dto : dtoList) { + String datasetVersion = (dto.getDataSetVersion() != null) ? dto.getDataSetVersion().getDataSetVersion() : null; + DarkActivityConfirmedEntity entity = DarkActivityConfirmedEntity.builder() + .datasetversion(datasetVersion) + .lrno(dto.getLrno()) + .mmsi(dto.getMmsi()) + .vessel_name(dto.getVesselName()) + .dark_hours(dto.getDarkHours()) + .dark_activity(dto.getDarkActivity()) + .dark_status(dto.getDarkStatus()) + .area_id(dto.getAreaId()) + .area_name(dto.getAreaName()) + .dark_time(dto.getDarkTime()) + .dark_latitude(dto.getDarkLatitude()) + .dark_longitude(dto.getDarkLongitude()) + .dark_speed(dto.getDarkSpeed()) + .dark_heading(dto.getDarkHeading()) + .dark_draught(dto.getDarkDraught()) + .nextseen(dto.getNextSeen()) + .nextseen_speed(dto.getNextSeenSpeed()) + .nextseen_draught(dto.getNextSeenDraught()) + .nextseen_heading(dto.getNextSeenHeading()) + .dark_reported_destination(dto.getDarkReportedDestination()) + .last_port_of_call(dto.getLastPortOfCall()) + .last_port_country_code(dto.getLastPortCountryCode()) + .last_port_country(dto.getLastPortCountry()) + .nextseen_latitude(dto.getNextSeenLatitude()) + .nextseen_longitude(dto.getNextSeenLongitude()) + .nextseen_reported_destination(dto.getNextSeenReportedDestination()) + .vesselid(dto.getLrno()) + .build(); + entityList.add(entity); + } + return entityList; + } + + private List makeCompanyComplianceEntityList(List dtoList){ + List entityList = new ArrayList<>(); + if (dtoList == null || dtoList.isEmpty()) { + return entityList; + } + for (CompanyComplianceDto dto : dtoList) { + String datasetVersion = (dto.getDataSetVersion() != null) ? dto.getDataSetVersion().getDataSetVersion() : null; + CompanyComplianceEntity entity = CompanyComplianceEntity.builder() + .datasetversion(datasetVersion) + .owcode(dto.getOwCode()) + .shortcompanyname(dto.getShortCompanyName()) + .companyonofacsanctionlist(dto.getCompanyOnOFACSanctionList()) + .companyonunsanctionlist(dto.getCompanyOnUNSanctionList()) + .companyoneusanctionlist(dto.getCompanyOnEUSanctionList()) + .companyonbessanctionlist(dto.getCompanyOnBESSanctionList()) + .companyinofacsanctionedcountry(dto.getCompanyInOFACSanctionedCountry()) + .companyinfatfjurisdiction(dto.getCompanyInFATFJurisdiction()) + .companyoverallcompliancestatus(dto.getCompanyOverallComplianceStatus()) + .companyonaustraliansanctionlist(dto.getCompanyOnAustralianSanctionList()) + .companyoncanadiansanctionlist(dto.getCompanyOnCanadianSanctionList()) + .companyonswisssanctionlist(dto.getCompanyOnSwissSanctionList()) + .companyonofacssilist(dto.getCompanyOnOFACSSIList()) + .companyonofacnonsdnsanctionlist(dto.getCompanyOnOFACNonSDNSanctionList()) + .companyonuaesanctionlist(dto.getCompanyOnUAESanctionList()) + .parentcompanycompliancerisk(dto.getParentCompanyComplianceRisk()) + .build(); + entityList.add(entity); + } + return entityList; + } + /** * 해시값을 비교하여 변경 여부를 판단합니다. */ diff --git a/src/main/java/com/snp/batch/jobs/shipdetail/batch/reader/ShipDetailUpdateDataReader.java b/src/main/java/com/snp/batch/jobs/shipdetail/batch/reader/ShipDetailUpdateDataReader.java index 8a18597..a9e21c8 100644 --- a/src/main/java/com/snp/batch/jobs/shipdetail/batch/reader/ShipDetailUpdateDataReader.java +++ b/src/main/java/com/snp/batch/jobs/shipdetail/batch/reader/ShipDetailUpdateDataReader.java @@ -47,7 +47,7 @@ public class ShipDetailUpdateDataReader extends BaseApiReader dbMasterHashes; private int currentBatchIndex = 0; - private final int batchSize = 30; + private final int batchSize = 1; public ShipDetailUpdateDataReader(WebClient webClient, JdbcTemplate jdbcTemplate, ObjectMapper objectMapper,BatchDateService batchDateService) { super(webClient); @@ -261,12 +261,18 @@ public class ShipDetailUpdateDataReader extends BaseApiReader uriBuilder // 맵에서 파라미터 값을 동적으로 가져와 세팅 .queryParam("shipsCategory", params.get("shipsCategory")) - .queryParam("fromYear", params.get("fromYear")) - .queryParam("fromMonth", params.get("fromMonth")) - .queryParam("fromDay", params.get("fromDay")) - .queryParam("toYear", params.get("toYear")) - .queryParam("toMonth", params.get("toMonth")) - .queryParam("toDay", params.get("toDay")) +// .queryParam("fromYear", params.get("fromYear")) +// .queryParam("fromMonth", params.get("fromMonth")) +// .queryParam("fromDay", params.get("fromDay")) +// .queryParam("toYear", params.get("toYear")) +// .queryParam("toMonth", params.get("toMonth")) +// .queryParam("toDay", params.get("toDay")) + .queryParam("fromYear", "2025") + .queryParam("fromMonth", "10") + .queryParam("fromDay", "15") + .queryParam("toYear", "2025") + .queryParam("toMonth", "12") + .queryParam("toDay", "17") .build()) .retrieve() .bodyToMono(ShipUpdateApiResponse.class) diff --git a/src/main/java/com/snp/batch/jobs/shipdetail/batch/repository/ShipDetailRepository.java b/src/main/java/com/snp/batch/jobs/shipdetail/batch/repository/ShipDetailRepository.java index e192014..e85ef7a 100644 --- a/src/main/java/com/snp/batch/jobs/shipdetail/batch/repository/ShipDetailRepository.java +++ b/src/main/java/com/snp/batch/jobs/shipdetail/batch/repository/ShipDetailRepository.java @@ -15,69 +15,54 @@ public interface ShipDetailRepository { void saveAllOwnerHistoryData(List entities); - //TODO : CrewList 저장 함수 선언 void saveAllCrewListData(List entities); - //TODO : StowageCommodity 저장 함수 선언 void saveAllStowageCommodityData(List entities); - //TODO : GroupBeneficialOwnerHistory 저장 함수 선언 void saveAllGroupBeneficialOwnerHistoryData(List entities); - //TODO : ShipManagerHistory 저장 함수 선언 void saveAllShipManagerHistoryData(List entities); - //TODO : OperatorHistory 저장 함수 선언 void saveAllOperatorHistoryData(List entities); - //TODO : TechnicalManagerHistory 저장 함수 선언 void saveAllTechnicalManagerHistoryData(List entities); - //TODO : BareBoatCharterHistory 저장 함수 선언 void saveAllBareBoatCharterHistoryData(List entities); - //TODO : NameHistory 저장 함수 선언 void saveAllNameHistoryData(List entities); - //TODO : FlagHistory 저장 함수 선언 void saveAllFlagHistoryData(List entities); - //TODO : AdditionalInformation 저장 함수 선언 void saveAllAdditionalInformationData(List entities); - //TODO : PandIHistory 저장 함수 선언 void saveAllPandIHistoryData(List entities); - //TODO : CallSignAndMmsiHistory 저장 함수 선언 void saveAllCallSignAndMmsiHistoryData(List entities); - //TODO : IceClass 저장 함수 선언 void saveAllIceClassData(List entities); - //TODO : SafetyManagementCertificateHistory 저장 함수 선언 void saveAllSafetyManagementCertificateHistoryData(List entities); - //TODO : ClassHistory 저장 함수 선언 void saveAllClassHistoryData(List entities); - //TODO : SurveyDatesHistory 저장 함수 선언 void saveAllSurveyDatesHistoryData(List entities); - //TODO : SurveyDatesHistoryUnique 저장 함수 선언 void saveAllSurveyDatesHistoryUniqueData(List entities); - //TODO : SisterShipLinks 저장 함수 선언 void saveAllSisterShipLinksData(List entities); - //TODO : StatusHistory 저장 함수 선언 void saveAllStatusHistoryData(List entities); - //TODO : SpecialFeature 저장 함수 선언 void saveAllSpecialFeatureData(List entities); - //TODO : Thrusters 저장 함수 선언 void saveAllThrustersData(List entities); + void saveAllDarkActivityConfirmedData(List entities); + + void saveAllCompanyComplianceData(List entities); + + void saveAllCompanyVesselRelationshipData(List entities); + void delete(String id); } diff --git a/src/main/java/com/snp/batch/jobs/shipdetail/batch/repository/ShipDetailRepositoryImpl.java b/src/main/java/com/snp/batch/jobs/shipdetail/batch/repository/ShipDetailRepositoryImpl.java index 13d6f27..00a5ae1 100644 --- a/src/main/java/com/snp/batch/jobs/shipdetail/batch/repository/ShipDetailRepositoryImpl.java +++ b/src/main/java/com/snp/batch/jobs/shipdetail/batch/repository/ShipDetailRepositoryImpl.java @@ -8,6 +8,8 @@ import org.springframework.jdbc.core.RowMapper; import org.springframework.stereotype.Repository; import java.sql.*; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import java.util.*; /** @@ -25,7 +27,7 @@ public class ShipDetailRepositoryImpl extends BaseJdbcRepository entities) { + String entityName = "DarkActivityConfirmedEntity"; + String sql = ShipDetailSql.getDarkActivityConfirmedSql(); + + if (entities == null || entities.isEmpty()) { + return; + } + + log.info("{} 배치 삽입 시작: {} 건", entityName, entities.size()); + + jdbcTemplate.batchUpdate(sql, entities, entities.size(), + (ps, entity) -> { + try { + setDarkActivityConfirmedInsertParameters(ps, (DarkActivityConfirmedEntity) entity); + } catch (Exception e) { + log.error("배치 삽입 파라미터 설정 실패 - " + entityName, e); + throw new RuntimeException(e); + } + }); + + log.info("{} 배치 삽입 완료: {} 건", entityName, entities.size()); + + } + + @Override + public void saveAllCompanyComplianceData(List entities) { + String entityName = "CompanyComplianceEntity"; + String sql = ShipDetailSql.getCompanyComplianceSql(); + + if (entities == null || entities.isEmpty()) { + return; + } + + log.info("{} 배치 삽입 시작: {} 건", entityName, entities.size()); + + jdbcTemplate.batchUpdate(sql, entities, entities.size(), + (ps, entity) -> { + try { + setCompanyComplianceInsertParameters(ps, (CompanyComplianceEntity) entity); + } catch (Exception e) { + log.error("배치 삽입 파라미터 설정 실패 - " + entityName, e); + throw new RuntimeException(e); + } + }); + + log.info("{} 배치 삽입 완료: {} 건", entityName, entities.size()); + } + + @Override + public void saveAllCompanyVesselRelationshipData(List entities) { + String entityName = "CompanyVesselRelationshipEntity"; + String sql = ShipDetailSql.getCompanyVesselRelationshipSql(); + + if (entities == null || entities.isEmpty()) { + return; + } + + log.info("{} 배치 삽입 시작: {} 건", entityName, entities.size()); + + jdbcTemplate.batchUpdate(sql, entities, entities.size(), + (ps, entity) -> { + try { + setCompanyVesselRelationshipInsertParameters(ps, (CompanyVesselRelationshipEntity) entity); + } catch (Exception e) { + log.error("배치 삽입 파라미터 설정 실패 - " + entityName, e); + throw new RuntimeException(e); + } + }); + + log.info("{} 배치 삽입 완료: {} 건", entityName, entities.size()); + } + public boolean existsByImo(String imo) { String sql = String.format("SELECT COUNT(*) FROM %s WHERE %s = ?", getTableName(), getIdColumnName("ihslrorimoshipno")); Long count = jdbcTemplate.queryForObject(sql, Long.class, imo); @@ -1370,6 +1461,92 @@ public class ShipDetailRepositoryImpl extends BaseJdbcRepository { List statusHistoryListEntities = flattenEntities(items, ShipDetailUpdate::getStatusHistoryEntityList); List specialFeatureListEntities = flattenEntities(items, ShipDetailUpdate::getSpecialFeatureEntityList); List thrustersListEntities = flattenEntities(items, ShipDetailUpdate::getThrustersEntityList); + List darkActivityConfirmedEntities = flattenEntities(items, ShipDetailUpdate::getDarkActivityConfirmedEntityList); + List companyComplianceEntities = flattenEntities(items, ShipDetailUpdate::getCompanyComplianceEntityList); + List companyVesselRelationshipEntities = flattenEntities(items, ShipDetailUpdate::getCompanyVesselRelationshipEntityList); // 1-3. List (Hash값 데이터 처리용) List hashEntities = items.stream() @@ -73,97 +76,109 @@ public class ShipDetailDataWriter extends BaseWriter { // 2. 각 Repository에 전달 // ✅ 2-1. ShipDetailRepository (Core20 데이터) - log.debug("Core20 데이터 저장 시작: {} 건", coreEntities.size()); - shipDetailRepository.saveAllCoreData(coreEntities); +// log.debug("Core20 데이터 저장 시작: {} 건", coreEntities.size()); +// shipDetailRepository.saveAllCoreData(coreEntities); +// +// // ✅ 2-2. 추가적인 Array/List 데이터 +// // OwnerHistory 저장 +// log.debug("OwnerHistory 데이터 저장 시작: {} 건", ownerHistoriyListEntities.size()); +// shipDetailRepository.saveAllOwnerHistoryData(ownerHistoriyListEntities); +// +// // CrewList 저장 +// log.debug("CrewList 데이터 저장 시작: {} 건", crewListEntities.size()); +// shipDetailRepository.saveAllCrewListData(crewListEntities); +// +// // StowageCommodity 저장 +// log.debug("StowageCommodity 저장 시작: {} 건", stowageCommodityListEntities.size()); +// shipDetailRepository.saveAllStowageCommodityData(stowageCommodityListEntities); +// +// // GroupBeneficialOwnerHistory 저장 +// log.debug("GroupBeneficialOwnerHistory 저장 시작: {} 건", groupBeneficialOwnerHistoryListEntities.size()); +// shipDetailRepository.saveAllGroupBeneficialOwnerHistoryData(groupBeneficialOwnerHistoryListEntities); +// +// // ShipManagerHistory 저장 +// log.debug("ShipManagerHistory 저장 시작: {} 건", shipManagerHistoryListEntities.size()); +// shipDetailRepository.saveAllShipManagerHistoryData(shipManagerHistoryListEntities); +// +// // OperatorHistory 저장 +// log.debug("OperatorHistory 저장 시작: {} 건", operatorHistoryListEntities.size()); +// shipDetailRepository.saveAllOperatorHistoryData(operatorHistoryListEntities); +// +// // TechnicalManagerHistory 저장 +// log.debug("TechnicalManagerHistory 저장 시작: {} 건", technicalManagerHistoryListEntities.size()); +// shipDetailRepository.saveAllTechnicalManagerHistoryData(technicalManagerHistoryListEntities); +// +// // BareBoatCharterHistory 저장 +// log.debug("BareBoatCharterHistory 저장 시작: {} 건", bareBoatCharterHistoryListEntities.size()); +// shipDetailRepository.saveAllBareBoatCharterHistoryData(bareBoatCharterHistoryListEntities); +// +// // NameHistory 저장 +// log.debug("NameHistory 저장 시작: {} 건", nameHistoryListEntities.size()); +// shipDetailRepository.saveAllNameHistoryData(nameHistoryListEntities); +// +// // FlagHistory 저장 +// log.debug("FlagHistory 저장 시작: {} 건", flagHistoryListEntities.size()); +// shipDetailRepository.saveAllFlagHistoryData(flagHistoryListEntities); +// +// // AdditionalInformation 저장 +// log.debug("AdditionalInformation 저장 시작: {} 건", additionalInformationListEntities.size()); +// shipDetailRepository.saveAllAdditionalInformationData(additionalInformationListEntities); +// +// // PandIHistory 저장 +// log.debug("PandIHistory 저장 시작: {} 건", pandIHistoryListEntities.size()); +// shipDetailRepository.saveAllPandIHistoryData(pandIHistoryListEntities); +// +// // CallSignAndMmsiHistory 저장 +// log.debug("CallSignAndMmsiHistory 저장 시작: {} 건", callSignAndMmsiHistoryListEntities.size()); +// shipDetailRepository.saveAllCallSignAndMmsiHistoryData(callSignAndMmsiHistoryListEntities); +// +// // IceClass 저장 +// log.debug("IceClass 저장 시작: {} 건", iceClassListEntities.size()); +// shipDetailRepository.saveAllIceClassData(iceClassListEntities); +// +// // SafetyManagementCertificateHistory 저장 +// log.debug("SafetyManagementCertificateHistory 저장 시작: {} 건", safetyManagementCertificateHistoryListEntities.size()); +// shipDetailRepository.saveAllSafetyManagementCertificateHistoryData(safetyManagementCertificateHistoryListEntities); +// +// // ClassHistory 저장 +// log.debug("ClassHistory 저장 시작: {} 건", classHistoryListEntities.size()); +// shipDetailRepository.saveAllClassHistoryData(classHistoryListEntities); +// +// // SurveyDatesHistory 저장 +// log.debug("SurveyDatesHistory 저장 시작: {} 건", surveyDatesHistoryListEntities.size()); +// shipDetailRepository.saveAllSurveyDatesHistoryData(surveyDatesHistoryListEntities); +// +// // SurveyDatesHistoryUnique 저장 +// log.debug("SurveyDatesHistoryUnique 저장 시작: {} 건", surveyDatesHistoryUniqueListEntities.size()); +// shipDetailRepository.saveAllSurveyDatesHistoryUniqueData(surveyDatesHistoryUniqueListEntities); +// +// // SisterShipLinks 저장 +// log.debug("SisterShipLinks 저장 시작: {} 건", sisterShipLinksListEntities.size()); +// shipDetailRepository.saveAllSisterShipLinksData(sisterShipLinksListEntities); +// +// // StatusHistory 저장 +// log.debug("StatusHistory 저장 시작: {} 건", statusHistoryListEntities.size()); +// shipDetailRepository.saveAllStatusHistoryData(statusHistoryListEntities); +// +// // SpecialFeature 저장 +// log.debug("SpecialFeature 저장 시작: {} 건", specialFeatureListEntities.size()); +// shipDetailRepository.saveAllSpecialFeatureData(specialFeatureListEntities); +// +// // Thrusters 저장 +// log.debug("Thrusters 저장 시작: {} 건", thrustersListEntities.size()); +// shipDetailRepository.saveAllThrustersData(thrustersListEntities); - // ✅ 2-2. 추가적인 Array/List 데이터 - // OwnerHistory 저장 - log.debug("OwnerHistory 데이터 저장 시작: {} 건", ownerHistoriyListEntities.size()); - shipDetailRepository.saveAllOwnerHistoryData(ownerHistoriyListEntities); + // DarkActivityConfirmed 저장 + log.debug("DarkActivityConfirmed 저장 시작: {} 건", darkActivityConfirmedEntities.size()); + shipDetailRepository.saveAllDarkActivityConfirmedData(darkActivityConfirmedEntities); - // CrewList 저장 - log.debug("CrewList 데이터 저장 시작: {} 건", crewListEntities.size()); - shipDetailRepository.saveAllCrewListData(crewListEntities); + // CompanyCompliance 저장 + log.debug("CompanyCompliance 저장 시작: {} 건", companyComplianceEntities.size()); + shipDetailRepository.saveAllCompanyComplianceData(companyComplianceEntities); - // StowageCommodity 저장 - log.debug("StowageCommodity 저장 시작: {} 건", stowageCommodityListEntities.size()); - shipDetailRepository.saveAllStowageCommodityData(stowageCommodityListEntities); - - // GroupBeneficialOwnerHistory 저장 - log.debug("GroupBeneficialOwnerHistory 저장 시작: {} 건", groupBeneficialOwnerHistoryListEntities.size()); - shipDetailRepository.saveAllGroupBeneficialOwnerHistoryData(groupBeneficialOwnerHistoryListEntities); - - // ShipManagerHistory 저장 - log.debug("ShipManagerHistory 저장 시작: {} 건", shipManagerHistoryListEntities.size()); - shipDetailRepository.saveAllShipManagerHistoryData(shipManagerHistoryListEntities); - - // OperatorHistory 저장 - log.debug("OperatorHistory 저장 시작: {} 건", operatorHistoryListEntities.size()); - shipDetailRepository.saveAllOperatorHistoryData(operatorHistoryListEntities); - - // TechnicalManagerHistory 저장 - log.debug("TechnicalManagerHistory 저장 시작: {} 건", technicalManagerHistoryListEntities.size()); - shipDetailRepository.saveAllTechnicalManagerHistoryData(technicalManagerHistoryListEntities); - - // BareBoatCharterHistory 저장 - log.debug("BareBoatCharterHistory 저장 시작: {} 건", bareBoatCharterHistoryListEntities.size()); - shipDetailRepository.saveAllBareBoatCharterHistoryData(bareBoatCharterHistoryListEntities); - - // NameHistory 저장 - log.debug("NameHistory 저장 시작: {} 건", nameHistoryListEntities.size()); - shipDetailRepository.saveAllNameHistoryData(nameHistoryListEntities); - - // FlagHistory 저장 - log.debug("FlagHistory 저장 시작: {} 건", flagHistoryListEntities.size()); - shipDetailRepository.saveAllFlagHistoryData(flagHistoryListEntities); - - // AdditionalInformation 저장 - log.debug("AdditionalInformation 저장 시작: {} 건", additionalInformationListEntities.size()); - shipDetailRepository.saveAllAdditionalInformationData(additionalInformationListEntities); - - // PandIHistory 저장 - log.debug("PandIHistory 저장 시작: {} 건", pandIHistoryListEntities.size()); - shipDetailRepository.saveAllPandIHistoryData(pandIHistoryListEntities); - - // CallSignAndMmsiHistory 저장 - log.debug("CallSignAndMmsiHistory 저장 시작: {} 건", callSignAndMmsiHistoryListEntities.size()); - shipDetailRepository.saveAllCallSignAndMmsiHistoryData(callSignAndMmsiHistoryListEntities); - - // IceClass 저장 - log.debug("IceClass 저장 시작: {} 건", iceClassListEntities.size()); - shipDetailRepository.saveAllIceClassData(iceClassListEntities); - - // SafetyManagementCertificateHistory 저장 - log.debug("SafetyManagementCertificateHistory 저장 시작: {} 건", safetyManagementCertificateHistoryListEntities.size()); - shipDetailRepository.saveAllSafetyManagementCertificateHistoryData(safetyManagementCertificateHistoryListEntities); - - // ClassHistory 저장 - log.debug("ClassHistory 저장 시작: {} 건", classHistoryListEntities.size()); - shipDetailRepository.saveAllClassHistoryData(classHistoryListEntities); - - // SurveyDatesHistory 저장 - log.debug("SurveyDatesHistory 저장 시작: {} 건", surveyDatesHistoryListEntities.size()); - shipDetailRepository.saveAllSurveyDatesHistoryData(surveyDatesHistoryListEntities); - - // SurveyDatesHistoryUnique 저장 - log.debug("SurveyDatesHistoryUnique 저장 시작: {} 건", surveyDatesHistoryUniqueListEntities.size()); - shipDetailRepository.saveAllSurveyDatesHistoryUniqueData(surveyDatesHistoryUniqueListEntities); - - // SisterShipLinks 저장 - log.debug("SisterShipLinks 저장 시작: {} 건", sisterShipLinksListEntities.size()); - shipDetailRepository.saveAllSisterShipLinksData(sisterShipLinksListEntities); - - // StatusHistory 저장 - log.debug("StatusHistory 저장 시작: {} 건", statusHistoryListEntities.size()); - shipDetailRepository.saveAllStatusHistoryData(statusHistoryListEntities); - - // SpecialFeature 저장 - log.debug("SpecialFeature 저장 시작: {} 건", specialFeatureListEntities.size()); - shipDetailRepository.saveAllSpecialFeatureData(specialFeatureListEntities); - - // Thrusters 저장 - log.debug("Thrusters 저장 시작: {} 건", thrustersListEntities.size()); - shipDetailRepository.saveAllThrustersData(thrustersListEntities); + // CompanyVesselRelationship 저장 + log.debug("CompanyVesselRelationship 저장 시작: {} 건", companyVesselRelationshipEntities.size()); + shipDetailRepository.saveAllCompanyVesselRelationshipData(companyVesselRelationshipEntities); // ✅ 2-3. ShipHashRepository (Hash값 데이터) log.debug("Ship Hash 데이터 저장 시작: {} 건", hashEntities.size());