단속 > 단속 등록&열람: 상세 템플릿 html 구성 진행중...

dev
박성영 4 months ago
parent 2c005e87bb
commit 49dab9de8a

@ -158,6 +158,54 @@ public class CrdnRegistAndViewController {
}
}
/**
* .
* 4 .
*
* @param crdnYr
* @param crdnNo
* @param model
* @return
*/
@GetMapping("/detailView.do")
@Operation(summary = "단속 상세보기", description = "단속 상세 정보를 4개 그리드로 분할하여 표시합니다.")
public String detailView(
@Parameter(description = "단속 연도") @RequestParam String crdnYr,
@Parameter(description = "단속 번호") @RequestParam String crdnNo,
Model model) {
try {
log.debug("단속 상세보기 페이지 요청 - 단속연도: {}, 단속번호: {}", crdnYr, crdnNo);
// 파라미터를 모델에 추가하여 JSP에서 사용할 수 있도록 함
model.addAttribute("crdnYr", crdnYr);
model.addAttribute("crdnNo", crdnNo);
// 상세보기에 필요한 공통코드 조회 (list 메서드와 동일)
// 지역구분 코드 조회
CmmnCodeSearchVO rgnSeCdSearchVO = CmmnCodeSearchVO.builder()
.searchCdGroupId("RGN_SE_CD")
.sortColumn("SORT_ORDR")
.sortAscending(true)
.build();
model.addAttribute("regionList", commonCodeService.selectCodeDetailList(rgnSeCdSearchVO));
// 적발방법 코드 조회
CmmnCodeSearchVO dsclMthdCdSearchVO = CmmnCodeSearchVO.builder()
.searchCdGroupId("DSCL_MTHD_CD")
.sortColumn("CD_NM")
.sortAscending(true)
.build();
model.addAttribute("dsclMthdCdList", commonCodeService.selectCodeDetailList(dsclMthdCdSearchVO));
return "crdn/crndRegistAndView/detailView" + TilesConstants.BASE;
} catch (Exception e) {
log.error("단속 상세보기 페이지 제공 중 오류 발생", e);
throw new MessageException("상세보기 페이지를 불러오는 중 오류가 발생했습니다.");
}
}
/**
* .
*

@ -0,0 +1,213 @@
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<script type="text/javascript">
/**
* 단속자료 위치정보 그리드 모듈 (Grid1)
* 단속 데이터의 위치 관련 정보를 표시합니다.
*/
(function(window, $) {
'use strict';
/**
* Grid1 (단속자료 위치정보) 관리 네임스페이스
*/
var CrdnDetailViewGrid1 = {
/**
* 그리드 관련 객체
*/
grid: {
/**
* 그리드 인스턴스
*/
instance: null,
/**
* 그리드 설정 초기화
* @returns {Object} 그리드 설정 객체
*/
initConfig: function() {
// 데이터 소스 설정
var dataSource = this.createDataSource();
// 그리드 설정 객체 생성
var gridConfig = new XitTuiGridConfig();
// 기본 설정
gridConfig.setOptDataSource(dataSource); // 데이터소스 연결
gridConfig.setOptGridId('grid1'); // 그리드를 출력할 Element ID
gridConfig.setOptGridHeight(200); // 그리드 높이(단위: px)
gridConfig.setOptRowHeight(30); // 그리드 행 높이(단위: px)
gridConfig.setOptRowHeaderType('rowNum'); // 행 첫번째 셀 타입(rowNum: 순번)
gridConfig.setOptUseClientSort(true); // 클라이언트 사이드 정렬
gridConfig.setOptRowHeaderType('checkbox');
gridConfig.setOptColumns(this.getGridColumns());
return gridConfig;
},
/**
* 그리드 컬럼 정의
* @returns {Array} 그리드 컬럼 배열
*/
getGridColumns: function() {
return [
{
header: '단속년도',
name: 'crdnYr',
align: 'center',
width: 80,
sortable: true
},
{
header: '단속번호',
name: 'crdnNo',
align: 'center',
width: 90,
sortable: true
},
{
header: '지역구분',
name: 'rgnSeCdNm',
align: 'center',
width: 100
},
{
header: '소재지',
name: 'lctnAddr',
align: 'left',
width: 200
},
{
header: '지번',
name: 'lotNoAddr',
align: 'left',
width: 150
},
{
header: '도로명주소',
name: 'roadNmAddr',
align: 'left',
width: 200
},
{
header: '상세주소',
name: 'dtlAddr',
align: 'left',
width: 150
}
];
},
/**
* 데이터 소스 생성
* @returns {Object} 데이터 소스 설정 객체
*/
createDataSource: function() {
return {
api: {
readData: {
url: '<c:url value="/crdn/crndRegistAndView/list.ajax"/>',
method: 'POST',
contentType: 'application/x-www-form-urlencoded',
processData: true
}
},
initialRequest: true, // 초기 데이터 요청 여부
serializer: function(params) {
// 기본 파라미터 (페이지 정보 등)
var defaultParams = $.param(params);
// 검색 조건 가져오기
var searchCond = window.CrdnDetailView ? window.CrdnDetailView.getSearchCondition() : {};
var searchParams = $.param(searchCond);
// 모든 파라미터 조합
return defaultParams + '&' + searchParams;
}
};
},
/**
* 그리드 인스턴스 생성
*/
create: function() {
var gridConfig = this.initConfig();
var Grid = tui.Grid;
this.instance = gridConfig.instance(Grid);
// 그리드 테마 설정
Grid.applyTheme('striped');
this.gridBindEvents();
},
/**
* 그리드 이벤트 바인딩
*/
gridBindEvents: function() {
var self = this;
// 데이터 로딩 완료 이벤트
this.instance.on('successResponse', function(ev) {
});
// 행 클릭 이벤트
this.instance.on('click', function(ev) {
if (ev.rowKey !== undefined && ev.rowKey !== null) {
var rowData = self.instance.getRow(ev.rowKey);
console.log('Grid1 행 클릭:', rowData);
}
});
// 행 더블클릭 이벤트
this.instance.on('dblclick', function(ev) {
var rowKey = ev.rowKey;
var rowData = self.instance.getRow(rowKey);
if (rowData) {
console.log('Grid1 행 더블클릭:', rowData);
// 상세 정보 표시 또는 추가 동작 구현 가능
}
});
}
},
/**
* 검색 함수
* 메인 모듈에서 호출됨
*/
search: function() {
if (this.grid.instance) {
this.grid.instance.readData();
console.log('Grid1 검색 실행');
}
},
/**
* 모듈 초기화
*/
init: function() {
// 그리드 생성
this.grid.create();
// 메인 모듈에 자신을 등록
if (window.CrdnDetailView) {
window.CrdnDetailView.registerGrid('grid1', this);
}
console.log('Grid1 (단속자료 위치정보) 모듈이 초기화되었습니다.');
}
};
// DOM 준비 완료 시 초기화
$(document).ready(function() {
// 메인 모듈이 로드될 때까지 약간의 지연
setTimeout(function() {
CrdnDetailViewGrid1.init();
}, 100);
});
// 전역 네임스페이스에 모듈 노출
window.CrdnDetailViewGrid1 = CrdnDetailViewGrid1;
})(window, jQuery);
</script>

@ -0,0 +1,235 @@
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<script type="text/javascript">
/**
* 소유자 정보 그리드 모듈 (Grid2)
* 단속 데이터의 소유자 관련 정보를 표시합니다.
*/
(function(window, $) {
'use strict';
/**
* Grid2 (소유자 정보) 관리 네임스페이스
*/
var CrdnDetailViewGrid2 = {
/**
* 그리드 관련 객체
*/
grid: {
/**
* 그리드 인스턴스
*/
instance: null,
/**
* 그리드 설정 초기화
* @returns {Object} 그리드 설정 객체
*/
initConfig: function() {
// 데이터 소스 설정
var dataSource = this.createDataSource();
// 그리드 설정 객체 생성
var gridConfig = new XitTuiGridConfig();
// 기본 설정
gridConfig.setOptDataSource(dataSource); // 데이터소스 연결
gridConfig.setOptGridId('grid2'); // 그리드를 출력할 Element ID
gridConfig.setOptGridHeight(200); // 그리드 높이(단위: px)
gridConfig.setOptRowHeight(30); // 그리드 행 높이(단위: px)
gridConfig.setOptRowHeaderType('rowNum'); // 행 첫번째 셀 타입(rowNum: 순번)
gridConfig.setOptUseClientSort(true); // 클라이언트 사이드 정렬
gridConfig.setOptRowHeaderType('checkbox');
gridConfig.setOptColumns(this.getGridColumns());
return gridConfig;
},
/**
* 그리드 컬럼 정의
* @returns {Array} 그리드 컬럼 배열
*/
getGridColumns: function() {
return [
{
header: '단속년도',
name: 'crdnYr',
align: 'center',
width: 80,
sortable: true
},
{
header: '단속번호',
name: 'crdnNo',
align: 'center',
width: 90,
sortable: true
},
{
header: '부과금액',
name: 'levyAmt',
align: 'right',
width: 100,
formatter: function(e) {
// 숫자 천단위 콤마 표시
return e.value ? Number(e.value).toLocaleString() + '원' : '0원';
}
},
{
header: '감경금액',
name: 'rdctnAmt',
align: 'right',
width: 100,
formatter: function(e) {
return e.value ? Number(e.value).toLocaleString() + '원' : '0원';
}
},
{
header: '납부금액',
name: 'payAmt',
align: 'right',
width: 100,
formatter: function(e) {
return e.value ? Number(e.value).toLocaleString() + '원' : '0원';
}
},
{
header: '납부일자',
name: 'payYmd',
align: 'center',
width: 100,
formatter: function (e) {
return e.value ? moment(e.value).format('YYYY-MM-DD') : '';
}
},
{
header: '부과일자',
name: 'levyYmd',
align: 'center',
width: 100,
formatter: function (e) {
return e.value ? moment(e.value).format('YYYY-MM-DD') : '';
}
},
{
header: '진행단계',
name: 'crdnPrcsSttsCdNm',
align: 'center',
width: 100
}
];
},
/**
* 데이터 소스 생성
* @returns {Object} 데이터 소스 설정 객체
*/
createDataSource: function() {
return {
api: {
readData: {
url: '<c:url value="/crdn/crndRegistAndView/list.ajax"/>',
method: 'POST',
contentType: 'application/x-www-form-urlencoded',
processData: true
}
},
initialRequest: true, // 초기 데이터 요청 여부
serializer: function(params) {
// 기본 파라미터 (페이지 정보 등)
var defaultParams = $.param(params);
// 검색 조건 가져오기
var searchCond = window.CrdnDetailView ? window.CrdnDetailView.getSearchCondition() : {};
var searchParams = $.param(searchCond);
// 모든 파라미터 조합
return defaultParams + '&' + searchParams;
}
};
},
/**
* 그리드 인스턴스 생성
*/
create: function() {
var gridConfig = this.initConfig();
var Grid = tui.Grid;
this.instance = gridConfig.instance(Grid);
// 그리드 테마 설정
Grid.applyTheme('striped');
this.gridBindEvents();
},
/**
* 그리드 이벤트 바인딩
*/
gridBindEvents: function() {
var self = this;
// 데이터 로딩 완료 이벤트
this.instance.on('successResponse', function(ev) {
});
// 행 클릭 이벤트
this.instance.on('click', function(ev) {
if (ev.rowKey !== undefined && ev.rowKey !== null) {
var rowData = self.instance.getRow(ev.rowKey);
console.log('Grid2 행 클릭:', rowData);
}
});
// 행 더블클릭 이벤트
this.instance.on('dblclick', function(ev) {
var rowKey = ev.rowKey;
var rowData = self.instance.getRow(rowKey);
if (rowData) {
console.log('Grid2 행 더블클릭:', rowData);
// 소유자 상세 정보 모달 또는 추가 동작 구현 가능
}
});
}
},
/**
* 검색 함수
* 메인 모듈에서 호출됨
*/
search: function() {
if (this.grid.instance) {
this.grid.instance.readData();
console.log('Grid2 검색 실행');
}
},
/**
* 모듈 초기화
*/
init: function() {
// 그리드 생성
this.grid.create();
// 메인 모듈에 자신을 등록
if (window.CrdnDetailView) {
window.CrdnDetailView.registerGrid('grid2', this);
}
console.log('Grid2 (소유자 정보) 모듈이 초기화되었습니다.');
}
};
// DOM 준비 완료 시 초기화
$(document).ready(function() {
// 메인 모듈이 로드될 때까지 약간의 지연
setTimeout(function() {
CrdnDetailViewGrid2.init();
}, 150);
});
// 전역 네임스페이스에 모듈 노출
window.CrdnDetailViewGrid2 = CrdnDetailViewGrid2;
})(window, jQuery);
</script>

@ -0,0 +1,235 @@
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<script type="text/javascript">
/**
* 행위자정보 그리드 모듈 (Grid3)
* 단속 데이터의 행위자 관련 정보를 표시합니다.
*/
(function(window, $) {
'use strict';
/**
* Grid3 (행위자정보) 관리 네임스페이스
*/
var CrdnDetailViewGrid3 = {
/**
* 그리드 관련 객체
*/
grid: {
/**
* 그리드 인스턴스
*/
instance: null,
/**
* 그리드 설정 초기화
* @returns {Object} 그리드 설정 객체
*/
initConfig: function() {
// 데이터 소스 설정
var dataSource = this.createDataSource();
// 그리드 설정 객체 생성
var gridConfig = new XitTuiGridConfig();
// 기본 설정
gridConfig.setOptDataSource(dataSource); // 데이터소스 연결
gridConfig.setOptGridId('grid3'); // 그리드를 출력할 Element ID
gridConfig.setOptGridHeight(200); // 그리드 높이(단위: px)
gridConfig.setOptRowHeight(30); // 그리드 행 높이(단위: px)
gridConfig.setOptRowHeaderType('rowNum'); // 행 첫번째 셀 타입(rowNum: 순번)
gridConfig.setOptUseClientSort(true); // 클라이언트 사이드 정렬
gridConfig.setOptRowHeaderType('checkbox');
gridConfig.setOptColumns(this.getGridColumns());
return gridConfig;
},
/**
* 그리드 컬럼 정의
* @returns {Array} 그리드 컬럼 배열
*/
getGridColumns: function() {
return [
{
header: '단속년도',
name: 'crdnYr',
align: 'center',
width: 80,
sortable: true
},
{
header: '단속번호',
name: 'crdnNo',
align: 'center',
width: 90,
sortable: true
},
{
header: '행위자명',
name: 'actorNm',
align: 'center',
width: 120
},
{
header: '생년월일',
name: 'brthYmd',
align: 'center',
width: 100,
formatter: function (e) {
return e.value ? moment(e.value).format('YYYY-MM-DD') : '';
}
},
{
header: '주민등록번호',
name: 'rrno',
align: 'center',
width: 130,
formatter: function(e) {
// 주민등록번호 뒷자리 마스킹 처리
if (e.value && e.value.length >= 7) {
return e.value.substring(0, 6) + '-' + e.value.substring(6, 7) + '******';
}
return e.value || '';
}
},
{
header: '전화번호',
name: 'telno',
align: 'center',
width: 120
},
{
header: '휴대폰번호',
name: 'mbtlno',
align: 'center',
width: 120
},
{
header: '주소',
name: 'addr',
align: 'left',
width: 250
},
{
header: '업체명',
name: 'cmpnyNm',
align: 'left',
width: 150
}
];
},
/**
* 데이터 소스 생성
* @returns {Object} 데이터 소스 설정 객체
*/
createDataSource: function() {
return {
api: {
readData: {
url: '<c:url value="/crdn/crndRegistAndView/list.ajax"/>',
method: 'POST',
contentType: 'application/x-www-form-urlencoded',
processData: true
}
},
initialRequest: true, // 초기 데이터 요청 여부
serializer: function(params) {
// 기본 파라미터 (페이지 정보 등)
var defaultParams = $.param(params);
// 검색 조건 가져오기
var searchCond = window.CrdnDetailView ? window.CrdnDetailView.getSearchCondition() : {};
var searchParams = $.param(searchCond);
// 모든 파라미터 조합
return defaultParams + '&' + searchParams;
}
};
},
/**
* 그리드 인스턴스 생성
*/
create: function() {
var gridConfig = this.initConfig();
var Grid = tui.Grid;
this.instance = gridConfig.instance(Grid);
// 그리드 테마 설정
Grid.applyTheme('striped');
this.gridBindEvents();
},
/**
* 그리드 이벤트 바인딩
*/
gridBindEvents: function() {
var self = this;
// 데이터 로딩 완료 이벤트
this.instance.on('successResponse', function(ev) {
});
// 행 클릭 이벤트
this.instance.on('click', function(ev) {
if (ev.rowKey !== undefined && ev.rowKey !== null) {
var rowData = self.instance.getRow(ev.rowKey);
console.log('Grid3 행 클릭:', rowData);
}
});
// 행 더블클릭 이벤트
this.instance.on('dblclick', function(ev) {
var rowKey = ev.rowKey;
var rowData = self.instance.getRow(rowKey);
if (rowData) {
console.log('Grid3 행 더블클릭:', rowData);
// 행위자 상세 정보 모달 또는 추가 동작 구현 가능
}
});
}
},
/**
* 검색 함수
* 메인 모듈에서 호출됨
*/
search: function() {
if (this.grid.instance) {
this.grid.instance.readData();
console.log('Grid3 검색 실행');
}
},
/**
* 모듈 초기화
*/
init: function() {
// 그리드 생성
this.grid.create();
// 메인 모듈에 자신을 등록
if (window.CrdnDetailView) {
window.CrdnDetailView.registerGrid('grid3', this);
}
console.log('Grid3 (행위자정보) 모듈이 초기화되었습니다.');
}
};
// DOM 준비 완료 시 초기화
$(document).ready(function() {
// 메인 모듈이 로드될 때까지 약간의 지연
setTimeout(function() {
CrdnDetailViewGrid3.init();
}, 200);
});
// 전역 네임스페이스에 모듈 노출
window.CrdnDetailViewGrid3 = CrdnDetailViewGrid3;
})(window, jQuery);
</script>

@ -0,0 +1,241 @@
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<script type="text/javascript">
/**
* 수유자정보 그리드 모듈 (Grid4)
* 단속 데이터의 수유자 관련 정보를 표시합니다.
*/
(function(window, $) {
'use strict';
/**
* Grid4 (수유자정보) 관리 네임스페이스
*/
var CrdnDetailViewGrid4 = {
/**
* 그리드 관련 객체
*/
grid: {
/**
* 그리드 인스턴스
*/
instance: null,
/**
* 그리드 설정 초기화
* @returns {Object} 그리드 설정 객체
*/
initConfig: function() {
// 데이터 소스 설정
var dataSource = this.createDataSource();
// 그리드 설정 객체 생성
var gridConfig = new XitTuiGridConfig();
// 기본 설정
gridConfig.setOptDataSource(dataSource); // 데이터소스 연결
gridConfig.setOptGridId('grid4'); // 그리드를 출력할 Element ID
gridConfig.setOptGridHeight(200); // 그리드 높이(단위: px)
gridConfig.setOptRowHeight(30); // 그리드 행 높이(단위: px)
gridConfig.setOptRowHeaderType('rowNum'); // 행 첫번째 셀 타입(rowNum: 순번)
gridConfig.setOptUseClientSort(true); // 클라이언트 사이드 정렬
gridConfig.setOptRowHeaderType('checkbox');
gridConfig.setOptColumns(this.getGridColumns());
return gridConfig;
},
/**
* 그리드 컬럼 정의
* @returns {Array} 그리드 컬럼 배열
*/
getGridColumns: function() {
return [
{
header: '단속년도',
name: 'crdnYr',
align: 'center',
width: 80,
sortable: true
},
{
header: '단속번호',
name: 'crdnNo',
align: 'center',
width: 90,
sortable: true
},
{
header: '수유자명',
name: 'ownerNm',
align: 'center',
width: 120
},
{
header: '생년월일',
name: 'ownerBrthYmd',
align: 'center',
width: 100,
formatter: function (e) {
return e.value ? moment(e.value).format('YYYY-MM-DD') : '';
}
},
{
header: '주민등록번호',
name: 'ownerRrno',
align: 'center',
width: 130,
formatter: function(e) {
// 주민등록번호 뒷자리 마스킹 처리
if (e.value && e.value.length >= 7) {
return e.value.substring(0, 6) + '-' + e.value.substring(6, 7) + '******';
}
return e.value || '';
}
},
{
header: '전화번호',
name: 'ownerTelno',
align: 'center',
width: 120
},
{
header: '휴대폰번호',
name: 'ownerMbtlno',
align: 'center',
width: 120
},
{
header: '주소',
name: 'ownerAddr',
align: 'left',
width: 250
},
{
header: '관계',
name: 'rltnCdNm',
align: 'center',
width: 100
},
{
header: '소유구분',
name: 'ownrshpSeCdNm',
align: 'center',
width: 100
}
];
},
/**
* 데이터 소스 생성
* @returns {Object} 데이터 소스 설정 객체
*/
createDataSource: function() {
return {
api: {
readData: {
url: '<c:url value="/crdn/crndRegistAndView/list.ajax"/>',
method: 'POST',
contentType: 'application/x-www-form-urlencoded',
processData: true
}
},
initialRequest: true, // 초기 데이터 요청 여부
serializer: function(params) {
// 기본 파라미터 (페이지 정보 등)
var defaultParams = $.param(params);
// 검색 조건 가져오기
var searchCond = window.CrdnDetailView ? window.CrdnDetailView.getSearchCondition() : {};
var searchParams = $.param(searchCond);
// 모든 파라미터 조합
return defaultParams + '&' + searchParams;
}
};
},
/**
* 그리드 인스턴스 생성
*/
create: function() {
var gridConfig = this.initConfig();
var Grid = tui.Grid;
this.instance = gridConfig.instance(Grid);
// 그리드 테마 설정
Grid.applyTheme('striped');
this.gridBindEvents();
},
/**
* 그리드 이벤트 바인딩
*/
gridBindEvents: function() {
var self = this;
// 데이터 로딩 완료 이벤트
this.instance.on('successResponse', function(ev) {
});
// 행 클릭 이벤트
this.instance.on('click', function(ev) {
if (ev.rowKey !== undefined && ev.rowKey !== null) {
var rowData = self.instance.getRow(ev.rowKey);
console.log('Grid4 행 클릭:', rowData);
}
});
// 행 더블클릭 이벤트
this.instance.on('dblclick', function(ev) {
var rowKey = ev.rowKey;
var rowData = self.instance.getRow(rowKey);
if (rowData) {
console.log('Grid4 행 더블클릭:', rowData);
// 수유자 상세 정보 모달 또는 추가 동작 구현 가능
}
});
}
},
/**
* 검색 함수
* 메인 모듈에서 호출됨
*/
search: function() {
if (this.grid.instance) {
this.grid.instance.readData();
console.log('Grid4 검색 실행');
}
},
/**
* 모듈 초기화
*/
init: function() {
// 그리드 생성
this.grid.create();
// 메인 모듈에 자신을 등록
if (window.CrdnDetailView) {
window.CrdnDetailView.registerGrid('grid4', this);
}
console.log('Grid4 (수유자정보) 모듈이 초기화되었습니다.');
}
};
// DOM 준비 완료 시 초기화
$(document).ready(function() {
// 메인 모듈이 로드될 때까지 약간의 지연
setTimeout(function() {
CrdnDetailViewGrid4.init();
}, 250);
});
// 전역 네임스페이스에 모듈 노출
window.CrdnDetailViewGrid4 = CrdnDetailViewGrid4;
})(window, jQuery);
</script>

@ -0,0 +1,402 @@
<%@ 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" %>
<!-- Main body -->
<div class="main_body">
<section id="section8" class="main_bars">
<div class="bgs-main">
<section id="section5">
<div class="sub_title"></div>
<button type="button" id="save_btn" class="newbtn bg1">저장</button>
<button type="button" id="cancel_btn" class="newbtn bg5" style="margin-left: 5px;">취소</button>
</section>
</div>
</section>
<div class="contants_body">
<div class="box_column">
<div class="containers">
<div class="forms_table_non">
<form id="crdnForm" name="crdnForm">
<input type="hidden" id="mode" name="mode" value="U" />
<input type="hidden" id="crdnYr" name="crdnYr" value="${crdnYr}" />
<input type="hidden" id="crdnNo" name="crdnNo" value="${crdnNo}" />
<table>
<tr>
<th class="th"><span class="required">*</span> 단속년도</th>
<td>
<input type="text" id="dispCrdnYr" name="dispCrdnYr" class="input" value="${crdnYr}" readonly style="width: 80px;"/>
</td>
<th class="th"><span class="required">*</span> 단속번호</th>
<td>
<input type="text" id="dispCrdnNo" name="dispCrdnNo" class="input" value="${crdnNo}" readonly style="width: 100px;"/>
</td>
<th class="th"><span class="required">*</span> 지역구분</th>
<td>
<select id="rgnSeCd" name="rgnSeCd" class="input" style="width: 120px;" validation-check="required">
<option value="">선택하세요</option>
<c:forEach var="code" items="${regionList}">
<option value="${code.cdId}">${code.cdNm}</option>
</c:forEach>
</select>
</td>
<th class="th"><span class="required">*</span> 적발방법</th>
<td>
<select id="dsclMthdCd" name="dsclMthdCd" class="input" style="width: 120px;" validation-check="required">
<option value="">선택하세요</option>
<c:forEach var="code" items="${dsclMthdCdList}">
<option value="${code.cdId}">${code.cdNm}</option>
</c:forEach>
</select>
</td>
</tr>
<tr>
<th class="th"><span class="required">*</span> 적발일자</th>
<td>
<input type="text" id="dsclYmd" name="dsclYmd" class="input calender datepicker" maxlength="10" style="width: 120px;" autocomplete="off" validation-check="required"/>
</td>
<th class="th">조사원</th>
<td>
<input type="text" id="exmnr" name="exmnr" class="input" maxlength="100"/>
</td>
<th class="th"><span class="required">*</span> 재부과여부</th>
<td>
<select id="relevyYn" name="relevyYn" class="input" style="width: 100px;" validation-check="required">
<option value="">선택하세요</option>
<option value="N">신규</option>
<option value="Y">재부과</option>
</select>
</td>
<th class="th"><span class="required">*</span> 가중부과대상</th>
<td>
<select id="agrvtnLevyTrgtYn" name="agrvtnLevyTrgtYn" class="input" style="width: 100px;" validation-check="required">
<option value="">선택하세요</option>
<option value="N">비대상</option>
<option value="Y">대상</option>
</select>
</td>
</tr>
<tr>
<th class="th">비고</th>
<td colspan="7">
<textarea id="rmrk" name="rmrk" class="textarea" rows="1" maxlength="1000" style="width: 100%; height: 60px;"></textarea>
</td>
</tr>
</table>
</form>
</div>
</div>
</div>
<!-- 4개 그리드 분할 레이아웃 -->
<div class="gs_booking">
<!-- 상단 2개 그리드 -->
<div class="row" style="margin-bottom: 10px;">
<div class="col-sm-6">
<div class="box_column">
<ul class="box_title">
<li class="tit">단속자료 위치정보</li>
</ul>
<div class="containers">
<div id="grid1"></div>
</div>
</div>
</div>
<div class="col-sm-6">
<div class="box_column">
<ul class="box_title">
<li class="tit">소유자 정보</li>
</ul>
<div class="containers">
<div id="grid2"></div>
</div>
</div>
</div>
</div>
<!-- 하단 2개 그리드 -->
<div class="row">
<div class="col-sm-6">
<div class="box_column">
<ul class="box_title">
<li class="tit">행위자정보</li>
</ul>
<div class="containers">
<div id="grid3"></div>
</div>
</div>
</div>
<div class="col-sm-6">
<div class="box_column">
<ul class="box_title">
<li class="tit">수유자정보</li>
</ul>
<div class="containers">
<div id="grid4"></div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- /Main body -->
<!-- 각 그리드별 개별 JSP 포함 -->
<%@ include file="detailView-grid1.jsp" %>
<%@ include file="detailView-grid2.jsp" %>
<%@ include file="detailView-grid3.jsp" %>
<%@ include file="detailView-grid4.jsp" %>
<script type="text/javascript">
/**
* 단속 상세보기 4개 그리드 통합 관리 모듈
* 단속 데이터의 상세정보를 4개 그리드로 분할하여 표시합니다.
*/
(function(window, $) {
'use strict';
var SEARCH_COND = {};
// 검색정보 설정
var setSearchCond = function() {
var schCrdnYr = $.trim(nvl($("#schCrdnYr").val(), ""));
var schCrdnNo = $.trim(nvl($("#schCrdnNo").val(), ""));
var schRgnSeCd = $.trim(nvl($("#schRgnSeCd").val(), ""));
var schDsclMthdCd = $.trim(nvl($("#schDsclMthdCd").val(), ""));
var schExmnr = $.trim(nvl($("#schExmnr").val(), ""));
SEARCH_COND.schCrdnYr = schCrdnYr;
SEARCH_COND.schCrdnNo = schCrdnNo;
SEARCH_COND.schRgnSeCd = schRgnSeCd;
SEARCH_COND.schDsclMthdCd = schDsclMthdCd;
SEARCH_COND.schExmnr = schExmnr;
};
/**
* 단속 상세보기 관리 네임스페이스
*/
var CrdnDetailView = {
/**
* 현재 수정 중인 데이터
*/
currentData: null,
/**
* 통합 그리드 관리 객체
*/
grids: {
// 각 그리드 모듈 인스턴스들
grid1: null,
grid2: null,
grid3: null,
grid4: null
},
/**
* 단속 정보 로딩 함수
* 페이지 로드 시 URL 파라미터로 전달받은 단속 정보를 조회하여 폼에 채웁니다.
*/
loadCrdnData: function() {
var self = this;
var crdnYr = '${crdnYr}';
var crdnNo = '${crdnNo}';
if (crdnYr && crdnNo) {
$.ajax({
url: '<c:url value="/crdn/crndRegistAndView/selectOne.ajax"/>',
type: 'GET',
data: {
crdnYr: crdnYr,
crdnNo: crdnNo
},
success: function(response) {
if (response && response.success && response.data) {
self.currentData = response.data;
self.populateForm(response.data);
} else {
alert('단속 정보를 불러올 수 없습니다.');
}
},
error: function(xhr, status, error) {
console.error('단속 정보 조회 오류:', error);
alert('단속 정보 조회 중 오류가 발생했습니다.');
}
});
}
},
/**
* 폼에 데이터 채우기
* 조회한 단속 정보를 폼 필드에 설정합니다.
*/
populateForm: function(data) {
$('#rgnSeCd').val(data.rgnSeCd || '');
$('#dsclMthdCd').val(data.dsclMthdCd || '');
$('#dsclYmd').val(data.dsclYmd ? moment(data.dsclYmd).format('YYYY-MM-DD') : '');
$('#exmnr').val(data.exmnr || '');
$('#relevyYn').val(data.relevyYn || 'N');
$('#agrvtnLevyTrgtYn').val(data.agrvtnLevyTrgtYn || 'N');
$('#rmrk').val(data.rmrk || '');
},
/**
* 단속 정보 저장
*/
saveCrdnData: function() {
var self = this;
// 필수 필드 검증
if (!$('#rgnSeCd').val()) {
alert('지역구분을 선택해주세요.');
$('#rgnSeCd').focus();
return;
}
if (!$('#dsclMthdCd').val()) {
alert('적발방법을 선택해주세요.');
$('#dsclMthdCd').focus();
return;
}
if (!$('#dsclYmd').val()) {
alert('적발일자를 입력해주세요.');
$('#dsclYmd').focus();
return;
}
// 폼 데이터 수집
var formData = {
crdnYr: $('#crdnYr').val(),
crdnNo: $('#crdnNo').val(),
rgnSeCd: $('#rgnSeCd').val(),
dsclMthdCd: $('#dsclMthdCd').val(),
dsclYmd: $('#dsclYmd').val().replace(/-/g, ''),
exmnr: $('#exmnr').val(),
relevyYn: $('#relevyYn').val(),
agrvtnLevyTrgtYn: $('#agrvtnLevyTrgtYn').val(),
rmrk: $('#rmrk').val()
};
if (confirm('단속 정보를 저장하시겠습니까?')) {
$.ajax({
url: '<c:url value="/crdn/crndRegistAndView/update.ajax"/>',
type: 'POST',
data: formData,
success: function(response) {
if (response && response.success) {
alert('단속 정보가 성공적으로 저장되었습니다.');
// 현재 데이터 업데이트
self.currentData = formData;
// 그리드 새로고침
self.refreshAllGrids();
} else {
alert(response.message || '저장에 실패했습니다.');
}
},
error: function(xhr, status, error) {
console.error('저장 오류:', error);
alert('저장 중 오류가 발생했습니다.');
}
});
}
},
/**
* 폼 초기화 (취소 기능)
*/
resetForm: function() {
if (confirm('변경사항을 취소하고 원래 데이터로 되돌리시겠습니까?')) {
if (this.currentData) {
this.populateForm(this.currentData);
} else {
this.loadCrdnData();
}
}
},
/**
* 모든 그리드 새로고침
*/
refreshAllGrids: function() {
// 각 그리드 모듈의 검색 함수 호출
if (this.grids.grid1 && this.grids.grid1.search) {
this.grids.grid1.search();
}
if (this.grids.grid2 && this.grids.grid2.search) {
this.grids.grid2.search();
}
if (this.grids.grid3 && this.grids.grid3.search) {
this.grids.grid3.search();
}
if (this.grids.grid4 && this.grids.grid4.search) {
this.grids.grid4.search();
}
},
/**
* 이벤트 핸들러 설정
*/
eventBindEvents: function() {
var self = this;
// 저장 버튼 클릭 이벤트
$('#save_btn').on('click', function() {
self.saveCrdnData();
});
// 취소 버튼 클릭 이벤트
$('#cancel_btn').on('click', function() {
self.resetForm();
});
// 닫기 버튼 클릭 이벤트
$("#closeBtn").on('click', function() {
if (confirm('페이지를 닫으시겠습니까?')) {
// list 페이지로 이동 (선택 파라미터 제거)
window.location.href = removeUrlParam(["selectCrdnYr", "selectCrdnNo"], "<c:url value="/crdn/crndRegistAndView/list.do"/>");
}
});
},
/**
* 그리드 모듈 등록 함수
* 각 개별 그리드 모듈에서 자신을 등록할 때 사용
*/
registerGrid: function(gridName, gridModule) {
this.grids[gridName] = gridModule;
console.log(gridName + ' 그리드 모듈이 등록되었습니다.');
},
/**
* 공통 검색 조건 반환 함수
* 각 그리드 모듈에서 검색 시 사용
*/
getSearchCondition: function() {
setSearchCond();
return SEARCH_COND;
},
/**
* 모듈 초기화
*/
init: function() {
// 이벤트 핸들러 설정
this.eventBindEvents();
// 단속 데이터 로딩
this.loadCrdnData();
console.log('단속 상세보기 통합 모듈이 초기화되었습니다.');
}
};
// DOM 준비 완료 시 초기화
$(document).ready(function() {
CrdnDetailView.init();
});
// 전역 네임스페이스에 모듈 노출
window.CrdnDetailView = CrdnDetailView;
})(window, jQuery);
</script>

@ -319,7 +319,7 @@
processData: true
}
},
initialRequest: true, // 초기 데이터 요청 여부
initialRequest: false, // 초기 데이터 요청 여부
serializer: function(params) {
// 기본 파라미터 (페이지 정보 등)
var defaultParams = $.param(params);
@ -384,12 +384,18 @@
}
});
// 행 더블클릭 이벤트
// 행 더블클릭 이벤트 - detailView 페이지로 이동
this.instance.on('dblclick', function(ev) {
var rowKey = ev.rowKey;
var rowData = self.instance.getRow(rowKey);
if (rowData) {
CrdnRegistAndViewList.openViewPopup(rowData.crdnYr, rowData.crdnNo);
// detailView 페이지로 이동 (검색 조건 유지)
setSearchCond();
var paramCond = Object.assign({}, SEARCH_COND);
paramCond.selectCrdnYr = rowData.crdnYr;
paramCond.selectCrdnNo = rowData.crdnNo;
// 컨트롤러가 요구하는 파라미터명으로 전달 (crdnYr, crdnNo)
window.location.href = buildUrlWithParamCondAndMultipleKeys(paramCond, {"crdnYr": rowData.crdnYr, "crdnNo": rowData.crdnNo}, "<c:url value="/crdn/crndRegistAndView/detailView.do"/>");
}
});
@ -619,6 +625,8 @@
// 이벤트 핸들러 설정
this.eventBindEvents();
this.grid.instance.readData(${param.page eq null or param.page eq 0 ? 1 : param.page});
}
};

@ -481,6 +481,31 @@ var buildUrlWithParamCondAndId = function(paramCond, idName, idValue, baseUrl) {
return addUrlParam(idName, idValue, urlWithParams);
};
/**
* 파라미터 객체와 여러 개의 key-value 쌍을 URL에 추가
*
* @param {object} paramCond - 파라미터 객체 (: ALL_PARAM_COND)
* @param {object} additionalParams - 추가할 파라미터들의 key-value 객체 (: {key1: value1, key2: value2})
* @param {string} baseUrl - 기본 URL
* @returns {string} 모든 파라미터가 추가된 URL
*/
var buildUrlWithParamCondAndMultipleKeys = function(paramCond, additionalParams, baseUrl) {
// 파라미터 객체가 정의되어 있지 않으면 기본 URL에 추가 파라미터만 추가
if (typeof paramCond === 'undefined' || !paramCond) {
return addUrlParam(additionalParams, null, baseUrl);
}
// 1. 기본 URL에 파라미터 객체의 모든 파라미터 추가
var urlWithParams = addUrlParam(paramCond, null, baseUrl);
// 2. 추가 파라미터들 추가
if (additionalParams && typeof additionalParams === 'object') {
urlWithParams = addUrlParam(additionalParams, null, urlWithParams);
}
return urlWithParams;
};
/**
* URL에 컨택스트 패스를 적용하는 유틸리티 함수
* 상대 URL을 받아서 컨택스트 패스가 적용된 절대 URL을 반환

Loading…
Cancel
Save