Compare commits

..

2 Commits

Author SHA1 Message Date
ythong
5ea8d4fdb6 관리자 지방문화원 등록/수정에 구.군(AREA_SUB_CODE) 선택 기능 추가
- lclttRegist.jsp: 시.도 select 옆에 구.군 select 추가, /lcltt/selectAreaSubCodeListAjax.do 연동,
  필수값 검증, 주소검색 콜백에서 sggNm 일치 구.군 자동선택
- LclttServiceImpl.java: insert/updateLcltt에서 폼의 areaSubCode 명시값을 우선 사용하고
  비어있을 때만 주소 텍스트 추정을 setAreaSubCodeByAdres() 폴백으로 분리, null/배열 방어코드 추가
  (기존 주소파싱 추정의 ArrayIndexOutOfBounds/NPE로 저장 실패하던 "시스템 에러" 해소)
- LclttDAO.xml: selectLclttDetail에 A.AREA_SUB_CODE 추가(수정화면 진입 시 기존값 표시)

운영(webapps/kccf)에 개별 파일(class/jsp/xml)로 반영 + Tomcat 재시작 완료.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-08 18:04:28 +09:00
ythong
603ef27a6f '전남광주' 선택 시 구.군 드롭다운이 비는 문제 수정
공개 찾기(listLclttFind)에서 '전남광주'(병합코드 'GJ,JN') 선택 시
selectAreaSubCodeListAjax가 ADIT_ATRB_INFO_VALUE1을 단일값으로만 비교해
구.군 목록이 채워지지 않던 문제를 수정.
- AND ADIT_ATRB_INFO_VALUE1 = #{aditAtrbInfoValue1}
  → AND INSTR(','||#{aditAtrbInfoValue1}||',', ','||ADIT_ATRB_INFO_VALUE1||',') > 0
광주·전남 소속 구/군이 모두 드롭다운에 채워짐. 구.군 선택 후 조회(selectLclttFindList)는
고유 AREA_SUB_CODE 매칭이라 수정 불필요. 운영(webapps/kccf) 반영 + Tomcat 재시작 완료.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-08 16:40:35 +09:00
3 changed files with 101 additions and 27 deletions

View File

@ -30,18 +30,10 @@ public class LclttServiceImpl implements LclttService{
@Override @Override
public int insertLcltt(LclttVO vo) { public int insertLcltt(LclttVO vo) {
String[] adresArray = vo.getAdres1().split("\\s"); if(vo.getAreaSubCode() == null || vo.getAreaSubCode().trim().isEmpty()) {
setAreaSubCodeByAdres(vo);
CmmDetailCodeVO cmmDetailCodeVO = new CmmDetailCodeVO();
cmmDetailCodeVO.setAditAtrbInfoValue1(vo.getAreaCode());
List<CmmDetailCodeVO> codeList = lclttDAO.selectAreaSubCodeListAjax(cmmDetailCodeVO);
for(int i = 0; i < codeList.size(); i++) {
if(codeList.get(i).getDetailCodeNm().equals(adresArray[1])) {
vo.setAreaSubCode(codeList.get(i).getDetailCode());
}
} }
return lclttDAO.insertLcltt(vo); return lclttDAO.insertLcltt(vo);
} }
@ -52,20 +44,46 @@ public class LclttServiceImpl implements LclttService{
@Override @Override
public int updateLcltt(LclttVO vo) { public int updateLcltt(LclttVO vo) {
if(vo.getAreaSubCode() == null || vo.getAreaSubCode().trim().isEmpty()) {
String[] adresArray = vo.getAdres1().split("\\s"); setAreaSubCodeByAdres(vo);
}
return lclttDAO.updateLcltt(vo);
}
/**
* 등록/수정 화면에서 .(areaSubCode) 명시적으로 전달되지 않은 경우에 한해
* 주소1(adres1) 번째 단어(.군명 추정) AREA_SUB_CODE 목록과 매칭하여
* vo에 areaSubCode를 세팅하는 하위 호환용 폴백 로직이다.
* 예외 없이 매칭 실패 조용히 건너뛴다.
*/
private void setAreaSubCodeByAdres(LclttVO vo) {
if(vo.getAdres1() == null || vo.getAdres1().trim().isEmpty()) {
return;
}
String[] adresArray = vo.getAdres1().trim().split("\\s+");
if(adresArray.length < 2) {
return;
}
String adresGuGun = adresArray[1];
CmmDetailCodeVO cmmDetailCodeVO = new CmmDetailCodeVO(); CmmDetailCodeVO cmmDetailCodeVO = new CmmDetailCodeVO();
cmmDetailCodeVO.setAditAtrbInfoValue1(vo.getAreaCode()); cmmDetailCodeVO.setAditAtrbInfoValue1(vo.getAreaCode());
List<CmmDetailCodeVO> codeList = lclttDAO.selectAreaSubCodeListAjax(cmmDetailCodeVO); List<CmmDetailCodeVO> codeList = lclttDAO.selectAreaSubCodeListAjax(cmmDetailCodeVO);
if(codeList == null) {
return;
}
for(int i = 0; i < codeList.size(); i++) { for(int i = 0; i < codeList.size(); i++) {
if(codeList.get(i).getDetailCodeNm().equals(adresArray[1])) { if(adresGuGun.equals(codeList.get(i).getDetailCodeNm())) {
vo.setAreaSubCode(codeList.get(i).getDetailCode()); vo.setAreaSubCode(codeList.get(i).getDetailCode());
break;
} }
} }
return lclttDAO.updateLcltt(vo);
} }
@Override @Override

View File

@ -101,6 +101,7 @@
A.LCLTT_ID , A.LCLTT_ID ,
A.LCLTT_NM , A.LCLTT_NM ,
A.AREA_CODE , A.AREA_CODE ,
A.AREA_SUB_CODE ,
A.ADRES1 , A.ADRES1 ,
A.ADRES2 , A.ADRES2 ,
A.ADRES1 || ' ' || A.ADRES2 AS ADRES , A.ADRES1 || ' ' || A.ADRES2 AS ADRES ,
@ -159,7 +160,7 @@
WHERE CODE = 'AREA_SUB_CODE' WHERE CODE = 'AREA_SUB_CODE'
<choose> <choose>
<when test="aditAtrbInfoValue1 != '' and aditAtrbInfoValue1 != null"> <when test="aditAtrbInfoValue1 != '' and aditAtrbInfoValue1 != null">
AND ADIT_ATRB_INFO_VALUE1 = #{aditAtrbInfoValue1} AND INSTR(','||#{aditAtrbInfoValue1}||',', ','||ADIT_ATRB_INFO_VALUE1||',') > 0
</when> </when>
<otherwise> <otherwise>
AND ADIT_ATRB_INFO_VALUE2 = '000' AND ADIT_ATRB_INFO_VALUE2 = '000'

View File

@ -47,6 +47,15 @@
</c:forEach> </c:forEach>
</div> </div>
</td> </td>
<th>
<label class="requiredText">구.군</label>
</th>
<td>
<div class="row-df">
<input type="hidden" id="hiddenAreaSubCode" name="hiddenAreaSubCode" value="${lclttVO.areaSubCode }" />
<select class="form-control form-control-sm" id="areaSubCode" name="areaSubCode"></select>
</div>
</td>
</tr> </tr>
<tr> <tr>
<th> <th>
@ -199,21 +208,53 @@
</div> </div>
<script> <script>
$(document).ready(function() { $(document).ready(function() {
if($('#hiddenUseYn').val() == $('#useYnY').val()){ if($('#hiddenUseYn').val() == $('#useYnY').val()){
$('#useYnY').prop("checked", true); $('#useYnY').prop("checked", true);
}else{ }else{
$('#useYnN').prop("checked", true); $('#useYnN').prop("checked", true);
} }
if($('#hiddenAreaCode').val() != null || $('#hiddenAreaCode').val() != ''){ if($('#hiddenAreaCode').val() != null && $('#hiddenAreaCode').val() != ''){
$('form#insertForm select[name=areaCode]').val($('#hiddenAreaCode').val()).prop('selected', true); $('form#insertForm select[name=areaCode]').val($('#hiddenAreaCode').val()).prop('selected', true);
} }
fnAreaSubCodeList($('#areaCode').val(), $('#hiddenAreaSubCode').val());
}); });
$('#areaCode').on('change', function(){
fnAreaSubCodeList($(this).val(), '');
});
function fnAreaSubCodeList(areaCode, selectedAreaSubCode){
$('#areaSubCode option').remove();
if(areaCode == null || areaCode == ''){
return;
}
$.ajax({
url: "/lcltt/selectAreaSubCodeListAjax.do",
type: "POST",
data: {"aditAtrbInfoValue1" : areaCode},
success: function(data){
$('#areaSubCode').append('<option value="">선택</option>');
for(var i=0; i<data.areaSubCodeList.length; i++){
$('#areaSubCode').append('<option value="'+ data.areaSubCodeList[i].detailCode +'">'+ data.areaSubCodeList[i].detailCodeNm +'</option>');
}
if(selectedAreaSubCode != null && selectedAreaSubCode != ''){
$('#areaSubCode').val(selectedAreaSubCode).prop('selected', true);
}
},
error: function(){
//전송에 실패하면 실행될 코드;
}
});
}
function fnLclttDelete(){ function fnLclttDelete(){
var conf = confirm("정말로 삭제 하시겠습니까?"); var conf = confirm("정말로 삭제 하시겠습니까?");
if(conf){ if(conf){
@ -236,7 +277,13 @@ function fnLclttSave(){
$('#areaCode').focus(); $('#areaCode').focus();
return false; return false;
} }
if($('#areaSubCode').val() == null || $('#areaSubCode').val() == ''){
alert('구.군을 선택해 주세요.');
$('#areaSubCode').focus();
return false;
}
if($('#adres1').val() == null || $('#adres1').val() == ''){ if($('#adres1').val() == null || $('#adres1').val() == ''){
alert('주소를 입력해 주세요.'); alert('주소를 입력해 주세요.');
$('#adres1').focus(); $('#adres1').focus();
@ -279,7 +326,15 @@ function jusoCallBack(roadFullAddr,roadAddrPart1,addrDetail,roadAddrPart2,engAdd
$('#zip').val(zipNo); $('#zip').val(zipNo);
$('#adres1').val(roadAddrPart1); $('#adres1').val(roadAddrPart1);
$('#adres2').val(addrDetail+roadAddrPart2); $('#adres2').val(addrDetail+roadAddrPart2);
// 주소 검색 결과의 시군구명(sggNm)과 일치하는 구.군을 자동 선택한다.
if(sggNm != null && sggNm != ''){
$('#areaSubCode option').each(function(){
if($(this).text() == sggNm){
$(this).prop('selected', true);
}
});
}
} }
function fnList(){ function fnList(){