단속 > 소유자행위자 관리 메뉴 생성, insert,update 사용 가능
parent
263ca05b56
commit
5d8d5655b3
@ -0,0 +1,162 @@
|
||||
package go.kr.project.ownact.ownActRegistAndView.controller;
|
||||
|
||||
import egovframework.constant.MessageConstants;
|
||||
import egovframework.constant.TilesConstants;
|
||||
import egovframework.exception.MessageException;
|
||||
import egovframework.util.ApiResponseUtil;
|
||||
import egovframework.util.SessionUtil;
|
||||
import go.kr.project.common.model.CmmnCodeSearchVO;
|
||||
import go.kr.project.common.service.CommonCodeService;
|
||||
import go.kr.project.ownact.ownActRegistAndView.model.OwnActRegistAndViewVO;
|
||||
import go.kr.project.ownact.ownActRegistAndView.service.OwnActRegistAndViewService;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.Parameter;
|
||||
import io.swagger.v3.oas.annotations.responses.ApiResponse;
|
||||
import io.swagger.v3.oas.annotations.responses.ApiResponses;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.ui.Model;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import org.springframework.web.servlet.ModelAndView;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* packageName : go.kr.project.ownact.ownActRegistAndView.controller
|
||||
* fileName : OwnActRegistAndViewController
|
||||
* author : 시스템 관리자
|
||||
* date : 2025-08-27
|
||||
* description : 단속 등록/조회 관련 요청을 처리하는 컨트롤러
|
||||
* 중요한 로직 주석: 단속 관련 화면 제공 및 CRUD API를 처리하는 컨트롤러
|
||||
* ===========================================================
|
||||
* DATE AUTHOR NOTE
|
||||
* -----------------------------------------------------------
|
||||
* 2025-08-27 시스템 관리자 최초 생성
|
||||
*/
|
||||
@Controller
|
||||
@RequestMapping("/ownact/ownActRegistAndView")
|
||||
@RequiredArgsConstructor
|
||||
@Slf4j
|
||||
@Tag(name = "소유자행위자 등록/조회", description = "소유자행위자 등록/조회 관련 API")
|
||||
public class OwnActRegistAndViewController {
|
||||
|
||||
/** 단속 서비스 */
|
||||
private final OwnActRegistAndViewService service;
|
||||
|
||||
private final CommonCodeService commonCodeService;
|
||||
|
||||
/**
|
||||
* 소유자행위자 목록 화면을 제공한다.
|
||||
* @return 소유자행위자 목록 화면
|
||||
*/
|
||||
@GetMapping("/list.do")
|
||||
@Operation(summary = "소유자행위자 목록 화면", description = "소유자행위자 목록을 조회하는 화면을 제공합니다.")
|
||||
public String list( Model model ) {
|
||||
log.debug("소유자행위자 목록 화면 요청");
|
||||
return "ownact/ownActRegistAndView/list" + TilesConstants.BASE;
|
||||
}
|
||||
|
||||
/**
|
||||
* 소유자행위자 목록을 조회하는 AJAX 메소드
|
||||
* 공통 응답 형식(ApiResponse)을 사용하여 응답합니다.
|
||||
*
|
||||
* @param paramVO 검색 조건을 담은 VO 객체
|
||||
* @return 소유자행위자 목록과 성공 상태를 담은 ResponseEntity 객체
|
||||
* @throws Exception 조회 중 발생할 수 있는 예외
|
||||
*/
|
||||
@Operation(summary = "소유자행위자 목록 조회 (AJAX)", description = "소유자행위자 목록을 조회하고 JSON 형식으로 반환합니다.")
|
||||
@ApiResponses(value = {
|
||||
@ApiResponse(responseCode = "200", description = "소유자행위자 목록 조회 성공"),
|
||||
@ApiResponse(responseCode = "400", description = "소유자행위자 목록 조회 실패"),
|
||||
@ApiResponse(description = "오류로 인한 실패")
|
||||
})
|
||||
@PostMapping("/list.ajax")
|
||||
public ResponseEntity<?> listAjax(@ModelAttribute OwnActRegistAndViewVO paramVO) {
|
||||
|
||||
// 총 소유자행위자 수 조회
|
||||
int totalCount = service.selectListTotalCount(paramVO);
|
||||
paramVO.setTotalCount(totalCount);
|
||||
|
||||
// 페이징 처리를 위한 설정
|
||||
paramVO.setPagingYn("Y");
|
||||
|
||||
// 페이징 처리된 소유자행위자 목록 조회
|
||||
List<OwnActRegistAndViewVO> list = service.selectList(paramVO);
|
||||
return ApiResponseUtil.successWithGrid(list, paramVO);
|
||||
}
|
||||
|
||||
/**
|
||||
* 소유자행위자 등록/수정 팝업 화면을 제공한다.
|
||||
* @param mode 화면 모드 (C: 등록, U: 수정, V: 보기)
|
||||
* @param model 모델 객체
|
||||
* @return 소유자행위자 등록/수정 팝업 화면
|
||||
*/
|
||||
@GetMapping("/ownActRegistPopup.do")
|
||||
@Operation(summary = "소유자행위자 등록/수정 팝업", description = "소유자행위자 등록/수정/조회 팝업 화면을 제공합니다.")
|
||||
public ModelAndView popup(
|
||||
@Parameter(description = "소유자 ID") @RequestParam(required = false) String ownrId,
|
||||
@Parameter(description = "화면 모드 (C:등록, U:수정, V:보기)") @RequestParam String mode,
|
||||
Model model) {
|
||||
|
||||
try {
|
||||
log.debug("소유자행위자 팝업 화면 요청 - 모드: {}", mode);
|
||||
|
||||
ModelAndView mav = new ModelAndView("ownact/ownActRegistAndView/ownActRegistPopup" + TilesConstants.POPUP);
|
||||
mav.addObject("mode", mode);
|
||||
|
||||
// 수정/조회 모드인 경우 기존 데이터 조회
|
||||
if (("U".equals(mode) || "V".equals(mode))) {
|
||||
|
||||
OwnActRegistAndViewVO paramVO = new OwnActRegistAndViewVO();
|
||||
paramVO.setOwnrId(ownrId);
|
||||
|
||||
OwnActRegistAndViewVO data = service.selectOne(paramVO);
|
||||
|
||||
if (data != null) {
|
||||
mav.addObject("data", data);
|
||||
} else {
|
||||
throw new MessageException("해당 소유자행위자 정보를 찾을 수 없습니다.");
|
||||
}
|
||||
}
|
||||
|
||||
return mav;
|
||||
|
||||
} catch (Exception e) {
|
||||
log.error("소유자행위자 팝업 화면 제공 중 오류 발생", e);
|
||||
throw new MessageException("팝업 화면을 불러오는 중 오류가 발생했습니다.");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 소유자행위자 정보를 등록합니다.
|
||||
*
|
||||
* @param paramVO 등록할 소유자행위자 정보를 담은 VO 객체
|
||||
* @return 등록 결과와 성공 상태를 담은 ResponseEntity 객체
|
||||
* @throws Exception 등록 중 발생할 수 있는 예외
|
||||
*/
|
||||
@Operation(summary = "소유자행위자 등록", description = "새로운 소유자행위자 정보를 등록합니다.")
|
||||
@ApiResponses(value = {
|
||||
@ApiResponse(responseCode = "200", description = "소유자행위자 등록 성공"),
|
||||
@ApiResponse(responseCode = "400", description = "소유자행위자 등록 실패"),
|
||||
@ApiResponse(description = "오류로 인한 실패")
|
||||
})
|
||||
@PostMapping("/insert.ajax")
|
||||
public ResponseEntity<?> insert(@ModelAttribute OwnActRegistAndViewVO paramVO) throws Exception {
|
||||
// 등록자 정보 설정
|
||||
paramVO.setRgtr(SessionUtil.getUserId());
|
||||
|
||||
// 시군구 코드 설정 (세션의 조직 코드 사용)
|
||||
paramVO.setSggCd(SessionUtil.getSessionVO().getUser().getOrgCd());
|
||||
int result = service.insert(paramVO);
|
||||
|
||||
if (result > 0) {
|
||||
return ApiResponseUtil.success(MessageConstants.Common.SAVE_SUCCESS);
|
||||
} else {
|
||||
return ApiResponseUtil.error(MessageConstants.Common.SAVE_ERROR);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,94 @@
|
||||
package go.kr.project.ownact.ownActRegistAndView.mapper;
|
||||
|
||||
import go.kr.project.ownact.ownActRegistAndView.model.OwnActRegistAndViewVO;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* packageName : go.kr.project.ownact.ownActRegistAndView.mapper
|
||||
* fileName : OwnActRegistAndViewMapper
|
||||
* author : 시스템 관리자
|
||||
* date : 2025-08-27
|
||||
* description : 소유자행위자 관련 데이터베이스 접근을 위한 MyBatis 매퍼 인터페이스
|
||||
* 중요한 로직 주석: 소유자행위자 테이블(tb_ownr)에 대한 CRUD 작업을 수행하는 매퍼 인터페이스
|
||||
* ===========================================================
|
||||
* DATE AUTHOR NOTE
|
||||
* -----------------------------------------------------------
|
||||
* 2025-08-27 시스템 관리자 최초 생성
|
||||
*/
|
||||
@Mapper
|
||||
public interface OwnActRegistAndViewMapper {
|
||||
|
||||
/**
|
||||
* 소유자행위자 목록을 조회한다.
|
||||
* @param vo 검색 조건과 페이징 정보를 담은 VO 객체
|
||||
* @return 소유자행위자 목록
|
||||
*/
|
||||
List<OwnActRegistAndViewVO> selectList(OwnActRegistAndViewVO vo);
|
||||
|
||||
/**
|
||||
* 소유자행위자 목록의 총 개수를 조회한다.
|
||||
* @param vo 검색 조건을 담은 VO 객체
|
||||
* @return 조회된 목록의 총 개수
|
||||
*/
|
||||
int selectListTotalCount(OwnActRegistAndViewVO vo);
|
||||
|
||||
/**
|
||||
* 특정 소유자행위자 연도와 번호에 해당하는 단속 정보를 조회한다.
|
||||
* @param vo 조회할 PK 정보(ownrId)를 담은 VO 객체
|
||||
* @return 조회된 소유자행위자 정보
|
||||
*/
|
||||
OwnActRegistAndViewVO selectOne(OwnActRegistAndViewVO vo);
|
||||
|
||||
/**
|
||||
* 새로운 소유자행위자 정보를 등록한다.
|
||||
* 소유자 ID는 연도별 시컨스를 통해 자동 생성된다.
|
||||
* @param vo 등록할 단속 정보를 담은 VO 객체
|
||||
* @return 등록된 행의 수
|
||||
*/
|
||||
int insert(OwnActRegistAndViewVO vo);
|
||||
|
||||
/**
|
||||
* 기존 단속 정보를 수정한다.
|
||||
* @param vo 수정할 단속 정보를 담은 VO 객체
|
||||
* @return 수정된 행의 수
|
||||
*/
|
||||
//int update(CrdnRegistAndViewVO vo);
|
||||
|
||||
/**
|
||||
* 단속 정보를 삭제한다. (논리 삭제)
|
||||
* @param vo 삭제할 PK 정보(crdnYr, crdnNo)를 담은 VO 객체
|
||||
* @return 삭제된 행의 수
|
||||
*/
|
||||
//int delete(CrdnRegistAndViewVO vo);
|
||||
|
||||
/**
|
||||
* PK(단속연도+단속번호) 중복 체크를 수행한다.
|
||||
* @param vo 중복 체크할 PK 정보(crdnYr, crdnNo)를 담은 VO 객체
|
||||
* @return 중복 건수 (0이면 중복 없음, 1이상이면 중복 존재)
|
||||
*/
|
||||
//int selectDuplicateCheck(CrdnRegistAndViewVO vo);
|
||||
|
||||
/**
|
||||
* 년도별 시퀀스 존재 여부를 확인한다.
|
||||
* @param sequenceName 확인할 시퀀스명 (seq_crdn_no_YYYY 형태)
|
||||
* @return 시퀀스 정의 (존재하지 않으면 예외 발생)
|
||||
*/
|
||||
//String checkSequenceExists(String sequenceName);
|
||||
|
||||
/**
|
||||
* 년도별 시퀀스를 생성한다.
|
||||
* @param sequenceName 생성할 시퀀스명 (seq_crdn_no_YYYY 형태)
|
||||
* @return 실행 결과
|
||||
*/
|
||||
//void createSequence(String sequenceName);
|
||||
|
||||
/**
|
||||
* 단속 처리 상태를 업데이트한다.
|
||||
* @param vo 상태 업데이트할 단속 정보(crdnYr, crdnNo, crdnPrcsSttsCd, crdnPrcsYmd)를 담은 VO 객체
|
||||
* @return 업데이트된 행의 수
|
||||
*/
|
||||
//int updateStatus(CrdnRegistAndViewVO vo);
|
||||
|
||||
}
|
||||
@ -0,0 +1,128 @@
|
||||
package go.kr.project.ownact.ownActRegistAndView.model;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
import go.kr.project.common.model.PagingVO;
|
||||
import lombok.*;
|
||||
import org.springframework.format.annotation.DateTimeFormat;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
/**
|
||||
* packageName : go.kr.project.ownact.ownActRegistAndView.model
|
||||
* fileName : OwnActRegistAndViewVO
|
||||
* author : 시스템 관리자
|
||||
* date : 2025-08-27
|
||||
* description : 소유자행위자 관련 데이터를 담는 Value Object 클래스
|
||||
* 중요한 로직 주석: 소유자행위자 테이블(tb_ownr)과 매핑되는 VO 클래스로 페이징 기능을 포함한다.
|
||||
* ===========================================================
|
||||
* DATE AUTHOR NOTE
|
||||
* -----------------------------------------------------------
|
||||
* 2025-08-27 시스템 관리자 최초 생성
|
||||
*/
|
||||
@EqualsAndHashCode(callSuper=true)
|
||||
@Data
|
||||
@Builder
|
||||
@AllArgsConstructor
|
||||
@NoArgsConstructor
|
||||
@ToString
|
||||
public class OwnActRegistAndViewVO extends PagingVO {
|
||||
|
||||
// ==================== 기본 테이블 컬럼 ====================
|
||||
|
||||
/** 소유자 ID */
|
||||
private String ownrId;
|
||||
|
||||
/** 시군구 코드 */
|
||||
private String sggCd;
|
||||
|
||||
/** 성명 */
|
||||
private String flnm;
|
||||
|
||||
/** 주민등록번호 */
|
||||
private String rrno;
|
||||
|
||||
/** 소유자 구분 코드 */
|
||||
private String ownrSeCd;
|
||||
|
||||
/** 주소 */
|
||||
private String addr;
|
||||
|
||||
/** 상세 주소 */
|
||||
private String daddr;
|
||||
|
||||
/** 지번 전체 주소 */
|
||||
private String lotnoWholAddr;
|
||||
|
||||
/** 도로명 전체 주소 */
|
||||
private String roadNmWholAddr;
|
||||
|
||||
/** 우편번호 */
|
||||
private String zip;
|
||||
|
||||
/** 지번 주소 */
|
||||
private String lotnoAddr;
|
||||
|
||||
/** 도로명 주소 */
|
||||
private String roadNmAddr;
|
||||
|
||||
/** 참고 주소 */
|
||||
private String refAddr;
|
||||
|
||||
/** 행정 구역 코드 */
|
||||
private String pbadmsZoneCd;
|
||||
|
||||
/** 도로명 코드 */
|
||||
private String roadNmCd;
|
||||
|
||||
/** 지번 본번 */
|
||||
private String lotnoMno;
|
||||
|
||||
/** 지번 부번 */
|
||||
private String lotnoSno;
|
||||
|
||||
/** 건물 본번 */
|
||||
private String bldgMno;
|
||||
|
||||
/** 건물 부번 */
|
||||
private String bldgSno;
|
||||
|
||||
/** 지하 여부 코드 */
|
||||
private String udgdYnCd;
|
||||
|
||||
/** 비고 */
|
||||
private String rmrk;
|
||||
|
||||
/** 등록 일시 */
|
||||
private String regDt;
|
||||
|
||||
/** 등록자 */
|
||||
private String rgtr;
|
||||
|
||||
/** 수정 일시 */
|
||||
private String mdfcnDt;
|
||||
|
||||
/** 수정자 */
|
||||
private String mdfr;
|
||||
|
||||
/** 삭제 여부 */
|
||||
private String delYn;
|
||||
|
||||
/** 삭제 일시 */
|
||||
private String delDt;
|
||||
|
||||
/** 삭제자 */
|
||||
private String dltr;
|
||||
|
||||
/** 산 여부 코드 */
|
||||
private String mtnYnCd;
|
||||
|
||||
/** 전화번호 */
|
||||
private String telno;
|
||||
|
||||
/** 이메일 */
|
||||
private String eml;
|
||||
|
||||
/** 검색 조건 - 성명 */
|
||||
private String schFlnm;
|
||||
|
||||
}
|
||||
@ -0,0 +1,84 @@
|
||||
package go.kr.project.ownact.ownActRegistAndView.service;
|
||||
|
||||
import go.kr.project.ownact.ownActRegistAndView.model.OwnActRegistAndViewVO;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* packageName : go.kr.project.ownact.ownActRegistAndView.service
|
||||
* fileName : OwnActRegistAndViewService
|
||||
* author : 김동규
|
||||
* date : 2025-08-27
|
||||
* description : 소유자행위자 관련 비즈니스 로직을 처리하는 서비스 인터페이스
|
||||
* ===========================================================
|
||||
* DATE AUTHOR NOTE
|
||||
* -----------------------------------------------------------
|
||||
* 2025-08-27 김동규 최초 생성
|
||||
*/
|
||||
public interface OwnActRegistAndViewService {
|
||||
|
||||
/**
|
||||
* 소유자행위자 목록을 조회합니다.
|
||||
*
|
||||
* @param vo 검색 조건과 페이징 정보를 담은 VO 객체
|
||||
* @return 소유자행위자 목록
|
||||
*/
|
||||
List<OwnActRegistAndViewVO> selectList(OwnActRegistAndViewVO vo);
|
||||
|
||||
/**
|
||||
* 소유자행위자 목록의 총 개수를 조회합니다.
|
||||
*
|
||||
* @param vo 검색 조건을 담은 VO 객체
|
||||
* @return 조회된 목록의 총 개수
|
||||
*/
|
||||
int selectListTotalCount(OwnActRegistAndViewVO vo);
|
||||
|
||||
/**
|
||||
* 소유자행위자 정보를 조회합니다.
|
||||
*
|
||||
* @param vo 조회할 PK 정보(ownrId)를 담은 VO 객체
|
||||
* @return 조회된 소유자행위자 정보
|
||||
*/
|
||||
OwnActRegistAndViewVO selectOne(OwnActRegistAndViewVO vo);
|
||||
|
||||
/**
|
||||
* 소유자행위자 정보를 등록합니다.
|
||||
*
|
||||
* @param vo 등록할 소유자행위자 정보를 담은 VO 객체
|
||||
* @return 등록된 행의 수
|
||||
*/
|
||||
int insert(OwnActRegistAndViewVO vo);
|
||||
|
||||
/**
|
||||
* 단속 정보를 수정합니다.
|
||||
*
|
||||
* @param vo 수정할 단속 정보를 담은 VO 객체
|
||||
* @return 수정된 행의 수
|
||||
*/
|
||||
//int update(CrdnRegistAndViewVO vo);
|
||||
|
||||
/**
|
||||
* 단속 정보를 삭제합니다. (논리 삭제)
|
||||
*
|
||||
* @param vo 삭제할 PK 정보(crdnYr, crdnNo)를 담은 VO 객체
|
||||
* @return 삭제된 행의 수
|
||||
*/
|
||||
//int delete(CrdnRegistAndViewVO vo);
|
||||
|
||||
/**
|
||||
* PK(단속연도+단속번호) 중복 체크를 수행합니다.
|
||||
*
|
||||
* @param vo 중복 체크할 PK 정보(crdnYr, crdnNo)를 담은 VO 객체
|
||||
* @return 중복 건수 (0이면 중복 없음, 1이상이면 중복 존재)
|
||||
*/
|
||||
//int selectDuplicateCheck(CrdnRegistAndViewVO vo);
|
||||
|
||||
/**
|
||||
* 단속 처리 상태를 업데이트합니다.
|
||||
*
|
||||
* @param vo 상태 업데이트할 단속 정보(crdnYr, crdnNo, crdnPrcsSttsCd)를 담은 VO 객체
|
||||
* @return 업데이트된 행의 수
|
||||
*/
|
||||
//int updateStatus(CrdnRegistAndViewVO vo);
|
||||
|
||||
}
|
||||
@ -0,0 +1,236 @@
|
||||
package go.kr.project.ownact.ownActRegistAndView.service.impl;
|
||||
|
||||
import egovframework.exception.MessageException;
|
||||
import egovframework.util.SessionUtil;
|
||||
import go.kr.project.ownact.ownActRegistAndView.mapper.OwnActRegistAndViewMapper;
|
||||
import go.kr.project.ownact.ownActRegistAndView.model.OwnActRegistAndViewVO;
|
||||
import go.kr.project.ownact.ownActRegistAndView.service.OwnActRegistAndViewService;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.egovframe.rte.fdl.cmmn.EgovAbstractServiceImpl;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* packageName : go.kr.project.ownact.ownActRegistAndView.service.impl
|
||||
* fileName : OwnActRegistAndViewServiceImpl
|
||||
* author : 김동규
|
||||
* date : 2025-08-27
|
||||
* description : 소유자행위자 관련 비즈니스 로직을 처리하는 서비스 구현체
|
||||
* ===========================================================
|
||||
* DATE AUTHOR NOTE
|
||||
* -----------------------------------------------------------
|
||||
* 2025-08-27 김동규 최초 생성
|
||||
*/
|
||||
@Service
|
||||
@RequiredArgsConstructor
|
||||
@Slf4j
|
||||
public class OwnActRegistAndViewServiceImpl extends EgovAbstractServiceImpl implements OwnActRegistAndViewService {
|
||||
|
||||
private final OwnActRegistAndViewMapper mapper;
|
||||
|
||||
/**
|
||||
* 소유자행위자 목록을 조회합니다.
|
||||
*
|
||||
* @param vo 검색 조건과 페이징 정보를 담은 VO 객체
|
||||
* @return 소유자행위자 목록
|
||||
*/
|
||||
@Override
|
||||
public List<OwnActRegistAndViewVO> selectList(OwnActRegistAndViewVO vo) {
|
||||
return mapper.selectList(vo);
|
||||
}
|
||||
|
||||
/**
|
||||
* 소유자행위자 목록의 총 개수를 조회합니다.
|
||||
*
|
||||
* @param vo 검색 조건을 담은 VO 객체
|
||||
* @return 조회된 목록의 총 개수
|
||||
*/
|
||||
@Override
|
||||
public int selectListTotalCount(OwnActRegistAndViewVO vo) {
|
||||
return mapper.selectListTotalCount(vo);
|
||||
}
|
||||
|
||||
/**
|
||||
* 소유자행위자 정보를 조회합니다.
|
||||
*
|
||||
* @param vo 조회할 PK 정보(ownrId)를 담은 VO 객체
|
||||
* @return 조회된 소유자행위자 정보
|
||||
*/
|
||||
@Override
|
||||
public OwnActRegistAndViewVO selectOne(OwnActRegistAndViewVO vo) {
|
||||
return mapper.selectOne(vo);
|
||||
}
|
||||
|
||||
/**
|
||||
* 소유자행위자 정보를 등록합니다.
|
||||
*
|
||||
* @param vo 등록할 소유자행위자 정보를 담은 VO 객체
|
||||
* @return 등록된 행의 수
|
||||
*/
|
||||
@Override
|
||||
public int insert(OwnActRegistAndViewVO vo) {
|
||||
log.debug("소유자행위자 등록 - 성명: {}, 주민번호: {}", vo.getFlnm(), vo.getRrno());
|
||||
|
||||
// 필수값 검증
|
||||
validateRequiredFields(vo);
|
||||
|
||||
// 등록자 정보 설정 및 등록 수행
|
||||
vo.setRgtr(SessionUtil.getUserId());
|
||||
int result = mapper.insert(vo);
|
||||
log.debug("소유자행위자 등록 완료 - 등록 건수: {}", result);
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* 단속 정보를 수정합니다.
|
||||
*
|
||||
* @param vo 수정할 단속 정보를 담은 VO 객체
|
||||
* @return 수정된 행의 수
|
||||
*/
|
||||
/*@Override
|
||||
public int update(CrdnRegistAndViewVO vo) {
|
||||
log.debug("단속 수정 - 단속연도: {}, 단속번호: {}", vo.getCrdnYr(), vo.getCrdnNo());
|
||||
|
||||
// PK(단속연도+단속번호) 필수값 검증
|
||||
validatePrimaryKey(vo);
|
||||
|
||||
// 필수값 검증
|
||||
validateRequiredFields(vo);
|
||||
|
||||
// 조사원 바이트 길이 검증 (한글 3바이트 기준 최대 100바이트)
|
||||
if (vo.getExmnr() != null && !vo.getExmnr().trim().isEmpty()) {
|
||||
int byteLength = StringUtil.calculateUtf8ByteLength(vo.getExmnr());
|
||||
if (byteLength > 100) {
|
||||
log.warn("단속 수정 실패 - 조사원 바이트 길이 초과: {}바이트", byteLength);
|
||||
throw new MessageException("조사원명은 최대 100바이트까지 입력 가능합니다. (현재: " + byteLength + "바이트)");
|
||||
}
|
||||
}
|
||||
|
||||
// 비고 바이트 길이 검증 (한글 3바이트 기준 최대 1000바이트)
|
||||
if (vo.getRmrk() != null && !vo.getRmrk().trim().isEmpty()) {
|
||||
int byteLength = StringUtil.calculateUtf8ByteLength(vo.getRmrk());
|
||||
if (byteLength > 1000) {
|
||||
log.warn("단속 수정 실패 - 비고 바이트 길이 초과: {}바이트", byteLength);
|
||||
throw new MessageException("비고는 최대 1000바이트까지 입력 가능합니다. (현재: " + byteLength + "바이트)");
|
||||
}
|
||||
}
|
||||
|
||||
// 수정 수행
|
||||
int result = mapper.update(vo);
|
||||
log.debug("단속 수정 완료 - 수정 건수: {}", result);
|
||||
return result;
|
||||
}*/
|
||||
|
||||
/**
|
||||
* 단속 정보를 삭제합니다. (논리 삭제)
|
||||
*
|
||||
* @param vo 삭제할 PK 정보(crdnYr, crdnNo)를 담은 VO 객체
|
||||
* @return 삭제된 행의 수
|
||||
*/
|
||||
/*@Override
|
||||
public int delete(CrdnRegistAndViewVO vo) {
|
||||
// PK(단속연도+단속번호) 필수값 검증
|
||||
validatePrimaryKey(vo);
|
||||
|
||||
// 삭제자 정보 설정 및 삭제 수행
|
||||
vo.setDltr(SessionUtil.getUserId());
|
||||
return mapper.delete(vo);
|
||||
}*/
|
||||
|
||||
/**
|
||||
* PK(단속연도+단속번호) 중복 체크를 수행합니다.
|
||||
*
|
||||
* @param vo 중복 체크할 PK 정보(crdnYr, crdnNo)를 담은 VO 객체
|
||||
* @return 중복 건수 (0이면 중복 없음, 1이상이면 중복 존재)
|
||||
*/
|
||||
/*@Override
|
||||
public int selectDuplicateCheck(CrdnRegistAndViewVO vo) {
|
||||
return mapper.selectDuplicateCheck(vo);
|
||||
}*/
|
||||
|
||||
/**
|
||||
* PK(단속연도+단속번호) 필수값 검증을 수행한다.
|
||||
* @param vo 검증할 VO 객체
|
||||
* @throws MessageException PK 필수값 누락 시 발생
|
||||
*/
|
||||
/*private void validatePrimaryKey(CrdnRegistAndViewVO vo) {
|
||||
if (vo.getCrdnYr() == null || vo.getCrdnYr().trim().isEmpty()) {
|
||||
log.warn("단속 작업 실패 - 단속연도 미입력");
|
||||
throw new MessageException("단속 연도는 필수값입니다.");
|
||||
}
|
||||
if (vo.getCrdnNo() == null || vo.getCrdnNo().trim().isEmpty()) {
|
||||
log.warn("단속 작업 실패 - 단속번호 미입력");
|
||||
throw new MessageException("단속 번호는 필수값입니다.");
|
||||
}
|
||||
}*/
|
||||
|
||||
/**
|
||||
* 필수값 검증을 수행한다.
|
||||
* @param vo 검증할 VO 객체
|
||||
* @throws MessageException 필수값 누락 시 발생
|
||||
*/
|
||||
private void validateRequiredFields(OwnActRegistAndViewVO vo) {
|
||||
if (vo.getRrno() == null || vo.getRrno().trim().isEmpty()) {
|
||||
log.warn("등록 작업 실패 - 주민번호 미입력");
|
||||
throw new MessageException("주민번호/법인번호는 필수값입니다.");
|
||||
}
|
||||
if (vo.getFlnm() == null || vo.getFlnm().trim().isEmpty()) {
|
||||
log.warn("등록 작업 실패 - 성명 미입력");
|
||||
throw new MessageException("성명은 필수값입니다.");
|
||||
}
|
||||
if (vo.getAddr() == null || vo.getAddr().trim().isEmpty()) {
|
||||
log.warn("등록 작업 실패 - 주소 미입력");
|
||||
throw new MessageException("주소는 필수값입니다.");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 년도별 시퀀스 존재 여부를 확인하고 없으면 생성한다.
|
||||
* @param year 년도 (YYYY 형태)
|
||||
*/
|
||||
/*private void ensureSequenceExists(String year) {
|
||||
String sequenceName = SEQ_CRDN + year;
|
||||
log.debug("년도별 시퀀스 확인 - 시퀀스명: {}", sequenceName);
|
||||
|
||||
try {
|
||||
// 시퀀스 존재 여부 확인 (SHOW CREATE SEQUENCE 실행)
|
||||
String sequenceDefinition = mapper.checkSequenceExists(sequenceName);
|
||||
log.debug("년도별 시퀀스 이미 존재 - 시퀀스명: {}, 정의: {}", sequenceName, sequenceDefinition);
|
||||
} catch (Exception e) {
|
||||
// 시퀀스가 존재하지 않으면 예외 발생 -> 시퀀스 생성
|
||||
log.info("년도별 시퀀스 생성 - 시퀀스명: {} (원인: {})", sequenceName, e.getMessage());
|
||||
mapper.createSequence(sequenceName);
|
||||
log.debug("년도별 시퀀스 생성 완료 - 시퀀스명: {}", sequenceName);
|
||||
}
|
||||
}*/
|
||||
|
||||
/**
|
||||
* 단속 처리 상태를 업데이트합니다.
|
||||
*
|
||||
* @param vo 상태 업데이트할 단속 정보(crdnYr, crdnNo, crdnPrcsSttsCd)를 담은 VO 객체
|
||||
* @return 업데이트된 행의 수
|
||||
*/
|
||||
/*@Override
|
||||
public int updateStatus(CrdnRegistAndViewVO vo) {
|
||||
log.debug("단속 상태 업데이트 - 단속연도: {}, 단속번호: {}, 상태코드: {}", vo.getCrdnYr(), vo.getCrdnNo(), vo.getCrdnPrcsSttsCd());
|
||||
|
||||
// PK(단속연도+단속번호) 필수값 검증
|
||||
validatePrimaryKey(vo);
|
||||
|
||||
// 처리 상태 코드 필수값 검증
|
||||
if (vo.getCrdnPrcsSttsCd() == null || vo.getCrdnPrcsSttsCd().trim().isEmpty()) {
|
||||
log.warn("단속 상태 업데이트 실패 - 처리상태코드 미입력");
|
||||
throw new MessageException("처리 상태 코드는 필수값입니다.");
|
||||
}
|
||||
|
||||
// 단속 처리 일자를 현재 일자로 설정 (yyyyMMdd 형식)
|
||||
vo.setCrdnPrcsYmd(LocalDate.now().toString().replace("-", ""));
|
||||
|
||||
// 상태 업데이트 수행
|
||||
int result = mapper.updateStatus(vo);
|
||||
log.debug("단속 상태 업데이트 완료 - 업데이트 건수: {}", result);
|
||||
return result;
|
||||
}*/
|
||||
}
|
||||
@ -0,0 +1,165 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
|
||||
<mapper namespace="go.kr.project.ownact.ownActRegistAndView.mapper.OwnActRegistAndViewMapper">
|
||||
|
||||
<!-- 단속 목록 조회 -->
|
||||
<select id="selectList" parameterType="OwnActRegistAndViewVO" resultType="OwnActRegistAndViewVO">
|
||||
/* CrdnRegistAndViewMapper.selectList : 단속 목록 조회 */
|
||||
SELECT
|
||||
OWNR_ID,
|
||||
SGG_CD,
|
||||
FLNM,
|
||||
RRNO,
|
||||
OWNR_SE_CD,
|
||||
addr,
|
||||
daddr,
|
||||
LOTNO_WHOL_ADDR,
|
||||
ROAD_NM_WHOL_ADDR,
|
||||
ZIP,
|
||||
LOTNO_ADDR,
|
||||
ROAD_NM_ADDR,
|
||||
REF_ADDR,
|
||||
PBADMS_ZONE_CD,
|
||||
ROAD_NM_CD,
|
||||
LOTNO_MNO,
|
||||
LOTNO_SNO,
|
||||
BLDG_MNO,
|
||||
BLDG_SNO,
|
||||
UDGD_YN_CD,
|
||||
RMRK,
|
||||
REG_DT,
|
||||
RGTR,
|
||||
MDFCN_DT,
|
||||
MDFR,
|
||||
DEL_YN,
|
||||
DEL_DT,
|
||||
DLTR,
|
||||
MTN_YN_CD,
|
||||
TELNO,
|
||||
EML
|
||||
FROM tb_ownr
|
||||
WHERE DEL_YN = 'N'
|
||||
<if test='schFlnm != null and schFlnm != ""'>
|
||||
AND FLNM LIKE CONCAT('%', #{schFlnm}, '%')
|
||||
</if>
|
||||
ORDER BY OWNR_ID DESC
|
||||
<if test='pagingYn != null and pagingYn == "Y"'>
|
||||
limit #{startIndex}, #{perPage} /* 서버사이드 페이징 처리 */
|
||||
</if>
|
||||
</select>
|
||||
|
||||
<!-- 단속 목록 총 개수 조회 -->
|
||||
<select id="selectListTotalCount" parameterType="OwnActRegistAndViewVO" resultType="int">
|
||||
/* CrdnRegistAndViewMapper.selectListTotalCount : 단속 목록 총 개수 조회 */
|
||||
SELECT COUNT(*)
|
||||
FROM tb_ownr
|
||||
WHERE DEL_YN = 'N'
|
||||
<if test='schFlnm != null and schFlnm != ""'>
|
||||
AND FLNM LIKE CONCAT('%', #{schFlnm}, '%')
|
||||
</if>
|
||||
</select>
|
||||
|
||||
<!-- 소유자행위자 단건 조회 -->
|
||||
<select id="selectOne" parameterType="OwnActRegistAndViewVO" resultType="OwnActRegistAndViewVO">
|
||||
/* OwnActRegistAndViewMapper.selectOne : 소유자행위자 단건 조회 */
|
||||
SELECT
|
||||
OWNR_ID,
|
||||
SGG_CD,
|
||||
FLNM,
|
||||
RRNO,
|
||||
OWNR_SE_CD,
|
||||
addr,
|
||||
daddr,
|
||||
LOTNO_WHOL_ADDR,
|
||||
ROAD_NM_WHOL_ADDR,
|
||||
ZIP,
|
||||
LOTNO_ADDR,
|
||||
ROAD_NM_ADDR,
|
||||
REF_ADDR,
|
||||
PBADMS_ZONE_CD,
|
||||
ROAD_NM_CD,
|
||||
LOTNO_MNO,
|
||||
LOTNO_SNO,
|
||||
BLDG_MNO,
|
||||
BLDG_SNO,
|
||||
UDGD_YN_CD,
|
||||
RMRK,
|
||||
REG_DT,
|
||||
RGTR,
|
||||
MDFCN_DT,
|
||||
MDFR,
|
||||
DEL_YN,
|
||||
DEL_DT,
|
||||
DLTR,
|
||||
MTN_YN_CD,
|
||||
TELNO,
|
||||
EML
|
||||
FROM tb_ownr
|
||||
WHERE DEL_YN = 'N'
|
||||
AND OWNR_ID= #{ownrId}
|
||||
</select>
|
||||
|
||||
<!-- 소유자행위자 등록 -->
|
||||
<insert id="insert" parameterType="OwnActRegistAndViewVO">
|
||||
/* OwnActRegistAndViewMapper.insert : 소유자행위자 등록 */
|
||||
INSERT INTO tb_ownr (
|
||||
OWNR_ID,
|
||||
SGG_CD,
|
||||
FLNM,
|
||||
RRNO,
|
||||
OWNR_SE_CD,
|
||||
ADDR,
|
||||
DADDR,
|
||||
ZIP,
|
||||
LOTNO_WHOL_ADDR,
|
||||
ROAD_NM_WHOL_ADDR,
|
||||
LOTNO_ADDR,
|
||||
ROAD_NM_ADDR,
|
||||
REF_ADDR,
|
||||
PBADMS_ZONE_CD,
|
||||
ROAD_NM_CD,
|
||||
LOTNO_MNO,
|
||||
LOTNO_SNO,
|
||||
BLDG_MNO,
|
||||
BLDG_SNO,
|
||||
UDGD_YN_CD,
|
||||
MTN_YN_CD,
|
||||
TELNO,
|
||||
RMRK,
|
||||
EML,
|
||||
REG_DT,
|
||||
RGTR,
|
||||
DEL_YN
|
||||
) VALUES (
|
||||
LPAD(NEXTVAL(seq_owner_id), 10, '0'),
|
||||
#{sggCd},
|
||||
#{flnm},
|
||||
#{rrno},
|
||||
#{ownrSeCd},
|
||||
#{addr},
|
||||
#{daddr},
|
||||
#{zip},
|
||||
#{lotnoWholAddr},
|
||||
#{roadNmWholAddr},
|
||||
#{lotnoAddr},
|
||||
#{roadNmAddr},
|
||||
#{refAddr},
|
||||
#{pbadmsZoneCd},
|
||||
#{roadNmCd},
|
||||
#{lotnoMno},
|
||||
#{lotnoSno},
|
||||
#{bldgMno},
|
||||
#{bldgSno},
|
||||
#{udgdYnCd},
|
||||
#{mtnYnCd},
|
||||
#{telno},
|
||||
#{rmrk},
|
||||
#{eml},
|
||||
NOW(),
|
||||
#{rgtr},
|
||||
'N'
|
||||
)
|
||||
</insert>
|
||||
|
||||
</mapper>
|
||||
@ -0,0 +1,506 @@
|
||||
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
|
||||
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
|
||||
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
|
||||
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
|
||||
<%@ taglib prefix="dateUtil" uri="http://egovframework.go.kr/functions/date-util" %>
|
||||
|
||||
<!-- Main body -->
|
||||
<div class="main_body">
|
||||
<section id="section8" class="main_bars">
|
||||
<div class="bgs-main">
|
||||
<section id="section5">
|
||||
<div class="sub_title"></div>
|
||||
<button type="button" id="registerBtn" class="newbtn bg1">등록</button>
|
||||
<button type="button" id="updaterBtn" class="newbtn bg4">수정</button>
|
||||
</section>
|
||||
</div>
|
||||
</section>
|
||||
<div class="contants_body">
|
||||
<div class="gs_b_top">
|
||||
<ul class="lef">
|
||||
<li class="th">조회 조건</li>
|
||||
<li>
|
||||
<input type="text" id="schFlnm" name="schFlnm" maxlength="6" class="input" style="width: 100px;" autocomplete="off"/>
|
||||
</li>
|
||||
</ul>
|
||||
<ul class="rig2">
|
||||
<li><button type="button" id="search_btn" class="newbtnss bg1">검색</button></li>
|
||||
<li><button type="button" id="reset_btn" class="newbtnss bg5" style="margin-left: 5px;">초기화</button></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="gs_booking">
|
||||
<div class="row">
|
||||
<div class="col-sm-12">
|
||||
<div class="box_column">
|
||||
<ul class="box_title" style="display: flex; justify-content: space-between; align-items: center;">
|
||||
<li class="tit">소유자·행위자 목록</li>
|
||||
<li class="rig">
|
||||
<span id="totalCount" class="total-count" style="padding-left: 25px;padding-right: 25px;">총 0건</span>
|
||||
<select id="perPageSelect" class="input" style="width: 112px; ">
|
||||
<option value="15">페이지당 15</option>
|
||||
<option value="50">페이지당 50</option>
|
||||
<option value="100">페이지당 100</option>
|
||||
</select>
|
||||
<span class="page_number"><span id="currentPage"></span><span class="bar">/</span><span id="totalPages"></span> Pages</span>
|
||||
</li>
|
||||
</ul>
|
||||
<div class="containers">
|
||||
<div id="grid"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- /Main body -->
|
||||
|
||||
<script type="text/javascript">
|
||||
|
||||
/**
|
||||
* 소유자행위자 등록/조회 목록 관리 모듈
|
||||
* 소유자행위자 목록을 조회하고 관리하는 기능을 제공합니다.
|
||||
*/
|
||||
(function(window, $) {
|
||||
'use strict';
|
||||
|
||||
var SEARCH_COND = {};
|
||||
|
||||
// 페이징 정보를 저장할 전역 변수
|
||||
var GRID_PAGINATION_INFO = {
|
||||
totalCount: 0,
|
||||
page: 0,
|
||||
perPage: 0
|
||||
};
|
||||
|
||||
// 검색정보 설정
|
||||
var setSearchCond = function() {
|
||||
var schFlnm = $.trim(nvl($("#schFlnm").val(), ""));
|
||||
|
||||
SEARCH_COND.schFlnm = schFlnm;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* 소유자행위자 목록 관리 네임스페이스
|
||||
*/
|
||||
var OwnActRegistAndViewList = {
|
||||
/**
|
||||
* 선택된 행 정보
|
||||
*/
|
||||
selectedRow: null,
|
||||
|
||||
/**
|
||||
* 그리드 관련 객체
|
||||
*/
|
||||
grid: {
|
||||
/**
|
||||
* 그리드 인스턴스
|
||||
*/
|
||||
instance: null,
|
||||
|
||||
/**
|
||||
* 그리드 설정 초기화
|
||||
* @returns {Object} 그리드 설정 객체
|
||||
*/
|
||||
initConfig: function() {
|
||||
// 데이터 소스 설정
|
||||
var dataSource = this.createDataSource();
|
||||
|
||||
// 현재 선택된 perPage 값 가져오기
|
||||
var perPage = parseInt($('#perPageSelect').val() || 15, 10);
|
||||
|
||||
// 그리드 설정 객체 생성
|
||||
var gridConfig = new XitTuiGridConfig();
|
||||
|
||||
// 기본 설정
|
||||
gridConfig.setOptDataSource(dataSource); // 데이터소스 연결
|
||||
gridConfig.setOptGridId('grid'); // 그리드를 출력할 Element ID
|
||||
gridConfig.setOptGridHeight(470); // 그리드 높이(단위: px)
|
||||
gridConfig.setOptRowHeight(30); // 그리드 행 높이(단위: px)
|
||||
gridConfig.setOptRowHeaderType(''); // 행 첫번째 셀 타입 비활성화 (라디오 버튼을 컬럼으로 구현)
|
||||
gridConfig.setOptUseClientSort(false); // 서버사이드 정렬 false
|
||||
|
||||
// 페이징 옵션 설정
|
||||
gridConfig.setOptPageOptions({
|
||||
useClient: false, // 클라이언트 페이징 여부(false: 서버 페이징)
|
||||
perPage: perPage // 페이지당 표시 건수
|
||||
});
|
||||
gridConfig.setOptColumns(this.getGridColumns());
|
||||
|
||||
return gridConfig;
|
||||
},
|
||||
|
||||
/**
|
||||
* 그리드 컬럼 정의
|
||||
* @returns {Array} 그리드 컬럼 배열
|
||||
*/
|
||||
getGridColumns: function() {
|
||||
var self = this;
|
||||
return [
|
||||
{
|
||||
header: '선택',
|
||||
name: '_radio',
|
||||
align: 'center',
|
||||
width: 50,
|
||||
sortable: false,
|
||||
renderer: {
|
||||
type: XitRadioRenderer,
|
||||
options: {
|
||||
radioName: 'gridRowRadio',
|
||||
targetObject: 'OwnActRegistAndViewList',
|
||||
selectedRowProperty: 'selectedRow'
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
header: '번호',
|
||||
name: '_rowNum',
|
||||
align: 'center',
|
||||
width: 60,
|
||||
sortable: false,
|
||||
formatter: function(e) {
|
||||
// 서버사이드 페이징에서 역순 번호 계산
|
||||
// totalCount - (현재페이지-1) * 페이지당항목수 - 현재행인덱스
|
||||
var totalCount = GRID_PAGINATION_INFO.totalCount;
|
||||
var page = GRID_PAGINATION_INFO.page;
|
||||
var perPage = GRID_PAGINATION_INFO.perPage;
|
||||
var rowIndex = e.row.rowKey;
|
||||
return totalCount - (page - 1) * perPage - rowIndex;
|
||||
}
|
||||
},
|
||||
{
|
||||
header: '구분',
|
||||
name: 'ownrSeCd',
|
||||
align: 'center',
|
||||
width: 80,
|
||||
sortingType: 'desc',
|
||||
sortable: true,
|
||||
formatter: function(e) {
|
||||
return e.value === '1' ? '개인' : '단체';
|
||||
}
|
||||
},
|
||||
{
|
||||
header: '주민·사업번호',
|
||||
name: 'rrno',
|
||||
align: 'center',
|
||||
width: 90,
|
||||
sortable: false
|
||||
},
|
||||
{
|
||||
header: '성명',
|
||||
name: 'flnm',
|
||||
align: 'center',
|
||||
width: 100
|
||||
},
|
||||
{
|
||||
header: '주소',
|
||||
name: 'addr',
|
||||
align: 'center',
|
||||
width: 120
|
||||
},
|
||||
{
|
||||
header: '상세주소',
|
||||
name: 'daddr',
|
||||
align: 'center',
|
||||
width: 100
|
||||
},
|
||||
{
|
||||
header: '우편번호',
|
||||
name: 'zip',
|
||||
align: 'center',
|
||||
width: 100
|
||||
},
|
||||
{
|
||||
header: '전화번호',
|
||||
name: 'telno',
|
||||
align: 'center',
|
||||
width: 100
|
||||
},
|
||||
{
|
||||
header: '메일',
|
||||
name: 'eml',
|
||||
align: 'center',
|
||||
width: 100
|
||||
},
|
||||
{
|
||||
header: '등록일시',
|
||||
name: 'regDt',
|
||||
align: 'center',
|
||||
width: 150
|
||||
},
|
||||
{
|
||||
header: '수정일시',
|
||||
name: 'mdfcnDt',
|
||||
align: 'center',
|
||||
width: 100
|
||||
}
|
||||
];
|
||||
},
|
||||
|
||||
/**
|
||||
* 데이터 소스 생성
|
||||
* @returns {Object} 데이터 소스 설정 객체
|
||||
*/
|
||||
createDataSource: function() {
|
||||
return {
|
||||
api: {
|
||||
readData: {
|
||||
url: '<c:url value="/ownact/ownActRegistAndView/list.ajax"/>',
|
||||
method: 'POST',
|
||||
contentType: 'application/x-www-form-urlencoded',
|
||||
processData: true
|
||||
}
|
||||
},
|
||||
initialRequest: false, // 초기 데이터 요청 여부
|
||||
serializer: function(params) {
|
||||
setSearchCond();
|
||||
SEARCH_COND.perPage = params.perPage;
|
||||
SEARCH_COND.page = params.page;
|
||||
return $.param(SEARCH_COND);
|
||||
}
|
||||
};
|
||||
},
|
||||
|
||||
/**
|
||||
* 그리드 인스턴스 생성
|
||||
*/
|
||||
create: function() {
|
||||
var gridConfig = this.initConfig();
|
||||
var Grid = tui.Grid;
|
||||
this.instance = gridConfig.instance(Grid);
|
||||
|
||||
// 그리드 테마 설정
|
||||
Grid.applyTheme('striped');
|
||||
|
||||
this.gridBindEvents();
|
||||
},
|
||||
|
||||
/**
|
||||
* 그리드 이벤트 바인딩
|
||||
*/
|
||||
gridBindEvents: function() {
|
||||
var self = this;
|
||||
|
||||
// 데이터 로딩 완료 이벤트 - 라디오 버튼 초기화
|
||||
this.instance.on('successResponse', function(ev) {
|
||||
var responseObj = JSON.parse(ev.xhr.response);
|
||||
if( responseObj ){
|
||||
$("#currentPage").text(responseObj.data.pagination.page);
|
||||
$("#totalPages").text(responseObj.data.pagination.totalPages);
|
||||
var totalCount = responseObj.data.pagination.totalCount;
|
||||
$("#totalCount").text('총 ' + totalCount.toLocaleString() + '건');
|
||||
|
||||
// 페이징 정보를 전역 변수에 저장 (formatter에서 사용하기 위해)
|
||||
GRID_PAGINATION_INFO.totalCount = responseObj.data.pagination.totalCount;
|
||||
GRID_PAGINATION_INFO.page = responseObj.data.pagination.page;
|
||||
GRID_PAGINATION_INFO.perPage = responseObj.data.pagination.perPage;
|
||||
}
|
||||
|
||||
// 라디오 버튼 모두 해제
|
||||
document.querySelectorAll('input[name="gridRowRadio"]').forEach(function(radio) {
|
||||
radio.checked = false;
|
||||
});
|
||||
// 선택된 행 초기화
|
||||
OwnActRegistAndViewList.selectedRow = null;
|
||||
});
|
||||
|
||||
// 행 선택 이벤트
|
||||
this.instance.on('selection', function(ev) {
|
||||
if (ev.range && ev.range.row && ev.range.row.length > 0) {
|
||||
var rowKey = ev.range.row[0];
|
||||
OwnActRegistAndViewList.selectedRow = self.instance.getRow(rowKey);
|
||||
|
||||
// XitRadioRenderer 동기화 함수 사용
|
||||
XitRadioRenderer.syncRadioSelection(rowKey, 'gridRowRadio');
|
||||
}
|
||||
});
|
||||
|
||||
// 행 클릭 이벤트 - 라디오 버튼 즉시 체크를 위해 추가
|
||||
this.instance.on('click', function(ev) {
|
||||
if (ev.rowKey !== undefined && ev.rowKey !== null) {
|
||||
OwnActRegistAndViewList.selectedRow = self.instance.getRow(ev.rowKey);
|
||||
|
||||
// XitRadioRenderer 동기화 함수 사용
|
||||
XitRadioRenderer.syncRadioSelection(ev.rowKey, 'gridRowRadio');
|
||||
}
|
||||
});
|
||||
|
||||
// 행 더블클릭 이벤트 - detailView 페이지를 새 탭으로 열기
|
||||
this.instance.on('dblclick', function(ev) {
|
||||
var rowKey = ev.rowKey;
|
||||
var rowData = self.instance.getRow(rowKey);
|
||||
if (rowData) {
|
||||
var paramCond = Object.assign({}, SEARCH_COND);
|
||||
paramCond.ownrId = rowData.ownrId;
|
||||
|
||||
// 새 탭으로 열기 - 컨트롤러가 요구하는 파라미터명으로 전달 (ownrId)
|
||||
var detailUrl = buildUrlWithParamCondAndMultipleKeys(null, {"ownrId": rowData.ownrId}, "<c:url value="/ownact/ownActRegistAndView/ownActRegistPopup.do"/>");
|
||||
window.open(detailUrl, 'ownActRegistAndView');
|
||||
}
|
||||
});
|
||||
|
||||
},
|
||||
|
||||
},
|
||||
|
||||
/**
|
||||
* 팝업 관련 기능
|
||||
*/
|
||||
openRegisterPopup: function() {
|
||||
window.open('<c:url value="/ownact/ownActRegistAndView/ownActRegistPopup.do"/>?mode=C', 'ownActRegistAndViewReg', 'width=600,height=600,scrollbars=yes');
|
||||
},
|
||||
|
||||
openViewPopup: function(ownrId) {
|
||||
var url = '<c:url value="/ownact/ownActRegistAndView/ownActRegistPopup.do"/>?mode=V&ownrId=' +
|
||||
encodeURIComponent(ownrId);
|
||||
window.open(url, 'ownActRegistAndViewView', 'width=800,height=700,scrollbars=yes');
|
||||
},
|
||||
|
||||
/**
|
||||
* 목록 새로고침
|
||||
*/
|
||||
refreshList: function() {
|
||||
if (this.grid.instance) {
|
||||
this.grid.instance.readData(GRID_PAGINATION_INFO.page);
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* 단속 상태를 업데이트합니다.
|
||||
* 선택된 행이 있을 때만 상태를 업데이트합니다.
|
||||
*
|
||||
* @param statusCode 변경할 상태 코드
|
||||
* @param statusName 상태명 (확인 메시지용)
|
||||
*/
|
||||
updateStatus: function(statusCode, statusName) {
|
||||
var self = this;
|
||||
|
||||
// 선택된 행 확인
|
||||
if (!this.selectedRow) {
|
||||
alert('상태를 변경할 단속 건을 선택해주세요.');
|
||||
return;
|
||||
}
|
||||
|
||||
var crdnYr = this.selectedRow.crdnYr;
|
||||
var crdnNo = this.selectedRow.crdnNo;
|
||||
|
||||
// 확인 메시지
|
||||
if (!confirm(crdnYr + '-' + crdnNo + ' 단속 건의 상태를 [' + statusName + ']으로 변경하시겠습니까?')) {
|
||||
return;
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
/**
|
||||
* 이벤트 핸들러 설정
|
||||
*/
|
||||
eventBindEvents: function() {
|
||||
var self = this;
|
||||
|
||||
// 검색 버튼 클릭 이벤트
|
||||
$("#search_btn").on('click', function() {
|
||||
self.grid.instance.readData(1);
|
||||
});
|
||||
|
||||
// 초기화 버튼 클릭 이벤트
|
||||
$("#reset_btn").on('click', function() {
|
||||
// 모든 검색 조건 초기화
|
||||
$("#schFlnm").val("");
|
||||
|
||||
// 그리드 데이터 새로고침
|
||||
self.grid.instance.readData(1);
|
||||
});
|
||||
|
||||
// 등록 버튼 클릭 이벤트
|
||||
$("#registerBtn").on('click', function() {
|
||||
self.openRegisterPopup();
|
||||
});
|
||||
|
||||
// 수정 버튼 클릭 이벤트
|
||||
$("#updaterBtn").on('click', function() {
|
||||
// 선택된 행 확인
|
||||
if (!self.selectedRow) {
|
||||
alert('수정할 단속 건을 선택해주세요.');
|
||||
return;
|
||||
}
|
||||
|
||||
// 선택된 행의 데이터로 팝업 열기
|
||||
self.openViewPopup(self.selectedRow.ownrId);
|
||||
});
|
||||
|
||||
// 상태 업데이트 버튼 클릭 이벤트들
|
||||
$("#btnDsps").on('click', function() {
|
||||
self.updateStatus('20', '처분사전');
|
||||
});
|
||||
|
||||
$("#btnCrcCmd").on('click', function() {
|
||||
self.updateStatus('30', '시정명령');
|
||||
});
|
||||
|
||||
$("#btnCrcUrg").on('click', function() {
|
||||
self.updateStatus('40', '시정촉구');
|
||||
});
|
||||
|
||||
$("#btnLevyPrvntc").on('click', function() {
|
||||
self.updateStatus('50', '부과예고');
|
||||
});
|
||||
|
||||
$("#btnLevy").on('click', function() {
|
||||
self.updateStatus('60', '부과');
|
||||
});
|
||||
|
||||
$("#btnPayUrg").on('click', function() {
|
||||
self.updateStatus('70', '납부촉구');
|
||||
});
|
||||
|
||||
// 엔터키 검색
|
||||
$(".gs_b_top input").on('keypress', function(e) {
|
||||
if (e.which === 13) {
|
||||
e.preventDefault();
|
||||
$("#search_btn").trigger('click');
|
||||
}
|
||||
});
|
||||
|
||||
// perPage 변경 이벤트 추가
|
||||
$('#perPageSelect').on('change', function() {
|
||||
var perPage = parseInt($(this).val(), 10);
|
||||
self.grid.instance.setPerPage(perPage);
|
||||
|
||||
// 라디오 버튼 모두 해제
|
||||
document.querySelectorAll('input[name="gridRowRadio"]').forEach(function(radio) {
|
||||
radio.checked = false;
|
||||
});
|
||||
// 선택된 행 초기화
|
||||
self.selectedRow = null;
|
||||
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* 모듈 초기화
|
||||
*/
|
||||
init: function() {
|
||||
|
||||
// 그리드 생성
|
||||
this.grid.create();
|
||||
|
||||
// 이벤트 핸들러 설정
|
||||
this.eventBindEvents();
|
||||
|
||||
this.grid.instance.readData(${param.page eq null or param.page eq 0 ? 1 : param.page});
|
||||
}
|
||||
};
|
||||
|
||||
// 팝업 콜백 함수 (팝업에서 호출)
|
||||
window.refreshOwnActList = function() {
|
||||
OwnActRegistAndViewList.refreshList();
|
||||
};
|
||||
|
||||
// DOM 준비 완료 시 초기화
|
||||
$(document).ready(function() {
|
||||
OwnActRegistAndViewList.init();
|
||||
});
|
||||
|
||||
})(window, jQuery);
|
||||
</script>
|
||||
@ -0,0 +1,412 @@
|
||||
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
|
||||
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
|
||||
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
|
||||
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
|
||||
<%@ taglib prefix="dateUtil" uri="http://egovframework.go.kr/functions/date-util" %>
|
||||
|
||||
<div class="popup_wrap">
|
||||
<div class="popup_inner">
|
||||
<div class="popup_tit">
|
||||
<h2 class="tit">소유자·행위자 관리</h2>
|
||||
<a href="#" class="pop-x-btn modalclose"></a>
|
||||
</div>
|
||||
<div class="popup_con">
|
||||
<div class="forms_table_non">
|
||||
<form id="ownActForm" name="ownActForm">
|
||||
<input type="hidden" id="mode" name="mode" value="${param.mode}" />
|
||||
<table>
|
||||
<colgroup>
|
||||
<col style="width: 20%;" />
|
||||
<col style="width: 30%;" />
|
||||
<col style="width: 20%;" />
|
||||
<col style="width: 30%;"/>
|
||||
</colgroup>
|
||||
<tr>
|
||||
<th class="th"><span class="required">*</span> 구분</th>
|
||||
<td colspan="3">
|
||||
<select id="ownrSeCd" name="ownrSeCd" class="input" validation-check="required">
|
||||
<option value="">선택하세요</option>
|
||||
<option value="1">미상</option>
|
||||
<option value="2" selected>개인</option>
|
||||
<option value="3">법인</option>
|
||||
</select>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th class="th"><span class="required">*</span> 주민번호/법인번호</th>
|
||||
<td colspan="3">
|
||||
<input type="text" id="rrno" name="rrno" class="input"
|
||||
value="${data.rrno}" maxlength="100" />
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th class="th"><span class="required">*</span> 성명</th>
|
||||
<td colspan="3">
|
||||
<input type="text" id="flnm" name="flnm" class="input"
|
||||
value="${data.flnm}" maxlength="100" />
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th class="th"><span class="required">*</span> 주소</th>
|
||||
<td colspan="3">
|
||||
<input type="text" id="addr" name="addr" class="input"
|
||||
value="${data.addr}" maxlength="100"/>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th class="th">상세 주소</th>
|
||||
<td colspan="3">
|
||||
<input type="text" id="daddr" name="daddr" class="input"
|
||||
value="${data.daddr}" maxlength="100"/>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th class="th"><span class="required">*</span> 우편번호</th>
|
||||
<td colspan="3">
|
||||
<input type="text" id="zip" name="zip" class="input" maxlength="6" style="width: 120px;" validation-check="required" value="${data.zip}" />
|
||||
<button class="newbtn bg1 smallb-2" type="button" onclick="searchZipCode();">주소 찾기</button>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th class="th"><span class="required">*</span> 전화번호</th>
|
||||
<td colspan="3">
|
||||
<input type="text" id="telno" name="telno" class="input"
|
||||
value="${data.telno}" maxlength="100"/>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th class="th"><span class="required">*</span> 메일주소</th>
|
||||
<td colspan="3">
|
||||
<input type="text" id="eml" name="eml" class="input"
|
||||
value="${data.eml}" maxlength="100"/>
|
||||
</td>
|
||||
</tr>
|
||||
<%--<tr>
|
||||
<th class="th">비고</th>
|
||||
<td colspan="3">
|
||||
<textarea id="rmrk" name="rmrk" class="textarea" rows="3" maxlength="1000" style="width: 100%;">${data.rmrk}</textarea>
|
||||
</td>
|
||||
</tr>--%>
|
||||
<tr style="display: none;">
|
||||
<th class="th"><span class="required">*</span> 지번 주소</th>
|
||||
<td colspan="3">
|
||||
<input type="text" id="lotnoAddr" name="lotnoAddr" class="input" style="width: 450px;" maxlength="320" readonly validation-check="required" value="${data.lotnoAddr}"/>
|
||||
<input type="text" id="lotnoMno" name="lotnoMno" class="input" style="width: 120px;" maxlength="4" readonly value="${data.lotnoMno}"/>
|
||||
<input type="text" id="lotnoSno" name="lotnoSno" class="input" style="width: 120px;" maxlength="4" readonly value="${data.lotnoSno}"/>
|
||||
</td>
|
||||
</tr>
|
||||
<tr style="display: none;">
|
||||
<th class="th"><span class="required">*</span> 도로명 주소</th>
|
||||
<td colspan="3">
|
||||
<input type="text" id="roadNmAddr" name="roadNmAddr" class="input" style="width: 450px;" maxlength="320" readonly validation-check="required" value="${data.roadNmAddr}"/>
|
||||
<input type="text" id="bldgMno" name="bldgMno" class="input" style="width: 120px;" maxlength="4" readonly value="${data.bldgMno}"/>
|
||||
<input type="text" id="bldgSno" name="bldgSno" class="input" style="width: 120px;" maxlength="4" readonly value="${data.bldgSno}"/>
|
||||
</td>
|
||||
</tr>
|
||||
<!-- 중요로직: sggCd(시군구 코드는 세션에서 서버가 설정) -->
|
||||
<tr style="display: none;">
|
||||
<th class="th"><span class="required">*</span> 행정구역코드</th>
|
||||
<td colspan="3">
|
||||
<input type="text" id="pbadmsZoneCd" name="pbadmsZoneCd" class="input" maxlength="10" style="width: 180px;" placeholder="예) 4128700000" readonly value="${data.pbadmsZoneCd}"/>
|
||||
</td>
|
||||
</tr>
|
||||
<tr style="display: none;">
|
||||
<th class="th">지번 전체주소</th>
|
||||
<td colspan="3">
|
||||
<input type="text" id="lotnoWholAddr" name="lotnoWholAddr" class="input" maxlength="2000" readonly value="${data.lotnoWholAddr}"/>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<tr style="display: none;">
|
||||
<th class="th">도로명 전체주소</th>
|
||||
<td colspan="3">
|
||||
<input type="text" id="roadNmWholAddr" name="roadNmWholAddr" class="input" maxlength="2000" readonly value="${data.roadNmWholAddr}"/>
|
||||
</td>
|
||||
</tr>
|
||||
<tr style="display: none;">
|
||||
<th class="th">참고 주소</th>
|
||||
<td>
|
||||
<input type="text" id="refAddr" name="refAddr" class="input" maxlength="320" readonly value="${data.refAddr}"/>
|
||||
</td>
|
||||
<th class="th">도로명 코드</th>
|
||||
<td>
|
||||
<input type="text" id="roadNmCd" name="roadNmCd" class="input" style="width: 180px;" maxlength="12" readonly value="${data.roadNmCd}"/>
|
||||
</td>
|
||||
</tr>
|
||||
<tr style="display: none;">
|
||||
<th class="th">지하 여부</th>
|
||||
<td>
|
||||
<select id="udgdYnCd" name="udgdYnCd" class="input" style="width: 120px;">
|
||||
<option value="">선택</option>
|
||||
<option value="Y" <c:if test="${data.udgdYnCd eq 'Y'}">selected</c:if>>Y</option>
|
||||
<option value="N" <c:if test="${data.udgdYnCd eq 'N'}">selected</c:if>>N</option>
|
||||
</select>
|
||||
</td>
|
||||
<th class="th">산 여부</th>
|
||||
<td>
|
||||
<select id="mtnYnCd" name="mtnYnCd" class="input" style="width: 120px;">
|
||||
<option value="">선택</option>
|
||||
<option value="Y" <c:if test="${data.mtnYnCd eq 'Y'}">selected</c:if>>Y</option>
|
||||
<option value="N" <c:if test="${data.mtnYnCd eq 'N'}">selected</c:if>>N</option>
|
||||
</select>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
<div class="popup_foot">
|
||||
<c:choose>
|
||||
<c:when test="${param.mode eq 'V'}">
|
||||
<a href="#" id="btnDelete" class="newbtns bg2">삭제</a>
|
||||
<a href="#" id="btnSave" class="newbtns bg4">수정</a>
|
||||
</c:when>
|
||||
<c:otherwise>
|
||||
<a href="#" id="btnSave" class="newbtns bg4">저장</a>
|
||||
</c:otherwise>
|
||||
</c:choose>
|
||||
<a href="#" class="newbtns bg1 modalclose">닫기</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
(function($) {
|
||||
'use strict';
|
||||
|
||||
var ownActPopup = {
|
||||
// 자식 팝업창 참조 저장 배열
|
||||
childPopups: [],
|
||||
|
||||
init: function() {
|
||||
this.bindEvents();
|
||||
},
|
||||
|
||||
bindEvents: function() {
|
||||
var self = this;
|
||||
|
||||
$("#btnSave").on('click', function() {
|
||||
self.save();
|
||||
});
|
||||
|
||||
$("#btnDelete").on('click', function() {
|
||||
self.delete();
|
||||
});
|
||||
|
||||
// 닫기 버튼
|
||||
$('.modalclose').on('click', function(e) {
|
||||
e.preventDefault();
|
||||
self.cancel();
|
||||
});
|
||||
|
||||
},
|
||||
|
||||
cancel: function() {
|
||||
// 공통 함수를 사용하여 자식 팝업창들을 닫고 현재 창 닫기
|
||||
this.childPopups = closeChildPopupsAndSelf(this.childPopups);
|
||||
},
|
||||
|
||||
save: function() {
|
||||
if (!this.validate()) return;
|
||||
|
||||
// 중요로직: 저장 전 최종적으로 전체주소 재조합
|
||||
updateWholeAddress();
|
||||
|
||||
var mode = $("#mode").val();
|
||||
var url = mode === 'C' ? '/ownact/ownActRegistAndView/insert.ajax' : '/ownact/ownActRegistAndView/update.ajax';
|
||||
var data = $("#ownActForm").serialize();
|
||||
|
||||
$.ajax({
|
||||
url: url,
|
||||
type: 'POST',
|
||||
data: data,
|
||||
success: function(response) {
|
||||
if (response.success) {
|
||||
alert(response.message || '처리되었습니다.');
|
||||
if (window.opener && window.opener.refreshOwnActList) {
|
||||
window.opener.refreshOwnActList();
|
||||
}
|
||||
window.close();
|
||||
} else {
|
||||
alert(response.message || '처리 중 오류가 발생했습니다.');
|
||||
}
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
delete: function() {
|
||||
if (!confirm('정말 삭제하시겠습니까?')) return;
|
||||
|
||||
var crdnYr = $("#crdnYr").val();
|
||||
var crdnNo = $("#crdnNo").val();
|
||||
|
||||
$.ajax({
|
||||
url: '/crdn/crndRegistAndView/delete.ajax',
|
||||
type: 'POST',
|
||||
data: { crdnYr: crdnYr, crdnNo: crdnNo },
|
||||
success: function(response) {
|
||||
if (response.success) {
|
||||
alert(response.message || '삭제되었습니다.');
|
||||
if (window.opener && window.opener.refreshOwnActList) {
|
||||
window.opener.refreshOwnActList();
|
||||
}
|
||||
window.close();
|
||||
} else {
|
||||
alert(response.message || '삭제 중 오류가 발생했습니다.');
|
||||
}
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* 폼 유효성 검증
|
||||
* baseData/bldgNewPrcCrtrAmt/popup.jsp 패턴과 동일하게 적용
|
||||
* @returns {boolean} 유효성 검증 결과
|
||||
*/
|
||||
validate: function() {
|
||||
// 기본 validation-check 속성 기반 검증
|
||||
var isValid = validateFormByAttributes('ownActForm');
|
||||
|
||||
if (isValid) {
|
||||
// 주민번호 검증
|
||||
if (!$.trim($('#rrno').val())) {
|
||||
var rrnoElement = document.getElementById('rrno');
|
||||
errorElementCreate(rrnoElement, '주민번호를 입력하세요.', false);
|
||||
$('#rrno').focus();
|
||||
return false;
|
||||
}
|
||||
|
||||
// 성명 검증
|
||||
if (!$.trim($('#flnm').val())) {
|
||||
var flnmElement = document.getElementById('flnm');
|
||||
errorElementCreate(flnmElement, '성명을 입력하세요.', false);
|
||||
$('#flnm').focus();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return isValid;
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* 우편번호 검색 팝업 호출
|
||||
* - 법정동이 선택된 경우 해당 동 이름을 검색어로 전달
|
||||
*/
|
||||
function searchZipCode() {
|
||||
var popUrl = '<c:url value="/common/address/search.do"/>';
|
||||
var params = '?callback=searchZipCodeCallback';
|
||||
|
||||
// 중요로직: 법정동이 선택된 경우 동 이름을 검색어로 전달
|
||||
var selectedEmd = $('#stdgEmdCd').val();
|
||||
if (selectedEmd) {
|
||||
var selectedEmdText = $('#stdgEmdCd option:selected').text();
|
||||
if (selectedEmdText && selectedEmdText !== '선택하세요') {
|
||||
params += '&keyword=' + encodeURIComponent(selectedEmdText);
|
||||
}
|
||||
}
|
||||
|
||||
popUrl += params;
|
||||
var popTitle = "주소 찾기";
|
||||
var popOption = "width=570px, height=530px, resizable=yes, scrollbars=yes, location=no, top=100px, left=100px";
|
||||
window.open(popUrl, popTitle, popOption);
|
||||
}
|
||||
|
||||
/**
|
||||
* 주소 검색 콜백 함수
|
||||
* - 주소 검색 팝업의 검색결과를 전달 받아 해당 필드에 설정
|
||||
* @param {Object} obj - 주소 검색 결과 객체
|
||||
*/
|
||||
function searchZipCodeCallback(obj) {
|
||||
// 중요로직: 우편번호와 기본 주소 정보 설정
|
||||
$("#zip").val(obj.zipNo || ""); // 우편번호
|
||||
$("#roadNmAddr").val(obj.roadAddrPart1 || ""); // 도로명 주소 (참고항목 제외)
|
||||
$("#addr").val(obj.roadAddrPart1 || ""); // 도로명 주소 (addr)
|
||||
$("#lotnoAddr").val(obj.jibunAddr || ""); // 지번 주소
|
||||
$("#daddr").val(obj.roadAddrPart2 || ""); // 상세주소는 사용자가 직접 입력
|
||||
|
||||
// 중요로직: 전체주소는 초기에는 기본주소만 설정 (상세주소 입력 후 동적으로 결합)
|
||||
$("#roadNmWholAddr").val(obj.roadAddrPart1 || ""); // 도로명 전체주소 (초기값: 도로명주소만)
|
||||
$("#lotnoWholAddr").val(obj.jibunAddr || ""); // 지번 전체주소 (초기값: 지번주소만)
|
||||
$("#refAddr").val(obj.roadAddrPart2 || ""); // 참고 주소 (도로명주소 참고항목)
|
||||
$("#roadNmCd").val(obj.rnMgtSn || ""); // 도로명 코드
|
||||
$("#pbadmsZoneCd").val(obj.admCd || ""); // 행정구역코드
|
||||
|
||||
// 중요로직: 지번 관련 정보 설정
|
||||
$("#lotnoMno").val(obj.lnbrMnnm || ""); // 지번 본번
|
||||
$("#lotnoSno").val(obj.lnbrSlno || ""); // 지번 부번
|
||||
$("#bldgMno").val(obj.buldMnnm || ""); // 건물 본번
|
||||
$("#bldgSno").val(obj.buldSlno || ""); // 건물 부번
|
||||
|
||||
// 중요로직: Y/N 코드 설정 (지하여부, 산여부)
|
||||
$("#udgdYnCd").val(obj.udrtYn === "1" ? "Y" : "N"); // 지하여부 (1:지하, 0:지상)
|
||||
$("#mtnYnCd").val(obj.mtYn === "1" ? "Y" : "N"); // 산여부 (1:산, 0:대지)
|
||||
|
||||
// 중요로직: 법정동 자동 선택 - 주소 검색 결과의 읍면동명과 매칭되는 옵션 찾아서 선택
|
||||
if (obj.emdNm) {
|
||||
var emdName = obj.emdNm.trim(); // 읍면동명
|
||||
var $stdgEmdCd = $("#stdgEmdCd");
|
||||
var found = false;
|
||||
|
||||
// selectbox의 각 옵션을 순회하면서 매칭되는 항목 찾기
|
||||
$stdgEmdCd.find('option').each(function() {
|
||||
var optionText = $(this).text().trim();
|
||||
var optionValue = $(this).val();
|
||||
|
||||
// 빈 값이 아니고, 옵션 텍스트가 읍면동명과 일치하는 경우
|
||||
if (optionValue && (optionText === emdName || optionText.indexOf(emdName) !== -1)) {
|
||||
$stdgEmdCd.val(optionValue);
|
||||
found = true;
|
||||
return false; // each 루프 종료
|
||||
}
|
||||
});
|
||||
|
||||
// 매칭되지 않은 경우 콘솔에 정보 출력 (디버깅용)
|
||||
if (!found) {
|
||||
console.info('[법정동 자동 선택] 매칭되는 법정동을 찾을 수 없습니다. 검색된 읍면동명:', emdName);
|
||||
}
|
||||
}
|
||||
|
||||
// 상세주소 입력 필드에 포커스
|
||||
$("#daddr").focus();
|
||||
}
|
||||
|
||||
/**
|
||||
* 전체주소 업데이트 함수
|
||||
* - 기본주소 + 상세주소를 결합하여 전체주소 필드를 업데이트
|
||||
*/
|
||||
function updateWholeAddress() {
|
||||
var roadNmAddr = $("#roadNmAddr").val() || ""; // 도로명 주소
|
||||
var lotnoAddr = $("#lotnoAddr").val() || ""; // 지번 주소
|
||||
var daddr = $("#daddr").val() || ""; // 상세주소
|
||||
|
||||
// 중요로직: 도로명 전체주소 = 도로명 주소 + 상세주소
|
||||
var roadNmWholAddr = roadNmAddr;
|
||||
if (daddr.trim() !== "") {
|
||||
roadNmWholAddr = roadNmAddr + " " + daddr.trim();
|
||||
}
|
||||
$("#roadNmWholAddr").val(roadNmWholAddr);
|
||||
|
||||
// 중요로직: 지번 전체주소 = 지번 주소 + 상세주소
|
||||
var lotnoWholAddr = lotnoAddr;
|
||||
if (daddr.trim() !== "") {
|
||||
lotnoWholAddr = lotnoAddr + " " + daddr.trim();
|
||||
}
|
||||
$("#lotnoWholAddr").val(lotnoWholAddr);
|
||||
}
|
||||
|
||||
$(document).ready(function() {
|
||||
ownActPopup.init();
|
||||
|
||||
// 중요로직: 상세주소 입력 시 실시간으로 전체주소 업데이트
|
||||
$('#daddr').on('input keyup blur', function() {
|
||||
updateWholeAddress();
|
||||
});
|
||||
});
|
||||
|
||||
// 전역 함수로 노출하여 onclick에서 호출 가능하게 처리
|
||||
window.searchZipCode = searchZipCode;
|
||||
window.searchZipCodeCallback = searchZipCodeCallback;
|
||||
|
||||
})(jQuery);
|
||||
</script>
|
||||
Loading…
Reference in New Issue