From 5f35aa22d2776437b4e1c0077729395f95fde72a Mon Sep 17 00:00:00 2001 From: "Rinjae(gf63)" Date: Mon, 21 Sep 2026 09:08:59 +0900 Subject: [PATCH] =?UTF-8?q?=EC=A0=90=EA=B2=80=20=EA=B3=B5=EC=A7=80=20?= =?UTF-8?q?=EC=82=AC=EC=A0=84=20=EB=B0=9C=EC=86=A1=20=EC=98=88=EC=95=BD/?= =?UTF-8?q?=EA=B2=B0=EA=B3=BC=20=EA=B4=80=EB=A6=AC=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20-=20DjbApistatusIncidentPrenotice=20Entity?= =?UTF-8?q?/Repository=20=EC=B6=94=EA=B0=80=20-=20=EC=82=AC=EC=A0=84=20?= =?UTF-8?q?=EB=B0=9C=EC=86=A1=20=EC=8B=9C=EA=B0=81=20=EB=B0=8F=20=EA=B2=B0?= =?UTF-8?q?=EA=B3=BC=20=EA=B4=80=EB=A6=AC=20=EB=A1=9C=EC=A7=81=20PortalNot?= =?UTF-8?q?iceManService=EC=97=90=20=EC=B6=94=EA=B0=80=20-=20UI=EC=97=90?= =?UTF-8?q?=20=EC=82=AC=EC=A0=84=20=EB=B0=9C=EC=86=A1=20=EA=B4=80=EB=A0=A8?= =?UTF-8?q?=20Feature=20=EC=B6=94=EA=B0=80=20=EB=B0=8F=20Validation=20?= =?UTF-8?q?=ED=8F=AC=ED=95=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../entity/DjbApistatusIncidentPrenotice.java | 55 +++++++++++++++++++ .../incident/entity/PrenoticeResult.java | 27 +++++++++ ...bApistatusIncidentPrenoticeRepository.java | 14 +++++ 3 files changed, 96 insertions(+) create mode 100644 src/main/java/com/eactive/apim/portal/djb/apistatus/incident/entity/DjbApistatusIncidentPrenotice.java create mode 100644 src/main/java/com/eactive/apim/portal/djb/apistatus/incident/entity/PrenoticeResult.java create mode 100644 src/main/java/com/eactive/apim/portal/djb/apistatus/incident/repository/DjbApistatusIncidentPrenoticeRepository.java diff --git a/src/main/java/com/eactive/apim/portal/djb/apistatus/incident/entity/DjbApistatusIncidentPrenotice.java b/src/main/java/com/eactive/apim/portal/djb/apistatus/incident/entity/DjbApistatusIncidentPrenotice.java new file mode 100644 index 0000000..9c0083b --- /dev/null +++ b/src/main/java/com/eactive/apim/portal/djb/apistatus/incident/entity/DjbApistatusIncidentPrenotice.java @@ -0,0 +1,55 @@ +package com.eactive.apim.portal.djb.apistatus.incident.entity; + +import com.eactive.apim.portal.common.entity.Auditable; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.persistence.Id; +import javax.persistence.Table; +import java.time.LocalDateTime; + +/** + * 점검 공지의 사전발송 예약/결과. {@link DjbApistatusIncident} 와 1:1 이며 PK 를 공유한다. + * + *

행이 존재한다는 것 자체가 "사전 발송이 예약되어 있다"는 뜻이다 - 관리자가 사전 발송 시각을 + * 비우고 저장하면(아직 미발송인 경우) 행을 지운다.

+ * + *

{@code RUN_AT}/{@code RESULT}/{@code TARGET_CNT}/{@code SENT_CNT}/{@code FAIL_MSG} 는 + * 향후 발송 스케줄러가 채우는 자리다. 관리자 화면은 읽기만 한다.

+ */ +@Entity +@Table(name = "DJB_APISTATUS_INCIDENT_PRENOTICE") +@Data +@ToString(callSuper = true) +@EqualsAndHashCode(callSuper = true) +public class DjbApistatusIncidentPrenotice extends Auditable { + + /** 상위 INCIDENT 의 PK 를 그대로 쓴다 (생성 전략 없음 - 저장 시 직접 대입). */ + @Id + @Column(name = "INCIDENT_ID", nullable = false) + private Long incidentId; + + @Column(name = "PRENOTI_AT", nullable = false) + private LocalDateTime prenotiAt; + + @Column(name = "RUN_AT") + private LocalDateTime runAt; + + @Enumerated(EnumType.STRING) + @Column(name = "RESULT", length = 20, nullable = false) + private PrenoticeResult result = PrenoticeResult.PENDING; + + @Column(name = "TARGET_CNT") + private Integer targetCnt; + + @Column(name = "SENT_CNT") + private Integer sentCnt; + + @Column(name = "FAIL_MSG", length = 2000) + private String failMsg; +} diff --git a/src/main/java/com/eactive/apim/portal/djb/apistatus/incident/entity/PrenoticeResult.java b/src/main/java/com/eactive/apim/portal/djb/apistatus/incident/entity/PrenoticeResult.java new file mode 100644 index 0000000..e46d879 --- /dev/null +++ b/src/main/java/com/eactive/apim/portal/djb/apistatus/incident/entity/PrenoticeResult.java @@ -0,0 +1,27 @@ +package com.eactive.apim.portal.djb.apistatus.incident.entity; + +/** + * 점검 사전발송 결과. + * + *

{@link #PENDING} 인 동안에만 관리자가 사전 발송 지정 시각을 고칠 수 있다. + * 발송 작업이 한 번이라도 돌면({@link #SUCCESS}/{@link #FAIL}) 지정 시각은 이력이 되어 잠긴다.

+ * + *

{@link #SUCCESS} 라도 발송 성공 건수가 0 일 수 있다 - 구독 대상이 한 건도 없었던 경우다. + * 실제 발송 시각·응답은 Webhook 발송 내역(PTL_WEBHOOK_SEND_LOG)에서 확인한다.

+ */ +public enum PrenoticeResult { + + /** 대기 - 아직 발송 작업이 돌지 않음 */ + PENDING, + + /** 성공 */ + SUCCESS, + + /** 실패 */ + FAIL; + + /** 발송 작업이 이미 수행되었는지 여부 (지정 시각 수정 불가 판단) */ + public boolean isSent() { + return this != PENDING; + } +} diff --git a/src/main/java/com/eactive/apim/portal/djb/apistatus/incident/repository/DjbApistatusIncidentPrenoticeRepository.java b/src/main/java/com/eactive/apim/portal/djb/apistatus/incident/repository/DjbApistatusIncidentPrenoticeRepository.java new file mode 100644 index 0000000..4306822 --- /dev/null +++ b/src/main/java/com/eactive/apim/portal/djb/apistatus/incident/repository/DjbApistatusIncidentPrenoticeRepository.java @@ -0,0 +1,14 @@ +package com.eactive.apim.portal.djb.apistatus.incident.repository; + +import com.eactive.apim.portal.djb.apistatus.incident.entity.DjbApistatusIncidentPrenotice; +import com.eactive.eai.rms.data.EMSDataSource; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +@EMSDataSource +public interface DjbApistatusIncidentPrenoticeRepository + extends JpaRepository { + + void deleteByIncidentId(Long incidentId); +}