diff --git a/bin/main/mybatis/mapper/noti/NotiMapper_maria.xml b/bin/main/mybatis/mapper/noti/NotiMapper_maria.xml new file mode 100644 index 0000000..ae9d0f3 --- /dev/null +++ b/bin/main/mybatis/mapper/noti/NotiMapper_maria.xml @@ -0,0 +1,107 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/egovframework/util/DateUtil.java b/src/main/java/egovframework/util/DateUtil.java index 7d58352..4a77f5b 100644 --- a/src/main/java/egovframework/util/DateUtil.java +++ b/src/main/java/egovframework/util/DateUtil.java @@ -49,6 +49,18 @@ public class DateUtil { LocalDate now = LocalDate.now(); return now.plusDays(days).format(DateTimeFormatter.ofPattern(pattern)); } + + /** + * 현재 날짜에 지정된 개월수를 더하거나 뺀 날짜를 지정된 형식으로 반환 + * + * @param pattern 날짜 형식 (예: "yyyy-MM-dd", "yyyyMMdd") + * @param months 더하거나 뺄 개월수 (양수: 더하기, 음수: 빼기) + * @return 계산된 날짜 + */ + public static String getCurrentDateAddMonths(String pattern, int months) { + LocalDate now = LocalDate.now(); + return now.plusMonths(months).format(DateTimeFormatter.ofPattern(pattern)); + } /** * 현재 날짜와 시간을 지정된 형식으로 반환 diff --git a/src/main/java/go/kr/project/noti/controller/NotiController.java b/src/main/java/go/kr/project/noti/controller/NotiController.java new file mode 100644 index 0000000..51ea506 --- /dev/null +++ b/src/main/java/go/kr/project/noti/controller/NotiController.java @@ -0,0 +1,122 @@ +package go.kr.project.noti.controller; + +import egovframework.constant.MessageConstants; +import egovframework.constant.TilesConstants; +import egovframework.exception.MessageException; +import egovframework.util.ApiResponseUtil; +import egovframework.util.SessionUtil; +import go.kr.project.common.model.CmmnCodeSearchVO; +import go.kr.project.common.service.CommonCodeService; +import go.kr.project.noti.model.NotiImpltInfoVO; +import go.kr.project.noti.model.NotiImpltTrprInfoVO; +import go.kr.project.noti.service.NotiService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.servlet.ModelAndView; + +import javax.servlet.http.HttpServletRequest; +import java.util.List; + +/** + * packageName : go.kr.project.noti.controller + * fileName : NotiController + * author : 김의진 + * date : 2025-09-11 + * description : 이행정보 관리 관련 요청을 처리하는 컨트롤러 + * 중요한 로직 주석: 이행정보 관련 화면 제공 및 CRUD API를 처리하는 컨트롤러 + * =========================================================== + * DATE AUTHOR NOTE + * ----------------------------------------------------------- + * 2025-09-11 김의진 최초 생성 + */ + +@Controller +@RequestMapping("/noti") +@RequiredArgsConstructor +@Slf4j +@Tag(name = "이행정보 관리", description = "이행 정보 관리 관련 API") +public class NotiController { + + /** 이행정보 서비스 */ + private final NotiService service; + + /** 코드 서비스 */ + private final CommonCodeService commonCodeService; + + @GetMapping("/list.do") + @Operation(summary = "이행정보 관리 화면", description = "이행정보 목록을 조회합니다.") + public String mainPage(Model model, HttpServletRequest request) { + + //진행단계 코드 조회 + CmmnCodeSearchVO impltTaskSeCdSearchVO = CmmnCodeSearchVO.builder() + .searchCdGroupId("IMPLT_TASK_SE_CD") + .sortColumn("SORT_ORDR") + .sortAscending(true) + .build(); + model.addAttribute("impltTaskSeCdList", commonCodeService.selectCodeDetailList(impltTaskSeCdSearchVO)); + + return "noti/list"+ TilesConstants.BASE; + } + + /** + * 이행정보 목록을 조회하는 AJAX 메소드 + * 공통 응답 형식(ApiResponse)을 사용하여 응답합니다. + * + * @param paramVO 검색 조건을 담은 VO 객체 + * @return 이행정보 목록과 성공 상태를 담은 ResponseEntity 객체 + * @throws Exception 조회 중 발생할 수 있는 예외 + */ + @Operation(summary = "이행정보 목록 조회 (AJAX)", description = "이행정보 목록을 조회하고 JSON 형식으로 반환합니다.") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "이행정보 목록 조회 성공"), + @ApiResponse(responseCode = "400", description = "이행정보 목록 조회 실패"), + @ApiResponse(description = "오류로 인한 실패") + }) + @PostMapping("/impltInfolist.ajax") + public ResponseEntity impltInfolistAjax(@ModelAttribute NotiImpltInfoVO paramVO) { + + // 총 이행정보 수 조회 + int totalCount = service.selectImpltInfoListTotalCount(paramVO); + paramVO.setTotalCount(totalCount); + + // 페이징 처리를 위한 설정 + paramVO.setPagingYn("Y"); + + // 페이징 처리된 이행정보 목록 조회 + List list = service.selectImpltInfoList(paramVO); + return ApiResponseUtil.successWithGrid(list, paramVO); + } + + /** + * 이행 대상자를 조회하는 AJAX 메소드 + * + * @param paramVO 검색 조건을 담은 VO 객체 + * @return 이행 대상자 목록과 성공 상태를 담은 ResponseEntity 객체 + * @throws Exception 조회 중 발생할 수 있는 예외 + */ + @Operation(summary = "이행 대상자 목록 조회", description = "이행 대상자 목록을 조회합니다.") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "이행 대상자 목록 조회 성공"), + @ApiResponse(responseCode = "400", description = "이행 대상자 목록 조회 실패"), + @ApiResponse(description = "오류로 인한 실패") + }) + @PostMapping("/impltTrprInfolist.ajax") + public ResponseEntity impltTrprInfolistAjax(@ModelAttribute NotiImpltTrprInfoVO paramVO) { + + List result = service.selectImpltTrprInfoList(paramVO); + + return ApiResponseUtil.successWithGrid(result, paramVO); + + } + + +} diff --git a/src/main/java/go/kr/project/noti/mapper/NotiMapper.java b/src/main/java/go/kr/project/noti/mapper/NotiMapper.java new file mode 100644 index 0000000..db4ff24 --- /dev/null +++ b/src/main/java/go/kr/project/noti/mapper/NotiMapper.java @@ -0,0 +1,49 @@ +package go.kr.project.noti.mapper; + +import go.kr.project.noti.model.NotiImpltInfoVO; +import go.kr.project.noti.model.NotiImpltTrprInfoVO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * packageName : go.kr.project.noti.mapper + * fileName : NotiMapper + * author : 김의진 + * date : 2025-09-11 + * description : 이행정보 관련 데이터베이스 접근을 위한 MyBatis 매퍼 인터페이스 + * 중요한 로직 주석: 이행정보 테이블(tb_implt_info)과 이행대상자 테이블(tb_implt_trpr_info)에 대한 CRUD 작업을 수행한다. + * =========================================================== + * DATE AUTHOR NOTE + * ----------------------------------------------------------- + * 2025-09-08 시스템 관리자 최초 생성 + */ +@Mapper +public interface NotiMapper { + + // ==================== 이행정보(TB_IMPLT_INFO) 관련 메서드 ==================== + + /** + * 이행정보 목록의 총 개수를 조회한다. + * @param vo 검색 조건을 담은 VO 객체 + * @return 조회된 목록의 총 개수 + */ + int selectImpltInfoListTotalCount(NotiImpltInfoVO vo); + + /** + * 이행정보 목록을 조회한다. + * @param vo 조회할 단속 정보와 이행업무구분코드를 담은 VO 객체 + * @return 조회된 이행정보 + */ + List selectImpltInfoList(NotiImpltInfoVO vo); + + // ==================== 이행 대상자 정보(TB_IMPLT_TRPR_INFO) 관련 메서드 ==================== + + /** + * 이행 대상자 정보 목록을 조회한다. + * @param vo 조회할 이행정보 ID를 담은 VO 객체 + * @return 이행 대상자 정보 목록 + */ + List selectImpltTrprInfoList(NotiImpltTrprInfoVO vo); + +} \ No newline at end of file diff --git a/src/main/java/go/kr/project/noti/model/NotiImpltInfoVO.java b/src/main/java/go/kr/project/noti/model/NotiImpltInfoVO.java new file mode 100644 index 0000000..1805ce8 --- /dev/null +++ b/src/main/java/go/kr/project/noti/model/NotiImpltInfoVO.java @@ -0,0 +1,132 @@ +package go.kr.project.noti.model; + +import com.fasterxml.jackson.annotation.JsonFormat; +import go.kr.project.common.model.PagingVO; +import lombok.*; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; +import java.util.List; + +/** + * packageName : go.kr.project.noti.model + * fileName : NotiImpltInfoVO + * author : 김의진 + * date : 2025-09-11 + * description : 이행정보 관련 데이터를 담는 Value Object 클래스 + * 중요한 로직 주석: 이행정보 테이블(tb_implt_info)과 매핑되는 VO 클래스로 페이징 기능을 포함한다. + * =========================================================== + * DATE AUTHOR NOTE + * ----------------------------------------------------------- + * 2025-09-11 김의진 최초 생성 + */ +@EqualsAndHashCode(callSuper=true) +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@ToString +public class NotiImpltInfoVO extends PagingVO { + + // ==================== 기본 테이블 컬럼 (TB_IMPLT_INFO) ==================== + + /** 이행정보 ID */ + private String impltInfoId; + + /** 시군구 코드 */ + private String sggCd; + + /** 단속 연도 */ + private String crdnYr; + + /** 단속 번호 */ + private String crdnNo; + + /** 이행업무구분코드 (1:처분사전, 2:시정명령, 3:시정촉구, 4:부과예고, 5:부과, 6:납부촉구) */ + private String impltTaskSeCd; + + /** 이행 시작 일자 (행정처분 시작일) */ + private String impltBgngYmd; + + /** 이행 종료 일자 (행정처분 종료일) */ + private String impltEndYmd; + + /** 행정처분 간격일 (자동계산) */ + private Integer impltDaysCnt; + + /** 등록 일시 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Seoul") + private LocalDateTime regDt; + + /** 등록자 */ + private String rgtr; + + /** 수정 일시 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Seoul") + private LocalDateTime mdfcnDt; + + /** 수정자 */ + private String mdfr; + + /** 삭제 여부 */ + private String delYn; + + /** 삭제 일시 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Seoul") + private LocalDateTime delDt; + + /** 삭제자 */ + private String dltr; + + // ==================== 추가 필드 ==================== + + /** 모드 (C:등록, U:수정, V:보기, D:삭제) */ + private String mode; + + /** 단속 정보 (조인용) */ + private String dsclYmd; // 적발일자 + private String exmnr; // 조사원 + private String lotnoWholAddr; // 지번전체주소 + private String lotnoAddr; // 지번주소 + private String lotnoMno; // 지번본번 + private String lotnoSno; // 지번부번 + + // ==================== 조인 컬럼 (코드명) ==================== + + /** 이행업무구분코드명 */ + private String impltTaskSeCdNm; + + /** 지역구분코드 */ + private String rgnSeCd; + + /** 지역구분코드명 */ + private String rgnSeCdNm; + + /** 표준읍면동코드 */ + private String stdgEmdCd; + + /** 표준읍면동코드명 */ + private String stdgEmdCdNm; + + private String rgtrNm; + private String mdrfNm; + + // ==================== 검색 조건 ==================== + + /** 검색 조건 - 단속 연도 */ + private String schCrdnYr; + + /** 검색 조건 - 진행 단계 코드 */ + private String schImpltTaskSeCd; + + /** 검색 조건 - 행정처분시작일 */ + private String schImpltBgngYmd1; + private String schImpltBgngYmd2; + // ==================== 이행 대상자 정보, 등록용도 ==================== + + /** 이행 대상자 정보 리스트 */ + private List impltTrprInfoList; +} \ No newline at end of file diff --git a/src/main/java/go/kr/project/noti/model/NotiImpltTrprInfoVO.java b/src/main/java/go/kr/project/noti/model/NotiImpltTrprInfoVO.java new file mode 100644 index 0000000..14dae91 --- /dev/null +++ b/src/main/java/go/kr/project/noti/model/NotiImpltTrprInfoVO.java @@ -0,0 +1,127 @@ +package go.kr.project.noti.model; + +import com.fasterxml.jackson.annotation.JsonFormat; + +import go.kr.project.common.model.PagingVO; +import lombok.*; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +/** + * packageName : go.kr.project.noti.model + * fileName : NotiImpltTrprInfoVO + * author : 김의진 + * date : 2025-09-11 + * description : 이행 대상자 정보 관련 데이터를 담는 Value Object 클래스 + * 중요한 로직 주석: 이행 대상자 정보 테이블(tb_implt_trpr_info)과 매핑되는 VO 클래스 + * =========================================================== + * DATE AUTHOR NOTE + * ----------------------------------------------------------- + * 2025-09-11 김의진 최초 생성 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@ToString +public class NotiImpltTrprInfoVO extends PagingVO { + + // ==================== 기본 테이블 컬럼 (TB_IMPLT_TRPR_INFO) ==================== + + /** 이행 대상자 정보 ID */ + private String impltTrprInfoId; + + /** 시군구 코드 */ + private String sggCd; + + /** 이행 정보 ID */ + private String impltInfoId; + + /** 이행 대상자 성명 */ + private String impltTrprFlnm; + + /** 이행 대상자 주소 */ + private String impltTrprAddr; + + /** 이행 대상자 상세주소 */ + private String impltTrprDaddr; + + /** 이행 대상자 우편번호 */ + private String impltTrprZip; + + /** 이행 대상자 구분 코드 (1:소유자, 2:행위자) */ + private String impltTrprSeCd; + + /** 소유자 행위자 정보 ID */ + private String ownrActrInfoId; + + /** 행위 번호 */ + private String actNo; + + /** 등록 일시 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Seoul") + private LocalDateTime regDt; + + /** 등록자 */ + private String rgtr; + + /** 수정 일시 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Seoul") + private LocalDateTime mdfcnDt; + + /** 수정자 */ + private String mdfr; + + /** 삭제 여부 */ + private String delYn; + + /** 삭제 일시 */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Seoul") + private LocalDateTime delDt; + + /** 삭제자 */ + private String dltr; + + // ==================== 조인 컬럼 (코드명) ==================== + + /** 이행 대상자 구분 코드명 */ + private String impltTrprSeCdNm; + + /** 시군구 코드명 */ + private String sggCdNm; + + /** 행위 구분 */ + private String actTypeCdNm; + + // ==================== 추가 필드 (체크박스 선택용) ==================== + + /** 체크박스 선택 여부 */ + //private boolean selected; + + //private String lotnoMno; + //private String lotnoSno; + + // ==================== 검색 조건 ==================== + + /** 검색 조건 - 이행 정보 ID */ + private String schImpltInfoId; + + // ==================== TUI 그리드용 속성 ==================== + /** + * TUI Grid 행 속성 (예: 체크박스, 클래스명) + *
+     * {
+     *   "checked": true,
+     *   "className": {
+     *     "row": ["red"]
+     *   }
+     * }
+     * 
+ */ + private java.util.Map _attributes; + +} \ No newline at end of file diff --git a/src/main/java/go/kr/project/noti/service/NotiService.java b/src/main/java/go/kr/project/noti/service/NotiService.java new file mode 100644 index 0000000..da3e1bc --- /dev/null +++ b/src/main/java/go/kr/project/noti/service/NotiService.java @@ -0,0 +1,48 @@ +package go.kr.project.noti.service; + +import go.kr.project.noti.model.NotiImpltInfoVO; +import go.kr.project.noti.model.NotiImpltTrprInfoVO; + +import java.util.List; + +/** + * packageName : go.kr.project.noti.service + * fileName : NotiService + * author : 김의진 + * date : 2025-09-11 + * description : 이행정보 관련 비즈니스 로직을 처리하는 서비스 인터페이스 + * 중요한 로직 주석: 이행정보와 이행대상자 정보의 CRUD 기능을 제공한다. + * =========================================================== + * DATE AUTHOR NOTE + * ----------------------------------------------------------- + * 2025-09-11 김의진 최초 생성 + */ +public interface NotiService { + + // ==================== 이행정보(TB_IMPLT_INFO) 관련 메서드 ==================== + + /** + * 이행정보 목록의 총 개수를 조회합니다. + * + * @param vo 검색 조건을 담은 VO 객체 + * @return 조회된 목록의 총 개수 + */ + int selectImpltInfoListTotalCount(NotiImpltInfoVO vo); + + /** + * 이행정보 목록을 조회한다. + * @param vo 조회할 단속 정보와 이행업무구분코드를 담은 VO 객체 + * @return 조회된 이행정보 + */ + List selectImpltInfoList(NotiImpltInfoVO vo); + + // ==================== 이행 대상자 정보(TB_IMPLT_TRPR_INFO) 관련 메서드 ==================== + + /** + * 이행 대상자 정보 목록을 조회한다. + * @param vo 조회할 이행정보 ID를 담은 VO 객체 + * @return 이행 대상자 정보 목록 + */ + List selectImpltTrprInfoList(NotiImpltTrprInfoVO vo); + +} \ No newline at end of file diff --git a/src/main/java/go/kr/project/noti/service/impl/NotiServiceImpl.java b/src/main/java/go/kr/project/noti/service/impl/NotiServiceImpl.java new file mode 100644 index 0000000..2843043 --- /dev/null +++ b/src/main/java/go/kr/project/noti/service/impl/NotiServiceImpl.java @@ -0,0 +1,54 @@ +package go.kr.project.noti.service.impl; + +import go.kr.project.noti.mapper.NotiMapper; +import go.kr.project.noti.model.NotiImpltInfoVO; +import go.kr.project.noti.model.NotiImpltTrprInfoVO; +import go.kr.project.noti.service.NotiService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +import java.util.List; + +import org.egovframe.rte.fdl.cmmn.EgovAbstractServiceImpl; +import org.springframework.stereotype.Service; + + +/** + * packageName : go.kr.project.noti.service.impl + * fileName : NotiServiceImpl + * author : 김의진 + * date : 2025-09-11 + * description : 이행정보 관련 비즈니스 로직을 처리하는 서비스 구현 클래스 + * 중요한 로직 주석: 이행정보와 이행대상자 정보의 CRUD 기능을 제공하며, 트랜잭션 처리를 포함한다. + * =========================================================== + * DATE AUTHOR NOTE + * ----------------------------------------------------------- + * 2025-09-11 김의진 최초 생성 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class NotiServiceImpl extends EgovAbstractServiceImpl implements NotiService { + + private final NotiMapper mapper; + + // ==================== 이행정보(TB_IMPLT_INFO) 관련 메서드 ==================== + + @Override + public int selectImpltInfoListTotalCount(NotiImpltInfoVO vo) { + return mapper.selectImpltInfoListTotalCount(vo); + } + + @Override + public List selectImpltInfoList(NotiImpltInfoVO vo) { + return mapper.selectImpltInfoList(vo); + } + + // ==================== 이행 대상자 정보(TB_IMPLT_TRPR_INFO) 관련 메서드 ==================== + + @Override + public List selectImpltTrprInfoList(NotiImpltTrprInfoVO vo) { + return mapper.selectImpltTrprInfoList(vo); + } + +} \ No newline at end of file diff --git a/src/main/resources/mybatis/mapper/noti/NotiMapper_maria.xml b/src/main/resources/mybatis/mapper/noti/NotiMapper_maria.xml new file mode 100644 index 0000000..ae9d0f3 --- /dev/null +++ b/src/main/resources/mybatis/mapper/noti/NotiMapper_maria.xml @@ -0,0 +1,107 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/tlds/date-format-functions.tld b/src/main/webapp/WEB-INF/tlds/date-format-functions.tld index 8666dcb..462cc48 100644 --- a/src/main/webapp/WEB-INF/tlds/date-format-functions.tld +++ b/src/main/webapp/WEB-INF/tlds/date-format-functions.tld @@ -42,7 +42,11 @@ java.lang.String getCurrentDateAddDays(java.lang.String, int) - + + getCurrentDateAddMonths + egovframework.util.DateUtil + java.lang.String getCurrentDateAddMonths(java.lang.String, int) + getSessionExpiryTime diff --git a/src/main/webapp/WEB-INF/views/noti/list.jsp b/src/main/webapp/WEB-INF/views/noti/list.jsp new file mode 100644 index 0000000..78ff81a --- /dev/null +++ b/src/main/webapp/WEB-INF/views/noti/list.jsp @@ -0,0 +1,593 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> +<%@ taglib prefix="dateUtil" uri="http://egovframework.go.kr/functions/date-util" %> + + +
+
+
+
+
+ +
+
+
+
+
+
    +
  • 단속 년도
  • +
  • + +
  • +
  • 진행단계
  • +
  • + +
  • +
  • 행정처분시작일
  • +
  • + +
  • +
  • ~
  • +
  • + +
  • +
+
    +
  • +
  • +
+
+
+
+
+
+
    +
  • 이행 정보 목록
  • +
  • + 총 0건 + + / Pages +
  • +
+
+
+
+
+
+
+
+ + + + +
+
+
+
+
    +
  • 이행자 목록
  • +
+
+
+
+
+
+
+
+ + +
+ +
+ + + \ No newline at end of file