점검 공지 사전 발송 예약/결과 관리 기능 추가
eapim-portal CI (from elink-portal-common) / build (push) Has been cancelled

- DjbApistatusIncidentPrenotice Entity/Repository 추가
- 사전 발송 시각 및 결과 관리 로직 PortalNoticeManService에 추가
- UI에 사전 발송 관련 Feature 추가 및 Validation 포함
This commit is contained in:
Rinjae(gf63)
2026-09-21 09:08:59 +09:00
parent 2cdb08a26f
commit 5f35aa22d2
3 changed files with 96 additions and 0 deletions
@@ -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 를 공유한다.
*
* <p>행이 존재한다는 것 자체가 "사전 발송이 예약되어 있다"는 뜻이다 - 관리자가 사전 발송 시각을
* 비우고 저장하면(아직 미발송인 경우) 행을 지운다.</p>
*
* <p>{@code RUN_AT}/{@code RESULT}/{@code TARGET_CNT}/{@code SENT_CNT}/{@code FAIL_MSG} 는
* 향후 발송 스케줄러가 채우는 자리다. 관리자 화면은 읽기만 한다.</p>
*/
@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;
}
@@ -0,0 +1,27 @@
package com.eactive.apim.portal.djb.apistatus.incident.entity;
/**
* 점검 사전발송 결과.
*
* <p>{@link #PENDING} 인 동안에만 관리자가 사전 발송 지정 시각을 고칠 수 있다.
* 발송 작업이 한 번이라도 돌면({@link #SUCCESS}/{@link #FAIL}) 지정 시각은 이력이 되어 잠긴다.</p>
*
* <p>{@link #SUCCESS} 라도 발송 성공 건수가 0 일 수 있다 - 구독 대상이 한 건도 없었던 경우다.
* 실제 발송 시각·응답은 Webhook 발송 내역(PTL_WEBHOOK_SEND_LOG)에서 확인한다.</p>
*/
public enum PrenoticeResult {
/** 대기 - 아직 발송 작업이 돌지 않음 */
PENDING,
/** 성공 */
SUCCESS,
/** 실패 */
FAIL;
/** 발송 작업이 이미 수행되었는지 여부 (지정 시각 수정 불가 판단) */
public boolean isSent() {
return this != PENDING;
}
}
@@ -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<DjbApistatusIncidentPrenotice, Long> {
void deleteByIncidentId(Long incidentId);
}