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,16 +30,8 @@ public class LclttServiceImpl implements LclttService{
@Override
public int insertLcltt(LclttVO vo) {
String[] adresArray = vo.getAdres1().split("\\s");
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());
}
if(vo.getAreaSubCode() == null || vo.getAreaSubCode().trim().isEmpty()) {
setAreaSubCodeByAdres(vo);
}
return lclttDAO.insertLcltt(vo);
@ -52,20 +44,46 @@ public class LclttServiceImpl implements LclttService{
@Override
public int updateLcltt(LclttVO vo) {
if(vo.getAreaSubCode() == null || vo.getAreaSubCode().trim().isEmpty()) {
setAreaSubCodeByAdres(vo);
}
String[] adresArray = vo.getAdres1().split("\\s");
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.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());
}
if(codeList == null) {
return;
}
return lclttDAO.updateLcltt(vo);
for(int i = 0; i < codeList.size(); i++) {
if(adresGuGun.equals(codeList.get(i).getDetailCodeNm())) {
vo.setAreaSubCode(codeList.get(i).getDetailCode());
break;
}
}
}
@Override

View File

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

View File

@ -47,6 +47,15 @@
</c:forEach>
</div>
</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>
<th>
@ -207,13 +216,45 @@ $(document).ready(function() {
$('#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);
}
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(){
var conf = confirm("정말로 삭제 하시겠습니까?");
if(conf){
@ -237,6 +278,12 @@ function fnLclttSave(){
return false;
}
if($('#areaSubCode').val() == null || $('#areaSubCode').val() == ''){
alert('구.군을 선택해 주세요.');
$('#areaSubCode').focus();
return false;
}
if($('#adres1').val() == null || $('#adres1').val() == ''){
alert('주소를 입력해 주세요.');
$('#adres1').focus();
@ -280,6 +327,14 @@ function jusoCallBack(roadFullAddr,roadAddrPart1,addrDetail,roadAddrPart2,engAdd
$('#adres1').val(roadAddrPart1);
$('#adres2').val(addrDetail+roadAddrPart2);
// 주소 검색 결과의 시군구명(sggNm)과 일치하는 구.군을 자동 선택한다.
if(sggNm != null && sggNm != ''){
$('#areaSubCode option').each(function(){
if($(this).text() == sggNm){
$(this).prop('selected', true);
}
});
}
}
function fnList(){