diff --git a/src/main/java/go/kr/project/levy/levy/controller/LevyController.java b/src/main/java/go/kr/project/levy/levy/controller/LevyController.java new file mode 100644 index 0000000..ae6a8f8 --- /dev/null +++ b/src/main/java/go/kr/project/levy/levy/controller/LevyController.java @@ -0,0 +1,119 @@ +package go.kr.project.levy.levy.controller; + +import egovframework.constant.TilesConstants; +import egovframework.util.ApiResponseUtil; +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.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.GetMapping; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; + +import javax.servlet.http.HttpServletRequest; +import java.util.List; + +/** + * packageName : go.kr.project.levy.levy.controller + * fileName : LevyController + * author : 김동규 + * date : 2025-10-14 + * description : 부과 관리 관련 요청을 처리하는 컨트롤러 + * 중요한 로직 주석: 부과 관련 화면 제공 및 CRUD API를 처리하는 컨트롤러 + * =========================================================== + * DATE AUTHOR NOTE + * ----------------------------------------------------------- + * 2025-10-14 김동규 최초 생성 + */ + +@Controller +@RequestMapping("/levy/levy/") +@RequiredArgsConstructor +@Slf4j +@Tag(name = "부과정보 관리", description = "부과 정보 관리 관련 API") +public class LevyController { + + /** 이행정보 서비스 */ + 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 "levy/levy/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("/levyImpltInfolist.ajax") + public ResponseEntity levyImpltInfolistAjax(@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("/levyImpltTrprInfolist.ajax") + public ResponseEntity levyImpltInfolistAjax(@ModelAttribute NotiImpltTrprInfoVO paramVO) { + + List result = service.selectImpltTrprInfoList(paramVO); + + return ApiResponseUtil.successWithGrid(result, paramVO); + + } + +} diff --git a/src/main/java/go/kr/project/levy/levy/mapper/LevyMapper.java b/src/main/java/go/kr/project/levy/levy/mapper/LevyMapper.java new file mode 100644 index 0000000..5dea217 --- /dev/null +++ b/src/main/java/go/kr/project/levy/levy/mapper/LevyMapper.java @@ -0,0 +1,49 @@ +package go.kr.project.levy.levy.mapper; + +import go.kr.project.levy.levy.model.LevyNotiImpltInfoVO; +import go.kr.project.levy.levy.model.LevyNotiImpltTrprInfoVO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * packageName : go.kr.project.levy.levy.mapper + * fileName : LevyMapper + * author : 김동규 + * date : 2025-10-14 + * description : 이행정보 관련 데이터베이스 접근을 위한 MyBatis 매퍼 인터페이스 + * 중요한 로직 주석: 이행정보 테이블(tb_implt_info)과 이행대상자 테이블(tb_implt_trpr_info)에 대한 CRUD 작업을 수행한다. + * =========================================================== + * DATE AUTHOR NOTE + * ----------------------------------------------------------- + * 2025-09-08 시스템 관리자 최초 생성 + */ +@Mapper +public interface LevyMapper { + + // ==================== 이행정보(TB_IMPLT_INFO) 관련 메서드 ==================== + + /** + * 이행정보 목록의 총 개수를 조회한다. + * @param vo 검색 조건을 담은 VO 객체 + * @return 조회된 목록의 총 개수 + */ + int selectImpltInfoListTotalCount(LevyNotiImpltInfoVO vo); + + /** + * 이행정보 목록을 조회한다. + * @param vo 조회할 단속 정보와 이행업무구분코드를 담은 VO 객체 + * @return 조회된 이행정보 + */ + List selectImpltInfoList(LevyNotiImpltInfoVO vo); + + // ==================== 이행 대상자 정보(TB_IMPLT_TRPR_INFO) 관련 메서드 ==================== + + /** + * 이행 대상자 정보 목록을 조회한다. + * @param vo 조회할 이행정보 ID를 담은 VO 객체 + * @return 이행 대상자 정보 목록 + */ + List selectImpltTrprInfoList(LevyNotiImpltTrprInfoVO vo); + +} \ No newline at end of file diff --git a/src/main/java/go/kr/project/levy/levy/model/LevyNotiImpltInfoVO.java b/src/main/java/go/kr/project/levy/levy/model/LevyNotiImpltInfoVO.java new file mode 100644 index 0000000..d7ecc23 --- /dev/null +++ b/src/main/java/go/kr/project/levy/levy/model/LevyNotiImpltInfoVO.java @@ -0,0 +1,133 @@ +package go.kr.project.levy.levy.model; + +import com.fasterxml.jackson.annotation.JsonFormat; +import go.kr.project.common.model.PagingVO; +import go.kr.project.noti.model.NotiImpltTrprInfoVO; +import lombok.*; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; +import java.util.List; + +/** + * packageName : go.kr.project.levy.levy.model + * fileName : LevyNotiImpltInfoVO + * author : 김동규 + * date : 2025-10-14 + * description : 이행정보 관련 데이터를 담는 Value Object 클래스 + * 중요한 로직 주석: 이행정보 테이블(tb_implt_info)과 매핑되는 VO 클래스로 페이징 기능을 포함한다. + * =========================================================== + * DATE AUTHOR NOTE + * ----------------------------------------------------------- + * 2025-10-14 김동규 최초 생성 + */ +@EqualsAndHashCode(callSuper=true) +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@ToString +public class LevyNotiImpltInfoVO 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/levy/levy/model/LevyNotiImpltTrprInfoVO.java b/src/main/java/go/kr/project/levy/levy/model/LevyNotiImpltTrprInfoVO.java new file mode 100644 index 0000000..10e4453 --- /dev/null +++ b/src/main/java/go/kr/project/levy/levy/model/LevyNotiImpltTrprInfoVO.java @@ -0,0 +1,126 @@ +package go.kr.project.levy.levy.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.levy.levy.model + * fileName : LevyNotiImpltTrprInfoVO + * author : 김동규 + * date : 2025-10-14 + * description : 이행 대상자 정보 관련 데이터를 담는 Value Object 클래스 + * 중요한 로직 주석: 이행 대상자 정보 테이블(tb_implt_trpr_info)과 매핑되는 VO 클래스 + * =========================================================== + * DATE AUTHOR NOTE + * ----------------------------------------------------------- + * 2025-10-14 김동규 최초 생성 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@ToString +public class LevyNotiImpltTrprInfoVO 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/levy/levy/service/LevyService.java b/src/main/java/go/kr/project/levy/levy/service/LevyService.java new file mode 100644 index 0000000..fb7e5d3 --- /dev/null +++ b/src/main/java/go/kr/project/levy/levy/service/LevyService.java @@ -0,0 +1,48 @@ +package go.kr.project.levy.levy.service; + +import go.kr.project.levy.levy.model.LevyNotiImpltInfoVO; +import go.kr.project.levy.levy.model.LevyNotiImpltTrprInfoVO; + +import java.util.List; + +/** + * packageName : go.kr.project.levy.levy.service + * fileName : LevyService + * author : 김동규 + * date : 2025-10-14 + * description : 이행정보 관련 비즈니스 로직을 처리하는 서비스 인터페이스 + * 중요한 로직 주석: 이행정보와 이행대상자 정보의 CRUD 기능을 제공한다. + * =========================================================== + * DATE AUTHOR NOTE + * ----------------------------------------------------------- + * 2025-10-14 김동규 최초 생성 + */ +public interface LevyService { + + // ==================== 이행정보(TB_IMPLT_INFO) 관련 메서드 ==================== + + /** + * 이행정보 목록의 총 개수를 조회합니다. + * + * @param vo 검색 조건을 담은 VO 객체 + * @return 조회된 목록의 총 개수 + */ + int selectImpltInfoListTotalCount(LevyNotiImpltInfoVO vo); + + /** + * 이행정보 목록을 조회한다. + * @param vo 조회할 단속 정보와 이행업무구분코드를 담은 VO 객체 + * @return 조회된 이행정보 + */ + List selectImpltInfoList(LevyNotiImpltInfoVO vo); + + // ==================== 이행 대상자 정보(TB_IMPLT_TRPR_INFO) 관련 메서드 ==================== + + /** + * 이행 대상자 정보 목록을 조회한다. + * @param vo 조회할 이행정보 ID를 담은 VO 객체 + * @return 이행 대상자 정보 목록 + */ + List selectImpltTrprInfoList(LevyNotiImpltTrprInfoVO vo); + +} \ No newline at end of file diff --git a/src/main/java/go/kr/project/levy/levy/service/impl/LevyServiceImpl.java b/src/main/java/go/kr/project/levy/levy/service/impl/LevyServiceImpl.java new file mode 100644 index 0000000..42e28d7 --- /dev/null +++ b/src/main/java/go/kr/project/levy/levy/service/impl/LevyServiceImpl.java @@ -0,0 +1,53 @@ +package go.kr.project.levy.levy.service.impl; + +import go.kr.project.levy.levy.mapper.LevyMapper; +import go.kr.project.levy.levy.model.LevyNotiImpltInfoVO; +import go.kr.project.levy.levy.model.LevyNotiImpltTrprInfoVO; +import go.kr.project.levy.levy.service.LevyService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.egovframe.rte.fdl.cmmn.EgovAbstractServiceImpl; +import org.springframework.stereotype.Service; + +import java.util.List; + + +/** + * packageName : go.kr.project.levy.levy.service.impl + * fileName : LevyServiceImpl + * author : 김동규 + * date : 2025-10-14 + * description : 이행정보 관련 비즈니스 로직을 처리하는 서비스 구현 클래스 + * 중요한 로직 주석: 이행정보와 이행대상자 정보의 CRUD 기능을 제공하며, 트랜잭션 처리를 포함한다. + * =========================================================== + * DATE AUTHOR NOTE + * ----------------------------------------------------------- + * 2025-10-14 김동규 최초 생성 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class LevyServiceImpl extends EgovAbstractServiceImpl implements LevyService { + + private final LevyMapper mapper; + + // ==================== 이행정보(TB_IMPLT_INFO) 관련 메서드 ==================== + + @Override + public int selectImpltInfoListTotalCount(LevyNotiImpltInfoVO vo) { + return mapper.selectImpltInfoListTotalCount(vo); + } + + @Override + public List selectImpltInfoList(LevyNotiImpltInfoVO vo) { + return mapper.selectImpltInfoList(vo); + } + + // ==================== 이행 대상자 정보(TB_IMPLT_TRPR_INFO) 관련 메서드 ==================== + + @Override + public List selectImpltTrprInfoList(LevyNotiImpltTrprInfoVO vo) { + return mapper.selectImpltTrprInfoList(vo); + } + +} \ No newline at end of file diff --git a/src/main/resources/mybatis/mapper/levy/levy/LevyMapper_maria.xml b/src/main/resources/mybatis/mapper/levy/levy/LevyMapper_maria.xml new file mode 100644 index 0000000..dbbedbf --- /dev/null +++ b/src/main/resources/mybatis/mapper/levy/levy/LevyMapper_maria.xml @@ -0,0 +1,107 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/views/levy/levy/list.jsp b/src/main/webapp/WEB-INF/views/levy/levy/list.jsp new file mode 100644 index 0000000..ecdeb3a --- /dev/null +++ b/src/main/webapp/WEB-INF/views/levy/levy/list.jsp @@ -0,0 +1,619 @@ +<%@ 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 diff --git a/src/main/webapp/ubi4/levyReport.jsp b/src/main/webapp/ubi4/levyReport.jsp new file mode 100644 index 0000000..ff09305 --- /dev/null +++ b/src/main/webapp/ubi4/levyReport.jsp @@ -0,0 +1,127 @@ +<%@ page contentType="text/html; charset=utf-8" pageEncoding="utf-8" %> +<%! + String nullToStr(String s1, String s2) { + return ((s1 == null)?s2:s1); + } +%> +<% + String jrf = nullToStr(request.getParameter("jrf"), "levyReport.jrf"); + String pstnIdxNo = request.getParameter("pstnIdxNo"); // 선택한 위치지수번호 + String arg = "pstnIdxNo#" + pstnIdxNo + "#"; // 유비리포트 파라미터 + String resId = nullToStr(request.getParameter("resId"), "UBIHTML"); +%> + + + + + + +levy Report + + + + + + + +
+ + \ No newline at end of file diff --git a/src/main/webapp/ubi4/work/levyReport.jrf b/src/main/webapp/ubi4/work/levyReport.jrf new file mode 100644 index 0000000..d708b74 Binary files /dev/null and b/src/main/webapp/ubi4/work/levyReport.jrf differ