#### feat: 그리드 고정컬럼 옵션 및 엑셀 다운로드 기능 추가

- 그리드 컬럼 고정(frozen column) 기능 추가: 고정 갯수, 보더 두께 및 크기 조정 가능
- "그리드 엑셀 다운로드" 버튼 추가 및 기존 버튼 텍스트 수정("행위별 엑셀 다운로드")

#### feat: 데이터 조회 필드 확장
- 지목 코드 및 상세주소 관련 필드 추가: VO, MyBatis Mapper 수정
- 구조 지수 및 면적 필드 추가로 데이터 조회 및 출력 가능

#### refactor: 그리드 컬럼 구성 재정비
- 가독성을 위해 컬럼 순서 및 크기 조정
- 사용되지 않거나 중복되는 위치 관련 컬럼 주석 처리

#### fix: 일부 컬럼 출력 로직 변경
- 번호 컬럼 및 날자 계산 코드 개선
- 지번 및 행위 타입 표현 형식 정정

#### style: UI 및 네이밍 정리
- JSP 파일 버튼 및 컬럼명 텍스트 수정
- 코드 내 주석 및 포매팅 개선
dev
박성영 1 month ago
parent a6e2d2dd5d
commit 29dac0538f

@ -178,6 +178,30 @@ public class CrdnRegistAndViewVO extends PagingVO {
/** 우편번호 */
private String zip;
/** 지번 본번 */
private String lotnoMno;
/** 지번 부번 */
private String lotnoSno;
/** 상세주소 */
private String dtlAddr;
/** 지목 코드 */
private String ldcgCd;
/** 지목 코드명 */
private String ldcgCdNm;
/** 면적 */
private String area;
/** 구조 지수 코드 */
private String strctIdxCd;
/** 구조 지수 코드명 */
private String strctIdxCdNm;
/** 조치처리상태 실제코드없음, join 된 row별 ACTN_PRCS_STTS_CD로 확인 [행위정보없음 0: , 미조치 : 1, 조치완료 : 3] */
private String actCmpltCd;

@ -47,6 +47,11 @@
p.STDG_EMD_CD, /* 법정동 읍면동 코드 */
emd.CD_NM AS STDG_EMD_CD_NM,
p.ZIP,
p.LOTNO_MNO, /* 지번 본번 */
p.LOTNO_SNO, /* 지번 부번 */
p.DTL_ADDR, /* 상세주소 */
p.LDCG_CD, /* 지목 코드 */
ldcg.CD_NM AS LDCG_CD_NM, /* 지목 코드명 */
(SELECT GROUP_CONCAT(DISTINCT o2.FLNM SEPARATOR ', ')
FROM tb_ownr_info oi2
LEFT JOIN tb_ownr o2 ON o2.OWNR_ID = oi2.OWNR_ID AND o2.DEL_YN = 'N'
@ -72,7 +77,10 @@
else '-'
end as ACT_CMPLT_CD, /* [행위정보없음 0: , 미조치 : 1, 조치완료 : 2] */
a.USG_IDX_CD, /* 용도 지수 코드 */
usg.USG_NM AS USG_IDX_CD_NM
usg.USG_NM AS USG_IDX_CD_NM,
a.AREA, /* 면적 */
a.STRCT_IDX_CD, /* 구조 지수 코드 */
strct.STRCT_NM AS STRCT_IDX_CD_NM /* 구조 지수 코드명 */
FROM tb_crdn c
LEFT JOIN tb_cd_detail sgg ON sgg.CD_GROUP_ID = 'ORG_CD' AND sgg.CD_ID = c.SGG_CD
LEFT JOIN tb_cd_detail rgn ON rgn.CD_GROUP_ID = 'RGN_SE_CD' AND rgn.CD_ID = c.RGN_SE_CD
@ -81,6 +89,7 @@
LEFT JOIN tb_user u ON u.USER_ID = c.RGTR AND u.USE_YN = 'Y'
LEFT JOIN tb_pstn_info p ON p.CRDN_YR = c.CRDN_YR AND p.CRDN_NO = c.CRDN_NO AND p.DEL_YN = 'N'
LEFT JOIN tb_cd_detail emd ON emd.CD_GROUP_ID = 'STDG_EMD_CD' AND emd.CD_ID = p.STDG_EMD_CD
LEFT JOIN tb_cd_detail ldcg ON ldcg.CD_GROUP_ID = 'LDCG_CD' AND ldcg.CD_ID = p.LDCG_CD
LEFT JOIN (
SELECT
CRDN_YR,
@ -94,6 +103,7 @@
LEFT Join tb_act_info a ON a.CRDN_YR = c.CRDN_YR and a.CRDN_NO = c.CRDN_NO AND a.DEL_YN = 'N' AND a.ACT_NO = (SELECT MIN(a1.ACT_NO) FROM tb_act_info a1 WHERE a1.CRDN_YR = a.CRDN_YR AND a1.CRDN_NO = a.CRDN_NO AND a1.DEL_YN='N')
LEFT JOIN tb_act_type act ON act.ACT_TYPE_CD = a.ACT_TYPE_CD
LEFT JOIN tb_usg_idx usg ON usg.USG_IDX_CD = a.USG_IDX_CD
LEFT JOIN tb_strct_idx strct ON strct.STRCT_IDX_CD = a.STRCT_IDX_CD
WHERE c.DEL_YN = 'N'
<if test='schCrdnYr != null and schCrdnYr != ""'>
AND c.CRDN_YR = #{schCrdnYr}

@ -12,8 +12,11 @@
<div class="sub_title"></div>
<button type="button" id="registerBtn" class="newbtn bg1">등록</button>
<button type="button" id="updaterBtn" class="newbtn bg4">수정</button>
<button type="button" id="excelDownBtnGrid" class="newbtn bg5 iconz">
<span class="mdi mdi-microsoft-excel"></span>그리드 엑셀 다운로드
</button>
<button type="button" id="excelDownBtn" class="newbtn bg5 iconz">
<span class="mdi mdi-microsoft-excel"></span>엑셀 다운로드
<span class="mdi mdi-microsoft-excel"></span>행위별 엑셀 다운로드
</button>
</section>
</div>
@ -261,6 +264,11 @@
useClient: false, // 클라이언트 페이징 여부(false: 서버 페이징)
perPage: perPage // 페이지당 표시 건수
});
gridConfig.setOptColumnOptions({ //컬럼고정 옵션
frozenCount: 9 //고정컬럼 갯수
, frozenBorderWidth: 2 //고정컬럼 보더(border) 두께
, resizable: true //최소 사이즈
});
gridConfig.setOptColumns(this.getGridColumns());
return gridConfig;
@ -277,7 +285,7 @@
header: '번호',
name: '_rowNum',
align: 'center',
width: 60,
width: 40,
sortable: false,
formatter: function(e) {
// 서버사이드 페이징에서 역순 번호 계산
@ -289,148 +297,189 @@
return totalCount - (page - 1) * perPage - rowIndex;
}
},
{ header: '단속년도', name: 'crdnYr', align: 'center', width: 80, sortingType: 'desc' },
{ header: '단속번호', name: 'crdnNo', align: 'center', width: 90 },
{ header: '법정동', name: 'stdgEmdCdNm', align: 'center', width: 90 },
{ header: '지역구분', name: 'rgnSeCdNm', align: 'center', width: 100 },
{ header: '적발방법', name: 'dsclMthdCdNm', align: 'center', width: 120 },
{
header: '조사일자',
name: 'dsclYmd',
align: 'center',
width: 100,
formatter: function (e) {
return e.value ? moment(e.value).format('YYYY-MM-DD') : '';
}
},
{ header: '조사원', name: 'exmnr', align: 'left', width: 130 },
{ header: '단속년도', name: 'crdnYr', align: 'center', width: 60, sortingType: 'desc' },
{ header: '단속번호', name: 'crdnNo', align: 'center', width: 60 },
{
header: '재부과여부',
header: '재부과',
name: 'relevyYn',
align: 'center',
width: 80,
width: 60,
formatter: function(e) {
return e.value === 'Y' ? '재부과' : '일반';
}
},
{
header: '가중부과대상',
name: 'agrvtnLevyTrgtYn',
align: 'center',
width: 100,
header: '소유자',
name: 'ownrNams',
align: 'left',
width: 80,
formatter: function(e) {
return e.value === 'Y' ? '대상' : '비대상';
return e.value;
}
},
{ header: '진행단계', name: 'crdnPrcsSttsCdNm', align: 'center', width: 100 },
{
header: '조치처리상태',
name: 'actCmpltCd',
align: 'center',
width: 100,
header: '행위자',
name: 'actrNams',
align: 'left',
width: 80,
formatter: function(e) {
/* 행위정보없음 0, 미조치 1, 조치완료 3 */
if (e.value === '0') return '행위정보없음';
else if (e.value === '1') return '미조치';
else if (e.value === '3') return '조치완료';
else return e.value || '';
return e.value;
}
},
{ header: '법정동', name: 'stdgEmdCdNm', align: 'center', width: 60 },
{
header: '위치',
name: 'lotnoWholAddr',
align: 'left',
minWidth: 300,
header: '지번',
name: 'lotnoMno',
align: 'center',
width: 60,
formatter: function(e) {
return e.value;
/* 지번 본번-부번 형식 */
if (e.row.lotnoMno && e.row.lotnoSno) {
return e.row.lotnoMno + '-' + e.row.lotnoSno;
} else if (e.row.lotnoMno) {
return e.row.lotnoMno;
}
return '';
}
},
{ header: '상세주소', name: 'dtlAddr', align: 'left', width: 100 },
{
header: '행위유형',
header: '행위내용',
name: 'actTypeCdNm',
align: 'left',
width: 130,
width: 85,
formatter: function(e) {
return e.value;
}
},
{ header: '지목', name: 'ldcgCdNm', align: 'center', width: 80 },
{
header: '용도',
name: 'usgIdxCdNm',
align: 'left',
width: 130,
width: 80,
formatter: function(e) {
return e.value;
}
},
{ header: '면적', name: 'area', align: 'right', width: 60 },
{ header: '구조', name: 'strctIdxCdNm', align: 'center', width: 60 },
{
header: '소유자',
name: 'ownrNams',
align: 'left',
width: 130,
header: '가중부과',
name: 'agrvtnLevyTrgtYn',
align: 'center',
width: 60,
formatter: function(e) {
return e.value;
return e.value === 'Y' ? '대상' : '비대상';
}
},
{
header: '행위자',
name: 'actrNams',
align: 'left',
width: 130,
formatter: function(e) {
return e.value;
header: '조사일자',
name: 'dsclYmd',
align: 'center',
width: 80,
formatter: function (e) {
return e.value ? moment(e.value).format('YYYY-MM-DD') : '';
}
},
{
header: '이행정보 이력',
name: 'impltTaskHistoryBtn',
width: 120,
header: '처분사전',
name: 'dspsBfhdBgngYmd',
align: 'center',
formatter: function(value) {
return '<span class="btn_unlock badge success" style="cursor:pointer;">이행 이력</span>';
width: 80,
formatter: function (e) {
return e.value ? moment(e.value).format('YYYY-MM-DD') : '';
}
},
{
header: '재부과 이력',
name: 'relevyHistoryBtn',
width: 120,
header: '시정명령',
name: 'crcCmdBgngYmd',
align: 'center',
formatter: function(value) {
return '<span class="btn_unlock badge success" style="cursor:pointer;">재부과 이력</span>';
}
},
{ header: '처분사전 일자', name: 'dspsBfhdBgngYmd', align: 'center', width: 120,
width: 80,
formatter: function (e) {
return e.value ? moment(e.value).format('YYYY-MM-DD') : '';
}
},
{ header: '시정명령 일자', name: 'crcCmdBgngYmd', align: 'center', width: 120,
{
header: '시정촉구',
name: 'crcUrgBgngYmd',
align: 'center',
width: 80,
formatter: function (e) {
return e.value ? moment(e.value).format('YYYY-MM-DD') : '';
}
},
{ header: '시정촉구 일자', name: 'crcUrgBgngYmd', align: 'center', width: 120,
{
header: '부과예고',
name: 'levyPrvntcBgngYmd',
align: 'center',
width: 80,
formatter: function (e) {
return e.value ? moment(e.value).format('YYYY-MM-DD') : '';
}
},
{ header: '부과예고 일자', name: 'levyPrvntcBgngYmd', align: 'center', width: 120,
{
header: '부과',
name: 'levyBgngYmd',
align: 'center',
width: 80,
formatter: function (e) {
return e.value ? moment(e.value).format('YYYY-MM-DD') : '';
}
},
{ header: '부과 일자', name: 'levyBgngYmd', align: 'center', width: 120,
{
header: '납부촉구',
name: 'payUrgBgngYmd',
align: 'center',
width: 80,
formatter: function (e) {
return e.value ? moment(e.value).format('YYYY-MM-DD') : '';
}
},
{ header: '납부촉구 일자', name: 'payUrgBgngYmd', align: 'center', width: 120,
formatter: function (e) {
return e.value ? moment(e.value).format('YYYY-MM-DD') : '';
{ header: '진행단계', name: 'crdnPrcsSttsCdNm', align: 'center', width: 80 },
{
header: '조치처리상태',
name: 'actCmpltCd',
align: 'center',
width: 80,
formatter: function(e) {
/* 행위정보없음 0, 미조치 1, 조치완료 3 */
if (e.value === '0') return '행위정보없음';
else if (e.value === '1') return '미조치';
else if (e.value === '3') return '조치완료';
else return e.value || '';
}
},
/*{
header: '위치',
name: 'lotnoWholAddr',
align: 'left',
minWidth: 300,
formatter: function(e) {
return e.value;
}
},*/
{
header: '이행정보 이력',
name: 'impltTaskHistoryBtn',
width: 100,
align: 'center',
formatter: function(value) {
return '<span class="btn_unlock badge success" style="cursor:pointer;">이행 이력</span>';
}
},
{
header: '재부과 이력',
name: 'relevyHistoryBtn',
width: 100,
align: 'center',
formatter: function(value) {
return '<span class="btn_unlock badge success" style="cursor:pointer;">재부과 이력</span>';
}
},
{ header: '등록일시', name: 'regDt', align: 'center', width: 150 },
{ header: '등록자', name: 'rgtrNm', align: 'center', width: 100 },
{ header: '적발방법', name: 'dsclMthdCdNm', align: 'center', width: 100 },
{ header: '등록일시', name: 'regDt', align: 'center', width: 120 },
{ header: '등록자', name: 'rgtrNm', align: 'center', width: 80 },
];
},

Loading…
Cancel
Save