단속 > 단속 등록&열람: 소유자 중복 검증 및 저장 로직 추가, 중복 소유자 조회 API 및 MyBatis 매퍼 구현, JSP 및 JavaScript 수정, 중요 로직 주석 추가

dev
박성영 4 months ago
parent 20075ba35d
commit 65cdbc61b7

@ -0,0 +1,8 @@
CREATE SEQUENCE seq_ownr_info_id
START WITH 1
INCREMENT BY 1
MINVALUE 1
MAXVALUE 9999999999
CACHE 1000
NOCYCLE;

@ -142,10 +142,10 @@ INSERT INTO ibmsdb.tb_cd_detail (CD_GROUP_ID, CD_ID, CD_NM, CD_DC, SORT_ORDR, US
INSERT INTO ibmsdb.tb_cd_detail (CD_GROUP_ID, CD_ID, CD_NM, CD_DC, SORT_ORDR, USE_YN, ATTRIBUTE1, ATTRIBUTE2, ATTRIBUTE3, ATTRIBUTE4, ATTRIBUTE5, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('STDG_EMD_CD', '107', '구산동', '구산동', 7, 'Y', NULL, NULL, NULL, NULL, NULL, '2025-08-25 10:19:00', 'SYSTEM', NULL, NULL);
INSERT INTO ibmsdb.tb_cd_detail (CD_GROUP_ID, CD_ID, CD_NM, CD_DC, SORT_ORDR, USE_YN, ATTRIBUTE1, ATTRIBUTE2, ATTRIBUTE3, ATTRIBUTE4, ATTRIBUTE5, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('STDG_EMD_CD', '108', '법곳동', '법곳동', 8, 'Y', NULL, NULL, NULL, NULL, NULL, '2025-08-25 10:19:00', 'SYSTEM', NULL, NULL);
-- 소유자 구분 (OWNER_DIV_CD)
INSERT INTO ibmsdb.tb_cd_detail (CD_GROUP_ID, CD_ID, CD_NM, CD_DC, SORT_ORDR, USE_YN, ATTRIBUTE1, ATTRIBUTE2, ATTRIBUTE3, ATTRIBUTE4, ATTRIBUTE5, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('OWNER_DIV_CD', '1', '미상', '미상', 1, 'Y', NULL, NULL, NULL, NULL, NULL, '2025-08-25 10:19:00', 'SYSTEM', NULL, NULL);
INSERT INTO ibmsdb.tb_cd_detail (CD_GROUP_ID, CD_ID, CD_NM, CD_DC, SORT_ORDR, USE_YN, ATTRIBUTE1, ATTRIBUTE2, ATTRIBUTE3, ATTRIBUTE4, ATTRIBUTE5, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('OWNER_DIV_CD', '2', '개인', '개인', 2, 'Y', NULL, NULL, NULL, NULL, NULL, '2025-08-25 10:19:00', 'SYSTEM', NULL, NULL);
INSERT INTO ibmsdb.tb_cd_detail (CD_GROUP_ID, CD_ID, CD_NM, CD_DC, SORT_ORDR, USE_YN, ATTRIBUTE1, ATTRIBUTE2, ATTRIBUTE3, ATTRIBUTE4, ATTRIBUTE5, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('OWNER_DIV_CD', '3', '법인', '법인', 3, 'Y', NULL, NULL, NULL, NULL, NULL, '2025-08-25 10:19:00', 'SYSTEM', NULL, NULL);
-- 소유자 구분 (OWNR_SE_CD)
INSERT INTO ibmsdb.tb_cd_detail (CD_GROUP_ID, CD_ID, CD_NM, CD_DC, SORT_ORDR, USE_YN, ATTRIBUTE1, ATTRIBUTE2, ATTRIBUTE3, ATTRIBUTE4, ATTRIBUTE5, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('OWNR_SE_CD', '1', '미상', '미상', 1, 'Y', NULL, NULL, NULL, NULL, NULL, '2025-08-25 10:19:00', 'SYSTEM', NULL, NULL);
INSERT INTO ibmsdb.tb_cd_detail (CD_GROUP_ID, CD_ID, CD_NM, CD_DC, SORT_ORDR, USE_YN, ATTRIBUTE1, ATTRIBUTE2, ATTRIBUTE3, ATTRIBUTE4, ATTRIBUTE5, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('OWNR_SE_CD', '2', '개인', '개인', 2, 'Y', NULL, NULL, NULL, NULL, NULL, '2025-08-25 10:19:00', 'SYSTEM', NULL, NULL);
INSERT INTO ibmsdb.tb_cd_detail (CD_GROUP_ID, CD_ID, CD_NM, CD_DC, SORT_ORDR, USE_YN, ATTRIBUTE1, ATTRIBUTE2, ATTRIBUTE3, ATTRIBUTE4, ATTRIBUTE5, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('OWNR_SE_CD', '3', '법인', '법인', 3, 'Y', NULL, NULL, NULL, NULL, NULL, '2025-08-25 10:19:00', 'SYSTEM', NULL, NULL);
-- 지역구분 (RGN_SE_CD)
INSERT INTO ibmsdb.tb_cd_detail (CD_GROUP_ID, CD_ID, CD_NM, CD_DC, SORT_ORDR, USE_YN, ATTRIBUTE1, ATTRIBUTE2, ATTRIBUTE3, ATTRIBUTE4, ATTRIBUTE5, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('RGN_SE_CD', '1', '일반지역', '일반지역', 1, 'Y', NULL, NULL, NULL, NULL, NULL, '2025-08-25 10:19:00', 'SYSTEM', NULL, NULL);

@ -12,6 +12,6 @@ INSERT INTO ibmsdb.tb_cd_group (CD_GROUP_ID, CD_GROUP_NM, CD_GROUP_DC, USE_YN, R
INSERT INTO ibmsdb.tb_cd_group (CD_GROUP_ID, CD_GROUP_NM, CD_GROUP_DC, USE_YN, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('JIJONG_CD', '지종', '지번 종류(지종) 코드', 'Y', '2025-08-25 10:19:00', 'SYSTEM', NULL, NULL);
INSERT INTO ibmsdb.tb_cd_group (CD_GROUP_ID, CD_GROUP_NM, CD_GROUP_DC, USE_YN, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('USER_ACT_DIV_CD', '사용자 행위 구분', '업무 처리 사용자 행위 로그 구분 코드', 'Y', '2025-08-25 10:19:00', 'SYSTEM', NULL, NULL);
INSERT INTO ibmsdb.tb_cd_group (CD_GROUP_ID, CD_GROUP_NM, CD_GROUP_DC, USE_YN, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('STDG_EMD_CD', '행정동 코드', '행정동 식별 코드', 'Y', '2025-08-25 10:19:00', 'SYSTEM', NULL, NULL);
INSERT INTO ibmsdb.tb_cd_group (CD_GROUP_ID, CD_GROUP_NM, CD_GROUP_DC, USE_YN, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('OWNER_DIV_CD', '소유자 구분', '소유자 유형 구분 코드', 'Y', '2025-08-25 10:19:00', 'SYSTEM', NULL, NULL);
INSERT INTO ibmsdb.tb_cd_group (CD_GROUP_ID, CD_GROUP_NM, CD_GROUP_DC, USE_YN, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('OWNR_SE_CD', '소유자 구분', '소유자 유형 구분 코드', 'Y', '2025-08-25 10:19:00', 'SYSTEM', NULL, NULL);
INSERT INTO ibmsdb.tb_cd_group (CD_GROUP_ID, CD_GROUP_NM, CD_GROUP_DC, USE_YN, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('RGN_SE_CD', '지역구분', '지역 구분 코드', 'Y', '2025-08-25 10:19:00', 'SYSTEM', NULL, NULL);
INSERT INTO ibmsdb.tb_cd_group (CD_GROUP_ID, CD_GROUP_NM, CD_GROUP_DC, USE_YN, REG_DTTM, RGTR, MDFCN_DTTM, MDFR) VALUES ('CRDN_PRCS_STTS_CD', '단속 처리 상태', '단속 처리 단계별 상태 코드', 'Y', '2025-08-26 13:12:00', 'SYSTEM', NULL, NULL);

@ -13,7 +13,10 @@ import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpSession;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
*
@ -48,4 +51,60 @@ public class CrdnOwnrInfoController {
List<CrdnOwnrInfoVO> list = service.selectOwnrInfoList(vo);
return ApiResponseUtil.successWithGrid(list, vo);
}
/**
* : TB_OWNR_INFO (AJAX)
* , .
*/
@Operation(summary = "소유자 정보 저장", description = "소유자 선택 후 TB_OWNR_INFO 테이블에 저장합니다.")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "저장 성공"),
@ApiResponse(responseCode = "400", description = "저장 실패")
})
@PostMapping("/saveSelectedOwnr.ajax")
public ResponseEntity<?> saveSelectedOwnrAjax(
@RequestParam String crdnYr,
@RequestParam String crdnNo,
@RequestParam String pstnInfoId,
@RequestParam String ownrId,
HttpSession session) {
try {
// 중요로직: 세션에서 사용자 ID 가져오기 (등록자 정보)
String rgtr = "SYSTEM"; // 기본값
// TODO: 실제로는 세션에서 사용자 정보를 가져와야 함
// Object loginUser = session.getAttribute("loginUser");
// if (loginUser != null) { rgtr = ((LoginVO)loginUser).getUserId(); }
// 중요로직: 중복 검증 먼저 수행
if (service.checkDuplicateOwnr(crdnYr, crdnNo, ownrId)) {
// 중복된 소유자 정보 조회하여 응답에 포함
CrdnOwnrInfoVO duplicateInfo = service.getDuplicateOwnrInfo(crdnYr, crdnNo, ownrId);
Map<String, Object> result = new HashMap<>();
result.put("success", false);
result.put("message", "해당 소유자가 이미 등록되어 있습니다.");
result.put("duplicateInfo", duplicateInfo);
return ApiResponseUtil.error("해당 소유자가 이미 등록되어 있습니다.");
}
// 중요로직: 중복이 없으면 저장 수행
int saveResult = service.saveSelectedOwnr(crdnYr, crdnNo, pstnInfoId, ownrId, rgtr);
if (saveResult > 0) {
Map<String, Object> result = new HashMap<>();
result.put("success", true);
result.put("message", "소유자 정보가 성공적으로 저장되었습니다.");
return ApiResponseUtil.success(result);
} else {
return ApiResponseUtil.error("소유자 정보 저장에 실패했습니다.");
}
} catch (Exception e) {
log.error("소유자 정보 저장 중 오류 발생: {}", e.getMessage(), e);
return ApiResponseUtil.error(e.getMessage());
}
}
}

@ -30,4 +30,10 @@ public interface CrdnOwnrInfoMapper {
/** 삭제 (논리삭제) */
int deleteOwnrInfo(@Param("ownrInfoId") String ownrInfoId, @Param("dltr") String dltr);
/** 중요로직: 특정 단속 건에서 소유자 중복 여부 확인 */
int checkDuplicateOwnr(@Param("crdnYr") String crdnYr, @Param("crdnNo") String crdnNo, @Param("ownrId") String ownrId);
/** 중요로직: 중복된 소유자 정보 조회 (표출용) */
CrdnOwnrInfoVO selectDuplicateOwnrInfo(@Param("crdnYr") String crdnYr, @Param("crdnNo") String crdnNo, @Param("ownrId") String ownrId);
}

@ -43,4 +43,13 @@ public class CrdnOwnrInfoVO extends PagingVO {
private String rgtrNm; // 등록자명
private String dltrAcnt; // 삭제자 계정
private String dltrNm; // 삭제자명
// ============ 조인 컬럼(TB_OWNR 테이블) ============
private String flnm; // 성명
private String rrno; // 주민등록번호
private String ownrSeCd; // 소유자 구분 코드
private String ownrSeCdNm; // 소유자 구분 코드명
private String addr; // 주소 (ROAD_NM_ADDR)
private String daddr; // 상세주소 (DTL_ADDR)
private String zip; // 우편번호
}

@ -20,4 +20,13 @@ public interface CrdnOwnrInfoService {
// 중요로직: 다중 삭제 - 체크박스로 선택된 소유자정보들을 논리 삭제
int deleteOwnrInfos(List<String> ownrInfoIds, String dltr);
// 중요로직: 소유자 중복 검증 - 특정 단속 건에서 동일한 소유자가 이미 등록되어 있는지 확인
boolean checkDuplicateOwnr(String crdnYr, String crdnNo, String ownrId);
// 중요로직: 중복된 소유자 정보 조회 - 중복 시 기존 소유자 정보 반환
CrdnOwnrInfoVO getDuplicateOwnrInfo(String crdnYr, String crdnNo, String ownrId);
// 중요로직: 소유자 선택 시 TB_OWNR_INFO에 저장 - 중복 검증 후 저장
int saveSelectedOwnr(String crdnYr, String crdnNo, String pstnInfoId, String ownrId, String rgtr);
}

@ -75,4 +75,41 @@ public class CrdnOwnrInfoServiceImpl extends EgovAbstractServiceImpl implements
return deletedCount;
}
@Override
public boolean checkDuplicateOwnr(String crdnYr, String crdnNo, String ownrId) {
// 중요로직: 중복 소유자 존재 여부 확인 (0보다 크면 중복)
int count = mapper.checkDuplicateOwnr(crdnYr, crdnNo, ownrId);
return count > 0;
}
@Override
public CrdnOwnrInfoVO getDuplicateOwnrInfo(String crdnYr, String crdnNo, String ownrId) {
// 중요로직: 중복된 소유자 정보 조회
return mapper.selectDuplicateOwnrInfo(crdnYr, crdnNo, ownrId);
}
@Override
public int saveSelectedOwnr(String crdnYr, String crdnNo, String pstnInfoId, String ownrId, String rgtr) {
// 중요로직: 중복 검증 후 저장
if (checkDuplicateOwnr(crdnYr, crdnNo, ownrId)) {
throw new MessageException("해당 단속 건에 동일한 소유자가 이미 등록되어 있습니다.");
}
// 중요로직: TB_OWNR_INFO 테이블에 저장할 VO 생성
CrdnOwnrInfoVO vo = CrdnOwnrInfoVO.builder()
.crdnYr(crdnYr)
.crdnNo(crdnNo)
.pstnInfoId(pstnInfoId)
.ownrId(ownrId)
.rgtr(rgtr)
.delYn("N")
.build();
// 중요로직: SGG_CD는 단속 정보에서 가져와야 하지만 우선 기본값 설정
// TODO: 실제로는 단속 정보에서 SGG_CD를 조회해서 설정해야 함
vo.setSggCd("11"); // 임시 기본값
return mapper.insertOwnrInfo(vo);
}
}

@ -63,8 +63,6 @@ public class OwnrSelectController {
int totalCount = service.selectOwnrListTotalCount(vo);
// 2. 응답 데이터 구성
vo.setTotalCount(totalCount);
// 3. 페이징 처리 (가이드 준수)
vo.setPagingYn("Y");
List<OwnrSelectVO> list = service.selectOwnrList(vo);
return ApiResponseUtil.successWithGrid(list, vo);

@ -8,32 +8,43 @@
resultType="CrdnOwnrInfoVO">
/* OwnrInfoMapper.selectOwnrInfoList : 소유자정보 목록 조회 */
SELECT
o.OWNR_INFO_ID,
o.SGG_CD,
o.CRDN_YR,
o.CRDN_NO,
o.PSTN_INFO_ID,
o.OWNR_ID,
o.REG_DT,
o.RGTR,
oi.OWNR_INFO_ID,
oi.SGG_CD,
oi.CRDN_YR,
oi.CRDN_NO,
oi.PSTN_INFO_ID,
oi.OWNR_ID,
oi.REG_DT,
oi.RGTR,
regUser.USER_ACNT AS RGTR_ACNT,
regUser.USER_NM AS RGTR_NM,
o.DEL_YN,
o.DEL_DT,
o.DLTR,
oi.DEL_YN,
oi.DEL_DT,
oi.DLTR,
delUser.USER_ACNT AS DLTR_ACNT,
delUser.USER_NM AS DLTR_NM
FROM tb_ownr_info o
LEFT JOIN tb_user regUser ON regUser.USER_ID = o.RGTR
LEFT JOIN tb_user delUser ON delUser.USER_ID = o.DLTR
WHERE o.DEL_YN = 'N'
delUser.USER_NM AS DLTR_NM,
/* 중요로직: TB_OWNR 테이블과 조인하여 소유자 상세 정보 추가 */
o.FLNM,
o.RRNO,
o.OWNR_SE_CD,
ownrSe.CD_NM AS OWNR_SE_CD_NM,
o.ROAD_NM_ADDR AS ADDR,
o.DTL_ADDR AS DADDR,
o.ZIP
FROM tb_ownr_info oi
LEFT JOIN tb_user regUser ON regUser.USER_ID = oi.RGTR
LEFT JOIN tb_user delUser ON delUser.USER_ID = oi.DLTR
/* 중요로직: TB_OWNR 테이블과 조인하여 소유자 상세 정보 조회 */
LEFT JOIN tb_ownr o ON o.OWNR_ID = oi.OWNR_ID AND o.DEL_YN = 'N'
LEFT JOIN tb_cd_detail ownrSe ON ownrSe.CD_GROUP_ID = 'OWNR_SE_CD' AND ownrSe.CD_ID = o.OWNR_SE_CD AND ownrSe.USE_YN = 'Y'
WHERE oi.DEL_YN = 'N'
<if test='crdnYr != null and crdnYr != ""'>
AND o.CRDN_YR = #{crdnYr}
AND oi.CRDN_YR = #{crdnYr}
</if>
<if test='crdnNo != null and crdnNo != ""'>
AND o.CRDN_NO = #{crdnNo}
AND oi.CRDN_NO = #{crdnNo}
</if>
ORDER BY o.REG_DT DESC, o.OWNR_INFO_ID DESC
ORDER BY oi.REG_DT DESC, oi.OWNR_INFO_ID DESC
<if test='pagingYn != null and pagingYn == "Y"'>
limit #{startIndex}, #{perPage} /* 서버사이드 페이징 처리 */
</if>
@ -128,4 +139,44 @@
AND DEL_YN = 'N'
</update>
<!-- 중요로직: 특정 단속 건에서 소유자 중복 여부 확인 -->
<select id="checkDuplicateOwnr" resultType="int">
/* OwnrInfoMapper.checkDuplicateOwnr : 소유자 중복 확인 */
SELECT COUNT(*)
FROM tb_ownr_info
WHERE CRDN_YR = #{crdnYr}
AND CRDN_NO = #{crdnNo}
AND OWNR_ID = #{ownrId}
AND DEL_YN = 'N'
</select>
<!-- 중요로직: 중복된 소유자 정보 조회 (표출용) -->
<select id="selectDuplicateOwnrInfo" resultType="CrdnOwnrInfoVO">
/* OwnrInfoMapper.selectDuplicateOwnrInfo : 중복 소유자 정보 조회 */
SELECT
o.OWNR_INFO_ID,
o.SGG_CD,
o.CRDN_YR,
o.CRDN_NO,
o.PSTN_INFO_ID,
o.OWNR_ID,
o.REG_DT,
o.RGTR,
regUser.USER_ACNT AS RGTR_ACNT,
regUser.USER_NM AS RGTR_NM,
o.DEL_YN,
o.DEL_DT,
o.DLTR,
delUser.USER_ACNT AS DLTR_ACNT,
delUser.USER_NM AS DLTR_NM
FROM tb_ownr_info o
LEFT JOIN tb_user regUser ON regUser.USER_ID = o.RGTR
LEFT JOIN tb_user delUser ON delUser.USER_ID = o.DLTR
WHERE o.CRDN_YR = #{crdnYr}
AND o.CRDN_NO = #{crdnNo}
AND o.OWNR_ID = #{ownrId}
AND o.DEL_YN = 'N'
LIMIT 1
</select>
</mapper>

@ -47,12 +47,14 @@
o.TELNO,
o.EML
FROM tb_ownr o
LEFT JOIN tb_cd_detail sgg ON sgg.CD_GROUP_ID = 'ORG_CD' AND sgg.CD_ID = o.SGG_CD AND sgg.USE_YN = 'Y'
LEFT JOIN tb_cd_detail ownrSe ON ownrSe.CD_GROUP_ID = 'OWNR_SE_CD' AND ownrSe.CD_ID = o.OWNR_SE_CD AND ownrSe.USE_YN = 'Y'
LEFT JOIN tb_user regUser ON regUser.USER_ID = o.RGTR
LEFT JOIN tb_user modUser ON modUser.USER_ID = o.MDFR
LEFT JOIN tb_user delUser ON delUser.USER_ID = o.DLTR
WHERE o.DEL_YN = 'N'
WHERE NOT EXISTS (SELECT 1 FROM tb_ownr_info oi WHERE oi.OWNR_ID = o.OWNR_ID AND oi.DEL_YN = 'N')
AND o.DEL_YN = 'N'
<if test='flnm != null and flnm != ""'>
AND o.FLNM LIKE CONCAT('%', #{flnm}, '%')
</if>

@ -47,23 +47,21 @@
/**
* 그리드 컬럼 정의
* 중요로직: TB_OWNR 테이블과 조인하여 소유자 상세 정보 표시
* @returns {Array} 그리드 컬럼 배열
*/
getGridColumns: function() {
return [
{ header: '소유자정보ID', name: 'ownrInfoId', align: 'center', width: 110 },
{ header: '시군구코드', name: 'sggCd', align: 'center', width: 100 },
{ header: '단속연도', name: 'crdnYr', align: 'center', width: 80, sortable: true },
{ header: '단속번호', name: 'crdnNo', align: 'center', width: 90, sortable: true },
{ header: '위치정보ID', name: 'pstnInfoId', align: 'center', width: 150 },
{ header: '소유자ID', name: 'ownrId', align: 'center', width: 110 },
{ header: '소유자정보ID', name: 'ownrInfoId', align: 'center', width: 110, hidden: true },
{ header: '소유자ID', name: 'ownrId', align: 'center', width: 110, hidden: true },
{ header: '성명', name: 'flnm', align: 'center', width: 120, sortable: true },
{ header: '주민등록번호', name: 'rrno', align: 'center', width: 150 },
{ header: '소유자구분', name: 'ownrSeCdNm', align: 'center', width: 100 },
{ header: '주소', name: 'addr', align: 'left', width: 250 },
{ header: '상세주소', name: 'daddr', align: 'left', width: 200 },
{ header: '우편번호', name: 'zip', align: 'center', width: 80 },
{ header: '등록일시', name: 'regDt', align: 'center', width: 150},
{ header: '등록자', name: 'rgtr', align: 'center', width: 100 },
{ header: '등록자명', name: 'rgtrNm', align: 'center', width: 100 },
{ header: '삭제여부', name: 'delYn', align: 'center', width: 80 },
{ header: '삭제일시', name: 'delDt', align: 'center', width: 150},
{ header: '삭제자', name: 'dltr', align: 'center', width: 100 },
{ header: '삭제자명', name: 'dltrNm', align: 'center', width: 100 }
{ header: '등록자명', name: 'rgtrNm', align: 'center', width: 100 }
];
},
@ -167,7 +165,7 @@
var url = '<c:url value="/crdn/crndRegistAndView/ownrSelect/popup.do"/>' +
'?crdnYr=' + encodeURIComponent(crdnYr) +
'&crdnNo=' + encodeURIComponent(crdnNo);
var w = 1000, h = 600;
var w = 1000, h = 800;
var left = Math.max(0, (screen.width - w) / 2);
var top = Math.max(0, (screen.height - h) / 2);
window.open(url, 'ownrSelectPopup', 'width=' + w + ',height=' + h + ',left=' + left + ',top=' + top + ',resizable=yes,scrollbars=yes');

@ -156,17 +156,111 @@
}
},
// 선택된 소유자들을 부모 창에 전달
// 중요로직: 선택된 소유자들을 TB_OWNR_INFO에 저장
selectOwners: function(selectedOwners) {
if (selectedOwners && selectedOwners.length > 0) {
// 중요로직: 부모창의 콜백 함수 호출
if (window.opener && window.opener.onOwnrSelected) {
window.opener.onOwnrSelected(selectedOwners);
}
window.close();
} else {
if (!selectedOwners || selectedOwners.length === 0) {
alert('선택할 소유자가 없습니다.');
return;
}
var self = this;
var crdnYr = '${crdnYr}';
var crdnNo = '${crdnNo}';
// 중요로직: 위치정보ID 가져오기 (부모창에서)
var pstnInfoId = '';
if (window.opener && window.opener.CrdnDetailViewPstn && window.opener.CrdnDetailViewPstn.grid && window.opener.CrdnDetailViewPstn.grid.instance) {
var pstnData = window.opener.CrdnDetailViewPstn.grid.instance.getData();
if (pstnData && pstnData.length > 0) {
pstnInfoId = pstnData[0].pstnInfoId || '';
}
}
if (!pstnInfoId) {
alert('위치정보가 등록되어 있지 않습니다. 위치정보를 먼저 등록해주세요.');
return;
}
// 중요로직: 각 선택된 소유자에 대해 순차적으로 저장 처리
var saveCount = 0;
var duplicateCount = 0;
var errorCount = 0;
var duplicateOwners = [];
function processSaveOwner(index) {
if (index >= selectedOwners.length) {
// 모든 처리 완료 시 결과 표시
self.showSaveResult(saveCount, duplicateCount, errorCount, duplicateOwners);
return;
}
var owner = selectedOwners[index];
$.ajax({
url: '<c:url value="/crdn/crndRegistAndView/crdnOwnrInfo/saveSelectedOwnr.ajax"/>',
type: 'POST',
data: {
crdnYr: crdnYr,
crdnNo: crdnNo,
pstnInfoId: pstnInfoId,
ownrId: owner.ownrId
},
success: function(response) {
if (response && response.success) {
saveCount++;
} else if (response && response.message && response.message.indexOf('이미 등록') !== -1) {
duplicateCount++;
duplicateOwners.push(owner.flnm || '이름없음');
} else {
errorCount++;
}
// 다음 소유자 처리
processSaveOwner(index + 1);
},
error: function(xhr, status, error) {
console.error('소유자 저장 오류:', error);
errorCount++;
// 다음 소유자 처리
processSaveOwner(index + 1);
}
});
}
// 첫 번째 소유자부터 처리 시작
processSaveOwner(0);
},
// 중요로직: 저장 결과 표시 및 부모창 새로고침
showSaveResult: function(saveCount, duplicateCount, errorCount, duplicateOwners) {
var message = '';
if (saveCount > 0) {
message += saveCount + '건의 소유자 정보가 저장되었습니다.\n';
}
if (duplicateCount > 0) {
message += duplicateCount + '건의 소유자는 이미 등록되어 있습니다.\n';
if (duplicateOwners.length > 0) {
message += '(중복: ' + duplicateOwners.join(', ') + ')\n';
}
}
if (errorCount > 0) {
message += errorCount + '건의 소유자 저장 중 오류가 발생했습니다.\n';
}
if (message) {
alert(message.trim());
}
// 중요로직: 저장 성공 시 부모창 소유자 정보 그리드 새로고침
if (saveCount > 0) {
if (window.opener && window.opener.CrdnDetailViewOwnrInfo && window.opener.CrdnDetailViewOwnrInfo.search) {
window.opener.CrdnDetailViewOwnrInfo.search();
}
}
window.close();
},
// 체크된 행들 가져오기

Loading…
Cancel
Save