단속 > 단속 등록&열람: 위치정보 및 불법행위 정보 관리 로직 추가, 필수값 검증 강화, 팝업 및 버튼 클릭 이벤트 리팩토링, Mapper 및 VO 업데이트

dev
박성영 4 months ago
parent 17d3cdf157
commit 044f74f236

@ -89,9 +89,10 @@ public class CrdnActInfoController {
@Operation(summary = "불법위반행위정보 팝업", description = "불법위반행위정보 등록/수정 팝업 화면을 제공합니다.")
@GetMapping("/crdnActInfoRegistPopup.do")
public ModelAndView popup(
@Parameter(description = "단속연도") @RequestParam(required = false) String crdnYr,
@Parameter(description = "단속번호") @RequestParam(required = false) String crdnNo,
@Parameter(description = "화면모드") @RequestParam(defaultValue = "insert") String mode,
@Parameter(description = "단속연도") @RequestParam String crdnYr,
@Parameter(description = "단속번호") @RequestParam String crdnNo,
@Parameter(description = "위치정보") @RequestParam String pstnInfoId,
@Parameter(description = "화면모드") @RequestParam String mode,
@Parameter(description = "행위정보ID") @RequestParam(required = false) String actInfoId,
Model model) {
@ -109,12 +110,10 @@ public class CrdnActInfoController {
mav.addObject("mode", mode);
mav.addObject("crdnYr", crdnYr);
mav.addObject("crdnNo", crdnNo);
mav.addObject("pstnInfoId", pstnInfoId);
// 필요한 공통코드 조회
model.addAttribute("actTypeCdList", commonCodeService.selectCodeDetailList(CmmnCodeSearchVO.builder().searchCdGroupId("ACT_TYPE_CD").build()));
model.addAttribute("vltnLwrgCdList", commonCodeService.selectCodeDetailList(CmmnCodeSearchVO.builder().searchCdGroupId("VLTN_LWRG_CD").build()));
model.addAttribute("strctIdxCdList", commonCodeService.selectCodeDetailList(CmmnCodeSearchVO.builder().searchCdGroupId("STRCT_IDX_CD").build()));
model.addAttribute("usgIdxCdList", commonCodeService.selectCodeDetailList(CmmnCodeSearchVO.builder().searchCdGroupId("USG_IDX_CD").build()));
return mav;
}

@ -54,6 +54,7 @@ public class CrdnOwnrSelectController {
public ModelAndView popup(
@Parameter(description = "단속 연도") @RequestParam String crdnYr,
@Parameter(description = "단속 번호") @RequestParam String crdnNo,
@Parameter(description = "위치 정보") @RequestParam String pstnInfoId,
Model model) {
log.debug("소유자 선택 팝업 조회 - 단속년도: {}, 단속번호: {}", crdnYr, crdnNo);
@ -61,6 +62,7 @@ public class CrdnOwnrSelectController {
ModelAndView mav = new ModelAndView("crdn/crndRegistAndView/crdnOwnrSelect/crdnOwnrSelectPopup" + TilesConstants.POPUP);
mav.addObject("crdnYr", crdnYr);
mav.addObject("crdnNo", crdnNo);
mav.addObject("pstnInfoId", pstnInfoId);
return mav;
}

@ -35,15 +35,12 @@
LEFT JOIN tb_user regUser ON regUser.USER_ID = oi.RGTR
LEFT JOIN tb_user delUser ON delUser.USER_ID = oi.DLTR
/* 중요로직: TB_OWNR 테이블과 조인하여 소유자 상세 정보 조회 */
LEFT JOIN tb_ownr o ON o.OWNR_ID = oi.OWNR_ID AND o.DEL_YN = 'N'
INNER JOIN tb_ownr o ON o.OWNR_ID = oi.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 oi.DEL_YN = 'N'
<if test='crdnYr != null and crdnYr != ""'>
AND oi.CRDN_YR = #{crdnYr}
</if>
<if test='crdnNo != null and crdnNo != ""'>
AND oi.CRDN_NO = #{crdnNo}
</if>
AND oi.CRDN_YR = #{crdnYr}
AND oi.CRDN_NO = #{crdnNo}
AND oi.PSTN_INFO_ID = #{pstnInfoId}
ORDER BY oi.REG_DT DESC, oi.OWNR_INFO_ID DESC
<if test='pagingYn != null and pagingYn == "Y"'>
limit #{startIndex}, #{perPage} /* 서버사이드 페이징 처리 */
@ -56,12 +53,9 @@
SELECT COUNT(*)
FROM tb_ownr_info o
WHERE o.DEL_YN = 'N'
<if test='crdnYr != null and crdnYr != ""'>
AND o.CRDN_YR = #{crdnYr}
</if>
<if test='crdnNo != null and crdnNo != ""'>
AND o.CRDN_NO = #{crdnNo}
</if>
AND o.CRDN_YR = #{crdnYr}
AND o.CRDN_NO = #{crdnNo}
AND o.PSTN_INFO_ID = #{pstnInfoId}
</select>
<!-- 소유자정보 등록 (시컨스 사용) - 필요시 사용 -->
@ -127,7 +121,7 @@
AND DEL_YN = 'N'
</update>
<!-- 소유자정보 삭제 (논리삭제) - 필요시 사용 -->
<!-- 소유자정보 삭제 (논리삭제) -->
<update id="deleteOwnrInfo">
/* OwnrInfoMapper.deleteOwnrInfo : 소유자정보 논리 삭제 */
UPDATE tb_ownr_info

@ -53,7 +53,7 @@
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_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}, '%')

@ -23,6 +23,7 @@
<input type="hidden" id="actInfoId" name="actInfoId" value="${data.actInfoId}" />
<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}" />
<table>
<colgroup>
@ -331,6 +332,16 @@
return;
}
// 중요로직: hidden input에서 파라미터 값 가져오기
var crdnYr = $('#crdnYr').val();
var crdnNo = $('#crdnNo').val();
var pstnInfoId = $('#pstnInfoId').val();
if (!crdnYr || !crdnNo || !pstnInfoId) {
alert('단속 기본정보가 없습니다.');
return;
}
var mode = $('#mode').val();
var formData = $('#actInfoForm').serialize();
@ -339,10 +350,6 @@
'<c:url value="/crdn/crndRegistAndView/crdnActInfo/insert.ajax"/>';
var actionText = (mode === 'update') ? '수정' : '등록';
//if (!confirm('불법행위정보를 ' + actionText + '하시겠습니까?')) {
// return;
//}
$.ajax({
url: url,

@ -9,6 +9,10 @@
<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}" />
<div class="popup_con">
<!-- 검색 영역 -->
<div class="box_column">
@ -281,20 +285,13 @@
}
var self = this;
var crdnYr = '${crdnYr}';
var crdnNo = '${crdnNo}';
// 중요로직: 위치정보ID 가져오기 (부모창에서)
var pstnInfoId = '';
if (window.opener && window.opener.CrdnDetailViewPstn && window.opener.CrdnDetailViewPstn.grid && window.opener.CrdnDetailViewPstn.grid.instance) {
var pstnData = window.opener.CrdnDetailViewPstn.grid.instance.getData();
if (pstnData && pstnData.length > 0) {
pstnInfoId = pstnData[0].pstnInfoId || '';
}
}
// 중요로직: hidden input에서 파라미터 값 가져오기
var crdnYr = $('#crdnYr').val();
var crdnNo = $('#crdnNo').val();
var pstnInfoId = $('#pstnInfoId').val();
if (!pstnInfoId) {
alert('위치정보가 등록되어 있지 않습니다. 위치정보를 먼저 등록해주세요.');
if (!crdnYr || !crdnNo || !pstnInfoId) {
alert('단속 기본정보가 없습니다.');
return;
}

@ -227,6 +227,84 @@
}
},
/**
* 중요로직: 불법행위 정보 등록 팝업 오픈 기능
* 단속 기본정보와 위치정보를 가지고 불법행위 등록 팝업을 연다.
*/
openActInfoRegistPopup: function() {
var crdnYr = $('#crdnYr').val();
var crdnNo = $('#crdnNo').val();
var pstnInfoId = '';
if (window.CrdnDetailViewPstn && window.CrdnDetailViewPstn.grid && window.CrdnDetailViewPstn.grid.instance) {
var pstnData = window.CrdnDetailViewPstn.grid.instance.getData();
if (pstnData && pstnData.length > 0) {
pstnInfoId = pstnData[0].pstnInfoId;
}
}
if (!crdnYr || !crdnNo || !pstnInfoId) {
alert('단속 기본정보가 없습니다.');
return;
}
var url = '<c:url value="/crdn/crndRegistAndView/crdnActInfo/crdnActInfoRegistPopup.do"/>'
+ '?crdnYr=' + encodeURIComponent(crdnYr)
+ '&pstnInfoId=' + encodeURIComponent(pstnInfoId)
+ '&crdnNo=' + encodeURIComponent(crdnNo)
+ '&mode=C';
var w = 1200, h = 480;
var left = Math.max(0, (screen.width - w) / 2);
var top = Math.max(0, (screen.height - h) / 2);
window.open(url, 'actInfoPopup', 'width=' + w + ',height=' + h + ',left=' + left + ',top=' + top + ',resizable=yes,scrollbars=yes');
},
/**
* 중요로직: 선택된 불법행위 정보 제거 기능
* 실제 불법행위 정보 데이터를 삭제하고 그리드를 리로드한다.
*/
removeActInfo: function() {
if (!this.grid.instance) {
alert('불법행위 정보 그리드가 초기화되지 않았습니다.');
return;
}
var checkedRows = this.grid.instance.getCheckedRows();
if (checkedRows.length === 0) {
alert('삭제할 항목을 선택해 주세요.');
return;
}
if (confirm('선택된 ' + checkedRows.length + '건의 불법행위 정보를 삭제하시겠습니까?')) {
var self = this;
// 중요로직: 삭제할 불법행위 정보 ID 목록 수집
var deleteIds = checkedRows.map(function(row) {
return row.actInfoId;
});
// 중요로직: 서버에 삭제 요청
$.ajax({
url: '<c:url value="/crdn/crndRegistAndView/crdnActInfo/delete.ajax"/>',
type: 'POST',
data: {
actInfoIds: deleteIds
},
traditional: true, // 배열 전송을 위한 설정
success: function(response) {
if (response && response.success) {
alert('불법행위 정보가 성공적으로 삭제되었습니다.');
// 중요로직: 그리드 리로드 처리
self.search();
} else {
alert(response.message || '삭제 중 오류가 발생했습니다.');
}
},
error: function(xhr, status, error) {
console.error('불법행위 정보 삭제 오류:', error);
alert('삭제 중 시스템 오류가 발생했습니다.');
}
});
}
},
/**
* 모듈 초기화
*/

@ -83,9 +83,19 @@
serializer: function(params) {
// 기본 파라미터 (페이지 정보 등)
var defaultParams = $.param(params);
// detailView 화면의 hidden 입력값에서 단속연도/번호를 가져온다.
var crdnYr = $('#crdnYr').val();
var crdnNo = $('#crdnNo').val();
var pstnInfoId = '';
if (window.CrdnDetailViewPstn && window.CrdnDetailViewPstn.grid && window.CrdnDetailViewPstn.grid.instance) {
var pstnData = window.CrdnDetailViewPstn.grid.instance.getData();
if (pstnData && pstnData.length > 0) {
pstnInfoId = pstnData[0].pstnInfoId;
}
}
if (!crdnYr || !crdnNo || !pstnInfoId) {
alert('단속 기본정보가 없습니다.');
return;
}
var extra = $.param({ crdnYr: crdnYr, crdnNo: crdnNo });
// 모든 파라미터 조합
return defaultParams + '&' + extra;
@ -162,9 +172,22 @@
var crdnYr = $('#crdnYr').val();
var crdnNo = $('#crdnNo').val();
var pstnInfoId = '';
if (window.CrdnDetailViewPstn && window.CrdnDetailViewPstn.grid && window.CrdnDetailViewPstn.grid.instance) {
var pstnData = window.CrdnDetailViewPstn.grid.instance.getData();
if (pstnData && pstnData.length > 0) {
pstnInfoId = pstnData[0].pstnInfoId;
}
}
if (!crdnYr || !crdnNo || !pstnInfoId) {
alert('단속 기본정보가 없습니다.');
return;
}
var url = '<c:url value="/crdn/crndRegistAndView/crdnOwnrSelect/crdnOwnrSelectPopup.do"/>' +
'?crdnYr=' + encodeURIComponent(crdnYr) +
'&crdnNo=' + encodeURIComponent(crdnNo);
'&crdnNo=' + encodeURIComponent(crdnNo) +
'&pstnInfoId=' + encodeURIComponent(pstnInfoId || '');
var w = 1000, h = 800;
var left = Math.max(0, (screen.width - w) / 2);
var top = Math.max(0, (screen.height - h) / 2);

@ -219,6 +219,80 @@
}
},
/**
* 중요로직: 위치정보 추가 팝업 오픈 기능
* 단속 기본정보를 가지고 위치정보 등록 팝업을 연다.
*/
openPstnInfoRegistPopup: function() {
var crdnYr = $('#crdnYr').val();
var crdnNo = $('#crdnNo').val();
if (!crdnYr || !crdnNo) {
alert('단속 기본정보가 없습니다.');
return;
}
var url = '<c:url value="/crdn/crndRegistAndView/crdnPstnInfo/crdnPstnInfoRegistPopup.do"/>' + '?crdnYr=' + encodeURIComponent(crdnYr) + '&crdnNo=' + encodeURIComponent(crdnNo) + '&mode=C';
var w = 1200, h = 500;
var left = Math.max(0, (screen.width - w) / 2);
var top = Math.max(0, (screen.height - h) / 2);
window.open(url, 'pstnInfoPopup', 'width=' + w + ',height=' + h + ',left=' + left + ',top=' + top + ',resizable=yes,scrollbars=yes');
},
/**
* 중요로직: 선택된 위치정보 제거 기능
* 실제 tb_pstn_info 데이터를 삭제하고 그리드를 리로드한다.
*/
removePstnInfo: function() {
if (!this.grid.instance) {
alert('위치정보 그리드가 초기화되지 않았습니다.');
return;
}
var checkedRows = this.grid.instance.getCheckedRows();
if (checkedRows.length === 0) {
alert('삭제할 위치정보를 선택해주세요.');
return;
}
if (confirm('선택된 ' + checkedRows.length + '건의 위치정보를 삭제하시겠습니까?')) {
var self = this;
// 중요로직: 삭제할 위치정보 ID 목록 수집
var deleteIds = checkedRows.map(function(row) {
return row.pstnInfoId;
}).filter(function(id) {
return id; // 빈 값 제외
});
if (deleteIds.length === 0) {
alert('삭제할 수 있는 위치정보가 없습니다.');
return;
}
// 중요로직: 서버에 삭제 요청
$.ajax({
url: '<c:url value="/crdn/crndRegistAndView/crdnPstnInfo/delete.ajax"/>',
type: 'POST',
data: {
pstnInfoIds: deleteIds
},
traditional: true, // 배열 전송을 위한 설정
success: function(response) {
if (response && response.success) {
alert('선택된 위치정보가 삭제되었습니다.');
// 중요로직: 그리드 리로드 처리
self.search();
} else {
alert(response.message || '위치정보 삭제에 실패했습니다.');
}
},
error: function(xhr, status, error) {
alert('위치정보 삭제 중 오류가 발생했습니다.');
console.error('삭제 오류:', error);
}
});
}
},
/**
* 모듈 초기화
*/

@ -365,80 +365,23 @@
}
});
// 위치정보 추가 팝업 오픈
// 조사원 선택 버튼 클릭 이벤트 (한글 주석: 화면에서 팝업을 호출하는 트리거)
$('#btnExmnrSelect').on('click', function() {
self.openExmnrPopup();
});
// 중요로직: 위치정보 추가 버튼 클릭 이벤트
$('#pstnInfoRegistBtn').on('click', function() {
var crdnYr = $('#crdnYr').val();
var crdnNo = $('#crdnNo').val();
if (!crdnYr || !crdnNo) {
alert('단속 기본정보가 없습니다.');
return;
if (window.CrdnDetailViewPstn && window.CrdnDetailViewPstn.openPstnInfoRegistPopup) {
window.CrdnDetailViewPstn.openPstnInfoRegistPopup();
}
var url = '<c:url value="/crdn/crndRegistAndView/crdnPstnInfo/crdnPstnInfoRegistPopup.do"/>' + '?crdnYr=' + encodeURIComponent(crdnYr) + '&crdnNo=' + encodeURIComponent(crdnNo) + '&mode=C';
var w = 1200, h = 500;
var left = Math.max(0, (screen.width - w) / 2);
var top = Math.max(0, (screen.height - h) / 2);
window.open(url, 'pstnInfoPopup', 'width=' + w + ',height=' + h + ',left=' + left + ',top=' + top + ',resizable=yes,scrollbars=yes');
});
// 위치정보 삭제 버튼 클릭 이벤트
// 중요로직: 위치정보 삭제 버튼 클릭 이벤트
$('#pstnInfoDeleteBtn').on('click', function() {
// 중요로직: 위치정보 그리드에서 체크된 행들을 삭제
if (!self.grids.pstn || !self.grids.pstn.grid || !self.grids.pstn.grid.instance) {
alert('위치정보 그리드가 초기화되지 않았습니다.');
return;
}
var checkedRows = self.grids.pstn.grid.instance.getCheckedRows();
if (checkedRows.length === 0) {
alert('삭제할 위치정보를 선택해주세요.');
return;
}
if (!confirm('선택된 ' + checkedRows.length + '건의 위치정보를 삭제하시겠습니까?')) {
return;
if (window.CrdnDetailViewPstn && window.CrdnDetailViewPstn.removePstnInfo) {
window.CrdnDetailViewPstn.removePstnInfo();
}
// 삭제할 위치정보 ID 목록 수집
var deleteIds = checkedRows.map(function(row) {
return row.pstnInfoId;
}).filter(function(id) {
return id; // 빈 값 제외
});
if (deleteIds.length === 0) {
alert('삭제할 수 있는 위치정보가 없습니다.');
return;
}
// 중요로직: 서버에 삭제 요청
$.ajax({
url: '<c:url value="/crdn/crndRegistAndView/crdnPstnInfo/delete.ajax"/>',
type: 'POST',
data: {
pstnInfoIds: deleteIds
},
traditional: true, // 배열 전송을 위한 설정
success: function(response) {
if (response && response.success) {
alert('선택된 위치정보가 삭제되었습니다.');
// 그리드 새로고침
if (self.grids.pstn && self.grids.pstn.search) {
self.grids.pstn.search();
}
} else {
alert(response.message || '위치정보 삭제에 실패했습니다.');
}
},
error: function(xhr, status, error) {
alert('위치정보 삭제 중 오류가 발생했습니다.');
console.error('삭제 오류:', error);
}
});
});
// 조사원 선택 버튼 클릭 이벤트 (한글 주석: 화면에서 팝업을 호출하는 트리거)
$('#btnExmnrSelect').on('click', function() {
self.openExmnrPopup();
});
// 중요로직: 소유자 선택 버튼 클릭 이벤트
@ -457,75 +400,16 @@
// 중요로직: 불법행위 정보 등록 버튼 클릭 이벤트
$('#actInfoRegistBtn').on('click', function() {
var crdnYr = $('#crdnYr').val();
var crdnNo = $('#crdnNo').val();
var pstnInfoId = '';
if (CrdnDetailViewPstn && CrdnDetailViewPstn.grid && CrdnDetailViewPstn.grid.instance) {
var pstnData = CrdnDetailViewPstn.grid.instance.getData();
if (pstnData && pstnData.length > 0) {
pstnInfoId = pstnData[0].pstnInfoId;
}
if (window.CrdnDetailViewActInfo && window.CrdnDetailViewActInfo.openActInfoRegistPopup) {
window.CrdnDetailViewActInfo.openActInfoRegistPopup();
}
if (!crdnYr || !crdnNo || !pstnInfoId) {
alert('단속 기본정보가 없습니다.');
return;
}
var url = '<c:url value="/crdn/crndRegistAndView/crdnActInfo/crdnActInfoRegistPopup.do"/>'
+ '?crdnYr=' + encodeURIComponent(crdnYr)
+ '&pstnInfoId=' + encodeURIComponent(pstnInfoId)
+ '&crdnNo=' + encodeURIComponent(crdnNo)
+ '&mode=C';
var w = 1200, h = 480;
var left = Math.max(0, (screen.width - w) / 2);
var top = Math.max(0, (screen.height - h) / 2);
window.open(url, 'actInfoPopup', 'width=' + w + ',height=' + h + ',left=' + left + ',top=' + top + ',resizable=yes,scrollbars=yes');
});
// 중요로직: 불법행위 정보 삭제 버튼 클릭 이벤트
$('#actInfoDeleteBtn').on('click', function() {
if (!window.CrdnDetailView.grids.actInfo || !window.CrdnDetailView.grids.actInfo.grid.instance) {
alert('불법행위 정보 그리드가 초기화되지 않았습니다.');
return;
}
var checkedRows = window.CrdnDetailView.grids.actInfo.grid.instance.getCheckedRows();
if (checkedRows.length === 0) {
alert('삭제할 항목을 선택해 주세요.');
return;
if (window.CrdnDetailViewActInfo && window.CrdnDetailViewActInfo.removeActInfo) {
window.CrdnDetailViewActInfo.removeActInfo();
}
if (!confirm('선택된 ' + checkedRows.length + '건의 불법행위 정보를 삭제하시겠습니까?')) {
return;
}
var deleteIds = checkedRows.map(function(row) {
return row.actInfoId;
});
// 중요로직: 서버에 삭제 요청
$.ajax({
url: '<c:url value="/crdn/crndRegistAndView/crdnActInfo/delete.ajax"/>',
type: 'POST',
data: {
actInfoIds: deleteIds
},
traditional: true, // 배열 전송을 위한 설정
success: function(response) {
if (response && response.success) {
alert('불법행위 정보가 성공적으로 삭제되었습니다.');
// 그리드 새로고침
if (window.CrdnDetailView.grids.actInfo) {
window.CrdnDetailView.grids.actInfo.search();
}
} else {
alert(response.message || '삭제 중 오류가 발생했습니다.');
}
},
error: function(xhr, status, error) {
console.error('불법행위 정보 삭제 오류:', error);
alert('삭제 중 시스템 오류가 발생했습니다.');
}
});
});
},

Loading…
Cancel
Save