From 6e70e921af489e1f25986b740698a8aa05127cb8 Mon Sep 17 00:00:00 2001 From: hyojin kim Date: Mon, 5 Jan 2026 17:42:53 +0900 Subject: [PATCH] =?UTF-8?q?:card=5Ffile=5Fbox:=20AIS=20Target=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD=EC=9C=BC=EB=A1=9C=20=EC=9D=B8=ED=95=9C=20=EB=8D=B0?= =?UTF-8?q?=EC=9D=B4=ED=84=B0=20=EB=B0=8F=20=EC=BB=AC=EB=9F=BC=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../batch/dto/AisTargetApiResponse.java | 2 +- .../aistarget/batch/dto/AisTargetDto.java | 32 ++++++++++ .../batch/entity/AisTargetEntity.java | 19 ++++++ .../processor/AisTargetDataProcessor.java | 16 +++++ .../batch/reader/AisTargetDataReader.java | 2 +- .../repository/AisTargetRepositoryImpl.java | 58 ++++++++++++++++++- 6 files changed, 124 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/snp/batch/jobs/aistarget/batch/dto/AisTargetApiResponse.java b/src/main/java/com/snp/batch/jobs/aistarget/batch/dto/AisTargetApiResponse.java index 5d300c6..2c19f30 100644 --- a/src/main/java/com/snp/batch/jobs/aistarget/batch/dto/AisTargetApiResponse.java +++ b/src/main/java/com/snp/batch/jobs/aistarget/batch/dto/AisTargetApiResponse.java @@ -22,6 +22,6 @@ import java.util.List; @AllArgsConstructor public class AisTargetApiResponse { - @JsonProperty("targetArr") + @JsonProperty("targetEnhancedArr") private List targetArr; } diff --git a/src/main/java/com/snp/batch/jobs/aistarget/batch/dto/AisTargetDto.java b/src/main/java/com/snp/batch/jobs/aistarget/batch/dto/AisTargetDto.java index 017e50e..6ecca2b 100644 --- a/src/main/java/com/snp/batch/jobs/aistarget/batch/dto/AisTargetDto.java +++ b/src/main/java/com/snp/batch/jobs/aistarget/batch/dto/AisTargetDto.java @@ -132,4 +132,36 @@ public class AisTargetDto { @JsonProperty("WidthStarboard") private Integer widthStarboard; + + // TargetEnhanced 컬럼 추가 + @JsonProperty("TonnesCargo") + private Integer tonnesCargo; + @JsonProperty("InSTS") + private Integer inSTS; + @JsonProperty("OnBerth") + private Boolean onBerth; + @JsonProperty("DWT") + private Integer dwt; + @JsonProperty("Anomalous") + private String anomalous; + @JsonProperty("DestinationPortID") + private Integer destinationPortID; + @JsonProperty("DestinationTidied") + private String destinationTidied; + @JsonProperty("DestinationUNLOCODE") + private String destinationUNLOCODE; + @JsonProperty("ImoVerified") + private String imoVerified; + @JsonProperty("LastStaticUpdateReceived") + private String lastStaticUpdateReceived; + @JsonProperty("LPCCode") + private Integer lpcCode; + @JsonProperty("MessageType") + private Integer messageType; + @JsonProperty("Source") + private String source; + @JsonProperty("StationId") + private String stationId; + @JsonProperty("ZoneId") + private Double zoneId; } diff --git a/src/main/java/com/snp/batch/jobs/aistarget/batch/entity/AisTargetEntity.java b/src/main/java/com/snp/batch/jobs/aistarget/batch/entity/AisTargetEntity.java index 0e4e1a9..1a83e4c 100644 --- a/src/main/java/com/snp/batch/jobs/aistarget/batch/entity/AisTargetEntity.java +++ b/src/main/java/com/snp/batch/jobs/aistarget/batch/entity/AisTargetEntity.java @@ -1,5 +1,6 @@ package com.snp.batch.jobs.aistarget.batch.entity; +import com.fasterxml.jackson.annotation.JsonProperty; import com.snp.batch.common.batch.entity.BaseEntity; import lombok.AllArgsConstructor; import lombok.Data; @@ -99,4 +100,22 @@ public class AisTargetEntity extends BaseEntity { * - Class B인 경우 항상 null */ private String core20Mmsi; + + // TargetEnhanced 컬럼 추가 + private Integer tonnesCargo; + private Integer inSTS; + private Boolean onBerth; + private Integer dwt; + private String anomalous; + private Integer destinationPortID; + private String destinationTidied; + private String destinationUNLOCODE; + private String imoVerified; + private OffsetDateTime lastStaticUpdateReceived; + private Integer lpcCode; + private Integer messageType; + private String source; + private String stationId; + private Double zoneId; + } diff --git a/src/main/java/com/snp/batch/jobs/aistarget/batch/processor/AisTargetDataProcessor.java b/src/main/java/com/snp/batch/jobs/aistarget/batch/processor/AisTargetDataProcessor.java index da146f7..4c8913d 100644 --- a/src/main/java/com/snp/batch/jobs/aistarget/batch/processor/AisTargetDataProcessor.java +++ b/src/main/java/com/snp/batch/jobs/aistarget/batch/processor/AisTargetDataProcessor.java @@ -95,6 +95,22 @@ public class AisTargetDataProcessor extends BaseProcessor { @Override protected String getApiPath() { - return "/AisSvc.svc/AIS/GetTargets"; + return "/AisSvc.svc/AIS/GetTargetsEnhanced"; } @Override diff --git a/src/main/java/com/snp/batch/jobs/aistarget/batch/repository/AisTargetRepositoryImpl.java b/src/main/java/com/snp/batch/jobs/aistarget/batch/repository/AisTargetRepositoryImpl.java index d70e02b..77803fb 100644 --- a/src/main/java/com/snp/batch/jobs/aistarget/batch/repository/AisTargetRepositoryImpl.java +++ b/src/main/java/com/snp/batch/jobs/aistarget/batch/repository/AisTargetRepositoryImpl.java @@ -43,7 +43,10 @@ public class AisTargetRepositoryImpl implements AisTargetRepository { age_minutes, position_accuracy, timestamp_utc, repeat_indicator, raim_flag, radio_status, regional, regional2, spare, spare2, ais_version, position_fix_type, dte, band_flag, - received_date, collected_at, created_at, updated_at + received_date, collected_at, created_at, updated_at, + tonnes_cargo, in_sts, on_berth, dwt, anomalous, + destination_port_id, destination_tidied, destination_unlocode, imo_verified, last_static_update_received, + lpc_code, message_type, "source", station_id, zone_id ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ST_SetSRID(ST_MakePoint(?, ?), 4326), @@ -53,7 +56,10 @@ public class AisTargetRepositoryImpl implements AisTargetRepository { ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, - ?, ?, NOW(), NOW() + ?, ?, NOW(), NOW(), + ?, ?, ?, ?, ?, + ?, ?, ?, ?, ?, + ?, ?, ?, ?, ? ) ON CONFLICT (mmsi, message_timestamp) DO UPDATE SET imo = EXCLUDED.imo, @@ -94,7 +100,22 @@ public class AisTargetRepositoryImpl implements AisTargetRepository { band_flag = EXCLUDED.band_flag, received_date = EXCLUDED.received_date, collected_at = EXCLUDED.collected_at, - updated_at = NOW() + updated_at = NOW(), + tonnes_cargo = EXCLUDED.tonnes_cargo, + in_sts = EXCLUDED.in_sts, + on_berth = EXCLUDED.on_berth, + dwt = EXCLUDED.dwt, + anomalous = EXCLUDED.anomalous, + destination_port_id = EXCLUDED.destination_port_id, + destination_tidied = EXCLUDED.destination_tidied, + destination_unlocode = EXCLUDED.destination_unlocode, + imo_verified = EXCLUDED.imo_verified, + last_static_update_received = EXCLUDED.last_static_update_received, + lpc_code = EXCLUDED.lpc_code, + message_type = EXCLUDED.message_type, + "source" = EXCLUDED."source", + station_id = EXCLUDED.station_id, + zone_id = EXCLUDED.zone_id """; // ==================== RowMapper ==================== @@ -139,6 +160,21 @@ public class AisTargetRepositoryImpl implements AisTargetRepository { .bandFlag(rs.getObject("band_flag", Integer.class)) .receivedDate(toOffsetDateTime(rs.getTimestamp("received_date"))) .collectedAt(toOffsetDateTime(rs.getTimestamp("collected_at"))) + .tonnesCargo(rs.getObject("tonnes_cargo", Integer.class)) + .inSTS(rs.getObject("in_sts", Integer.class)) + .onBerth(rs.getObject("on_berth", Boolean.class)) + .dwt(rs.getObject("dwt", Integer.class)) + .anomalous(rs.getString("anomalous")) + .destinationPortID(rs.getObject("destination_port_id", Integer.class)) + .destinationTidied(rs.getString("destination_tidied")) + .destinationUNLOCODE(rs.getString("destination_unlocode")) + .imoVerified(rs.getString("imo_verified")) + .lastStaticUpdateReceived(toOffsetDateTime(rs.getTimestamp("last_static_update_received"))) + .lpcCode(rs.getObject("lpc_code", Integer.class)) + .messageType(rs.getObject("message_type", Integer.class)) + .source(rs.getString("source")) + .stationId(rs.getString("station_id")) + .zoneId(rs.getObject("zone_id", Double.class)) .build(); // ==================== Repository Methods ==================== @@ -277,6 +313,22 @@ public class AisTargetRepositoryImpl implements AisTargetRepository { // 타임스탬프 ps.setTimestamp(idx++, toTimestamp(entity.getReceivedDate())); ps.setTimestamp(idx++, toTimestamp(entity.getCollectedAt())); + // TargetEnhanced 컬럼 추가 + ps.setObject(idx++, entity.getTonnesCargo()); + ps.setObject(idx++, entity.getInSTS()); + ps.setObject(idx++, entity.getOnBerth()); + ps.setObject(idx++, entity.getDwt()); + ps.setObject(idx++, entity.getAnomalous()); + ps.setObject(idx++, entity.getDestinationPortID()); + ps.setObject(idx++, entity.getDestinationTidied()); + ps.setObject(idx++, entity.getDestinationUNLOCODE()); + ps.setObject(idx++, entity.getImoVerified()); + ps.setTimestamp(idx++, toTimestamp(entity.getLastStaticUpdateReceived())); + ps.setObject(idx++, entity.getLpcCode()); + ps.setObject(idx++, entity.getMessageType()); + ps.setObject(idx++, entity.getSource()); + ps.setObject(idx++, entity.getStationId()); + ps.setObject(idx++, entity.getZoneId()); }); log.info("AIS Target 배치 UPSERT 완료: {} 건", entities.size());