shjung 2 жил өмнө
parent
commit
086e4fa56e

+ 1 - 1
src/main/java/com/its/op/controller/its/facility/TbFcltSttsAlrmStupController.java

@@ -12,7 +12,7 @@ import org.springframework.web.bind.annotation.*;
 import javax.validation.Valid;
 import java.util.List;
 
-@Api(tags = "01.시설물관리-4.시설물 상태 알람 설정")
+@Api(tags = "01.시설물관리-4.시설물정보 전파-1.시설물 상태 알람 설정")
 @Validated
 @RestController
 @RequiredArgsConstructor

+ 100 - 0
src/main/java/com/its/op/controller/its/facility/TbUserMsgController.java

@@ -0,0 +1,100 @@
+package com.its.op.controller.its.facility;
+
+import com.its.op.dto.its.oper.TbUserMsgDto;
+import com.its.op.dto.its.oper.TbUserMsgToDto;
+import com.its.op.service.its.oper.TbUserMsgService;
+import com.its.op.service.its.oper.TbUserMsgToService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import lombok.RequiredArgsConstructor;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import java.util.List;
+
+@Api(tags = "01.시설물관리-4.시설물정보 전파-2.유지보수 메시지 전송")
+@Validated
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("/api/facility/tb_user_msg")
+public class TbUserMsgController {
+
+    private final TbUserMsgService service;
+    private final TbUserMsgToService toService;
+
+    @ApiOperation(value = "사용자 메시지 전체조회(TB_USER_MSG)", response = TbUserMsgDto.class, responseContainer = "ArrayList")
+    @GetMapping(value = "/list", produces = {"application/json; charset=utf8"})
+    public List<TbUserMsgDto> findAllList() {
+        return this.service.findAllList();
+    }
+
+    @ApiOperation(value = "사용자 메시지 개별조회(TB_USER_MSG)", response = TbUserMsgDto.class)
+    @GetMapping(value = "/{msgNmbr}", produces = {"application/json; charset=utf8"})
+    public TbUserMsgDto findById(@PathVariable("msgNmbr") final Long msgNmbr) {
+        return this.service.findById(msgNmbr);
+    }
+
+    @ApiOperation(value = "사용자 메시지 정보변경(TB_USER_MSG)", response = TbUserMsgDto.class)
+    @PutMapping(value = "/{msgNmbr}", produces = {"application/json; charset=utf8"})
+    public TbUserMsgDto updateById(@PathVariable("msgNmbr") final Long msgNmbr, @RequestBody @Valid final TbUserMsgDto.TbUserMsgUpdReq req) {
+        return this.service.updateById(msgNmbr, req);
+    }
+
+    @ApiOperation(value = "사용자 메시지 정보변경/생성-개별(TB_USER_MSG)", response = TbUserMsgDto.class)
+    @PostMapping(value = "/{msgNmbr}", produces = {"application/json; charset=utf8"})
+    public TbUserMsgDto mergeInfo(@PathVariable("msgNmbr") final Long msgNmbr, @RequestBody @Valid final TbUserMsgDto.TbUserMsgUpdReq req) {
+        return this.service.mergeInfo(req);
+    }
+
+    @ApiOperation(value = "사용자 메시지 정보삭제-개별(TB_USER_MSG)", response = TbUserMsgDto.class)
+    @DeleteMapping(value = "/{msgNmbr}", produces = {"application/json; charset=utf8"})
+    public TbUserMsgDto deleteDataById(@PathVariable("msgNmbr") final Long msgNmbr) {
+        return this.service.deleteById(msgNmbr);
+    }
+
+    /**
+     * 로그인 사용자 Notify 메시지 조회
+     * @return
+     */
+    @ApiOperation(value = "로그인 사용자가 확인하지 않고 남아있는 메시지를 조회", response = TbUserMsgDto.class, responseContainer = "ArrayList")
+    @GetMapping(value = "/list/notify/{userId}", produces = {"application/json; charset=utf8"})
+    public List<TbUserMsgDto> findAllListNotify(@PathVariable("userId") final String userId) {
+        return this.service.findAllListNotify(userId);
+    }
+
+    @ApiOperation(value = "유지보수 메시지 이력 조회", response = TbUserMsgDto.class, responseContainer = "ArrayList")
+    @GetMapping(value = "/list/history", produces = {"application/json; charset=utf8"})
+    public List<TbUserMsgDto> findAllListHistory(
+            @ApiParam(name = "FROM_DT", value = "조회시작시각(YYYYMMDDHH24MI00)", example = "20220122000000", required = true)
+            @RequestParam String FROM_DT,
+            @ApiParam(name = "TO_DT", value = "조회종료시각(YYYYMMDDHH24MI59)", example = "20220122235959", required = true)
+            @RequestParam String TO_DT) {
+        return this.service.findAllListHistory(FROM_DT, TO_DT);
+    }
+
+    /**
+     * 사용자 메시지 대상 테이블 Controller
+     * @param msgNmbr
+     * @return
+     */
+    @ApiOperation(value = "사용자 메시지 대상 개별조회(TB_USER_MSG_TO)", response = TbUserMsgToDto.class, responseContainer = "ArrayList")
+    @GetMapping(value = "/to/{msgNmbr}", produces = {"application/json; charset=utf8"})
+    public List<TbUserMsgToDto> findAllListTo(@PathVariable("msgNmbr") final Long msgNmbr) {
+        return this.toService.findAllListTo(msgNmbr);
+    }
+
+    /**
+     * 사용자 메시지 확인
+     * @param msgNmbr
+     * @param userId
+     * @return
+     */
+    @ApiOperation(value = "사용자 메시지 확인", response = TbUserMsgToDto.class)
+    @PostMapping(value = "/to/cnfm/{msgNmbr}/{userId}", produces = {"application/json; charset=utf8"})
+    public TbUserMsgToDto mergeInfo(@PathVariable("msgNmbr") final Long msgNmbr, @PathVariable("userId") final String userId) {
+        return this.toService.cnfmMsg(msgNmbr, userId);
+    }
+
+}

+ 72 - 0
src/main/java/com/its/op/controller/its/facility/TbUserMsgToController.java

@@ -0,0 +1,72 @@
+package com.its.op.controller.its.facility;
+
+import com.its.op.dto.its.oper.TbUserMsgToDto;
+import com.its.op.entity.its.oper.TbUserMsgToKey;
+import com.its.op.service.its.oper.TbUserMsgToService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import java.util.List;
+
+@Api(tags = "사용자 메시지 대상")
+@Validated
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("/api/tb_user_msg_to")
+public class TbUserMsgToController {
+
+    private final TbUserMsgToService service;
+
+    @ApiOperation(value = "사용자 메시지 대상 전체조회(TB_USER_MSG_TO)", response = TbUserMsgToDto.class, responseContainer = "ArrayList")
+    @GetMapping(value = "", produces = {"application/json; charset=utf8"})
+    public List<TbUserMsgToDto> findAll() {
+        return this.service.findAll();
+    }
+
+    @ApiOperation(value = "사용자 메시지 대상 전체조회(TB_USER_MSG_TO)", response = TbUserMsgToDto.class, responseContainer = "ArrayList")
+    @GetMapping(value = "/list", produces = {"application/json; charset=utf8"})
+    public List<TbUserMsgToDto> findAllList() {
+        return this.service.findAllList();
+    }
+
+    @ApiOperation(value = "사용자 메시지 대상 개별조회(TB_USER_MSG_TO)", response = TbUserMsgToDto.class)
+    @GetMapping(value = "/{msgNmbr}", produces = {"application/json; charset=utf8"})
+    public TbUserMsgToDto findById(@PathVariable("msgNmbr") final TbUserMsgToKey msgNmbr) {
+        return this.service.findById(msgNmbr);
+    }
+
+    @ApiOperation(value = "사용자 메시지 대상 정보변경(TB_USER_MSG_TO)", response = TbUserMsgToDto.class)
+    @PutMapping(value = "/{msgNmbr}", produces = {"application/json; charset=utf8"})
+    public TbUserMsgToDto updateById(@PathVariable("msgNmbr") final TbUserMsgToKey msgNmbr, @RequestBody @Valid final TbUserMsgToDto.TbUserMsgToUpdReq req) {
+        return this.service.updateById(msgNmbr, req);
+    }
+
+    @ApiOperation(value = "사용자 메시지 대상 정보변경/생성-목록(TB_USER_MSG_TO)", response = TbUserMsgToDto.class, responseContainer = "ArrayList")
+    @PostMapping(value = "", produces = {"application/json; charset=utf8"})
+    public List<TbUserMsgToDto> mergeInfoList(@RequestBody @Valid final List<TbUserMsgToDto.TbUserMsgToUpdReq> listReq) {
+        return this.service.mergeInfoList(listReq);
+    }
+
+    @ApiOperation(value = "사용자 메시지 대상 정보변경/생성-개별(TB_USER_MSG_TO)", response = TbUserMsgToDto.class)
+    @PostMapping(value = "/{msgNmbr}", produces = {"application/json; charset=utf8"})
+    public TbUserMsgToDto mergeInfo(@PathVariable("msgNmbr") final TbUserMsgToKey msgNmbr, @RequestBody @Valid final TbUserMsgToDto.TbUserMsgToUpdReq req) {
+        return this.service.mergeInfo(req);
+    }
+
+    @ApiOperation(value = "사용자 메시지 대상 정보삭제-개별(TB_USER_MSG_TO)", response = TbUserMsgToDto.class)
+    @DeleteMapping(value = "/{msgNmbr}", produces = {"application/json; charset=utf8"})
+    public TbUserMsgToDto deleteDataById(@PathVariable("msgNmbr") final TbUserMsgToKey msgNmbr) {
+        return this.service.deleteById(msgNmbr);
+    }
+
+    @ApiOperation(value = "사용자 메시지 대상 정보삭제-목록(TB_USER_MSG_TO)", response = TbUserMsgToDto.class, responseContainer = "ArrayList")
+    @DeleteMapping(value = "", produces = {"application/json; charset=utf8"})
+    public List<TbUserMsgToDto> deleteDataByIds(@RequestBody @Valid final List<TbUserMsgToKey> ids) {
+        return this.service.deleteByIds(ids);
+    }
+
+}

+ 27 - 0
src/main/java/com/its/op/dao/repository/its/oper/TbUserMsgRepository.java

@@ -0,0 +1,27 @@
+package com.its.op.dao.repository.its.oper;
+
+import com.its.op.entity.its.oper.TbUserMsg;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public interface TbUserMsgRepository extends JpaRepository<TbUserMsg, Long>, JpaSpecificationExecutor<TbUserMsg> {
+
+    @Query("select p from TbUserMsg p")
+    List<TbUserMsg> findAll();
+
+    @Query("select p from TbUserMsg p")
+    List<TbUserMsg> findAllList();
+
+    @Query("select p from TbUserMsg p where p.msgNmbr in (select t.msgNmbr from TbUserMsgTo t where t.userId = :userId and t.cnfmYn = 'N') and p.strDt >= to_char(sysdate, 'YYYYMMDDHH24MISS') and p.endDt <= to_char(sysdate, 'YYYYMMDDHH24MISS')")
+    List<TbUserMsg> findAllListNotify(@Param("userId") String userId);
+
+    @Query("select p from TbUserMsg p where p.regDt between :fromDt and :toDt")
+    List<TbUserMsg> findAllListHistory(@Param("fromDt") String fromDt, @Param("toDt") String toDt);
+
+}

+ 25 - 0
src/main/java/com/its/op/dao/repository/its/oper/TbUserMsgToRepository.java

@@ -0,0 +1,25 @@
+package com.its.op.dao.repository.its.oper;
+
+import com.its.op.entity.its.oper.TbUserMsgTo;
+import com.its.op.entity.its.oper.TbUserMsgToKey;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public interface TbUserMsgToRepository extends JpaRepository<TbUserMsgTo, TbUserMsgToKey>, JpaSpecificationExecutor<TbUserMsgTo> {
+
+    @Query("select p from TbUserMsgTo p")
+    List<TbUserMsgTo> findAll();
+
+    @Query("select p from TbUserMsgTo p")
+    List<TbUserMsgTo> findAllList();
+
+    @Query("select p from TbUserMsgTo p where p.msgNmbr = :msgNmbr")
+    List<TbUserMsgTo> findAllListTo(@Param("msgNmbr") Long msgNmbr);
+
+}

+ 133 - 0
src/main/java/com/its/op/dto/its/oper/TbUserMsgDto.java

@@ -0,0 +1,133 @@
+package com.its.op.dto.its.oper;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.its.op.entity.its.oper.TbUserMsg;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.*;
+
+import javax.validation.constraints.PositiveOrZero;
+import javax.validation.constraints.Size;
+import java.io.Serializable;
+
+/**
+ * 사용자 메시지 DTO Class
+ */
+@Data
+@Builder
+@ApiModel("TbUserMsgDto(사용자 메시지)")
+public class TbUserMsgDto implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("메시지 관리번호")  // N NUMBER(10)
+    @JsonProperty("msg_nmbr")
+    private Long msgNmbr;
+
+    @ApiModelProperty("메시지 작성일시")  // Y VARCHAR2(14)
+    @JsonProperty("reg_dt")
+    private String regDt;
+
+    @ApiModelProperty("메시지 유형('FMSG')")  // Y VARCHAR2(7)
+    @JsonProperty("msg_cd")
+    private String msgCd;
+
+    @ApiModelProperty("메시지 제목")  // Y VARCHAR2(100)
+    @JsonProperty("msg_titl")
+    private String msgTitl;
+
+    @ApiModelProperty("메시지 내용")  // Y VARCHAR2(500)
+    @JsonProperty("msg_ctx")
+    private String msgCtx;
+
+    @ApiModelProperty("메시지 유효 시작일시")  // Y VARCHAR2(14)
+    @JsonProperty("str_dt")
+    private String strDt;
+
+    @ApiModelProperty("메시지 유효 종료일시")  // Y VARCHAR2(14)
+    @JsonProperty("end_dt")
+    private String endDt;
+
+    @ApiModelProperty("작성 사용자ID(사원번호)")  // N VARCHAR2(20)
+    @JsonProperty("user_id")
+    private String userId;
+
+    // Code Description Field
+    @ApiModelProperty("메시지 유형('FMSG') 설명")
+    @JsonProperty("msg_desc")    // MSG_CD
+    private String msgDesc;
+
+    @ApiModel("TbUserMsgUpdReq(사용자 메시지 정보변경)")
+    @Getter
+    @Setter
+    @ToString
+    @NoArgsConstructor//(access = AccessLevel.PROTECTED)
+    public static class TbUserMsgUpdReq {
+
+        @ApiModelProperty("메시지 관리번호, Nullable = N, NUMBER(10)")  // N NUMBER(10)
+        @JsonProperty("msg_nmbr")
+        @PositiveOrZero
+        private Long msgNmbr;
+
+        @ApiModelProperty("메시지 작성일시, Nullable = Y, VARCHAR2(14)")  // Y VARCHAR2(14)
+        @JsonProperty("reg_dt")
+        @Size(min=1, max=14)
+        private String regDt;
+
+        @ApiModelProperty("메시지 유형('FMSG'), Nullable = Y, VARCHAR2(7)")  // Y VARCHAR2(7)
+        @JsonProperty("msg_cd")
+        @Size(min=1, max=7)
+        private String msgCd;
+
+        @ApiModelProperty("메시지 제목, Nullable = Y, VARCHAR2(100)")  // Y VARCHAR2(100)
+        @JsonProperty("msg_titl")
+        @Size(min=1, max=100)
+        private String msgTitl;
+
+        @ApiModelProperty("메시지 내용, Nullable = Y, VARCHAR2(500)")  // Y VARCHAR2(500)
+        @JsonProperty("msg_ctx")
+        @Size(min=1, max=500)
+        private String msgCtx;
+
+        @ApiModelProperty("메시지 유효 시작일시, Nullable = Y, VARCHAR2(14)")  // Y VARCHAR2(14)
+        @JsonProperty("str_dt")
+        @Size(min=1, max=14)
+        private String strDt;
+
+        @ApiModelProperty("메시지 유효 종료일시, Nullable = Y, VARCHAR2(14)")  // Y VARCHAR2(14)
+        @JsonProperty("end_dt")
+        @Size(min=1, max=14)
+        private String endDt;
+
+        @ApiModelProperty("작성 사용자ID(사원번호), Nullable = N, VARCHAR2(20)")  // N VARCHAR2(20)
+        @JsonProperty("user_id")
+        @Size(min=1, max=20)
+        private String userId;
+
+        @Builder
+        public TbUserMsgUpdReq(Long msg_nmbr, String reg_dt, String msg_cd, String msg_titl, String msg_ctx, String str_dt, String end_dt, String user_id) {
+            this.msgNmbr = msg_nmbr;
+            this.regDt = reg_dt;
+            this.msgCd = msg_cd;
+            this.msgTitl = msg_titl;
+            this.msgCtx = msg_ctx;
+            this.strDt = str_dt;
+            this.endDt = end_dt;
+            this.userId = user_id;
+        }
+
+        public TbUserMsg toEntity() {
+            return TbUserMsg.builder()
+                    .msgNmbr(this.msgNmbr)
+                    .regDt(this.regDt)
+                    .msgCd(this.msgCd)
+                    .msgTitl(this.msgTitl)
+                    .msgCtx(this.msgCtx)
+                    .strDt(this.strDt)
+                    .endDt(this.endDt)
+                    .userId(this.userId)
+                    .build();
+        }
+
+    }
+
+}

+ 91 - 0
src/main/java/com/its/op/dto/its/oper/TbUserMsgToDto.java

@@ -0,0 +1,91 @@
+package com.its.op.dto.its.oper;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.its.op.entity.its.oper.TbUserMsgTo;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.*;
+
+import javax.validation.constraints.Pattern;
+import javax.validation.constraints.PositiveOrZero;
+import javax.validation.constraints.Size;
+import java.io.Serializable;
+
+/**
+ * 사용자 메시지 대상 DTO Class
+ */
+@Data
+@Builder
+@ApiModel("TbUserMsgToDto(사용자 메시지 대상)")
+public class TbUserMsgToDto implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("메시지 관리번호")  // N NUMBER(10)
+    @JsonProperty("msg_nmbr")
+    private Long msgNmbr;
+
+    @ApiModelProperty("대상 사용자ID(사원번호)")  // N VARCHAR2(20)
+    @JsonProperty("user_id")
+    private String userId;
+
+    @ApiModelProperty("확인 여부")  // Y CHAR(1)
+    @JsonProperty("cnfm_yn")
+    private String cnfmYn;
+
+    @ApiModelProperty("확인 일시")  // Y VARCHAR2(14)
+    @JsonProperty("cnfm_dt")
+    private String cnfmDt;
+
+    // Code Description Field
+    @ApiModelProperty("확인 여부 설명")
+    @JsonProperty("cnfm_desc")    // CNFM_YN
+    private String cnfmDesc;
+
+    @ApiModel("TbUserMsgToUpdReq(사용자 메시지 대상 정보변경)")
+    @Getter
+    @Setter
+    @ToString
+    @NoArgsConstructor//(access = AccessLevel.PROTECTED)
+    public static class TbUserMsgToUpdReq {
+
+        @ApiModelProperty("메시지 관리번호, Nullable = N, NUMBER(10)")  // N NUMBER(10)
+        @JsonProperty("msg_nmbr")
+        @PositiveOrZero
+        private Long msgNmbr;
+
+        @ApiModelProperty("대상 사용자ID(사원번호), Nullable = N, VARCHAR2(20)")  // N VARCHAR2(20)
+        @JsonProperty("user_id")
+        @Size(min=1, max=20)
+        private String userId;
+
+        @ApiModelProperty("확인 여부, Nullable = Y, CHAR(1)")  // Y CHAR(1)
+        @JsonProperty("cnfm_yn")
+        @Size(min=1, max=1)
+        @Pattern(regexp = "[YN]")
+        private String cnfmYn;
+
+        @ApiModelProperty("확인 일시, Nullable = Y, VARCHAR2(14)")  // Y VARCHAR2(14)
+        @JsonProperty("cnfm_dt")
+        @Size(min=1, max=14)
+        private String cnfmDt;
+
+        @Builder
+        public TbUserMsgToUpdReq(Long msg_nmbr, String user_id, String cnfm_yn, String cnfm_dt) {
+            this.msgNmbr = msg_nmbr;
+            this.userId = user_id;
+            this.cnfmYn = cnfm_yn;
+            this.cnfmDt = cnfm_dt;
+        }
+
+        public TbUserMsgTo toEntity() {
+            return TbUserMsgTo.builder()
+                    .msgNmbr(this.msgNmbr)
+                    .userId(this.userId)
+                    .cnfmYn(this.cnfmYn)
+                    .cnfmDt(this.cnfmDt)
+                    .build();
+        }
+
+    }
+
+}

+ 90 - 0
src/main/java/com/its/op/entity/its/oper/TbUserMsg.java

@@ -0,0 +1,90 @@
+package com.its.op.entity.its.oper;
+
+import com.its.op.dto.its.oper.TbUserMsgDto;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import java.io.Serializable;
+
+/**
+ * 사용자 메시지 Entity Class
+ */
+@Getter
+@NoArgsConstructor//(access = AccessLevel.PROTECTED)
+@Builder
+@AllArgsConstructor
+@ApiModel("사용자 메시지")
+@Entity
+@Table(name = "TB_USER_MSG")
+public class TbUserMsg implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("메시지 관리번호")  // N NUMBER(10)
+    @Id
+    @Column(name = "MSG_NMBR", nullable = false, columnDefinition = "NUMBER", length = 10)
+    private Long msgNmbr;
+
+    @ApiModelProperty("메시지 작성일시")  // Y VARCHAR2(14)
+    @Column(name = "REG_DT", length = 14)
+    private String regDt;
+
+    @ApiModelProperty("메시지 유형('FMSG')")  // Y VARCHAR2(7)
+    @Column(name = "MSG_CD", length = 7)
+    private String msgCd;
+
+    @ApiModelProperty("메시지 제목")  // Y VARCHAR2(100)
+    @Column(name = "MSG_TITL", length = 100)
+    private String msgTitl;
+
+    @ApiModelProperty("메시지 내용")  // Y VARCHAR2(500)
+    @Column(name = "MSG_CTX", length = 500)
+    private String msgCtx;
+
+    @ApiModelProperty("메시지 유효 시작일시")  // Y VARCHAR2(14)
+    @Column(name = "STR_DT", length = 14)
+    private String strDt;
+
+    @ApiModelProperty("메시지 유효 종료일시")  // Y VARCHAR2(14)
+    @Column(name = "END_DT", length = 14)
+    private String endDt;
+
+    @ApiModelProperty("작성 사용자ID(사원번호)")  // N VARCHAR2(20)
+    @Column(name = "USER_ID", nullable = false, length = 20)
+    private String userId;
+
+    public TbUserMsgDto toDto() {
+        return TbUserMsgDto.builder()
+                .msgNmbr(this.msgNmbr)
+                .regDt(this.regDt)
+                .msgCd(this.msgCd)
+                .msgTitl(this.msgTitl)
+                .msgCtx(this.msgCtx)
+                .strDt(this.strDt)
+                .endDt(this.endDt)
+                .userId(this.userId)
+                .build();
+    }
+
+    public TbUserMsg(Long msgNmbr) {
+        this.msgNmbr = msgNmbr;
+    }
+
+    public void updateInfo(TbUserMsgDto.TbUserMsgUpdReq req) {
+        this.regDt = req.getRegDt();
+        this.msgCd = req.getMsgCd();
+        this.msgTitl = req.getMsgTitl();
+        this.msgCtx = req.getMsgCtx();
+        this.strDt = req.getStrDt();
+        this.endDt = req.getEndDt();
+        this.userId = req.getUserId();
+    }
+
+}

+ 71 - 0
src/main/java/com/its/op/entity/its/oper/TbUserMsgTo.java

@@ -0,0 +1,71 @@
+package com.its.op.entity.its.oper;
+
+import com.its.op.dto.its.oper.TbUserMsgToDto;
+import com.its.utils.SysUtils;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.*;
+import java.io.Serializable;
+
+/**
+ * 사용자 메시지 대상 Entity Class
+ */
+@Getter
+@NoArgsConstructor//(access = AccessLevel.PROTECTED)
+@Builder
+@AllArgsConstructor
+@ApiModel("사용자 메시지 대상")
+@Entity
+@Table(name = "TB_USER_MSG_TO")
+@IdClass(TbUserMsgToKey.class)
+public class TbUserMsgTo implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("메시지 관리번호")  // N NUMBER(10)
+    @Id
+    @Column(name = "MSG_NMBR", nullable = false, columnDefinition = "NUMBER", length = 10)
+    private Long msgNmbr;
+
+    @ApiModelProperty("대상 사용자ID(사원번호)")  // N VARCHAR2(20)
+    @Id
+    @Column(name = "USER_ID", nullable = false, length = 20)
+    private String userId;
+
+    @ApiModelProperty("확인 여부")  // Y CHAR(1)
+    @Column(name = "CNFM_YN", columnDefinition = "CHAR", length = 1)
+    private String cnfmYn;
+
+    @ApiModelProperty("확인 일시")  // Y VARCHAR2(14)
+    @Column(name = "CNFM_DT", length = 14)
+    private String cnfmDt;
+
+    public void cnfmMsg() {
+        this.cnfmYn = "Y";
+        this.cnfmDt = SysUtils.getSysTime();
+    }
+
+    public TbUserMsgToDto toDto() {
+        return TbUserMsgToDto.builder()
+                .msgNmbr(this.msgNmbr)
+                .userId(this.userId)
+                .cnfmYn(this.cnfmYn)
+                .cnfmDt(this.cnfmDt)
+                .build();
+    }
+
+    public TbUserMsgTo(Long msgNmbr, String userId) {
+        this.msgNmbr = msgNmbr;
+        this.userId = userId;
+    }
+
+    public void updateInfo(TbUserMsgToDto.TbUserMsgToUpdReq req) {
+        this.cnfmYn = req.getCnfmYn();
+        this.cnfmDt = req.getCnfmDt();
+    }
+
+}

+ 24 - 0
src/main/java/com/its/op/entity/its/oper/TbUserMsgToKey.java

@@ -0,0 +1,24 @@
+package com.its.op.entity.its.oper;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+/**
+ * 사용자 메시지 대상 Key Class
+ */
+@Data
+@NoArgsConstructor//(access = AccessLevel.PROTECTED)
+@AllArgsConstructor
+public class TbUserMsgToKey implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    // MSG_NMBR, 메시지 관리번호  // N NUMBER(10)
+    private Long msgNmbr;
+
+    // USER_ID, 대상 사용자ID(사원번호)  // N VARCHAR2(20)
+    private String userId;
+
+}

+ 145 - 0
src/main/java/com/its/op/service/its/oper/TbUserMsgService.java

@@ -0,0 +1,145 @@
+package com.its.op.service.its.oper;
+
+import com.its.op.dao.repository.its.oper.TbUserMsgRepository;
+import com.its.op.dto.its.oper.TbUserMsgDto;
+import com.its.op.entity.its.oper.TbUserMsg;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.NoSuchElementException;
+import java.util.Optional;
+
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class TbUserMsgService {
+
+    private final TbUserMsgRepository repo;
+
+    // 데이터 1건 조회, 없으면 exception
+    private TbUserMsg requireOne(Long msgNmbr) throws NoSuchElementException {
+        Optional<TbUserMsg> info = this.repo.findById(msgNmbr);
+        if (info.isPresent()) {
+            return info.get();
+        }
+        else {
+            throw new NoSuchElementException("데이터가 존재하지 않습니다: " + msgNmbr);
+        }
+    }
+
+    /**
+     * 로그인 사용자가 확인하지 않고 남아있는 메시지를 조회
+     * @param userId
+     * @return
+     */
+    @Transactional(readOnly = true)
+    public List<TbUserMsgDto> findAllListNotify(String userId) {
+        List<TbUserMsgDto> result = new ArrayList<>();
+        List<TbUserMsg> data = this.repo.findAllListNotify(userId);
+        for (TbUserMsg entity : data) {
+            result.add(entity.toDto());
+        }
+        return result;
+    }
+
+    /**
+     * 사용자 메시지 이력 조회
+     * @param fromDt
+     * @param toDt
+     * @return
+     */
+    @Transactional(readOnly = true)
+    public List<TbUserMsgDto> findAllListHistory(String fromDt, String toDt) {
+        List<TbUserMsgDto> result = new ArrayList<>();
+        List<TbUserMsg> data = this.repo.findAllListHistory(fromDt, toDt);
+        for (TbUserMsg entity : data) {
+            result.add(entity.toDto());
+        }
+        return result;
+    }
+
+    // 전체 데이터 조회
+    @Transactional(readOnly = true)
+    public List<TbUserMsgDto> findAll() {
+        List<TbUserMsgDto> result = new ArrayList<>();
+        List<TbUserMsg> data = this.repo.findAll();
+        for (TbUserMsg entity : data) {
+            result.add(entity.toDto());
+        }
+        return result;
+    }
+
+    // 전체 데이터 조회
+    @Transactional(readOnly = true)
+    public List<TbUserMsgDto> findAllList() {
+        List<TbUserMsgDto> result = new ArrayList<>();
+        List<TbUserMsg> data = this.repo.findAllList();
+        for (TbUserMsg entity : data) {
+            result.add(entity.toDto());
+        }
+        return result;
+    }
+
+    // 데이터 1건 조회(기존 데이터가 반드시 존재해야 함)
+    @Transactional(readOnly = true)
+    public TbUserMsgDto findById(Long msgNmbr) {
+        TbUserMsg entity = requireOne(msgNmbr);
+        return entity.toDto();
+    }
+
+    // 데이터 변경
+    @Transactional
+    public TbUserMsgDto updateById(Long msgNmbr, TbUserMsgDto.TbUserMsgUpdReq req) {
+        TbUserMsg entity = requireOne(msgNmbr);
+        entity.updateInfo(req);
+        this.repo.save(entity);
+        return entity.toDto();
+    }
+
+    // 데이터 변경 또는 생성-목록(데이터가 존재하면 업데이트 없으면 신규로 생성)
+    @Transactional
+    public List<TbUserMsgDto> mergeInfoList(List<TbUserMsgDto.TbUserMsgUpdReq> reqList) {
+        List<TbUserMsgDto> result = new ArrayList<>();
+        for (TbUserMsgDto.TbUserMsgUpdReq req : reqList) {
+            TbUserMsg obj = req.toEntity();
+            this.repo.save(obj);
+            result.add(obj.toDto());
+        }
+        return result;
+    }
+
+    // 데이터 변경 또는 생성-개별(데이터가 존재하면 업데이트 없으면 신규로 생성)
+    @Transactional
+    public TbUserMsgDto mergeInfo(TbUserMsgDto.TbUserMsgUpdReq req) {
+        TbUserMsg obj = req.toEntity();
+        this.repo.save(obj);
+        return obj.toDto();
+    }
+
+    // 정보 삭제-개별, 데이터 존재하지 않으면 Exception
+    @Transactional
+    public TbUserMsgDto deleteById(Long msgNmbr) {
+        TbUserMsg entity = requireOne(msgNmbr);
+        this.repo.deleteById(msgNmbr);
+        return entity.toDto();
+    }
+
+    // 정보 삭제-목록, 존재하는 데이터 만 삭제
+    @Transactional
+    public List<TbUserMsgDto> deleteByIds(List<Long> ids) {
+        List<TbUserMsgDto> result = new ArrayList<>();
+        for (Long id : ids) {
+            Optional<TbUserMsg> obj = this.repo.findById(id);
+            if (obj.isPresent()) {
+                this.repo.deleteById(id);
+                result.add(obj.get().toDto());
+            }
+        }
+        return result;
+    }
+
+}

+ 151 - 0
src/main/java/com/its/op/service/its/oper/TbUserMsgToService.java

@@ -0,0 +1,151 @@
+package com.its.op.service.its.oper;
+
+import com.its.op.dao.repository.its.oper.TbUserMsgToRepository;
+import com.its.op.dto.its.oper.TbUserMsgToDto;
+import com.its.op.entity.its.oper.TbUserMsgTo;
+import com.its.op.entity.its.oper.TbUserMsgToKey;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.NoSuchElementException;
+import java.util.Optional;
+
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class TbUserMsgToService {
+
+    private final TbUserMsgToRepository repo;
+
+    // 데이터 1건 조회, 없으면 exception
+    private TbUserMsgTo requireOne(TbUserMsgToKey msgKey) throws NoSuchElementException {
+        Optional<TbUserMsgTo> info = this.repo.findById(msgKey);
+        if (info.isPresent()) {
+            return info.get();
+        }
+        else {
+            throw new NoSuchElementException("데이터가 존재하지 않습니다: " + msgKey);
+        }
+    }
+
+    /**
+     * 메시지 넘버에 해당하는 대상 사용자 정보 조회
+     * @param msgNmbr
+     * @return
+     */
+    @Transactional(readOnly = true)
+    public List<TbUserMsgToDto> findAllListTo(Long msgNmbr) {
+        List<TbUserMsgToDto> result = new ArrayList<>();
+        List<TbUserMsgTo> data = this.repo.findAllListTo(msgNmbr);
+        for (TbUserMsgTo entity : data) {
+            result.add(entity.toDto());
+        }
+        return result;
+    }
+
+    /**
+     * 대상 메시지 확인
+     * @param msgNmbr
+     * @param userId
+     * @return
+     */
+    @Transactional
+    public TbUserMsgToDto cnfmMsg(Long msgNmbr, String userId) {
+        TbUserMsgToKey msgKey = new TbUserMsgToKey(msgNmbr, userId);
+        TbUserMsgTo entity = requireOne(msgKey);
+        entity.cnfmMsg();
+        this.repo.save(entity);
+        return entity.toDto();
+    }
+
+
+
+
+
+
+
+
+    // 전체 데이터 조회
+    @Transactional(readOnly = true)
+    public List<TbUserMsgToDto> findAll() {
+        List<TbUserMsgToDto> result = new ArrayList<>();
+        List<TbUserMsgTo> data = this.repo.findAll();
+        for (TbUserMsgTo entity : data) {
+            result.add(entity.toDto());
+        }
+        return result;
+    }
+
+    // 전체 데이터 조회
+    @Transactional(readOnly = true)
+    public List<TbUserMsgToDto> findAllList() {
+        List<TbUserMsgToDto> result = new ArrayList<>();
+        List<TbUserMsgTo> data = this.repo.findAllList();
+        for (TbUserMsgTo entity : data) {
+            result.add(entity.toDto());
+        }
+        return result;
+    }
+
+    // 데이터 1건 조회(기존 데이터가 반드시 존재해야 함)
+    @Transactional(readOnly = true)
+    public TbUserMsgToDto findById(TbUserMsgToKey msgNmbr) {
+        TbUserMsgTo entity = requireOne(msgNmbr);
+        return entity.toDto();
+    }
+
+    // 데이터 변경
+    @Transactional
+    public TbUserMsgToDto updateById(TbUserMsgToKey msgNmbr, TbUserMsgToDto.TbUserMsgToUpdReq req) {
+        TbUserMsgTo entity = requireOne(msgNmbr);
+        entity.updateInfo(req);
+        this.repo.save(entity);
+        return entity.toDto();
+    }
+
+    // 데이터 변경 또는 생성-목록(데이터가 존재하면 업데이트 없으면 신규로 생성)
+    @Transactional
+    public List<TbUserMsgToDto> mergeInfoList(List<TbUserMsgToDto.TbUserMsgToUpdReq> reqList) {
+        List<TbUserMsgToDto> result = new ArrayList<>();
+        for (TbUserMsgToDto.TbUserMsgToUpdReq req : reqList) {
+            TbUserMsgTo obj = req.toEntity();
+            this.repo.save(obj);
+            result.add(obj.toDto());
+        }
+        return result;
+    }
+
+    // 데이터 변경 또는 생성-개별(데이터가 존재하면 업데이트 없으면 신규로 생성)
+    @Transactional
+    public TbUserMsgToDto mergeInfo(TbUserMsgToDto.TbUserMsgToUpdReq req) {
+        TbUserMsgTo obj = req.toEntity();
+        this.repo.save(obj);
+        return obj.toDto();
+    }
+
+    // 정보 삭제-개별, 데이터 존재하지 않으면 Exception
+    @Transactional
+    public TbUserMsgToDto deleteById(TbUserMsgToKey msgNmbr) {
+        TbUserMsgTo entity = requireOne(msgNmbr);
+        this.repo.deleteById(msgNmbr);
+        return entity.toDto();
+    }
+
+    // 정보 삭제-목록, 존재하는 데이터 만 삭제
+    @Transactional
+    public List<TbUserMsgToDto> deleteByIds(List<TbUserMsgToKey> ids) {
+        List<TbUserMsgToDto> result = new ArrayList<>();
+        for (TbUserMsgToKey id : ids) {
+            Optional<TbUserMsgTo> obj = this.repo.findById(id);
+            if (obj.isPresent()) {
+                this.repo.deleteById(id);
+                result.add(obj.get().toDto());
+            }
+        }
+        return result;
+    }
+}