단속 > 단속 등록&열람: 불필요한 Grid3, Grid4 관련 JSP 및 JavaScript 코드 제거, 소유자 선택 서비스/매퍼 제거, 불법위반행위정보 관리 컨트롤러/서비스/매퍼 추가, 관련 API 구현 및 주석 보강

dev
박성영 4 months ago
parent 9ea7565aa3
commit 09f41802cf

@ -0,0 +1,29 @@
create table tb_act_info
(
ACT_INFO_ID varchar(10) not null comment '행위 정보 ID'
primary key,
SGG_CD varchar(5) not null comment '시군구 코드',
CRDN_YR char(4) null comment '단속 연도',
CRDN_NO varchar(6) null comment '단속 번호',
PSTN_INFO_ID varchar(10) not null comment '위치 정보 ID',
ACT_BGNG_YMD char(8) null comment '행위 시작 일자',
ACT_TYPE_CD varchar(2) null comment '행위 유형 코드',
VLTN_LWRG_CD_1 varchar(3) null comment '위반 법규 코드 1',
VLTN_LWRG_CD_2 varchar(3) null comment '위반 법규 코드 2',
STRCT_IDX_CD varchar(3) null comment '구조 지수 코드',
USG_IDX_CD varchar(5) null comment '용도 지수 코드',
HGT decimal(10, 2) null comment '높이',
WDTH decimal(10, 2) null comment '가로',
VRTC decimal(10, 2) null comment '세로',
AREA decimal(10, 2) null comment '면적',
RMRK varchar(1000) null comment '비고',
REG_DT datetime null comment '등록 일시',
RGTR varchar(11) null comment '등록자',
MDFCN_DT datetime null comment '수정 일시',
MDFR varchar(11) null comment '수정자',
DEL_YN char not null comment '삭제 여부',
DEL_DT datetime null comment '삭제 일시',
DLTR varchar(11) null comment '삭제자'
)
comment '행위 정보';

@ -0,0 +1,17 @@
create table tb_actr_info
(
ACTR_INFO_ID varchar(10) not null comment '행위자 정보 ID'
primary key,
SGG_CD varchar(5) not null comment '시군구 코드',
CRDN_YR char(4) null comment '단속 연도',
CRDN_NO varchar(6) null comment '단속 번호',
ACT_INFO_ID varchar(10) not null comment '행위 정보 ID',
OWNR_ID varchar(10) not null comment '소유자 ID',
REG_DT datetime null comment '등록 일시',
RGTR varchar(11) null comment '등록자',
DEL_YN char not null comment '삭제 여부',
DEL_DT datetime null comment '삭제 일시',
DLTR varchar(11) null comment '삭제자'
)
comment '행위자 정보';

@ -0,0 +1,12 @@
create table tb_bldg_new_prc_crtr_amt
(
YR char(4) not null comment '연도',
NO char not null comment '번호',
BDST_USG varchar(60) null comment '건축물 용도',
BLDG_NEW_PRC_CRTR_AMT decimal(13) null comment '건물 신축 가격 기준 액',
REG_DT datetime null comment '등록 일시',
RGTR varchar(11) null comment '등록자',
primary key (YR, NO)
)
comment '건물 신축 가격 기준 액';

@ -0,0 +1,37 @@
create table tb_crdn
(
CRDN_YR char(4) not null comment '단속 연도',
CRDN_NO varchar(6) not null comment '단속 번호',
SGG_CD varchar(5) null comment '시군구 코드',
RGN_SE_CD char not null comment '지역 구분 코드',
DSCL_MTHD_CD varchar(2) not null comment '적발 방법 코드',
DSCL_YMD char(8) null comment '적발 일자',
EXMNR varchar(100) null comment '조사원',
RMRK varchar(1000) null comment '비고',
DSPS_BFHD_BGNG_YMD varchar(8) null comment '처분 사전 시작 일자',
DSPS_BFHD_END_YMD varchar(8) null comment '처분 사전 종료 일자',
CRC_CMD_BGNG_YMD varchar(8) null comment '시정 명령 시작 일자',
CRC_CMD_END_YMD varchar(8) null comment '시정 명령 종료 일자',
CRC_URG_BGNG_YMD varchar(8) null comment '시정 촉구 시작 일자',
CRC_URG_END_YMD varchar(8) null comment '시정 촉구 종료 일자',
LEVY_PRVNTC_BGNG_YMD varchar(8) null comment '부과 예고 시작 일자',
LEVY_PRVNTC_END_YMD varchar(8) null comment '부과 예고 종료 일자',
LEVY_BGNG_YMD varchar(8) null comment '부과 시작 일자',
LEVY_END_YMD varchar(8) null comment '부과 종료 일자',
PAY_URG_BGNG_YMD varchar(8) null comment '납부 촉구 시작 일자',
PAY_URG_END_YMD varchar(8) null comment '납부 촉구 종료 일자',
FRST_CRDN_YR varchar(4) null comment '최초 단속 연도',
FRST_CRDN_NO varchar(6) null comment '최초 단속 번호',
AGRVTN_LEVY_TRGT_YN char not null comment '가중 부과 대상 여부',
RELEVY_YN char not null comment '재부과 여부',
CRDN_PRCS_STTS_CD varchar(2) null comment '단속 처리 상태 코드',
CRDN_PRCS_YMD varchar(8) null comment '단속 처리 일자',
REG_DT datetime null comment '등록 일시',
RGTR varchar(11) null comment '등록자',
DEL_YN char not null comment '삭제 여부',
DEL_DT datetime null comment '삭제 일시',
DLTR varchar(11) null comment '삭제자',
primary key (CRDN_YR, CRDN_NO)
)
comment '단속';

@ -0,0 +1,14 @@
create table tb_exmnr
(
EXMNR_ID varchar(10) not null comment '조사원 ID'
primary key,
SGG_CD varchar(5) not null comment '시군구 코드',
REG_DT datetime null comment '등록 일시',
RGTR varchar(11) null comment '등록자',
DEL_YN char not null comment '삭제 여부',
DEL_DT datetime null comment '삭제 일시',
DLTR varchar(11) null comment '삭제자',
EXMNR varchar(100) null comment '조사원'
)
comment '조사원';

@ -0,0 +1,38 @@
create table tb_ownr
(
OWNR_ID varchar(10) not null comment '소유자 ID'
primary key,
SGG_CD varchar(5) not null comment '시군구 코드',
FLNM varchar(100) null comment '성명',
RRNO varchar(100) null comment '주민등록번호',
OWNR_SE_CD varchar(1) null comment '소유자 구분 코드',
ADDR varchar(320) null comment '주소',
DADDR varchar(320) null comment '상세주소',
ZIP varchar(6) null comment '우편번호',
LOTNO_WHOL_ADDR varchar(2000) null comment '지번 전체 주소',
ROAD_NM_WHOL_ADDR varchar(2000) null comment '도로 명 전체 주소',
LOTNO_ADDR varchar(320) null comment '지번 주소',
ROAD_NM_ADDR varchar(320) null comment '도로 명 주소',
DTL_ADDR varchar(320) null comment '상세 주소',
REF_ADDR varchar(320) null comment '참고 주소',
PBADMS_ZONE_CD varchar(10) not null comment '행정 구역 코드',
ROAD_NM_CD varchar(12) null comment '도로 명 코드',
LOTNO_MNO varchar(4) null comment '지번 본번',
LOTNO_SNO varchar(4) null comment '지번 부번',
BLDG_MNO varchar(4) null comment '건물 본번',
BLDG_SNO varchar(4) null comment '건물 부번',
UDGD_YN_CD varchar(1) null comment '지하 여부 코드',
MTN_YN_CD varchar(1) null comment '산 여부 코드',
TELNO varchar(11) null comment '전화번호',
RMRK varchar(1000) null comment '비고',
EML varchar(50) null comment '이메일',
REG_DT datetime null comment '등록 일시',
RGTR varchar(11) null comment '등록자',
MDFCN_DT datetime null comment '수정 일시',
MDFR varchar(11) null comment '수정자',
DEL_YN char not null comment '삭제 여부',
DEL_DT datetime null comment '삭제 일시',
DLTR varchar(11) null comment '삭제자'
)
comment '소유자';

@ -0,0 +1,17 @@
create table tb_ownr_info
(
OWNR_INFO_ID varchar(10) not null comment '소유자 정보 ID'
primary key,
SGG_CD varchar(5) not null comment '시군구 코드',
CRDN_YR char(4) null comment '단속 연도',
CRDN_NO varchar(6) null comment '단속 번호',
PSTN_INFO_ID char(18) null comment '위치 정보 ID',
OWNR_ID char(18) null comment '소유자 ID',
REG_DT datetime null comment '등록 일시',
RGTR varchar(11) null comment '등록자',
DEL_YN char not null comment '삭제 여부',
DEL_DT datetime null comment '삭제 일시',
DLTR varchar(11) null comment '삭제자'
)
comment '소유자 정보';

@ -0,0 +1,37 @@
create table tb_pstn_info
(
PSTN_INFO_ID varchar(10) not null comment '위치 정보 ID'
primary key,
SGG_CD varchar(5) not null comment '시군구 코드',
CRDN_YR char(4) null comment '단속 연도',
CRDN_NO varchar(6) null comment '단속 번호',
STDG_EMD_CD char(3) not null comment '법정동 읍면동 코드',
LDCG_CD char(3) not null comment '지목 코드',
PTOUT decimal(22, 2) null comment '지적',
OALP decimal(13) null comment '공시지가',
LOTNO_WHOL_ADDR varchar(2000) null comment '지번 전체 주소',
ROAD_NM_WHOL_ADDR varchar(2000) null comment '도로 명 전체 주소',
ZIP varchar(6) null comment '우편번호',
LOTNO_ADDR varchar(320) null comment '지번 주소',
ROAD_NM_ADDR varchar(320) null comment '도로 명 주소',
DTL_ADDR varchar(320) null comment '상세 주소',
REF_ADDR varchar(320) null comment '참고 주소',
PBADMS_ZONE_CD varchar(10) not null comment '행정 구역 코드',
ROAD_NM_CD varchar(12) null comment '도로 명 코드',
LOTNO_MNO varchar(4) null comment '지번 본번',
LOTNO_SNO varchar(4) null comment '지번 부번',
BLDG_MNO varchar(4) null comment '건물 본번',
BLDG_SNO varchar(4) null comment '건물 부번',
UDGD_YN_CD varchar(1) null comment '지하 여부 코드',
MTN_YN_CD varchar(1) null comment '산 여부 코드',
RMRK varchar(1000) null comment '비고',
REG_DT datetime null comment '등록 일시',
RGTR varchar(11) null comment '등록자',
MDFCN_DT datetime null comment '수정 일시',
MDFR varchar(11) null comment '수정자',
DEL_YN char not null comment '삭제 여부',
DEL_DT datetime null comment '삭제 일시',
DLTR varchar(11) null comment '삭제자'
)
comment '위치 정보';

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

@ -0,0 +1,222 @@
package go.kr.project.crdn.crndRegistAndView.crdnActInfo.controller;
import egovframework.constant.MessageConstants;
import egovframework.constant.TilesConstants;
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.crdn.crndRegistAndView.crdnActInfo.model.CrdnActInfoVO;
import go.kr.project.crdn.crndRegistAndView.crdnActInfo.service.CrdnActInfoService;
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;
/**
*
* <pre>
* packageName : go.kr.project.crdn.crndRegistAndView.crdnActInfo.controller
* fileName : CrdnActInfoController
* author :
* date : 2025-08-28
* description :
* : CRUD .
* ===========================================================
* DATE AUTHOR NOTE
* -----------------------------------------------------------
* 2025-08-28
* </pre>
*/
@Slf4j
@Controller
@RequiredArgsConstructor
@RequestMapping("/crdn/crndRegistAndView/crdnActInfo")
@Tag(name = "불법위반행위정보", description = "불법위반행위정보 관리 API")
public class CrdnActInfoController {
private final CrdnActInfoService service;
private final CommonCodeService commonCodeService;
/**
* (AJAX)
* @param vo
* @return
*/
@Operation(summary = "불법위반행위정보 목록 조회", description = "불법위반행위정보 목록을 조회합니다.")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "조회 성공"),
@ApiResponse(responseCode = "500", description = "서버 오류")
})
@PostMapping("/list.ajax")
@ResponseBody
public ResponseEntity<?> listAjax(@ModelAttribute CrdnActInfoVO vo) {
log.debug("불법위반행위정보 목록 조회 요청: {}", vo);
// 1. 총 개수 조회
int totalCount = service.selectActInfoListTotalCount(vo);
// 2. 응답 데이터 구성
vo.setTotalCount(totalCount);
// 3. 페이징 처리
//vo.setPagingYn("Y");
List<CrdnActInfoVO> list = service.selectActInfoList(vo);
return ApiResponseUtil.success(list);
}
/**
*
* @param crdnYr
* @param crdnNo
* @param mode (: insert, : update)
* @param actInfoId ID ( )
* @param model
* @return ModelAndView
*/
@Operation(summary = "불법위반행위정보 팝업", description = "불법위반행위정보 등록/수정 팝업 화면을 제공합니다.")
@GetMapping("/popup.do")
public ModelAndView popup(
@Parameter(description = "단속연도") @RequestParam(required = false) String crdnYr,
@Parameter(description = "단속번호") @RequestParam(required = false) String crdnNo,
@Parameter(description = "화면모드") @RequestParam(defaultValue = "insert") String mode,
@Parameter(description = "행위정보ID") @RequestParam(required = false) String actInfoId,
Model model) {
log.debug("불법위반행위정보 팝업 요청 - crdnYr: {}, crdnNo: {}, mode: {}, actInfoId: {}", crdnYr, crdnNo, mode, actInfoId);
try {
CrdnActInfoVO data = null;
// 수정 모드인 경우 기존 데이터 조회
if ("update".equals(mode) && actInfoId != null) {
data = service.selectActInfoByPk(actInfoId);
}
ModelAndView mav = new ModelAndView("crdn/crndRegistAndView/crdnActInfo/crdnActInfoRegistPopup" + TilesConstants.POPUP);
mav.addObject("data", data);
mav.addObject("mode", mode);
mav.addObject("crdnYr", crdnYr);
mav.addObject("crdnNo", crdnNo);
// 필요한 공통코드 조회
model.addAttribute("actTypeCdList", commonCodeService.selectCodeDetailList(CmmnCodeSearchVO.builder().searchCdGroupId("ACT_TYPE_CD").build()));
model.addAttribute("vltnLwrgCdList", commonCodeService.selectCodeDetailList(CmmnCodeSearchVO.builder().searchCdGroupId("VLTN_LWRG_CD").build()));
model.addAttribute("strctIdxCdList", commonCodeService.selectCodeDetailList(CmmnCodeSearchVO.builder().searchCdGroupId("STRCT_IDX_CD").build()));
model.addAttribute("usgIdxCdList", commonCodeService.selectCodeDetailList(CmmnCodeSearchVO.builder().searchCdGroupId("USG_IDX_CD").build()));
return mav;
} catch (Exception e) {
log.error("불법위반행위정보 팝업 처리 중 오류 발생", e);
throw e;
}
}
/**
* (AJAX)
* @param vo
* @return
*/
@Operation(summary = "불법위반행위정보 등록", description = "불법위반행위정보를 등록합니다.")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "등록 성공"),
@ApiResponse(responseCode = "500", description = "서버 오류")
})
@PostMapping("/insert.ajax")
@ResponseBody
public ResponseEntity<?> insertAjax(@ModelAttribute CrdnActInfoVO vo) {
log.debug("불법위반행위정보 등록 요청: {}", vo);
// 현재 로그인한 사용자 정보 설정
String userId = SessionUtil.getUserId();
vo.setRgtr(userId);
int result = service.insertActInfo(vo);
if (result > 0) {
return ApiResponseUtil.success(MessageConstants.Common.SAVE_SUCCESS);
} else {
return ApiResponseUtil.error("등록에 실패했습니다.");
}
}
/**
* (AJAX)
* @param vo
* @return
*/
@Operation(summary = "불법위반행위정보 수정", description = "불법위반행위정보를 수정합니다.")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "수정 성공"),
@ApiResponse(responseCode = "500", description = "서버 오류")
})
@PostMapping("/update.ajax")
@ResponseBody
public ResponseEntity<?> updateAjax(@ModelAttribute CrdnActInfoVO vo) {
log.debug("불법위반행위정보 수정 요청: {}", vo);
// 현재 로그인한 사용자 정보 설정
String userId = SessionUtil.getUserId();
vo.setMdfr(userId);
int result = service.updateActInfo(vo);
if (result > 0) {
return ApiResponseUtil.success(MessageConstants.Common.SAVE_SUCCESS);
} else {
return ApiResponseUtil.error("수정에 실패했습니다.");
}
}
/**
* (AJAX)
* @param actInfoIds ID
* @return
*/
@Operation(summary = "불법위반행위정보 삭제", description = "불법위반행위정보를 삭제합니다.")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "삭제 성공"),
@ApiResponse(responseCode = "500", description = "서버 오류")
})
@PostMapping("/delete.ajax")
@ResponseBody
public ResponseEntity<?> deleteAjax(@RequestParam("actInfoIds[]") List<String> actInfoIds) {
log.debug("불법위반행위정보 삭제 요청: {}", actInfoIds);
if (actInfoIds == null || actInfoIds.isEmpty()) {
return ApiResponseUtil.error("삭제할 항목을 선택해 주세요.");
}
// 현재 로그인한 사용자 정보
String userId = SessionUtil.getUserId();
// 중요한 로직 주석: 각 행위정보 ID에 대해 논리 삭제 수행
int deletedCount = 0;
for (String actInfoId : actInfoIds) {
if (actInfoId != null && !actInfoId.trim().isEmpty()) {
CrdnActInfoVO deleteVO = CrdnActInfoVO.builder()
.actInfoId(actInfoId)
.dltr(userId)
.build();
int result = service.deleteActInfo(deleteVO);
deletedCount += result;
}
}
if (deletedCount > 0) {
return ApiResponseUtil.success(MessageConstants.Common.SAVE_SUCCESS);
} else {
return ApiResponseUtil.error("삭제에 실패했습니다.");
}
}
}

@ -0,0 +1,56 @@
package go.kr.project.crdn.crndRegistAndView.crdnActInfo.mapper;
import go.kr.project.crdn.crndRegistAndView.crdnActInfo.model.CrdnActInfoVO;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
/**
*
* : tb_act_info CRUD .
*/
@Mapper
public interface CrdnActInfoMapper {
/**
*
* @param vo
* @return
*/
List<CrdnActInfoVO> selectActInfoList(CrdnActInfoVO vo);
/**
*
* @param vo
* @return
*/
int selectActInfoListTotalCount(CrdnActInfoVO vo);
/**
*
* @param vo
* @return
*/
int insertActInfo(CrdnActInfoVO vo);
/**
* (PK )
* @param actInfoId ID
* @return
*/
CrdnActInfoVO selectActInfoByPk(String actInfoId);
/**
*
* @param vo
* @return
*/
int updateActInfo(CrdnActInfoVO vo);
/**
* ()
* @param vo (delYn, delDt, dltr )
* @return
*/
int deleteActInfo(CrdnActInfoVO vo);
}

@ -0,0 +1,70 @@
package go.kr.project.crdn.crndRegistAndView.crdnActInfo.model;
import com.fasterxml.jackson.annotation.JsonFormat;
import go.kr.project.common.model.PagingVO;
import lombok.*;
import org.springframework.format.annotation.DateTimeFormat;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
* VO
* : tb_act_info , (//) .
*/
@EqualsAndHashCode(callSuper = true)
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class CrdnActInfoVO extends PagingVO {
// ============ 테이블 컬럼 ============
private String actInfoId; // 행위 정보 ID
private String sggCd; // 시군구 코드
private String crdnYr; // 단속 연도
private String crdnNo; // 단속 번호
private String pstnInfoId; // 위치 정보 ID
private String actBgngYmd; // 행위 시작 일자
private String actTypeCd; // 행위 유형 코드
private String vltnLwrgCd1; // 위반 법규 코드 1
private String vltnLwrgCd2; // 위반 법규 코드 2
private String strctIdxCd; // 구조 지수 코드
private String usgIdxCd; // 용도 지수 코드
private BigDecimal hgt; // 높이
private BigDecimal wdth; // 가로
private BigDecimal vrtc; // 세로
private BigDecimal area; // 면적
private String rmrk; // 비고
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Seoul")
private LocalDateTime regDt; // 등록 일시
private String rgtr; // 등록자
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Seoul")
private LocalDateTime mdfcnDt; // 수정 일시
private String mdfr; // 수정자
private String delYn; // 삭제 여부
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Seoul")
private LocalDateTime delDt; // 삭제 일시
private String dltr; // 삭제자
// ============ 조인 컬럼(코드명) ============
private String sggCdNm; // 시군구 코드명
private String actTypeCdNm; // 행위 유형 코드명
private String vltnLwrgCd1Nm; // 위반 법규 코드 1명
private String vltnLwrgCd2Nm; // 위반 법규 코드 2명
private String strctIdxCdNm; // 구조 지수 코드명
private String usgIdxCdNm; // 용도 지수 코드명
// ============ 조인 컬럼(사용자정보) ============
private String rgtrAcnt; // 등록자 계정
private String rgtrNm; // 등록자명
private String mdfrAcnt; // 수정자 계정
private String mdfrNm; // 수정자명
}

@ -0,0 +1,54 @@
package go.kr.project.crdn.crndRegistAndView.crdnActInfo.service;
import go.kr.project.crdn.crndRegistAndView.crdnActInfo.model.CrdnActInfoVO;
import java.util.List;
/**
*
* : tb_act_info CRUD .
*/
public interface CrdnActInfoService {
/**
*
* @param vo
* @return
*/
List<CrdnActInfoVO> selectActInfoList(CrdnActInfoVO vo);
/**
*
* @param vo
* @return
*/
int selectActInfoListTotalCount(CrdnActInfoVO vo);
/**
*
* @param vo
* @return
*/
int insertActInfo(CrdnActInfoVO vo);
/**
* (PK )
* @param actInfoId ID
* @return
*/
CrdnActInfoVO selectActInfoByPk(String actInfoId);
/**
*
* @param vo
* @return
*/
int updateActInfo(CrdnActInfoVO vo);
/**
* ()
* @param vo (delYn, delDt, dltr )
* @return
*/
int deleteActInfo(CrdnActInfoVO vo);
}

@ -0,0 +1,92 @@
package go.kr.project.crdn.crndRegistAndView.crdnActInfo.service.impl;
import egovframework.exception.MessageException;
import go.kr.project.crdn.crndRegistAndView.crdnActInfo.mapper.CrdnActInfoMapper;
import go.kr.project.crdn.crndRegistAndView.crdnActInfo.model.CrdnActInfoVO;
import go.kr.project.crdn.crndRegistAndView.crdnActInfo.service.CrdnActInfoService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.egovframe.rte.fdl.cmmn.EgovAbstractServiceImpl;
import org.springframework.stereotype.Service;
import java.util.List;
/**
*
* <pre>
* packageName : go.kr.project.crdn.crndRegistAndView.crdnActInfo.service.impl
* fileName : CrdnActInfoServiceImpl
* author :
* date : 2025-08-28
* description :
* : tb_act_info CRUD .
* ===========================================================
* DATE AUTHOR NOTE
* -----------------------------------------------------------
* 2025-08-28
* </pre>
*/
@Slf4j
@Service
@RequiredArgsConstructor
public class CrdnActInfoServiceImpl extends EgovAbstractServiceImpl implements CrdnActInfoService {
private final CrdnActInfoMapper mapper;
@Override
public List<CrdnActInfoVO> selectActInfoList(CrdnActInfoVO vo) {
log.debug("불법위반행위정보 목록 조회: {}", vo);
return mapper.selectActInfoList(vo);
}
@Override
public int selectActInfoListTotalCount(CrdnActInfoVO vo) {
log.debug("불법위반행위정보 총 개수 조회: {}", vo);
return mapper.selectActInfoListTotalCount(vo);
}
@Override
public int insertActInfo(CrdnActInfoVO vo) {
log.debug("불법위반행위정보 등록: {}", vo);
// 중요한 로직 주석: 동일한 단속년도/단속번호/위치정보에 대한 중복 등록 방지
CrdnActInfoVO existingRecord = null;
if (vo.getCrdnYr() != null && vo.getCrdnNo() != null && vo.getPstnInfoId() != null) {
List<CrdnActInfoVO> existingList = mapper.selectActInfoList(CrdnActInfoVO.builder()
.crdnYr(vo.getCrdnYr())
.crdnNo(vo.getCrdnNo())
.pstnInfoId(vo.getPstnInfoId())
.build());
if (!existingList.isEmpty()) {
existingRecord = existingList.get(0);
}
}
if (existingRecord != null) {
log.warn("이미 등록된 불법위반행위정보가 존재합니다. 단속년도: {}, 단속번호: {}, 위치정보ID: {}",
vo.getCrdnYr(), vo.getCrdnNo(), vo.getPstnInfoId());
return 0;
}
return mapper.insertActInfo(vo);
}
@Override
public CrdnActInfoVO selectActInfoByPk(String actInfoId) {
log.debug("불법위반행위정보 상세 조회: {}", actInfoId);
return mapper.selectActInfoByPk(actInfoId);
}
@Override
public int updateActInfo(CrdnActInfoVO vo) {
log.debug("불법위반행위정보 수정: {}", vo);
return mapper.updateActInfo(vo);
}
@Override
public int deleteActInfo(CrdnActInfoVO vo) {
log.debug("불법위반행위정보 삭제: {}", vo);
return mapper.deleteActInfo(vo);
}
}

@ -0,0 +1,138 @@
package go.kr.project.crdn.crndRegistAndView.crdnActrInfo.controller;
import egovframework.util.ApiResponseUtil;
import egovframework.util.SessionUtil;
import go.kr.project.crdn.crndRegistAndView.crdnActrInfo.model.CrdnActrInfoVO;
import go.kr.project.crdn.crndRegistAndView.crdnActrInfo.service.CrdnActrInfoService;
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.web.bind.annotation.*;
import java.util.List;
/**
*
* <pre>
* packageName : go.kr.project.crdn.crndRegistAndView.crdnActrInfo.controller
* fileName : CrdnActrInfoController
* author :
* date : 2025-08-28
* description :
* : CRUD . ( )
* ===========================================================
* DATE AUTHOR NOTE
* -----------------------------------------------------------
* 2025-08-28
* </pre>
*/
@Slf4j
@Controller
@RequiredArgsConstructor
@RequestMapping("/crdn/crndRegistAndView/crdnActrInfo")
@Tag(name = "위반행위자정보", description = "위반행위자정보 관리 API")
public class CrdnActrInfoController {
private final CrdnActrInfoService service;
/**
* (AJAX)
* @param vo
* @return
*/
@Operation(summary = "위반행위자정보 목록 조회", description = "위반행위자정보 목록을 조회합니다.")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "조회 성공"),
@ApiResponse(responseCode = "500", description = "서버 오류")
})
@PostMapping("/list.ajax")
@ResponseBody
public ResponseEntity<?> listAjax(@ModelAttribute CrdnActrInfoVO vo) {
log.debug("위반행위자정보 목록 조회 요청: {}", vo);
// 1. 총 개수 조회
int totalCount = service.selectActrInfoListTotalCount(vo);
// 2. 응답 데이터 구성
vo.setTotalCount(totalCount);
List<CrdnActrInfoVO> list = service.selectActrInfoList(vo);
return ApiResponseUtil.success(list);
}
/**
* (AJAX)
* @param vo
* @return
*/
@Operation(summary = "위반행위자정보 등록", description = "위반행위자정보를 등록합니다.")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "등록 성공"),
@ApiResponse(responseCode = "500", description = "서버 오류")
})
@PostMapping("/insert.ajax")
@ResponseBody
public ResponseEntity<?> insertAjax(@ModelAttribute CrdnActrInfoVO vo) {
log.debug("위반행위자정보 등록 요청: {}", vo);
// 현재 로그인한 사용자 정보 설정
String userId = SessionUtil.getUserId();
vo.setRgtr(userId);
int result = service.insertActrInfo(vo);
if (result > 0) {
return ApiResponseUtil.success("등록이 완료되었습니다.");
} else {
return ApiResponseUtil.error("등록에 실패했습니다.");
}
}
/**
* (AJAX)
* @param actrInfoIds ID
* @return
*/
@Operation(summary = "위반행위자정보 삭제", description = "위반행위자정보를 삭제합니다.")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "삭제 성공"),
@ApiResponse(responseCode = "500", description = "서버 오류")
})
@PostMapping("/delete.ajax")
@ResponseBody
public ResponseEntity<?> deleteAjax(@RequestParam("actrInfoIds[]") List<String> actrInfoIds) {
log.debug("위반행위자정보 삭제 요청: {}", actrInfoIds);
if (actrInfoIds == null || actrInfoIds.isEmpty()) {
return ApiResponseUtil.error("삭제할 항목을 선택해 주세요.");
}
// 현재 로그인한 사용자 정보
String userId = SessionUtil.getUserId();
// 중요한 로직 주석: 각 행위자정보 ID에 대해 논리 삭제 수행
int deletedCount = 0;
for (String actrInfoId : actrInfoIds) {
if (actrInfoId != null && !actrInfoId.trim().isEmpty()) {
CrdnActrInfoVO deleteVO = CrdnActrInfoVO.builder()
.actrInfoId(actrInfoId)
.dltr(userId)
.build();
int result = service.deleteActrInfo(deleteVO);
deletedCount += result;
}
}
if (deletedCount > 0) {
return ApiResponseUtil.success("삭제가 완료되었습니다.");
} else {
return ApiResponseUtil.error("삭제에 실패했습니다.");
}
}
}

@ -0,0 +1,49 @@
package go.kr.project.crdn.crndRegistAndView.crdnActrInfo.mapper;
import go.kr.project.crdn.crndRegistAndView.crdnActrInfo.model.CrdnActrInfoVO;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
/**
*
* : tb_actr_info CRUD .
*/
@Mapper
public interface CrdnActrInfoMapper {
/**
*
* @param vo
* @return
*/
List<CrdnActrInfoVO> selectActrInfoList(CrdnActrInfoVO vo);
/**
*
* @param vo
* @return
*/
int selectActrInfoListTotalCount(CrdnActrInfoVO vo);
/**
*
* @param vo
* @return
*/
int insertActrInfo(CrdnActrInfoVO vo);
/**
* (PK )
* @param actrInfoId ID
* @return
*/
CrdnActrInfoVO selectActrInfoByPk(String actrInfoId);
/**
* ()
* @param vo (delYn, delDt, dltr )
* @return
*/
int deleteActrInfo(CrdnActrInfoVO vo);
}

@ -0,0 +1,55 @@
package go.kr.project.crdn.crndRegistAndView.crdnActrInfo.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;
/**
* VO
* : tb_actr_info , () .
*/
@EqualsAndHashCode(callSuper = true)
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class CrdnActrInfoVO extends PagingVO {
// ============ 테이블 컬럼 ============
private String actrInfoId; // 행위자 정보 ID
private String sggCd; // 시군구 코드
private String crdnYr; // 단속 연도
private String crdnNo; // 단속 번호
private String actInfoId; // 행위 정보 ID
private String ownrId; // 소유자 ID
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Seoul")
private LocalDateTime regDt; // 등록 일시
private String rgtr; // 등록자
private String delYn; // 삭제 여부
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Seoul")
private LocalDateTime delDt; // 삭제 일시
private String dltr; // 삭제자
// ============ 조인 컬럼(코드명) ============
private String sggCdNm; // 시군구 코드명
// ============ 조인 컬럼(소유자정보 - tb_ownr 테이블) ============
private String ownrNm; // 소유자명 (FLNM)
private String ownrRrno; // 소유자 주민등록번호 (RRNO)
private String ownrTelno; // 소유자 전화번호 (TELNO)
private String ownrAddr; // 소유자 주소 (LOTNO_ADDR + DTL_ADDR)
private String ownrDtlAddr; // 소유자 상세주소 (DTL_ADDR)
private String ownrZip; // 소유자 우편번호 (ZIP)
// ============ 조인 컬럼(사용자정보) ============
private String rgtrAcnt; // 등록자 계정
private String rgtrNm; // 등록자명
}

@ -0,0 +1,47 @@
package go.kr.project.crdn.crndRegistAndView.crdnActrInfo.service;
import go.kr.project.crdn.crndRegistAndView.crdnActrInfo.model.CrdnActrInfoVO;
import java.util.List;
/**
*
* : tb_actr_info CRUD .
*/
public interface CrdnActrInfoService {
/**
*
* @param vo
* @return
*/
List<CrdnActrInfoVO> selectActrInfoList(CrdnActrInfoVO vo);
/**
*
* @param vo
* @return
*/
int selectActrInfoListTotalCount(CrdnActrInfoVO vo);
/**
*
* @param vo
* @return
*/
int insertActrInfo(CrdnActrInfoVO vo);
/**
* (PK )
* @param actrInfoId ID
* @return
*/
CrdnActrInfoVO selectActrInfoByPk(String actrInfoId);
/**
* ()
* @param vo (delYn, delDt, dltr )
* @return
*/
int deleteActrInfo(CrdnActrInfoVO vo);
}

@ -0,0 +1,85 @@
package go.kr.project.crdn.crndRegistAndView.crdnActrInfo.service.impl;
import egovframework.exception.MessageException;
import go.kr.project.crdn.crndRegistAndView.crdnActrInfo.mapper.CrdnActrInfoMapper;
import go.kr.project.crdn.crndRegistAndView.crdnActrInfo.model.CrdnActrInfoVO;
import go.kr.project.crdn.crndRegistAndView.crdnActrInfo.service.CrdnActrInfoService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.egovframe.rte.fdl.cmmn.EgovAbstractServiceImpl;
import org.springframework.stereotype.Service;
import java.util.List;
/**
*
* <pre>
* packageName : go.kr.project.crdn.crndRegistAndView.crdnActrInfo.service.impl
* fileName : CrdnActrInfoServiceImpl
* author :
* date : 2025-08-28
* description :
* : tb_actr_info CRUD .
* ===========================================================
* DATE AUTHOR NOTE
* -----------------------------------------------------------
* 2025-08-28
* </pre>
*/
@Slf4j
@Service
@RequiredArgsConstructor
public class CrdnActrInfoServiceImpl extends EgovAbstractServiceImpl implements CrdnActrInfoService {
private final CrdnActrInfoMapper mapper;
@Override
public List<CrdnActrInfoVO> selectActrInfoList(CrdnActrInfoVO vo) {
log.debug("위반행위자정보 목록 조회: {}", vo);
return mapper.selectActrInfoList(vo);
}
@Override
public int selectActrInfoListTotalCount(CrdnActrInfoVO vo) {
log.debug("위반행위자정보 총 개수 조회: {}", vo);
return mapper.selectActrInfoListTotalCount(vo);
}
@Override
public int insertActrInfo(CrdnActrInfoVO vo) {
log.debug("위반행위자정보 등록: {}", vo);
// 중요한 로직 주석: 동일한 행위정보ID와 소유자ID에 대한 중복 등록 방지
CrdnActrInfoVO existingRecord = null;
if (vo.getActInfoId() != null && vo.getOwnrId() != null) {
List<CrdnActrInfoVO> existingList = mapper.selectActrInfoList(CrdnActrInfoVO.builder()
.actInfoId(vo.getActInfoId())
.ownrId(vo.getOwnrId())
.build());
if (!existingList.isEmpty()) {
existingRecord = existingList.get(0);
}
}
if (existingRecord != null) {
log.warn("이미 등록된 위반행위자정보가 존재합니다. 행위정보ID: {}, 소유자ID: {}",
vo.getActInfoId(), vo.getOwnrId());
return 0;
}
return mapper.insertActrInfo(vo);
}
@Override
public CrdnActrInfoVO selectActrInfoByPk(String actrInfoId) {
log.debug("위반행위자정보 상세 조회: {}", actrInfoId);
return mapper.selectActrInfoByPk(actrInfoId);
}
@Override
public int deleteActrInfo(CrdnActrInfoVO vo) {
log.debug("위반행위자정보 삭제: {}", vo);
return mapper.deleteActrInfo(vo);
}
}

@ -34,7 +34,7 @@ public class CrdnExmnrController {
* @return
*/
@Operation(summary = "조사원 선택 팝업 페이지", description = "조사원을 선택할 수 있는 팝업 페이지를 표시합니다.")
@GetMapping("/popup.do")
@GetMapping("/crdnExmnrSelectPopup.do")
public String exmnrPopup(Model model) {
log.debug("조사원 선택 팝업 페이지 호출");
return "crdn/crndRegistAndView/crdnExmnr/crdnExmnrSelectPopup" + TilesConstants.POPUP;

@ -1,9 +1,9 @@
package go.kr.project.crdn.crndRegistAndView.ownrSelect.controller;
package go.kr.project.crdn.crndRegistAndView.crdnOwnrSelect.controller;
import egovframework.constant.TilesConstants;
import egovframework.util.ApiResponseUtil;
import go.kr.project.crdn.crndRegistAndView.ownrSelect.model.OwnrSelectVO;
import go.kr.project.crdn.crndRegistAndView.ownrSelect.service.OwnrSelectService;
import go.kr.project.crdn.crndRegistAndView.crdnOwnrSelect.model.CrdnOwnrSelectVO;
import go.kr.project.crdn.crndRegistAndView.crdnOwnrSelect.service.CrdnOwnrSelectService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
@ -32,13 +32,13 @@ import java.util.List;
* 2025-08-28
*/
@Controller
@RequestMapping("/crdn/crndRegistAndView/ownrSelect")
@RequestMapping("/crdn/crndRegistAndView/crdnOwnrSelect")
@RequiredArgsConstructor
@Slf4j
@Tag(name = "소유자 선택", description = "소유자 선택 팝업 API")
public class OwnrSelectController {
public class CrdnOwnrSelectController {
private final OwnrSelectService service;
private final CrdnOwnrSelectService service;
/**
* .
@ -50,7 +50,7 @@ public class OwnrSelectController {
* @return ModelAndView
* @throws Exception
*/
@GetMapping("/popup.do")
@GetMapping("/crdnOwnrSelectPopup.do")
@Operation(summary = "소유자 선택 팝업", description = "소유자 선택을 위한 팝업 화면을 제공합니다.")
public ModelAndView popup(
@Parameter(description = "단속 연도") @RequestParam String crdnYr,
@ -59,7 +59,7 @@ public class OwnrSelectController {
log.debug("소유자 선택 팝업 조회 - 단속년도: {}, 단속번호: {}", crdnYr, crdnNo);
ModelAndView mav = new ModelAndView("crdn/crndRegistAndView/ownrSelect/ownrSelectPopup" + TilesConstants.POPUP);
ModelAndView mav = new ModelAndView("crdn/crndRegistAndView/crdnOwnrSelect/crdnOwnrSelectPopup" + TilesConstants.POPUP);
mav.addObject("crdnYr", crdnYr);
mav.addObject("crdnNo", crdnNo);
return mav;
@ -80,15 +80,15 @@ public class OwnrSelectController {
@ApiResponse(description = "오류로 인한 실패")
})
@PostMapping("/list.ajax")
public ResponseEntity<?> listAjax(@ModelAttribute OwnrSelectVO vo) {
public ResponseEntity<?> listAjax(@ModelAttribute CrdnOwnrSelectVO vo) {
log.debug("소유자 목록 AJAX 조회 - 검색조건: {}", vo);
// 1. 총 개수 조회
int totalCount = service.selectOwnrListTotalCount(vo);
// 2. 응답 데이터 구성
vo.setTotalCount(totalCount);
//vo.setTotalCount(totalCount);
List<OwnrSelectVO> list = service.selectOwnrList(vo);
List<CrdnOwnrSelectVO> list = service.selectOwnrList(vo);
return ApiResponseUtil.successWithGrid(list, vo);
}
}

@ -0,0 +1,23 @@
package go.kr.project.crdn.crndRegistAndView.crdnOwnrSelect.mapper;
import go.kr.project.crdn.crndRegistAndView.crdnOwnrSelect.model.CrdnOwnrSelectVO;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
/**
* MyBatis
* : tb_ownr . .
*/
@Mapper
public interface CrdnOwnrSelectMapper {
/** 목록 조회 */
List<CrdnOwnrSelectVO> selectOwnrList(CrdnOwnrSelectVO vo);
/** 총 개수 */
int selectOwnrListTotalCount(CrdnOwnrSelectVO vo);
/** 상세 조회 */
CrdnOwnrSelectVO selectOwnrByPk(String ownrId);
}

@ -1,4 +1,4 @@
package go.kr.project.crdn.crndRegistAndView.ownrSelect.model;
package go.kr.project.crdn.crndRegistAndView.crdnOwnrSelect.model;
import com.fasterxml.jackson.annotation.JsonFormat;
import go.kr.project.common.model.PagingVO;
@ -16,7 +16,7 @@ import java.time.LocalDateTime;
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class OwnrSelectVO extends PagingVO {
public class CrdnOwnrSelectVO extends PagingVO {
// ============ 테이블 컬럼 ============
private String ownrId; // 소유자 ID

@ -0,0 +1,20 @@
package go.kr.project.crdn.crndRegistAndView.crdnOwnrSelect.service;
import go.kr.project.crdn.crndRegistAndView.crdnOwnrSelect.model.CrdnOwnrSelectVO;
import java.util.List;
/**
*
*/
public interface CrdnOwnrSelectService {
/** 소유자 목록 조회 */
List<CrdnOwnrSelectVO> selectOwnrList(CrdnOwnrSelectVO vo);
/** 소유자 목록 총 개수 조회 */
int selectOwnrListTotalCount(CrdnOwnrSelectVO vo);
/** 소유자 상세 조회 */
CrdnOwnrSelectVO selectOwnrByPk(String ownrId);
}

@ -1,8 +1,8 @@
package go.kr.project.crdn.crndRegistAndView.ownrSelect.service.impl;
package go.kr.project.crdn.crndRegistAndView.crdnOwnrSelect.service.impl;
import go.kr.project.crdn.crndRegistAndView.ownrSelect.mapper.OwnrSelectMapper;
import go.kr.project.crdn.crndRegistAndView.ownrSelect.model.OwnrSelectVO;
import go.kr.project.crdn.crndRegistAndView.ownrSelect.service.OwnrSelectService;
import go.kr.project.crdn.crndRegistAndView.crdnOwnrSelect.mapper.CrdnOwnrSelectMapper;
import go.kr.project.crdn.crndRegistAndView.crdnOwnrSelect.model.CrdnOwnrSelectVO;
import go.kr.project.crdn.crndRegistAndView.crdnOwnrSelect.service.CrdnOwnrSelectService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.egovframe.rte.fdl.cmmn.EgovAbstractServiceImpl;
@ -25,22 +25,22 @@ import java.util.List;
@Service
@RequiredArgsConstructor
@Slf4j
public class OwnrSelectServiceImpl extends EgovAbstractServiceImpl implements OwnrSelectService {
public class CrdnOwnrSelectSelectServiceImpl extends EgovAbstractServiceImpl implements CrdnOwnrSelectService {
private final OwnrSelectMapper mapper;
private final CrdnOwnrSelectMapper mapper;
@Override
public List<OwnrSelectVO> selectOwnrList(OwnrSelectVO vo) {
public List<CrdnOwnrSelectVO> selectOwnrList(CrdnOwnrSelectVO vo) {
return mapper.selectOwnrList(vo);
}
@Override
public int selectOwnrListTotalCount(OwnrSelectVO vo) {
public int selectOwnrListTotalCount(CrdnOwnrSelectVO vo) {
return mapper.selectOwnrListTotalCount(vo);
}
@Override
public OwnrSelectVO selectOwnrByPk(String ownrId) {
public CrdnOwnrSelectVO selectOwnrByPk(String ownrId) {
return mapper.selectOwnrByPk(ownrId);
}
}

@ -69,7 +69,7 @@ public class CrdnPstnInfoController {
// 2. 응답 데이터 구성
vo.setTotalCount(totalCount);
// 3. 페이징 처리 (가이드 준수)
vo.setPagingYn("Y");
//vo.setPagingYn("Y");
List<CrdnPstnInfoVO> list = service.selectPstnInfoList(vo);
return ApiResponseUtil.successWithGrid(list, vo);

@ -1,23 +0,0 @@
package go.kr.project.crdn.crndRegistAndView.ownrSelect.mapper;
import go.kr.project.crdn.crndRegistAndView.ownrSelect.model.OwnrSelectVO;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
/**
* MyBatis
* : tb_ownr . .
*/
@Mapper
public interface OwnrSelectMapper {
/** 목록 조회 */
List<OwnrSelectVO> selectOwnrList(OwnrSelectVO vo);
/** 총 개수 */
int selectOwnrListTotalCount(OwnrSelectVO vo);
/** 상세 조회 */
OwnrSelectVO selectOwnrByPk(String ownrId);
}

@ -1,20 +0,0 @@
package go.kr.project.crdn.crndRegistAndView.ownrSelect.service;
import go.kr.project.crdn.crndRegistAndView.ownrSelect.model.OwnrSelectVO;
import java.util.List;
/**
*
*/
public interface OwnrSelectService {
/** 소유자 목록 조회 */
List<OwnrSelectVO> selectOwnrList(OwnrSelectVO vo);
/** 소유자 목록 총 개수 조회 */
int selectOwnrListTotalCount(OwnrSelectVO vo);
/** 소유자 상세 조회 */
OwnrSelectVO selectOwnrByPk(String ownrId);
}

@ -0,0 +1,214 @@
<?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.crdn.crndRegistAndView.crdnActInfo.mapper.CrdnActInfoMapper">
<!-- 불법위반행위정보 목록 조회 -->
<select id="selectActInfoList" parameterType="CrdnActInfoVO"
resultType="CrdnActInfoVO">
/* ActInfoMapper.selectActInfoList : 불법위반행위정보 목록 조회 */
SELECT
a.ACT_INFO_ID,
a.SGG_CD,
sgg.CD_NM AS SGG_CD_NM,
a.CRDN_YR,
a.CRDN_NO,
a.PSTN_INFO_ID,
a.ACT_BGNG_YMD,
a.ACT_TYPE_CD,
act.CD_NM AS ACT_TYPE_CD_NM,
a.VLTN_LWRG_CD_1,
vltn1.CD_NM AS VLTN_LWRG_CD_1_NM,
a.VLTN_LWRG_CD_2,
vltn2.CD_NM AS VLTN_LWRG_CD_2_NM,
a.STRCT_IDX_CD,
strct.CD_NM AS STRCT_IDX_CD_NM,
a.USG_IDX_CD,
usg.CD_NM AS USG_IDX_CD_NM,
a.HGT,
a.WDTH,
a.VRTC,
a.AREA,
a.RMRK,
a.REG_DT,
a.RGTR,
regUser.USER_ACNT AS RGTR_ACNT,
regUser.USER_NM AS RGTR_NM,
a.MDFCN_DT,
a.MDFR,
modUser.USER_ACNT AS MDFR_ACNT,
modUser.USER_NM AS MDFR_NM,
a.DEL_YN,
a.DEL_DT,
a.DLTR
FROM tb_act_info a
LEFT JOIN tb_cd_detail sgg ON sgg.CD_GROUP_ID = 'ORG_CD' AND sgg.CD_ID = a.SGG_CD AND sgg.USE_YN = 'Y'
LEFT JOIN tb_cd_detail act ON act.CD_GROUP_ID = 'ACT_TYPE_CD' AND act.CD_ID = a.ACT_TYPE_CD AND act.USE_YN = 'Y'
LEFT JOIN tb_cd_detail vltn1 ON vltn1.CD_GROUP_ID = 'VLTN_LWRG_CD' AND vltn1.CD_ID = a.VLTN_LWRG_CD_1 AND vltn1.USE_YN = 'Y'
LEFT JOIN tb_cd_detail vltn2 ON vltn2.CD_GROUP_ID = 'VLTN_LWRG_CD' AND vltn2.CD_ID = a.VLTN_LWRG_CD_2 AND vltn2.USE_YN = 'Y'
LEFT JOIN tb_cd_detail strct ON strct.CD_GROUP_ID = 'STRCT_IDX_CD' AND strct.CD_ID = a.STRCT_IDX_CD AND strct.USE_YN = 'Y'
LEFT JOIN tb_cd_detail usg ON usg.CD_GROUP_ID = 'USG_IDX_CD' AND usg.CD_ID = a.USG_IDX_CD AND usg.USE_YN = 'Y'
LEFT JOIN tb_user regUser ON regUser.USER_ID = a.RGTR
LEFT JOIN tb_user modUser ON modUser.USER_ID = a.MDFR
WHERE a.DEL_YN = 'N'
<if test='crdnYr != null and crdnYr != ""'>
AND a.CRDN_YR = #{crdnYr}
</if>
<if test='crdnNo != null and crdnNo != ""'>
AND a.CRDN_NO = #{crdnNo}
</if>
<if test='pstnInfoId != null and pstnInfoId != ""'>
AND a.PSTN_INFO_ID = #{pstnInfoId}
</if>
ORDER BY a.REG_DT DESC, a.ACT_INFO_ID DESC
<if test='pagingYn != null and pagingYn == "Y"'>
limit #{startIndex}, #{perPage} /* 서버사이드 페이징 처리 */
</if>
</select>
<!-- 불법위반행위정보 총 개수 조회 -->
<select id="selectActInfoListTotalCount" parameterType="CrdnActInfoVO" resultType="int">
/* ActInfoMapper.selectActInfoListTotalCount : 불법위반행위정보 총 개수 조회 */
SELECT COUNT(*)
FROM tb_act_info a
WHERE a.DEL_YN = 'N'
<if test='crdnYr != null and crdnYr != ""'>
AND a.CRDN_YR = #{crdnYr}
</if>
<if test='crdnNo != null and crdnNo != ""'>
AND a.CRDN_NO = #{crdnNo}
</if>
<if test='pstnInfoId != null and pstnInfoId != ""'>
AND a.PSTN_INFO_ID = #{pstnInfoId}
</if>
</select>
<!-- 불법위반행위정보 등록 (시컨스 사용) -->
<insert id="insertActInfo" parameterType="CrdnActInfoVO">
/* ActInfoMapper.insertActInfo : 불법위반행위정보 등록 */
INSERT INTO tb_act_info (
ACT_INFO_ID,
SGG_CD,
CRDN_YR,
CRDN_NO,
PSTN_INFO_ID,
ACT_BGNG_YMD,
ACT_TYPE_CD,
VLTN_LWRG_CD_1,
VLTN_LWRG_CD_2,
STRCT_IDX_CD,
USG_IDX_CD,
HGT,
WDTH,
VRTC,
AREA,
RMRK,
REG_DT,
RGTR,
DEL_YN
) VALUES (
CONCAT('ACTI', LPAD(NEXTVAL(seq_act_info_id), 16, '0')),
#{sggCd},
#{crdnYr},
#{crdnNo},
#{pstnInfoId},
#{actBgngYmd},
#{actTypeCd},
#{vltnLwrgCd1},
#{vltnLwrgCd2},
#{strctIdxCd},
#{usgIdxCd},
#{hgt},
#{wdth},
#{vrtc},
#{area},
#{rmrk},
NOW(),
#{rgtr},
'N'
)
</insert>
<!-- 불법위반행위정보 상세 조회 -->
<select id="selectActInfoByPk" parameterType="String" resultType="CrdnActInfoVO">
/* ActInfoMapper.selectActInfoByPk : 불법위반행위정보 상세 조회 */
SELECT
a.ACT_INFO_ID,
a.SGG_CD,
sgg.CD_NM AS SGG_CD_NM,
a.CRDN_YR,
a.CRDN_NO,
a.PSTN_INFO_ID,
a.ACT_BGNG_YMD,
a.ACT_TYPE_CD,
act.CD_NM AS ACT_TYPE_CD_NM,
a.VLTN_LWRG_CD_1,
vltn1.CD_NM AS VLTN_LWRG_CD_1_NM,
a.VLTN_LWRG_CD_2,
vltn2.CD_NM AS VLTN_LWRG_CD_2_NM,
a.STRCT_IDX_CD,
strct.CD_NM AS STRCT_IDX_CD_NM,
a.USG_IDX_CD,
usg.CD_NM AS USG_IDX_CD_NM,
a.HGT,
a.WDTH,
a.VRTC,
a.AREA,
a.RMRK,
a.REG_DT,
a.RGTR,
regUser.USER_ACNT AS RGTR_ACNT,
regUser.USER_NM AS RGTR_NM,
a.MDFCN_DT,
a.MDFR,
modUser.USER_ACNT AS MDFR_ACNT,
modUser.USER_NM AS MDFR_NM,
a.DEL_YN,
a.DEL_DT,
a.DLTR
FROM tb_act_info a
LEFT JOIN tb_cd_detail sgg ON sgg.CD_GROUP_ID = 'ORG_CD' AND sgg.CD_ID = a.SGG_CD AND sgg.USE_YN = 'Y'
LEFT JOIN tb_cd_detail act ON act.CD_GROUP_ID = 'ACT_TYPE_CD' AND act.CD_ID = a.ACT_TYPE_CD AND act.USE_YN = 'Y'
LEFT JOIN tb_cd_detail vltn1 ON vltn1.CD_GROUP_ID = 'VLTN_LWRG_CD' AND vltn1.CD_ID = a.VLTN_LWRG_CD_1 AND vltn1.USE_YN = 'Y'
LEFT JOIN tb_cd_detail vltn2 ON vltn2.CD_GROUP_ID = 'VLTN_LWRG_CD' AND vltn2.CD_ID = a.VLTN_LWRG_CD_2 AND vltn2.USE_YN = 'Y'
LEFT JOIN tb_cd_detail strct ON strct.CD_GROUP_ID = 'STRCT_IDX_CD' AND strct.CD_ID = a.STRCT_IDX_CD AND strct.USE_YN = 'Y'
LEFT JOIN tb_cd_detail usg ON usg.CD_GROUP_ID = 'USG_IDX_CD' AND usg.CD_ID = a.USG_IDX_CD AND usg.USE_YN = 'Y'
LEFT JOIN tb_user regUser ON regUser.USER_ID = a.RGTR
LEFT JOIN tb_user modUser ON modUser.USER_ID = a.MDFR
WHERE a.ACT_INFO_ID = #{actInfoId}
AND a.DEL_YN = 'N'
</select>
<!-- 불법위반행위정보 수정 -->
<update id="updateActInfo" parameterType="CrdnActInfoVO">
/* ActInfoMapper.updateActInfo : 불법위반행위정보 수정 */
UPDATE tb_act_info SET
ACT_BGNG_YMD = #{actBgngYmd},
ACT_TYPE_CD = #{actTypeCd},
VLTN_LWRG_CD_1 = #{vltnLwrgCd1},
VLTN_LWRG_CD_2 = #{vltnLwrgCd2},
STRCT_IDX_CD = #{strctIdxCd},
USG_IDX_CD = #{usgIdxCd},
HGT = #{hgt},
WDTH = #{wdth},
VRTC = #{vrtc},
AREA = #{area},
RMRK = #{rmrk},
MDFCN_DT = NOW(),
MDFR = #{mdfr}
WHERE ACT_INFO_ID = #{actInfoId}
AND DEL_YN = 'N'
</update>
<!-- 불법위반행위정보 삭제 (논리삭제) -->
<update id="deleteActInfo" parameterType="CrdnActInfoVO">
/* ActInfoMapper.deleteActInfo : 불법위반행위정보 삭제 (논리삭제) */
UPDATE tb_act_info SET
DEL_YN = 'Y',
DEL_DT = NOW(),
DLTR = #{dltr}
WHERE ACT_INFO_ID = #{actInfoId}
AND DEL_YN = 'N'
</update>
</mapper>

@ -0,0 +1,141 @@
<?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.crdn.crndRegistAndView.crdnActrInfo.mapper.CrdnActrInfoMapper">
<!-- 위반행위자정보 목록 조회 -->
<select id="selectActrInfoList" parameterType="CrdnActrInfoVO"
resultType="CrdnActrInfoVO">
/* ActrInfoMapper.selectActrInfoList : 위반행위자정보 목록 조회 */
SELECT
ar.ACTR_INFO_ID,
ar.SGG_CD,
sgg.CD_NM AS SGG_CD_NM,
ar.CRDN_YR,
ar.CRDN_NO,
ar.ACT_INFO_ID,
ar.OWNR_ID,
ar.REG_DT,
ar.RGTR,
regUser.USER_ACNT AS RGTR_ACNT,
regUser.USER_NM AS RGTR_NM,
ar.DEL_YN,
ar.DEL_DT,
ar.DLTR,
o.FLNM AS OWNR_NM,
'' AS OWNR_BRTH_YMD,
o.RRNO AS OWNR_RRNO,
o.TELNO AS OWNR_TELNO,
'' AS OWNR_MBTLNO,
CONCAT(IFNULL(o.LOTNO_ADDR, ''), ' ', IFNULL(o.DTL_ADDR, '')) AS OWNR_ADDR,
o.DTL_ADDR AS OWNR_DTL_ADDR,
o.ZIP AS OWNR_ZIP
FROM tb_actr_info ar
LEFT JOIN tb_cd_detail sgg ON sgg.CD_GROUP_ID = 'ORG_CD' AND sgg.CD_ID = ar.SGG_CD AND sgg.USE_YN = 'Y'
LEFT JOIN tb_user regUser ON regUser.USER_ID = ar.RGTR
LEFT JOIN tb_ownr o ON o.OWNR_ID = ar.OWNR_ID AND o.DEL_YN = 'N'
WHERE ar.DEL_YN = 'N'
<if test='crdnYr != null and crdnYr != ""'>
AND ar.CRDN_YR = #{crdnYr}
</if>
<if test='crdnNo != null and crdnNo != ""'>
AND ar.CRDN_NO = #{crdnNo}
</if>
<if test='actInfoId != null and actInfoId != ""'>
AND ar.ACT_INFO_ID = #{actInfoId}
</if>
ORDER BY ar.REG_DT DESC, ar.ACTR_INFO_ID DESC
<if test='pagingYn != null and pagingYn == "Y"'>
limit #{startIndex}, #{perPage} /* 서버사이드 페이징 처리 */
</if>
</select>
<!-- 위반행위자정보 총 개수 조회 -->
<select id="selectActrInfoListTotalCount" parameterType="CrdnActrInfoVO" resultType="int">
/* ActrInfoMapper.selectActrInfoListTotalCount : 위반행위자정보 총 개수 조회 */
SELECT COUNT(*)
FROM tb_actr_info ar
WHERE ar.DEL_YN = 'N'
<if test='crdnYr != null and crdnYr != ""'>
AND ar.CRDN_YR = #{crdnYr}
</if>
<if test='crdnNo != null and crdnNo != ""'>
AND ar.CRDN_NO = #{crdnNo}
</if>
<if test='actInfoId != null and actInfoId != ""'>
AND ar.ACT_INFO_ID = #{actInfoId}
</if>
</select>
<!-- 위반행위자정보 등록 (시컨스 사용) -->
<insert id="insertActrInfo" parameterType="CrdnActrInfoVO">
/* ActrInfoMapper.insertActrInfo : 위반행위자정보 등록 */
INSERT INTO tb_actr_info (
ACTR_INFO_ID,
SGG_CD,
CRDN_YR,
CRDN_NO,
ACT_INFO_ID,
OWNR_ID,
REG_DT,
RGTR,
DEL_YN
) VALUES (
CONCAT('ACTR', LPAD(NEXTVAL(seq_actr_info_id), 16, '0')),
#{sggCd},
#{crdnYr},
#{crdnNo},
#{actInfoId},
#{ownrId},
NOW(),
#{rgtr},
'N'
)
</insert>
<!-- 위반행위자정보 상세 조회 -->
<select id="selectActrInfoByPk" parameterType="String" resultType="CrdnActrInfoVO">
/* ActrInfoMapper.selectActrInfoByPk : 위반행위자정보 상세 조회 */
SELECT
ar.ACTR_INFO_ID,
ar.SGG_CD,
sgg.CD_NM AS SGG_CD_NM,
ar.CRDN_YR,
ar.CRDN_NO,
ar.ACT_INFO_ID,
ar.OWNR_ID,
ar.REG_DT,
ar.RGTR,
regUser.USER_ACNT AS RGTR_ACNT,
regUser.USER_NM AS RGTR_NM,
ar.DEL_YN,
ar.DEL_DT,
ar.DLTR,
o.FLNM AS OWNR_NM,
'' AS OWNR_BRTH_YMD,
o.RRNO AS OWNR_RRNO,
o.TELNO AS OWNR_TELNO,
'' AS OWNR_MBTLNO,
CONCAT(IFNULL(o.LOTNO_ADDR, ''), ' ', IFNULL(o.DTL_ADDR, '')) AS OWNR_ADDR,
o.DTL_ADDR AS OWNR_DTL_ADDR,
o.ZIP AS OWNR_ZIP
FROM tb_actr_info ar
LEFT JOIN tb_cd_detail sgg ON sgg.CD_GROUP_ID = 'ORG_CD' AND sgg.CD_ID = ar.SGG_CD AND sgg.USE_YN = 'Y'
LEFT JOIN tb_user regUser ON regUser.USER_ID = ar.RGTR
LEFT JOIN tb_ownr o ON o.OWNR_ID = ar.OWNR_ID AND o.DEL_YN = 'N'
WHERE ar.ACTR_INFO_ID = #{actrInfoId}
AND ar.DEL_YN = 'N'
</select>
<!-- 위반행위자정보 삭제 (논리삭제) -->
<update id="deleteActrInfo" parameterType="CrdnActrInfoVO">
/* ActrInfoMapper.deleteActrInfo : 위반행위자정보 삭제 (논리삭제) */
UPDATE tb_actr_info SET
DEL_YN = 'Y',
DEL_DT = NOW(),
DLTR = #{dltr}
WHERE ACTR_INFO_ID = #{actrInfoId}
AND DEL_YN = 'N'
</update>
</mapper>

@ -1,11 +1,11 @@
<?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.crdn.crndRegistAndView.ownrSelect.mapper.OwnrSelectMapper">
<mapper namespace="go.kr.project.crdn.crndRegistAndView.crdnOwnrSelect.mapper.CrdnOwnrSelectMapper">
<!-- 소유자 목록 조회 -->
<select id="selectOwnrList" parameterType="OwnrSelectVO"
resultType="OwnrSelectVO">
<select id="selectOwnrList" parameterType="CrdnOwnrSelectVO"
resultType="CrdnOwnrSelectVO">
/* OwnrSelectMapper.selectOwnrList : 소유자 목록 조회 */
SELECT
o.OWNR_ID,
@ -79,7 +79,7 @@
</select>
<!-- 소유자 총 개수 조회 -->
<select id="selectOwnrListTotalCount" parameterType="OwnrSelectVO" resultType="int">
<select id="selectOwnrListTotalCount" parameterType="CrdnOwnrSelectVO" resultType="int">
/* OwnrSelectMapper.selectOwnrListTotalCount : 소유자 총 개수 조회 */
SELECT COUNT(*)
FROM tb_ownr o
@ -106,7 +106,7 @@
</select>
<!-- 소유자 상세 조회 -->
<select id="selectOwnrByPk" parameterType="String" resultType="OwnrSelectVO">
<select id="selectOwnrByPk" parameterType="String" resultType="CrdnOwnrSelectVO">
/* OwnrSelectMapper.selectOwnrByPk : 소유자 상세 조회 */
SELECT
o.OWNR_ID,

@ -72,7 +72,7 @@
/**
* 소유자 선택 팝업 관리 네임스페이스
*/
var OwnrSelectPopup = {
var CrdnOwnrSelectPopup = {
/**
* 그리드 관련 객체
*/
@ -118,7 +118,7 @@
width: 60,
sortable: false,
formatter: function(e) {
return XitReverseRowNumberRenderer.format(OwnrSelectPopup.grid.instance.getData().length, e);
return XitReverseRowNumberRenderer.format(CrdnOwnrSelectPopup.grid.instance.getData().length, e);
}
},
{ header: '소유자ID', name: 'ownrId', align: 'center', width: 100, hidden: true },
@ -143,7 +143,7 @@
return {
api: {
readData: {
url: '<c:url value="/crdn/crndRegistAndView/ownrSelect/list.ajax"/>',
url: '<c:url value="/crdn/crndRegistAndView/crdnOwnrSelect/list.ajax"/>',
method: 'POST',
contentType: 'application/x-www-form-urlencoded',
processData: true
@ -198,7 +198,7 @@
this.instance.on('dblclick', function(ev) {
var rowData = self.instance.getRow(ev.rowKey);
if (rowData) {
OwnrSelectPopup.selectOwners([rowData]);
CrdnOwnrSelectPopup.selectOwners([rowData]);
}
});
},
@ -387,11 +387,11 @@
// DOM 준비 완료 시 초기화
$(document).ready(function() {
// 중요로직: 소유자 선택 그리드 초기화
OwnrSelectPopup.init();
CrdnOwnrSelectPopup.init();
});
// 전역 네임스페이스에 모듈 노출
window.OwnrSelectPopup = OwnrSelectPopup;
window.CrdnOwnrSelectPopup = CrdnOwnrSelectPopup;
})(window, jQuery);
</script>

@ -213,7 +213,7 @@
* 조사원 선택 팝업 열기
*/
openExmnrPopup: function () {
var popupUrl = '<c:url value="/crdn/crndRegistAndView/crdnExmnr/popup.do" />';
var popupUrl = '<c:url value="/crdn/crndRegistAndView/crdnExmnr/crdnExmnrSelectPopup.do" />';
var popupName = 'exmnrPopup';
var popupOptions = 'width=900,height=700,scrollbars=yes,resizable=yes,left=' +
Math.round((screen.width - 900) / 2 + 200) + ',top=' +

@ -2,16 +2,16 @@
<script type="text/javascript">
/**
* 수유자정보 그리드 모듈 (Grid4)
* 단속 데이터의 수유자 관련 정보를 표시합니다.
* 불법위반행위정보 그리드 모듈 (ActInfo)
* 단속 데이터의 불법위반행위 관련 정보를 표시합니다.
*/
(function(window, $) {
'use strict';
/**
* Grid4 (수유자정보) 관리 네임스페이스
* ActInfo (불법위반행위정보) 관리 네임스페이스
*/
var CrdnDetailViewGrid4 = {
var CrdnDetailViewActInfo = {
/**
* 그리드 관련 객체
*/
@ -34,7 +34,7 @@
// 기본 설정
gridConfig.setOptDataSource(dataSource); // 데이터소스 연결
gridConfig.setOptGridId('grid4'); // 그리드를 출력할 Element ID
gridConfig.setOptGridId('grid3'); // 그리드를 출력할 Element ID
gridConfig.setOptGridHeight(200); // 그리드 높이(단위: px)
gridConfig.setOptRowHeight(30); // 그리드 행 높이(단위: px)
gridConfig.setOptRowHeaderType('rowNum'); // 행 첫번째 셀 타입(rowNum: 순번)
@ -53,76 +53,85 @@
getGridColumns: function() {
return [
{
header: '단속년도',
name: 'crdnYr',
header: '행위시작일자',
name: 'actBgngYmd',
align: 'center',
width: 80,
sortable: true
width: 100,
formatter: function (e) {
return e.value ? moment(e.value).format('YYYY-MM-DD') : '';
}
},
{
header: '단속번호',
name: 'crdnNo',
header: '행위유형',
name: 'actTypeCdNm',
align: 'center',
width: 90,
sortable: true
width: 120
},
{
header: '수유자명',
name: 'ownerNm',
header: '위반법규1',
name: 'vltnLwrgCd1Nm',
align: 'center',
width: 120
},
{
header: '생년월일',
name: 'ownerBrthYmd',
header: '위반법규2',
name: 'vltnLwrgCd2Nm',
align: 'center',
width: 100,
formatter: function (e) {
return e.value ? moment(e.value).format('YYYY-MM-DD') : '';
}
width: 120
},
{
header: '주민등록번호',
name: 'ownerRrno',
header: '구조지수',
name: 'strctIdxCdNm',
align: 'center',
width: 130,
formatter: function(e) {
// 주민등록번호 뒷자리 마스킹 처리
if (e.value && e.value.length >= 7) {
return e.value.substring(0, 6) + '-' + e.value.substring(6, 7) + '******';
}
return e.value || '';
}
width: 100
},
{
header: '전화번호',
name: 'ownerTelno',
header: '용도지수',
name: 'usgIdxCdNm',
align: 'center',
width: 120
width: 100
},
{
header: '휴대폰번호',
name: 'ownerMbtlno',
align: 'center',
width: 120
header: '높이(m)',
name: 'hgt',
align: 'right',
width: 80,
formatter: function(e) {
return e.value ? Number(e.value).toFixed(2) : '';
}
},
{
header: '주소',
name: 'ownerAddr',
align: 'left',
width: 250
header: '가로(m)',
name: 'wdth',
align: 'right',
width: 80,
formatter: function(e) {
return e.value ? Number(e.value).toFixed(2) : '';
}
},
{
header: '관계',
name: 'rltnCdNm',
align: 'center',
width: 100
header: '세로(m)',
name: 'vrtc',
align: 'right',
width: 80,
formatter: function(e) {
return e.value ? Number(e.value).toFixed(2) : '';
}
},
{
header: '소유구분',
name: 'ownrshpSeCdNm',
align: 'center',
width: 100
header: '면적(㎡)',
name: 'area',
align: 'right',
width: 90,
formatter: function(e) {
return e.value ? Number(e.value).toFixed(2) : '';
}
},
{
header: '비고',
name: 'rmrk',
align: 'left',
width: 200
}
];
},
@ -135,7 +144,7 @@
return {
api: {
readData: {
url: '<c:url value="/crdn/crndRegistAndView/list.ajax"/>',
url: '<c:url value="/crdn/crndRegistAndView/crdnActInfo/list.ajax"/>',
method: 'POST',
contentType: 'application/x-www-form-urlencoded',
processData: true
@ -183,7 +192,7 @@
this.instance.on('click', function(ev) {
if (ev.rowKey !== undefined && ev.rowKey !== null) {
var rowData = self.instance.getRow(ev.rowKey);
console.log('Grid4 행 클릭:', rowData);
console.log('불법위반행위정보 행 클릭:', rowData);
}
});
@ -192,8 +201,8 @@
var rowKey = ev.rowKey;
var rowData = self.instance.getRow(rowKey);
if (rowData) {
console.log('Grid4 행 더블클릭:', rowData);
// 수유자 상세 정보 모달 또는 추가 동작 구현 가능
console.log('불법위반행위정보 행 더블클릭:', rowData);
// 불법위반행위 상세 정보 모달 또는 추가 동작 구현 가능
}
});
}
@ -206,7 +215,7 @@
search: function() {
if (this.grid.instance) {
this.grid.instance.readData();
console.log('Grid4 검색 실행');
console.log('불법위반행위정보 검색 실행');
}
},
@ -219,10 +228,10 @@
// 메인 모듈에 자신을 등록
if (window.CrdnDetailView) {
window.CrdnDetailView.registerGrid('grid4', this);
window.CrdnDetailView.registerGrid('actInfo', this);
}
console.log('Grid4 (수유자정보) 모듈이 초기화되었습니다.');
console.log('불법위반행위정보 모듈이 초기화되었습니다.');
}
};
@ -230,12 +239,12 @@
$(document).ready(function() {
// 메인 모듈이 로드될 때까지 약간의 지연
setTimeout(function() {
CrdnDetailViewGrid4.init();
}, 250);
CrdnDetailViewActInfo.init();
}, 200);
});
// 전역 네임스페이스에 모듈 노출
window.CrdnDetailViewGrid4 = CrdnDetailViewGrid4;
window.CrdnDetailViewActInfo = CrdnDetailViewActInfo;
})(window, jQuery);
</script>

@ -2,16 +2,16 @@
<script type="text/javascript">
/**
* 행위자정보 그리드 모듈 (Grid3)
* 단속 데이터의 행위자 관련 정보를 표시합니다.
* 위반행위자정보 그리드 모듈 (ActrInfo)
* 단속 데이터의 위반행위자 관련 정보를 표시합니다.
*/
(function(window, $) {
'use strict';
/**
* Grid3 (행위자정보) 관리 네임스페이스
* ActrInfo (위반행위자정보) 관리 네임스페이스
*/
var CrdnDetailViewGrid3 = {
var CrdnDetailViewActrInfo = {
/**
* 그리드 관련 객체
*/
@ -34,7 +34,7 @@
// 기본 설정
gridConfig.setOptDataSource(dataSource); // 데이터소스 연결
gridConfig.setOptGridId('grid3'); // 그리드를 출력할 Element ID
gridConfig.setOptGridId('grid4'); // 그리드를 출력할 Element ID
gridConfig.setOptGridHeight(200); // 그리드 높이(단위: px)
gridConfig.setOptRowHeight(30); // 그리드 행 높이(단위: px)
gridConfig.setOptRowHeaderType('rowNum'); // 행 첫번째 셀 타입(rowNum: 순번)
@ -53,37 +53,14 @@
getGridColumns: function() {
return [
{
header: '단속년도',
name: 'crdnYr',
align: 'center',
width: 80,
sortable: true
},
{
header: '단속번호',
name: 'crdnNo',
align: 'center',
width: 90,
sortable: true
},
{
header: '행위자명',
name: 'actorNm',
header: '소유자명',
name: 'ownrNm',
align: 'center',
width: 120
},
{
header: '생년월일',
name: 'brthYmd',
align: 'center',
width: 100,
formatter: function (e) {
return e.value ? moment(e.value).format('YYYY-MM-DD') : '';
}
},
{
header: '주민등록번호',
name: 'rrno',
name: 'ownrRrno',
align: 'center',
width: 130,
formatter: function(e) {
@ -96,27 +73,27 @@
},
{
header: '전화번호',
name: 'telno',
align: 'center',
width: 120
},
{
header: '휴대폰번호',
name: 'mbtlno',
name: 'ownrTelno',
align: 'center',
width: 120
},
{
header: '주소',
name: 'addr',
name: 'ownrAddr',
align: 'left',
width: 250
},
{
header: '업체명',
name: 'cmpnyNm',
header: '상세주소',
name: 'ownrDtlAddr',
align: 'left',
width: 150
width: 200
},
{
header: '우편번호',
name: 'ownrZip',
align: 'center',
width: 80
}
];
},
@ -129,7 +106,7 @@
return {
api: {
readData: {
url: '<c:url value="/crdn/crndRegistAndView/list.ajax"/>',
url: '<c:url value="/crdn/crndRegistAndView/crdnActrInfo/list.ajax"/>',
method: 'POST',
contentType: 'application/x-www-form-urlencoded',
processData: true
@ -177,7 +154,7 @@
this.instance.on('click', function(ev) {
if (ev.rowKey !== undefined && ev.rowKey !== null) {
var rowData = self.instance.getRow(ev.rowKey);
console.log('Grid3 행 클릭:', rowData);
console.log('위반행위자정보 행 클릭:', rowData);
}
});
@ -186,8 +163,8 @@
var rowKey = ev.rowKey;
var rowData = self.instance.getRow(rowKey);
if (rowData) {
console.log('Grid3 행 더블클릭:', rowData);
// 행위자 상세 정보 모달 또는 추가 동작 구현 가능
console.log('위반행위자정보 행 더블클릭:', rowData);
// 위반행위자 상세 정보 모달 또는 추가 동작 구현 가능
}
});
}
@ -200,7 +177,7 @@
search: function() {
if (this.grid.instance) {
this.grid.instance.readData();
console.log('Grid3 검색 실행');
console.log('위반행위자정보 검색 실행');
}
},
@ -213,10 +190,10 @@
// 메인 모듈에 자신을 등록
if (window.CrdnDetailView) {
window.CrdnDetailView.registerGrid('grid3', this);
window.CrdnDetailView.registerGrid('actrInfo', this);
}
console.log('Grid3 (행위자정보) 모듈이 초기화되었습니다.');
console.log('위반행위자정보 모듈이 초기화되었습니다.');
}
};
@ -224,12 +201,12 @@
$(document).ready(function() {
// 메인 모듈이 로드될 때까지 약간의 지연
setTimeout(function() {
CrdnDetailViewGrid3.init();
}, 200);
CrdnDetailViewActrInfo.init();
}, 250);
});
// 전역 네임스페이스에 모듈 노출
window.CrdnDetailViewGrid3 = CrdnDetailViewGrid3;
window.CrdnDetailViewActrInfo = CrdnDetailViewActrInfo;
})(window, jQuery);
</script>

@ -162,7 +162,7 @@
var crdnYr = $('#crdnYr').val();
var crdnNo = $('#crdnNo').val();
var url = '<c:url value="/crdn/crndRegistAndView/ownrSelect/popup.do"/>' +
var url = '<c:url value="/crdn/crndRegistAndView/crdnOwnrSelect/crdnOwnrSelectPopup.do"/>' +
'?crdnYr=' + encodeURIComponent(crdnYr) +
'&crdnNo=' + encodeURIComponent(crdnNo);
var w = 1000, h = 800;

@ -160,8 +160,8 @@
<!-- 각 그리드별 개별 JSP 포함 -->
<%@ include file="detailView-pstn.jsp" %>
<%@ include file="detailView-ownrInfo.jsp" %>
<%@ include file="detailView-grid3.jsp" %>
<%@ include file="detailView-grid4.jsp" %>
<%@ include file="detailView-actInfo.jsp" %>
<%@ include file="detailView-actrInfo.jsp" %>
<script type="text/javascript">
/**
@ -204,8 +204,8 @@
// 각 그리드 모듈 인스턴스들
pstn: null,
ownrInfo: null,
grid3: null,
grid4: null
actInfo: null,
actrInfo: null
},
/**
@ -335,11 +335,11 @@
if (this.grids.ownrInfo && this.grids.ownrInfo.search) {
this.grids.ownrInfo.search();
}
if (this.grids.grid3 && this.grids.grid3.search) {
this.grids.grid3.search();
if (this.grids.actInfo && this.grids.actInfo.search) {
this.grids.actInfo.search();
}
if (this.grids.grid4 && this.grids.grid4.search) {
this.grids.grid4.search();
if (this.grids.actrInfo && this.grids.actrInfo.search) {
this.grids.actrInfo.search();
}
},
@ -347,7 +347,7 @@
* 조사원 선택 팝업 열기 (한글 주석: crdnExmnr 팝업 호출 로직)
*/
openExmnrPopup: function() {
var popupUrl = '<c:url value="/crdn/crndRegistAndView/crdnExmnr/popup.do" />';
var popupUrl = '<c:url value="/crdn/crndRegistAndView/crdnExmnr/crdnExmnrSelectPopup.do" />';
var w = 900, h = 700;
var left = Math.max(0, (screen.width - w) / 2);
var top = Math.max(0, (screen.height - h) / 2);

Loading…
Cancel
Save