소유자·행위자 관리: 행위자 선택 팝업 신규 추가, 컨트롤러/서비스/매퍼/VO 구현, JSP UI 및 관련 로직 적용

dev
박성영 4 months ago
parent 9e4ac3ea20
commit 2ee9fecca9

@ -52,7 +52,6 @@ public class CrdnActrInfoController {
@ApiResponse(responseCode = "500", description = "서버 오류")
})
@PostMapping("/list.ajax")
@ResponseBody
public ResponseEntity<?> listAjax(@ModelAttribute CrdnActrInfoVO vo) {
log.debug("위반행위자정보 목록 조회 요청: {}", vo);
@ -75,14 +74,12 @@ public class CrdnActrInfoController {
@ApiResponse(responseCode = "200", description = "등록 성공"),
@ApiResponse(responseCode = "500", description = "서버 오류")
})
@PostMapping("/saveSelectedOwnr.ajax")
@ResponseBody
@PostMapping("/saveSelectedActr.ajax")
public ResponseEntity<?> insertAjax(@ModelAttribute CrdnActrInfoVO vo) {
log.debug("위반행위자정보 등록 요청: {}", vo);
// 현재 로그인한 사용자 정보 설정
String userId = SessionUtil.getUserId();
vo.setRgtr(userId);
vo.setRgtr(SessionUtil.getUserId());
vo.setSggCd(SessionUtil.getSessionVO().getUser().getOrgCd());
int result = service.insertActrInfo(vo);
@ -104,8 +101,7 @@ public class CrdnActrInfoController {
@ApiResponse(responseCode = "500", description = "서버 오류")
})
@PostMapping("/delete.ajax")
@ResponseBody
public ResponseEntity<?> deleteAjax(@RequestParam("actrInfoIds[]") List<String> actrInfoIds) {
public ResponseEntity<?> deleteAjax(List<String> actrInfoIds) {
log.debug("위반행위자정보 삭제 요청: {}", actrInfoIds);
if (actrInfoIds == null || actrInfoIds.isEmpty()) {

@ -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 . (setTotalCountsetPagingYn) .
* ===========================================================
* 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);
}
}

@ -51,15 +51,9 @@
LEFT JOIN tb_user regUser ON regUser.USER_ID = a.RGTR
LEFT JOIN tb_user modUser ON modUser.USER_ID = a.MDFR
WHERE a.DEL_YN = 'N'
<if test='crdnYr != null and crdnYr != ""'>
AND a.CRDN_YR = #{crdnYr}
</if>
<if test='crdnNo != null and crdnNo != ""'>
AND a.CRDN_NO = #{crdnNo}
</if>
<if test='pstnInfoId != null and pstnInfoId != ""'>
AND a.PSTN_INFO_ID = #{pstnInfoId}
</if>
AND a.CRDN_YR = #{crdnYr}
AND a.CRDN_NO = #{crdnNo}
AND a.PSTN_INFO_ID = #{pstnInfoId}
ORDER BY a.REG_DT DESC, a.ACT_INFO_ID DESC
<if test='pagingYn != null and pagingYn == "Y"'>
limit #{startIndex}, #{perPage} /* 서버사이드 페이징 처리 */
@ -72,15 +66,9 @@
SELECT COUNT(*)
FROM tb_act_info a
WHERE a.DEL_YN = 'N'
<if test='crdnYr != null and crdnYr != ""'>
AND a.CRDN_YR = #{crdnYr}
</if>
<if test='crdnNo != null and crdnNo != ""'>
AND a.CRDN_NO = #{crdnNo}
</if>
<if test='pstnInfoId != null and pstnInfoId != ""'>
AND a.PSTN_INFO_ID = #{pstnInfoId}
</if>
AND a.CRDN_YR = #{crdnYr}
AND a.CRDN_NO = #{crdnNo}
AND a.PSTN_INFO_ID = #{pstnInfoId}
</select>
<!-- 불법위반행위정보 등록 (시컨스 사용) -->

@ -35,15 +35,9 @@
LEFT JOIN tb_ownr o ON o.OWNR_ID = ar.OWNR_ID AND o.DEL_YN = 'N'
LEFT JOIN tb_cd_detail ownrSe ON ownrSe.CD_GROUP_ID = 'OWNR_SE_CD' AND ownrSe.CD_ID = o.OWNR_SE_CD
WHERE ar.DEL_YN = 'N'
<if test='crdnYr != null and crdnYr != ""'>
AND ar.CRDN_YR = #{crdnYr}
</if>
<if test='crdnNo != null and crdnNo != ""'>
AND ar.CRDN_NO = #{crdnNo}
</if>
<if test='actInfoId != null and actInfoId != ""'>
AND ar.ACT_INFO_ID = #{actInfoId}
</if>
AND ar.CRDN_YR = #{crdnYr}
AND ar.CRDN_NO = #{crdnNo}
AND ar.ACT_INFO_ID = #{actInfoId}
ORDER BY ar.REG_DT DESC, ar.ACTR_INFO_ID DESC
<if test='pagingYn != null and pagingYn == "Y"'>
limit #{startIndex}, #{perPage} /* 서버사이드 페이징 처리 */
@ -56,15 +50,9 @@
SELECT COUNT(*)
FROM tb_actr_info ar
WHERE ar.DEL_YN = 'N'
<if test='crdnYr != null and crdnYr != ""'>
AND ar.CRDN_YR = #{crdnYr}
</if>
<if test='crdnNo != null and crdnNo != ""'>
AND ar.CRDN_NO = #{crdnNo}
</if>
<if test='actInfoId != null and actInfoId != ""'>
AND ar.ACT_INFO_ID = #{actInfoId}
</if>
AND ar.CRDN_YR = #{crdnYr}
AND ar.CRDN_NO = #{crdnNo}
AND ar.ACT_INFO_ID = #{actInfoId}
</select>
<!-- 위반행위자정보 등록 (시컨스 사용) -->

@ -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>

@ -5,7 +5,7 @@
<!-- 소유자 목록 조회 -->
<select id="selectOwnrList" parameterType="CrdnOwnrSelectVO"
resultType="CrdnOwnrSelectVO">
resultType="CrdnActrSelectVO">
/* OwnrSelectMapper.selectOwnrList : 소유자 목록 조회 */
SELECT
o.OWNR_ID,
@ -80,11 +80,11 @@
</select>
<!-- 소유자 총 개수 조회 -->
<select id="selectOwnrListTotalCount" parameterType="CrdnOwnrSelectVO" resultType="int">
<select id="selectOwnrListTotalCount" parameterType="CrdnActrSelectVO" resultType="int">
/* OwnrSelectMapper.selectOwnrListTotalCount : 소유자 총 개수 조회 */
SELECT COUNT(*)
FROM tb_ownr o
WHERE NOT EXISTS (SELECT 1 FROM tb_ownr_info oi WHERE oi.OWNR_ID = o.OWNR_ID AND oi.DEL_YN = 'N')
WHERE NOT EXISTS (SELECT 1 FROM tb_ownr_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.PSTN_INFO_ID = #{pstnInfoId} )
AND o.DEL_YN = 'N'
<if test='flnm != null and flnm != ""'>
AND o.FLNM LIKE CONCAT('%', #{flnm}, '%')
@ -107,7 +107,7 @@
</select>
<!-- 소유자 상세 조회 -->
<select id="selectOwnrByPk" parameterType="String" resultType="CrdnOwnrSelectVO">
<select id="selectOwnrByPk" parameterType="String" resultType="CrdnActrSelectVO">
/* OwnrSelectMapper.selectOwnrByPk : 소유자 상세 조회 */
SELECT
o.OWNR_ID,

@ -53,12 +53,8 @@
LEFT JOIN tb_user regUser ON regUser.USER_ID = p.RGTR
LEFT JOIN tb_user modUser ON modUser.USER_ID = p.MDFR
WHERE p.DEL_YN = 'N'
<if test='crdnYr != null and crdnYr != ""'>
AND p.CRDN_YR = #{crdnYr}
</if>
<if test='crdnNo != null and crdnNo != ""'>
AND p.CRDN_NO = #{crdnNo}
</if>
AND p.CRDN_YR = #{crdnYr}
AND p.CRDN_NO = #{crdnNo}
ORDER BY p.REG_DT DESC, p.PSTN_INFO_ID DESC
<if test='pagingYn != null and pagingYn == "Y"'>
limit #{startIndex}, #{perPage} /* 서버사이드 페이징 처리 */
@ -71,12 +67,8 @@
SELECT COUNT(*)
FROM tb_pstn_info p
WHERE p.DEL_YN = 'N'
<if test='crdnYr != null and crdnYr != ""'>
AND p.CRDN_YR = #{crdnYr}
</if>
<if test='crdnNo != null and crdnNo != ""'>
AND p.CRDN_NO = #{crdnNo}
</if>
AND p.CRDN_YR = #{crdnYr}
AND p.CRDN_NO = #{crdnNo}
</select>
<!-- 위치정보 등록 (시컨스 사용) -->

@ -6,13 +6,13 @@
<div class="popup_wrap">
<div class="popup_inner">
<div class="popup_tit">
<h2 class="tit">소유자 선택</h2>
<h2 class="tit">행위자 선택</h2>
<a href="#" class="pop-x-btn modalclose" id="btnCloseTop"></a>
</div>
<!-- 중요로직: 단속 정보 파라미터를 hidden input으로 관리 -->
<input type="hidden" id="crdnYr" name="crdnYr" value="${crdnYr}" />
<input type="hidden" id="crdnNo" name="crdnNo" value="${crdnNo}" />
<input type="hidden" id="pstnInfoId" name="pstnInfoId" value="${pstnInfoId}" />
<input type="hidden" id="actInfoId" name="actInfoId" value="${actInfoId}" />
<div class="popup_con">
<!-- 검색 영역 -->
<div class="box_column">
@ -54,7 +54,7 @@
<!-- 그리드 영역 -->
<div class="box_column" style="margin-top: 20px;">
<ul class="box_title">
<li class="tit">소유자 목록</li>
<li class="tit">행위자 목록</li>
<span id="totalCount" class="total-count" style="padding-left: 25px;padding-right: 25px;">총 0건</span>
</ul>
<div class="containers">
@ -74,9 +74,9 @@
'use strict';
/**
* 소유자 선택 팝업 관리 네임스페이스
* 행위자 선택 팝업 관리 네임스페이스
*/
var CrdnOwnrSelectPopup = {
var CrdnActrSelectPopup = {
/**
* 그리드 관련 객체
*/
@ -122,13 +122,13 @@
width: 60,
sortable: false,
formatter: function(e) {
return XitReverseRowNumberRenderer.format(CrdnOwnrSelectPopup.grid.instance.getData().length, e);
return XitReverseRowNumberRenderer.format(CrdnActrSelectPopup.grid.instance.getData().length, e);
}
},
{ header: '소유자ID', name: 'ownrId', align: 'center', width: 100, hidden: true },
{ header: '행위자ID', name: 'ownrId', align: 'center', width: 100, hidden: true },
{ header: '성명', name: 'flnm', align: 'center', width: 120, sortable: true },
{ header: '주민등록번호', name: 'rrno', align: 'center', width: 150 },
{ header: '소유자구분', name: 'ownrSeCdNm', align: 'center', width: 100 },
{ header: '행위자구분', name: 'ownrSeCdNm', align: 'center', width: 100 },
{ header: '전화번호', name: 'telno', align: 'center', width: 120 },
{ header: '이메일', name: 'eml', align: 'left', width: 200 },
{ header: '주소', name: 'addr', align: 'left', width: 200 },
@ -149,7 +149,7 @@
return {
api: {
readData: {
url: '<c:url value="/crdn/crndRegistAndView/crdnOwnrSelect/list.ajax"/>',
url: '<c:url value="/crdn/crndRegistAndView/crdnActrSelect/list.ajax"/>',
method: 'POST',
contentType: 'application/x-www-form-urlencoded',
processData: true
@ -167,7 +167,7 @@
eml: $('#searchEml').val() || '',
crdnYr: $('#crdnYr').val() || '',
crdnNo: $('#crdnNo').val() || '',
pstnInfoId: $('#pstnInfoId').val() || ''
actInfoId: $('#actInfoId').val() || ''
});
return defaultParams + '&' + searchParams;
}
@ -207,7 +207,7 @@
this.instance.on('dblclick', function(ev) {
var rowData = self.instance.getRow(ev.rowKey);
if (rowData) {
CrdnOwnrSelectPopup.selectOwners([rowData]);
CrdnActrSelectPopup.selectOwners([rowData]);
}
});
},
@ -250,7 +250,7 @@
$('#selectBtn').on('click', function() {
var checkedRows = self.grid.getCheckedRows();
if (checkedRows.length === 0) {
alert('선택할 소유자를 체크해주세요.');
alert('선택할 행위자를 체크해주세요.');
return;
}
self.selectOwners(checkedRows);
@ -280,10 +280,10 @@
}
},
// 중요로직: 선택된 소유자들을 TB_OWNR_INFO에 저장
// 중요로직: 선택된 행위자들을 TB_OWNR_INFO에 저장
selectOwners: function(selectedOwners) {
if (!selectedOwners || selectedOwners.length === 0) {
alert('선택할 소유자가 없습니다.');
alert('선택할 행위자가 없습니다.');
return;
}
@ -291,14 +291,14 @@
// 중요로직: hidden input에서 파라미터 값 가져오기
var crdnYr = $('#crdnYr').val();
var crdnNo = $('#crdnNo').val();
var pstnInfoId = $('#pstnInfoId').val();
var actInfoId = $('#actInfoId').val();
if (!crdnYr || !crdnNo || !pstnInfoId) {
if (!crdnYr || !crdnNo || !actInfoId) {
alert('단속 기본정보가 없습니다.');
return;
}
// 중요로직: 각 선택된 소유자에 대해 순차적으로 저장 처리
// 중요로직: 각 선택된 행위자에 대해 순차적으로 저장 처리
var saveCount = 0;
var duplicateCount = 0;
var errorCount = 0;
@ -314,12 +314,12 @@
var owner = selectedOwners[index];
$.ajax({
url: '<c:url value="/crdn/crndRegistAndView/crdnOwnrInfo/saveSelectedOwnr.ajax"/>',
url: '<c:url value="/crdn/crndRegistAndView/crdnActrInfo/saveSelectedActr.ajax"/>',
type: 'POST',
data: {
crdnYr: crdnYr,
crdnNo: crdnNo,
pstnInfoId: pstnInfoId,
actInfoId: actInfoId,
ownrId: owner.ownrId
},
success: function(response) {
@ -331,19 +331,19 @@
} else {
errorCount++;
}
// 다음 소유자 처리
// 다음 행위자 처리
processSaveOwner(index + 1);
},
error: function(xhr, status, error) {
console.error('소유자 저장 오류:', error);
console.error('행위자 저장 오류:', error);
errorCount++;
// 다음 소유자 처리
// 다음 행위자 처리
processSaveOwner(index + 1);
}
});
}
// 첫 번째 소유자부터 처리 시작
// 첫 번째 행위자부터 처리 시작
processSaveOwner(0);
},
@ -352,28 +352,28 @@
var message = '';
if (saveCount > 0) {
message += saveCount + '건의 소유자 정보가 저장되었습니다.\n';
message += saveCount + '건의 행위자 정보가 저장되었습니다.\n';
}
if (duplicateCount > 0) {
message += duplicateCount + '건의 소유자는 이미 등록되어 있습니다.\n';
message += duplicateCount + '건의 행위자는 이미 등록되어 있습니다.\n';
if (duplicateOwners.length > 0) {
message += '(중복: ' + duplicateOwners.join(', ') + ')\n';
}
}
if (errorCount > 0) {
message += errorCount + '건의 소유자 저장 중 오류가 발생했습니다.\n';
message += errorCount + '건의 행위자 저장 중 오류가 발생했습니다.\n';
}
if (message) {
alert(message.trim());
}
// 중요로직: 저장 성공 시 부모창 소유자 정보 그리드 새로고침
// 중요로직: 저장 성공 시 부모창 행위자 정보 그리드 새로고침
if (saveCount > 0) {
if (window.opener && window.opener.CrdnDetailViewOwnrInfo && window.opener.CrdnDetailViewOwnrInfo.search) {
window.opener.CrdnDetailViewOwnrInfo.search();
if (window.opener && window.opener.CrdnDetailViewActrInfo && window.opener.CrdnDetailViewActrInfo.search) {
window.opener.CrdnDetailViewActrInfo.search();
}
}
@ -388,12 +388,12 @@
// DOM 준비 완료 시 초기화
$(document).ready(function() {
// 중요로직: 소유자 선택 그리드 초기화
CrdnOwnrSelectPopup.init();
// 중요로직: 행위자 선택 그리드 초기화
CrdnActrSelectPopup.init();
});
// 전역 네임스페이스에 모듈 노출
window.CrdnOwnrSelectPopup = CrdnOwnrSelectPopup;
window.CrdnActrSelectPopup = CrdnActrSelectPopup;
})(window, jQuery);
</script>

@ -80,7 +80,7 @@
processData: true
}
},
initialRequest: true, // 초기 데이터 요청 여부
initialRequest: false, // 초기 데이터 요청 여부
serializer: function(params) {
// 기본 파라미터 (페이지 정보 등)
var defaultParams = $.param(params);
@ -221,7 +221,7 @@
url: '<c:url value="/crdn/crndRegistAndView/crdnActrInfo/delete.ajax"/>',
type: 'POST',
data: {
ownrInfoIds: deleteIds
actrInfoIds: deleteIds
},
traditional: true, // 배열 전송을 위한 설정
success: function(response) {

@ -438,6 +438,21 @@
window.CrdnDetailViewActInfo.removeActInfo();
}
});
// 중요로직: 소유자 선택 버튼 클릭 이벤트
$('#actrSelectBtn').on('click', function() {
if (window.CrdnDetailViewActrInfo && window.CrdnDetailViewActrInfo.openActrSelectPopup) {
window.CrdnDetailViewActrInfo.openActrSelectPopup();
}
});
// 중요로직: 소유자 제거 버튼 클릭 이벤트
$('#actrRemoveBtn').on('click', function() {
if (window.CrdnDetailViewActrInfo && window.CrdnDetailViewActrInfo.removeSelectedActr) {
window.CrdnDetailViewActrInfo.removeSelectedActr();
}
});
},
/**

Loading…
Cancel
Save