단속정보 조회 쿼리 수정: GROUP_CONCAT 사용해 행위유형 및 소유자 정보 집계 추가, 관련 VO/JSP 수정

dev
박성영 2 months ago
parent e3a55827b0
commit 29739976a9

@ -112,8 +112,17 @@ public class LevyNotiImpltInfoVO extends PagingVO {
/** 표준읍면동코드명 */
private String stdgEmdCdNm;
/** 행위유형명 (GROUP_CONCAT) */
private String actTypeCdNms;
/** 소유자ID (GROUP_CONCAT) */
private String ownrIds;
/** 소유자명 (GROUP_CONCAT) */
private String ownrFlnms;
private String rgtrNm;
private String mdrfNm;
private String mdrfNm;
// ==================== 검색 조건 ====================

@ -122,8 +122,17 @@ public class NotiImpltInfoVO extends PagingVO {
/** 용도 지수 코드명 */
private String usgIdxCdNm;
/** 행위유형명 (GROUP_CONCAT) */
private String actTypeCdNms;
/** 소유자ID (GROUP_CONCAT) */
private String ownrIds;
/** 소유자명 (GROUP_CONCAT) */
private String ownrFlnms;
private String rgtrNm;
private String mdrfNm;
private String mdrfNm;
// ==================== 검색 조건 ====================

@ -44,7 +44,7 @@ public class NotiServiceImpl extends EgovAbstractServiceImpl implements NotiServ
List<NotiImpltInfoVO> list = mapper.selectImpltInfoList(vo);
// 중요로직: 같은 단속년도(crdnYr), 단속번호(crdnNo) 그룹별로 그리드 행에 CSS 클래스를 적용
applyRowColorByGroup(list);
//applyRowColorByGroup(list);
return list;
}

@ -34,7 +34,26 @@
p.LOTNO_WHOL_ADDR,
impltTaskSe.CD_NM as IMPLT_TASK_SE_CD_NM,
ru.USER_NM AS RGTR_NM, /* 등록자 명 */
mu.USER_NM AS MDFR_NM /* 수정자 명 */
mu.USER_NM AS MDFR_NM, /* 수정자 명 */
/* 중요로직: GROUP_CONCAT을 이용하여 단속건별 행위유형, 소유자 정보 집계 */
(SELECT GROUP_CONCAT(DISTINCT act2.VLTN_BDST SEPARATOR ', ')
FROM tb_act_info ai2
LEFT JOIN tb_act_type act2 ON act2.ACT_TYPE_CD = ai2.ACT_TYPE_CD
WHERE ai2.CRDN_YR = c.CRDN_YR
AND ai2.CRDN_NO = c.CRDN_NO
AND ai2.DEL_YN = 'N') AS ACT_TYPE_CD_NMS, /* 행위유형명 */
(SELECT GROUP_CONCAT(DISTINCT o2.OWNR_ID SEPARATOR ', ')
FROM tb_ownr_info oi2
LEFT JOIN tb_ownr o2 ON o2.OWNR_ID = oi2.OWNR_ID AND o2.DEL_YN = 'N'
WHERE oi2.CRDN_YR = c.CRDN_YR
AND oi2.CRDN_NO = c.CRDN_NO
AND oi2.DEL_YN = 'N') AS OWNR_IDS, /* 소유자ID */
(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'
WHERE oi2.CRDN_YR = c.CRDN_YR
AND oi2.CRDN_NO = c.CRDN_NO
AND oi2.DEL_YN = 'N') AS OWNR_FLNMS /* 소유자명 */
FROM TB_IMPLT_INFO ii
INNER JOIN tb_crdn c ON ii.CRDN_YR = c.CRDN_YR AND ii.CRDN_NO = c.CRDN_NO AND c.DEL_YN = 'N'
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'

@ -35,11 +35,25 @@
impltTaskSe.CD_NM as IMPLT_TASK_SE_CD_NM,
ru.USER_NM AS RGTR_NM, /* 등록자 명 */
mu.USER_NM AS MDFR_NM, /* 수정자 명 */
a.ACT_NO,
a.ACT_TYPE_CD,
act.VLTN_BDST AS ACT_TYPE_CD_NM,
a.USG_IDX_CD,
usg.USG_NM AS USG_IDX_CD_NM
/* 중요로직: GROUP_CONCAT을 이용하여 단속건별 행위유형, 소유자 정보 집계 */
(SELECT GROUP_CONCAT(DISTINCT act2.VLTN_BDST SEPARATOR ', ')
FROM tb_act_info ai2
LEFT JOIN tb_act_type act2 ON act2.ACT_TYPE_CD = ai2.ACT_TYPE_CD
WHERE ai2.CRDN_YR = c.CRDN_YR
AND ai2.CRDN_NO = c.CRDN_NO
AND ai2.DEL_YN = 'N') AS ACT_TYPE_CD_NMS, /* 행위유형명 */
(SELECT GROUP_CONCAT(DISTINCT o2.OWNR_ID SEPARATOR ', ')
FROM tb_ownr_info oi2
LEFT JOIN tb_ownr o2 ON o2.OWNR_ID = oi2.OWNR_ID AND o2.DEL_YN = 'N'
WHERE oi2.CRDN_YR = c.CRDN_YR
AND oi2.CRDN_NO = c.CRDN_NO
AND oi2.DEL_YN = 'N') AS OWNR_IDS, /* 소유자ID */
(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'
WHERE oi2.CRDN_YR = c.CRDN_YR
AND oi2.CRDN_NO = c.CRDN_NO
AND oi2.DEL_YN = 'N') AS OWNR_FLNMS /* 소유자명 */
FROM TB_IMPLT_INFO ii
INNER JOIN tb_crdn c ON ii.CRDN_YR = c.CRDN_YR AND ii.CRDN_NO = c.CRDN_NO AND c.DEL_YN = 'N'
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'
@ -48,13 +62,10 @@
LEFT JOIN tb_cd_detail stdgEmdCd ON stdgEmdCd.CD_GROUP_ID = 'STDG_EMD_CD' AND stdgEmdCd.CD_ID = p.STDG_EMD_CD
LEFT JOIN tb_cd_detail rgnSeCd ON rgnSeCd.CD_GROUP_ID = 'RGN_SE_CD' AND rgnSeCd.CD_ID = c.RGN_SE_CD
LEFT JOIN tb_user ru ON ii.RGTR = ru.USER_ID
LEFT JOIN tb_user mu ON ii.MDFR = mu.USER_ID
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'
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 AND usg.DEL_YN = 'N'
WHERE ii.CRDN_YR = #{schCrdnYr}
AND ii.DEL_YN = 'N'
AND ii.IMPLT_BGNG_YMD BETWEEN #{schImpltBgngYmd1} AND #{schImpltBgngYmd2}
LEFT JOIN tb_user mu ON ii.MDFR = mu.USER_ID
WHERE ii.CRDN_YR = #{schCrdnYr}
AND ii.DEL_YN = 'N'
AND ii.IMPLT_BGNG_YMD BETWEEN #{schImpltBgngYmd1} AND #{schImpltBgngYmd2}
<if test='schImpltTaskSeCd != null and schImpltTaskSeCd != ""'>
AND ii.IMPLT_TASK_SE_CD = #{schImpltTaskSeCd}
</if>
@ -83,13 +94,13 @@
<!-- system 메뉴 패턴 준수: sortAscending(Boolean) 사용 -->
<!-- 중요로직: 화면 sortColumn은 컬럼 name 기준(crdnNo)으로 전달되므로 화이트리스트 매핑 적용 -->
<when test="sortColumn != null and (sortColumn == 'crdnNo' or sortColumn == 'CRDN_NO') and sortAscending != null and sortAscending == true">
ORDER BY ii.CRDN_NO ASC, a.ACT_NO ASC
ORDER BY ii.CRDN_NO ASC
</when>
<when test="sortColumn != null and (sortColumn == 'crdnNo' or sortColumn == 'CRDN_NO') and sortAscending != null and sortAscending == false">
ORDER BY ii.CRDN_NO DESC, a.ACT_NO ASC
ORDER BY ii.CRDN_NO DESC
</when>
<otherwise>
ORDER BY ii.CRDN_NO DESC, a.ACT_NO ASC
ORDER BY ii.CRDN_NO DESC
</otherwise>
</choose>
<if test='pagingYn != null and pagingYn == "Y"'>
@ -103,7 +114,6 @@
FROM TB_IMPLT_INFO ii
INNER JOIN tb_crdn c ON ii.CRDN_YR = c.CRDN_YR AND ii.CRDN_NO = c.CRDN_NO AND c.DEL_YN = 'N'
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_act_info a ON a.CRDN_YR = c.CRDN_YR and a.CRDN_NO = c.CRDN_NO AND a.DEL_YN = 'N'
WHERE ii.CRDN_YR = #{schCrdnYr}
AND ii.DEL_YN = 'N'
AND ii.IMPLT_BGNG_YMD BETWEEN #{schImpltBgngYmd1} AND #{schImpltBgngYmd2}
@ -113,6 +123,24 @@
<if test='schImpltTaskSeCd == null or schImpltTaskSeCd == ""'>
AND ii.IMPLT_TASK_SE_CD IN ('1', '2', '3')
</if>
<if test='schStdgEmdCd != null and schStdgEmdCd != ""'>
AND p.STDG_EMD_CD = #{schStdgEmdCd}
</if>
<if test='schZip != null and schZip != ""'>
AND p.ZIP LIKE CONCAT('%', #{schZip}, '%')
</if>
<if test='schLotnoAddr != null and schLotnoAddr != ""'>
AND p.LOTNO_ADDR LIKE CONCAT('%', #{schLotnoAddr}, '%')
</if>
<if test='schDtlAddr != null and schDtlAddr != ""'>
AND p.DTL_ADDR LIKE CONCAT('%', #{schDtlAddr}, '%')
</if>
<if test='schLotnoMno != null and schLotnoMno != ""'>
AND p.LOTNO_MNO = #{schLotnoMno}
</if>
<if test='schLotnoSno != null and schLotnoSno != ""'>
AND p.LOTNO_SNO = #{schLotnoSno}
</if>
</select>
@ -121,8 +149,8 @@
<!-- 이행 대상자 정보 목록 조회 -->
<select id="selectImpltTrprInfoList" parameterType="NotiImpltTrprInfoVO"
resultType="NotiImpltTrprInfoVO">
SELECT
iti.IMPLT_TRPR_INFO_ID,
SELECT
MIN(iti.IMPLT_TRPR_INFO_ID) AS IMPLT_TRPR_INFO_ID,
iti.SGG_CD,
iti.IMPLT_INFO_ID,
iti.IMPLT_TRPR_FLNM,
@ -130,30 +158,17 @@
iti.IMPLT_TRPR_DADDR,
iti.IMPLT_TRPR_ZIP,
iti.IMPLT_TRPR_SE_CD,
iti.OWNR_ACTR_INFO_ID,
iti.REG_DT,
iti.RGTR,
iti.MDFCN_DT,
iti.MDFR,
iti.DEL_YN,
iti.DEL_DT,
iti.DLTR,
iti.ACT_NO,
MIN(iti.OWNR_ACTR_INFO_ID) as OWNR_ACTR_INFO_ID,
-- 코드성 데이터 조인 (코드명)
impltTrprSe.CD_NM as IMPLT_TRPR_SE_CD_NM,
sggCd.CD_NM as SGG_CD_NM,
a.ACT_TYPE_CD,
act.VLTN_BDST AS ACT_TYPE_CD_NM
sggCd.CD_NM as SGG_CD_NM
FROM TB_IMPLT_TRPR_INFO iti
JOIN TB_IMPLT_INFO ii ON iti.IMPLT_INFO_ID = ii.IMPLT_INFO_ID AND ii.DEL_YN = 'N'
-- 코드성 데이터 조인
LEFT JOIN tb_cd_detail impltTrprSe ON impltTrprSe.CD_GROUP_ID = 'IMPLT_TRPR_SE_CD' AND impltTrprSe.CD_ID = iti.IMPLT_TRPR_SE_CD
LEFT JOIN tb_cd_detail sggCd ON sggCd.CD_GROUP_ID = 'SGG_CD' AND sggCd.CD_ID = iti.SGG_CD
LEFT JOIN tb_act_info a ON a.CRDN_YR = ii.CRDN_YR and a.CRDN_NO = ii.CRDN_NO AND a.ACT_NO = iti.ACT_NO AND a.DEL_YN = 'N'
LEFT JOIN tb_act_type act ON act.ACT_TYPE_CD = a.ACT_TYPE_CD
WHERE iti.IMPLT_INFO_ID = #{schImpltInfoId}
AND iti.ACT_NO = #{schActNo}
AND iti.DEL_YN = 'N'
group by iti.SGG_CD, iti.IMPLT_INFO_ID, iti.IMPLT_TRPR_FLNM, iti.IMPLT_TRPR_ADDR, iti.IMPLT_TRPR_DADDR, iti.IMPLT_TRPR_ZIP, iti.IMPLT_TRPR_SE_CD
ORDER BY iti.IMPLT_TRPR_SE_CD, iti.IMPLT_TRPR_FLNM
</select>

@ -302,6 +302,9 @@
}
},
{ header: '위치', name: 'lotnoWholAddr', align: 'left', minWidth: 300 },
{ header: '행위유형', name: 'actTypeCdNms', align: 'left', width: 200 },
/*{ header: '소유자', name: 'ownrIds', align: 'center', width: 150 },
{ header: '소유자명', name: 'ownrFlnms', align: 'center', width: 150 },*/
{
header: '등록일시',
name: 'regDt',

@ -209,7 +209,6 @@
},
{ header: '단속년도', name: 'crdnYr', align: 'center', width: 90 },
{ header: '단속번호', name: 'crdnNo', align: 'center', width: 100, sortable: true },
{ header: '행위번호', name: 'actNo', align: 'center', width: 60 },
{ header: '진행단계', name: 'impltTaskSeCdNm', align: 'center', width: 100 },
{ header: '지역구분', name: 'rgnSeCdNm', align: 'center', width: 100 },
{ header: '단속동', name: 'stdgEmdCdNm', align: 'center', width: 100 },
@ -232,8 +231,9 @@
}
},
{ header: '위치', name: 'lotnoWholAddr', align: 'left', minWidth: 300 },
{ header: '용도', name: 'usgIdxCdNm', align: 'left', width: 130 },
{ header : '행위유형', name : 'actTypeCdNm', align : 'center', width : 140 },
{ header: '행위유형', name: 'actTypeCdNms', align: 'left', width: 200 },
/*{ header: '소유자', name: 'ownrIds', align: 'center', width: 150 },
{ header: '소유자명', name: 'ownrFlnms', align: 'center', width: 150 },*/
{ header: '등록일시', name: 'regDt', align: 'center', width: 130 },
{ header: '등록자', name: 'rgtrNm', align: 'center', width: 100 }
];
@ -301,7 +301,6 @@
NotiList.selectedRow = self.instance.getRow(ev.rowKey);
NotiList.schImpltInfoId = rowData.impltInfoId;
NotiList.schActNo = rowData.actNo;
NotiList.detailGrid.instance.readData(1);
});
@ -370,8 +369,6 @@
getGridColumns : function() {
return [
{ header : '행위번호', name : 'actNo', align : 'center', width : 60 },
{ header : '행위유형', name : 'actTypeCdNm', align : 'center', width : 140 },
{ header : '소유자,행위자 구분', name : 'impltTrprSeCdNm', align : 'center', width : 120 },
{ header : '성명', name : 'impltTrprFlnm', align : 'center', width : 200 },
{ header : '우편번호', name : 'impltTrprZip', align : 'center', width : 80 },
@ -392,7 +389,7 @@
},
initialRequest : false,
serializer : function(params) {
var searchParams = $.param({schImpltInfoId: NotiList.schImpltInfoId, schActNo: NotiList.schActNo });
var searchParams = $.param({schImpltInfoId: NotiList.schImpltInfoId });
return searchParams;
}
};

Loading…
Cancel
Save