소유자·행위자 관리: 행위자 선택 팝업 신규 추가, 컨트롤러/서비스/매퍼/VO 구현, JSP UI 및 관련 로직 적용
parent
9e4ac3ea20
commit
2ee9fecca9
@ -0,0 +1,95 @@
|
||||
package go.kr.project.crdn.crndRegistAndView.crdnActrSelect.controller;
|
||||
|
||||
import egovframework.constant.TilesConstants;
|
||||
import egovframework.util.ApiResponseUtil;
|
||||
import go.kr.project.crdn.crndRegistAndView.crdnActrSelect.model.CrdnActrSelectVO;
|
||||
import go.kr.project.crdn.crndRegistAndView.crdnActrSelect.service.CrdnActrSelectService;
|
||||
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 java.util.List;
|
||||
|
||||
/**
|
||||
* packageName : go.kr.project.crdn.crndRegistAndView.actrSelect.controller
|
||||
* fileName : ActrSelectController
|
||||
* author : 시스템 관리자
|
||||
* date : 2025-08-28
|
||||
* description : 행위자 선택 팝업 관리 컨트롤러
|
||||
* 중요한 로직 주석: 행위자 선택 팝업에서 TB_OWNR 테이블을 조회하여 그리드로 표시하는 API 제공. 페이징 순서(총건수→setTotalCount→setPagingYn)를 준수한다.
|
||||
* ===========================================================
|
||||
* DATE AUTHOR NOTE
|
||||
* -----------------------------------------------------------
|
||||
* 2025-08-28 시스템 관리자 최초 생성
|
||||
*/
|
||||
@Controller
|
||||
@RequestMapping("/crdn/crndRegistAndView/crdnActrSelect")
|
||||
@RequiredArgsConstructor
|
||||
@Slf4j
|
||||
@Tag(name = "행위자 선택", description = "행위자 선택 팝업 API")
|
||||
public class CrdnActrSelectController {
|
||||
|
||||
private final CrdnActrSelectService service;
|
||||
|
||||
/**
|
||||
* 행위자 선택 팝업 페이지를 조회합니다.
|
||||
* 행위자 선택을 위한 팝업 화면을 제공합니다.
|
||||
*
|
||||
* @param crdnYr 단속 연도
|
||||
* @param crdnNo 단속 번호
|
||||
* @param actInfoId 행위 번호
|
||||
* @param model 뷰에 전달할 데이터를 담는 모델 객체
|
||||
* @return 행위자 선택 팝업 페이지 ModelAndView 객체
|
||||
*/
|
||||
@GetMapping("/crdnActrSelectPopup.do")
|
||||
@Operation(summary = "행위자 선택 팝업", description = "행위자 선택을 위한 팝업 화면을 제공합니다.")
|
||||
public ModelAndView popup(
|
||||
@Parameter(description = "단속 연도") @RequestParam String crdnYr,
|
||||
@Parameter(description = "단속 번호") @RequestParam String crdnNo,
|
||||
@Parameter(description = "행위 번호") @RequestParam String actInfoId,
|
||||
Model model) {
|
||||
|
||||
log.debug("행위자 선택 팝업 조회 - 단속년도: {}, 단속번호: {}, 행위번호: {}", crdnYr, crdnNo, actInfoId);
|
||||
|
||||
ModelAndView mav = new ModelAndView("crdn/crndRegistAndView/crdnActrSelect/crdnActrSelectPopup" + TilesConstants.POPUP);
|
||||
mav.addObject("crdnYr", crdnYr);
|
||||
mav.addObject("crdnNo", crdnNo);
|
||||
mav.addObject("actInfoId", actInfoId);
|
||||
return mav;
|
||||
}
|
||||
|
||||
/**
|
||||
* 행위자 목록을 조회하는 AJAX 메소드
|
||||
* 공통 응답 형식(ApiResponse)을 사용하여 응답합니다.
|
||||
*
|
||||
* @param vo 검색 조건을 담은 VO 객체
|
||||
* @return 행위자 목록과 성공 상태를 담은 ResponseEntity 객체
|
||||
*/
|
||||
@Operation(summary = "행위자 목록 조회 (AJAX)", description = "TB_OWNR 테이블에서 행위자 목록을 조회하고 JSON 형식으로 반환합니다.")
|
||||
@ApiResponses(value = {
|
||||
@ApiResponse(responseCode = "200", description = "행위자 목록 조회 성공"),
|
||||
@ApiResponse(responseCode = "400", description = "행위자 목록 조회 실패"),
|
||||
@ApiResponse(description = "오류로 인한 실패")
|
||||
})
|
||||
@PostMapping("/list.ajax")
|
||||
public ResponseEntity<?> listAjax(@ModelAttribute CrdnActrSelectVO vo) {
|
||||
log.debug("행위자 목록 AJAX 조회 - 검색조건: {}", vo);
|
||||
|
||||
// 1. 총 개수 조회
|
||||
int totalCount = service.selectActrListTotalCount(vo);
|
||||
// 2. 응답 데이터 구성
|
||||
//vo.setTotalCount(totalCount);
|
||||
|
||||
List<CrdnActrSelectVO> list = service.selectActrList(vo);
|
||||
return ApiResponseUtil.successWithGrid(list, vo);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,23 @@
|
||||
package go.kr.project.crdn.crndRegistAndView.crdnActrSelect.mapper;
|
||||
|
||||
import go.kr.project.crdn.crndRegistAndView.crdnActrSelect.model.CrdnActrSelectVO;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 행위자 선택 MyBatis 매퍼
|
||||
* 중요한 로직 주석: tb_ownr 테이블 조회를 담당한다. 행위자 선택 팝업에서 사용.
|
||||
*/
|
||||
@Mapper
|
||||
public interface CrdnActrSelectMapper {
|
||||
|
||||
/** 목록 조회 */
|
||||
List<CrdnActrSelectVO> selectActrList(CrdnActrSelectVO vo);
|
||||
|
||||
/** 총 개수 */
|
||||
int selectActrListTotalCount(CrdnActrSelectVO vo);
|
||||
|
||||
/** 상세 조회 */
|
||||
CrdnActrSelectVO selectActrByPk(String actrId);
|
||||
}
|
||||
@ -0,0 +1,82 @@
|
||||
package go.kr.project.crdn.crndRegistAndView.crdnActrSelect.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;
|
||||
|
||||
/**
|
||||
* 소유자 VO (TB_OWNR 테이블)
|
||||
* 중요한 로직 주석: tb_ownr 테이블과 매핑되며, 소유자 선택 팝업에서 사용된다.
|
||||
*/
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@Data
|
||||
@Builder
|
||||
@AllArgsConstructor
|
||||
@NoArgsConstructor
|
||||
public class CrdnActrSelectVO extends PagingVO {
|
||||
|
||||
// ============ 테이블 컬럼 ============
|
||||
private String ownrId; // 행위자 ID
|
||||
private String sggCd; // 시군구 코드
|
||||
private String flnm; // 성명
|
||||
private String rrno; // 주민등록번호
|
||||
private String ownrSeCd; // 소유자 구분 코드
|
||||
private String addr; // 주소
|
||||
private String daddr; // 상세주소
|
||||
private String lotnoWholAddr; // 지번 전체 주소
|
||||
private String roadNmWholAddr; // 도로명 전체 주소
|
||||
private String zip; // 우편번호
|
||||
private String lotnoAddr; // 지번 주소
|
||||
private String roadNmAddr; // 도로명 주소
|
||||
private String refAddr; // 참고 주소
|
||||
private String pbadmsZoneCd; // 행정 구역 코드
|
||||
private String roadNmCd; // 도로명 코드
|
||||
private String lotnoMno; // 지번 본번
|
||||
private String lotnoSno; // 지번 부번
|
||||
private String bldgMno; // 건물 본번
|
||||
private String bldgSno; // 건물 부번
|
||||
private String udgdYnCd; // 지하 여부 코드
|
||||
private String rmrk; // 비고
|
||||
|
||||
@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 mtnYnCd; // 산 여부 코드
|
||||
private String telno; // 전화번호
|
||||
private String eml; // 이메일
|
||||
|
||||
// ============ 조인 컬럼(코드명) ============
|
||||
private String sggCdNm; // 시군구 코드명
|
||||
private String ownrSeCdNm; // 소유자 구분 코드명
|
||||
|
||||
// ============ 조인 컬럼(사용자정보) ============
|
||||
private String rgtrAcnt; // 등록자 계정
|
||||
private String rgtrNm; // 등록자명
|
||||
private String mdfrAcnt; // 수정자 계정
|
||||
private String mdfrNm; // 수정자명
|
||||
private String dltrAcnt; // 삭제자 계정
|
||||
private String dltrNm; // 삭제자명
|
||||
|
||||
// ============ 검색 용도 ============
|
||||
private String crdnYr; // 단속 연도
|
||||
private String crdnNo; // 단속 번호
|
||||
private String actInfoId; // 행위 번호
|
||||
private String actrInfoId; // 행위 번호
|
||||
}
|
||||
@ -0,0 +1,20 @@
|
||||
package go.kr.project.crdn.crndRegistAndView.crdnActrSelect.service;
|
||||
|
||||
import go.kr.project.crdn.crndRegistAndView.crdnActrSelect.model.CrdnActrSelectVO;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 행위자 선택 서비스 인터페이스
|
||||
*/
|
||||
public interface CrdnActrSelectService {
|
||||
|
||||
/** 행위자 목록 조회 */
|
||||
List<CrdnActrSelectVO> selectActrList(CrdnActrSelectVO vo);
|
||||
|
||||
/** 행위자 목록 총 개수 조회 */
|
||||
int selectActrListTotalCount(CrdnActrSelectVO vo);
|
||||
|
||||
/** 행위자 상세 조회 */
|
||||
CrdnActrSelectVO selectActrByPk(String ownrId);
|
||||
}
|
||||
@ -0,0 +1,45 @@
|
||||
package go.kr.project.crdn.crndRegistAndView.crdnActrSelect.service.impl;
|
||||
|
||||
import go.kr.project.crdn.crndRegistAndView.crdnActrSelect.mapper.CrdnActrSelectMapper;
|
||||
import go.kr.project.crdn.crndRegistAndView.crdnActrSelect.model.CrdnActrSelectVO;
|
||||
import go.kr.project.crdn.crndRegistAndView.crdnActrSelect.service.CrdnActrSelectService;
|
||||
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.crdn.crndRegistAndView.ownrSelect.service.impl
|
||||
* fileName : ActrSelectServiceImpl
|
||||
* author : 시스템 관리자
|
||||
* date : 2025-08-28
|
||||
* description : 행위자 선택 서비스 구현체
|
||||
* ===========================================================
|
||||
* DATE AUTHOR NOTE
|
||||
* -----------------------------------------------------------
|
||||
* 2025-08-28 시스템 관리자 최초 생성
|
||||
*/
|
||||
@Service
|
||||
@RequiredArgsConstructor
|
||||
@Slf4j
|
||||
public class CrdnActrSelectSelectServiceImpl extends EgovAbstractServiceImpl implements CrdnActrSelectService {
|
||||
|
||||
private final CrdnActrSelectMapper mapper;
|
||||
|
||||
@Override
|
||||
public List<CrdnActrSelectVO> selectActrList(CrdnActrSelectVO vo) {
|
||||
return mapper.selectActrList(vo);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int selectActrListTotalCount(CrdnActrSelectVO vo) {
|
||||
return mapper.selectActrListTotalCount(vo);
|
||||
}
|
||||
|
||||
@Override
|
||||
public CrdnActrSelectVO selectActrByPk(String ownrId) {
|
||||
return mapper.selectActrByPk(ownrId);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,162 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
|
||||
<mapper namespace="go.kr.project.crdn.crndRegistAndView.crdnActrSelect.mapper.CrdnActrSelectMapper">
|
||||
|
||||
<!-- 행위자 목록 조회 -->
|
||||
<select id="selectActrList" parameterType="CrdnActrSelectVO"
|
||||
resultType="CrdnActrSelectVO">
|
||||
/* ActrSelectMapper.selectActrList : 행위자 목록 조회 */
|
||||
SELECT
|
||||
o.OWNR_ID,
|
||||
o.SGG_CD,
|
||||
sgg.CD_NM AS SGG_CD_NM,
|
||||
o.FLNM,
|
||||
o.RRNO,
|
||||
o.OWNR_SE_CD,
|
||||
ownrSe.CD_NM AS OWNR_SE_CD_NM,
|
||||
o.ADDR,
|
||||
o.DADDR,
|
||||
o.LOTNO_WHOL_ADDR,
|
||||
o.ROAD_NM_WHOL_ADDR,
|
||||
o.ZIP,
|
||||
o.LOTNO_ADDR,
|
||||
o.ROAD_NM_ADDR,
|
||||
o.REF_ADDR,
|
||||
o.PBADMS_ZONE_CD,
|
||||
o.ROAD_NM_CD,
|
||||
o.LOTNO_MNO,
|
||||
o.LOTNO_SNO,
|
||||
o.BLDG_MNO,
|
||||
o.BLDG_SNO,
|
||||
o.UDGD_YN_CD,
|
||||
o.RMRK,
|
||||
o.REG_DT,
|
||||
o.RGTR,
|
||||
regUser.USER_ACNT AS RGTR_ACNT,
|
||||
regUser.USER_NM AS RGTR_NM,
|
||||
o.MDFCN_DT,
|
||||
o.MDFR,
|
||||
modUser.USER_ACNT AS MDFR_ACNT,
|
||||
modUser.USER_NM AS MDFR_NM,
|
||||
o.DEL_YN,
|
||||
o.DEL_DT,
|
||||
o.DLTR,
|
||||
delUser.USER_ACNT AS DLTR_ACNT,
|
||||
delUser.USER_NM AS DLTR_NM,
|
||||
o.MTN_YN_CD,
|
||||
o.TELNO,
|
||||
o.EML
|
||||
FROM tb_ownr o
|
||||
LEFT JOIN tb_cd_detail sgg ON sgg.CD_GROUP_ID = 'ORG_CD' AND sgg.CD_ID = o.SGG_CD
|
||||
LEFT JOIN tb_cd_detail ownrSe ON ownrSe.CD_GROUP_ID = 'OWNR_SE_CD' AND ownrSe.CD_ID = o.OWNR_SE_CD
|
||||
LEFT JOIN tb_user regUser ON regUser.USER_ID = o.RGTR
|
||||
LEFT JOIN tb_user modUser ON modUser.USER_ID = o.MDFR
|
||||
LEFT JOIN tb_user delUser ON delUser.USER_ID = o.DLTR
|
||||
WHERE NOT EXISTS (SELECT 1 FROM tb_actr_info oi WHERE oi.OWNR_ID = o.OWNR_ID AND oi.DEL_YN = 'N' AND oi.CRDN_NO = #{crdnNo} AND oi.CRDN_YR = #{crdnYr} AND oi.ACT_INFO_ID = #{actInfoId} )
|
||||
AND o.DEL_YN = 'N'
|
||||
<if test='flnm != null and flnm != ""'>
|
||||
AND o.FLNM LIKE CONCAT('%', #{flnm}, '%')
|
||||
</if>
|
||||
<if test='rrno != null and rrno != ""'>
|
||||
AND o.RRNO LIKE CONCAT('%', #{rrno}, '%')
|
||||
</if>
|
||||
<if test='telno != null and telno != ""'>
|
||||
AND o.TELNO LIKE CONCAT('%', #{telno}, '%')
|
||||
</if>
|
||||
<if test='eml != null and eml != ""'>
|
||||
AND o.EML LIKE CONCAT('%', #{eml}, '%')
|
||||
</if>
|
||||
<if test='sggCd != null and sggCd != ""'>
|
||||
AND o.SGG_CD = #{sggCd}
|
||||
</if>
|
||||
<if test='ownrSeCd != null and ownrSeCd != ""'>
|
||||
AND o.OWNR_SE_CD = #{ownrSeCd}
|
||||
</if>
|
||||
ORDER BY o.REG_DT DESC, o.OWNR_ID DESC
|
||||
<if test='pagingYn != null and pagingYn == "Y"'>
|
||||
limit #{startIndex}, #{perPage} /* 서버사이드 페이징 처리 */
|
||||
</if>
|
||||
</select>
|
||||
|
||||
<!-- 행위자 총 개수 조회 -->
|
||||
<select id="selectActrListTotalCount" parameterType="CrdnActrSelectVO" resultType="int">
|
||||
/* ActrSelectMapper.selectActrListTotalCount : 행위자 총 개수 조회 */
|
||||
SELECT COUNT(*)
|
||||
FROM tb_ownr o
|
||||
WHERE NOT EXISTS (SELECT 1 FROM tb_actr_info oi WHERE oi.OWNR_ID = o.OWNR_ID AND oi.DEL_YN = 'N' AND oi.CRDN_NO = #{crdnNo} AND oi.CRDN_YR = #{crdnYr} AND oi.ACT_INFO_ID = #{actInfoId} )
|
||||
AND o.DEL_YN = 'N'
|
||||
<if test='flnm != null and flnm != ""'>
|
||||
AND o.FLNM LIKE CONCAT('%', #{flnm}, '%')
|
||||
</if>
|
||||
<if test='rrno != null and rrno != ""'>
|
||||
AND o.RRNO LIKE CONCAT('%', #{rrno}, '%')
|
||||
</if>
|
||||
<if test='telno != null and telno != ""'>
|
||||
AND o.TELNO LIKE CONCAT('%', #{telno}, '%')
|
||||
</if>
|
||||
<if test='eml != null and eml != ""'>
|
||||
AND o.EML LIKE CONCAT('%', #{eml}, '%')
|
||||
</if>
|
||||
<if test='sggCd != null and sggCd != ""'>
|
||||
AND o.SGG_CD = #{sggCd}
|
||||
</if>
|
||||
<if test='ownrSeCd != null and ownrSeCd != ""'>
|
||||
AND o.OWNR_SE_CD = #{ownrSeCd}
|
||||
</if>
|
||||
</select>
|
||||
|
||||
<!-- 행위자 상세 조회 -->
|
||||
<select id="selectActrByPk" parameterType="String" resultType="CrdnActrSelectVO">
|
||||
/* ActrSelectMapper.selectActrByPk : 행위자 상세 조회 */
|
||||
SELECT
|
||||
o.OWNR_ID,
|
||||
o.SGG_CD,
|
||||
sgg.CD_NM AS SGG_CD_NM,
|
||||
o.FLNM,
|
||||
o.RRNO,
|
||||
o.OWNR_SE_CD,
|
||||
ownrSe.CD_NM AS OWNR_SE_CD_NM,
|
||||
o.ADDR,
|
||||
o.DADDR,
|
||||
o.LOTNO_WHOL_ADDR,
|
||||
o.ROAD_NM_WHOL_ADDR,
|
||||
o.ZIP,
|
||||
o.LOTNO_ADDR,
|
||||
o.ROAD_NM_ADDR,
|
||||
o.REF_ADDR,
|
||||
o.PBADMS_ZONE_CD,
|
||||
o.ROAD_NM_CD,
|
||||
o.LOTNO_MNO,
|
||||
o.LOTNO_SNO,
|
||||
o.BLDG_MNO,
|
||||
o.BLDG_SNO,
|
||||
o.UDGD_YN_CD,
|
||||
o.RMRK,
|
||||
o.REG_DT,
|
||||
o.RGTR,
|
||||
regUser.USER_ACNT AS RGTR_ACNT,
|
||||
regUser.USER_NM AS RGTR_NM,
|
||||
o.MDFCN_DT,
|
||||
o.MDFR,
|
||||
modUser.USER_ACNT AS MDFR_ACNT,
|
||||
modUser.USER_NM AS MDFR_NM,
|
||||
o.DEL_YN,
|
||||
o.DEL_DT,
|
||||
o.DLTR,
|
||||
delUser.USER_ACNT AS DLTR_ACNT,
|
||||
delUser.USER_NM AS DLTR_NM,
|
||||
o.MTN_YN_CD,
|
||||
o.TELNO,
|
||||
o.EML
|
||||
FROM tb_ownr o
|
||||
LEFT JOIN tb_cd_detail sgg ON sgg.CD_GROUP_ID = 'ORG_CD' AND sgg.CD_ID = o.SGG_CD
|
||||
LEFT JOIN tb_cd_detail ownrSe ON ownrSe.CD_GROUP_ID = 'OWNR_SE_CD' AND ownrSe.CD_ID = o.OWNR_SE_CD
|
||||
LEFT JOIN tb_user regUser ON regUser.USER_ID = o.RGTR
|
||||
LEFT JOIN tb_user modUser ON modUser.USER_ID = o.MDFR
|
||||
LEFT JOIN tb_user delUser ON delUser.USER_ID = o.DLTR
|
||||
WHERE o.OWNR_ID = #{ownrId}
|
||||
AND o.DEL_YN = 'N'
|
||||
</select>
|
||||
|
||||
</mapper>
|
||||
Loading…
Reference in New Issue