From 29739976a900b8265806d7a1dc850f2d007c63ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=B0=95=EC=84=B1=EC=98=81?= Date: Sun, 26 Oct 2025 21:19:04 +0900 Subject: [PATCH] =?UTF-8?q?=EB=8B=A8=EC=86=8D=EC=A0=95=EB=B3=B4=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=20=EC=BF=BC=EB=A6=AC=20=EC=88=98=EC=A0=95:?= =?UTF-8?q?=20GROUP=5FCONCAT=20=EC=82=AC=EC=9A=A9=ED=95=B4=20=ED=96=89?= =?UTF-8?q?=EC=9C=84=EC=9C=A0=ED=98=95=20=EB=B0=8F=20=EC=86=8C=EC=9C=A0?= =?UTF-8?q?=EC=9E=90=20=EC=A0=95=EB=B3=B4=20=EC=A7=91=EA=B3=84=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80,=20=EA=B4=80=EB=A0=A8=20VO/JSP=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../levy/levy/model/LevyNotiImpltInfoVO.java | 11 ++- .../project/noti/model/NotiImpltInfoVO.java | 11 ++- .../noti/service/impl/NotiServiceImpl.java | 2 +- .../mapper/levy/levy/LevyMapper_maria.xml | 21 ++++- .../mybatis/mapper/noti/NotiMapper_maria.xml | 83 +++++++++++-------- .../webapp/WEB-INF/views/levy/levy/list.jsp | 3 + src/main/webapp/WEB-INF/views/noti/list.jsp | 11 +-- 7 files changed, 97 insertions(+), 45 deletions(-) diff --git a/src/main/java/go/kr/project/levy/levy/model/LevyNotiImpltInfoVO.java b/src/main/java/go/kr/project/levy/levy/model/LevyNotiImpltInfoVO.java index c1c0105..da37252 100644 --- a/src/main/java/go/kr/project/levy/levy/model/LevyNotiImpltInfoVO.java +++ b/src/main/java/go/kr/project/levy/levy/model/LevyNotiImpltInfoVO.java @@ -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; // ==================== 검색 조건 ==================== diff --git a/src/main/java/go/kr/project/noti/model/NotiImpltInfoVO.java b/src/main/java/go/kr/project/noti/model/NotiImpltInfoVO.java index c2dc270..43f74b0 100644 --- a/src/main/java/go/kr/project/noti/model/NotiImpltInfoVO.java +++ b/src/main/java/go/kr/project/noti/model/NotiImpltInfoVO.java @@ -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; // ==================== 검색 조건 ==================== diff --git a/src/main/java/go/kr/project/noti/service/impl/NotiServiceImpl.java b/src/main/java/go/kr/project/noti/service/impl/NotiServiceImpl.java index e1c9d50..edf4897 100644 --- a/src/main/java/go/kr/project/noti/service/impl/NotiServiceImpl.java +++ b/src/main/java/go/kr/project/noti/service/impl/NotiServiceImpl.java @@ -44,7 +44,7 @@ public class NotiServiceImpl extends EgovAbstractServiceImpl implements NotiServ List list = mapper.selectImpltInfoList(vo); // 중요로직: 같은 단속년도(crdnYr), 단속번호(crdnNo) 그룹별로 그리드 행에 CSS 클래스를 적용 - applyRowColorByGroup(list); + //applyRowColorByGroup(list); return list; } diff --git a/src/main/resources/mybatis/mapper/levy/levy/LevyMapper_maria.xml b/src/main/resources/mybatis/mapper/levy/levy/LevyMapper_maria.xml index 6807edd..65a2bc7 100644 --- a/src/main/resources/mybatis/mapper/levy/levy/LevyMapper_maria.xml +++ b/src/main/resources/mybatis/mapper/levy/levy/LevyMapper_maria.xml @@ -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' diff --git a/src/main/resources/mybatis/mapper/noti/NotiMapper_maria.xml b/src/main/resources/mybatis/mapper/noti/NotiMapper_maria.xml index 8179382..5e659dd 100644 --- a/src/main/resources/mybatis/mapper/noti/NotiMapper_maria.xml +++ b/src/main/resources/mybatis/mapper/noti/NotiMapper_maria.xml @@ -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} AND ii.IMPLT_TASK_SE_CD = #{schImpltTaskSeCd} @@ -83,13 +94,13 @@ - ORDER BY ii.CRDN_NO ASC, a.ACT_NO ASC + ORDER BY ii.CRDN_NO ASC - ORDER BY ii.CRDN_NO DESC, a.ACT_NO ASC + ORDER BY ii.CRDN_NO DESC - ORDER BY ii.CRDN_NO DESC, a.ACT_NO ASC + ORDER BY ii.CRDN_NO DESC @@ -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 @@ AND ii.IMPLT_TASK_SE_CD IN ('1', '2', '3') + + AND p.STDG_EMD_CD = #{schStdgEmdCd} + + + AND p.ZIP LIKE CONCAT('%', #{schZip}, '%') + + + AND p.LOTNO_ADDR LIKE CONCAT('%', #{schLotnoAddr}, '%') + + + AND p.DTL_ADDR LIKE CONCAT('%', #{schDtlAddr}, '%') + + + AND p.LOTNO_MNO = #{schLotnoMno} + + + AND p.LOTNO_SNO = #{schLotnoSno} + @@ -121,8 +149,8 @@ diff --git a/src/main/webapp/WEB-INF/views/levy/levy/list.jsp b/src/main/webapp/WEB-INF/views/levy/levy/list.jsp index 2486974..d283fd1 100644 --- a/src/main/webapp/WEB-INF/views/levy/levy/list.jsp +++ b/src/main/webapp/WEB-INF/views/levy/levy/list.jsp @@ -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', diff --git a/src/main/webapp/WEB-INF/views/noti/list.jsp b/src/main/webapp/WEB-INF/views/noti/list.jsp index 5f03612..b3bfbad 100644 --- a/src/main/webapp/WEB-INF/views/noti/list.jsp +++ b/src/main/webapp/WEB-INF/views/noti/list.jsp @@ -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; } };