재부과 그리드 테스트
parent
2def888522
commit
dade725948
@ -0,0 +1,127 @@
|
|||||||
|
package go.kr.project.levy.levyRelevy.controller;
|
||||||
|
|
||||||
|
import egovframework.constant.TilesConstants;
|
||||||
|
import egovframework.util.ApiResponseUtil;
|
||||||
|
import go.kr.project.common.model.CmmnCodeSearchVO;
|
||||||
|
import go.kr.project.common.service.CommonCodeService;
|
||||||
|
import go.kr.project.crdn.crndRegistAndView.main.model.CrdnRegistAndViewVO;
|
||||||
|
import go.kr.project.crdn.crndRegistAndView.main.service.CrdnImpltTaskService;
|
||||||
|
import go.kr.project.levy.levyRelevy.model.LevyRelevyVO;
|
||||||
|
import go.kr.project.levy.levyRelevy.service.LevyRelevyService;
|
||||||
|
import io.swagger.v3.oas.annotations.Operation;
|
||||||
|
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.GetMapping;
|
||||||
|
import org.springframework.web.bind.annotation.ModelAttribute;
|
||||||
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* packageName : go.kr.project.levy.levyRelevy.controller
|
||||||
|
* fileName : LevyRelevyController
|
||||||
|
* author : 시스템 관리자
|
||||||
|
* date : 2025-08-25
|
||||||
|
* description : 재부과 관련 요청을 처리하는 컨트롤러
|
||||||
|
* 중요한 로직 주석: 재부과 대상 조회 화면 제공 및 목록 조회 API를 처리하는 컨트롤러
|
||||||
|
* ===========================================================
|
||||||
|
* DATE AUTHOR NOTE
|
||||||
|
* -----------------------------------------------------------
|
||||||
|
* 2025-08-25 시스템 관리자 최초 생성
|
||||||
|
*/
|
||||||
|
@Controller
|
||||||
|
@RequestMapping("/levy/levyRelevy")
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
@Slf4j
|
||||||
|
@Tag(name = "재부과", description = "재부과 관련 API")
|
||||||
|
public class LevyRelevyController {
|
||||||
|
|
||||||
|
/** 재부과 서비스 */
|
||||||
|
private final LevyRelevyService service;
|
||||||
|
|
||||||
|
/** 이행정보 서비스 */
|
||||||
|
private final CrdnImpltTaskService crdnImpltTaskService;
|
||||||
|
|
||||||
|
private final CommonCodeService commonCodeService;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 재부과 대상 목록 화면을 제공하고, 검색 조건에 사용될 공통코드를 모델에 추가한다.
|
||||||
|
* @param model 뷰에 전달할 데이터를 담는 모델 객체
|
||||||
|
* @return 재부과 대상 목록 화면 경로
|
||||||
|
*/
|
||||||
|
@GetMapping("/list.do")
|
||||||
|
@Operation(summary = "재부과 대상 목록 화면", description = "재부과 대상 목록을 조회하는 화면을 제공합니다.")
|
||||||
|
public String list( Model model ) {
|
||||||
|
log.debug("재부과 대상 목록 화면 요청");
|
||||||
|
|
||||||
|
//법정동 읍면동 코드 조회
|
||||||
|
CmmnCodeSearchVO stdgEmdCdSearchVO = CmmnCodeSearchVO.builder()
|
||||||
|
.searchCdGroupId("STDG_EMD_CD")
|
||||||
|
.sortColumn("SORT_ORDR")
|
||||||
|
.sortAscending(true)
|
||||||
|
.build();
|
||||||
|
model.addAttribute("stdgEmdCdList", commonCodeService.selectCodeDetailList(stdgEmdCdSearchVO));
|
||||||
|
|
||||||
|
//지역구분 코드 조회
|
||||||
|
CmmnCodeSearchVO rgnSeCdSearchVO = CmmnCodeSearchVO.builder()
|
||||||
|
.searchCdGroupId("RGN_SE_CD")
|
||||||
|
.sortColumn("SORT_ORDR")
|
||||||
|
.sortAscending(true)
|
||||||
|
.build();
|
||||||
|
model.addAttribute("regionList", commonCodeService.selectCodeDetailList(rgnSeCdSearchVO));
|
||||||
|
|
||||||
|
//적발방법 코드 조회
|
||||||
|
CmmnCodeSearchVO dsclMthdCdSearchVO = CmmnCodeSearchVO.builder()
|
||||||
|
.searchCdGroupId("DSCL_MTHD_CD")
|
||||||
|
.sortColumn("CD_NM")
|
||||||
|
.sortAscending(true)
|
||||||
|
.build();
|
||||||
|
model.addAttribute("dsclMthdCdList", commonCodeService.selectCodeDetailList(dsclMthdCdSearchVO));
|
||||||
|
|
||||||
|
//진행단계 코드 조회
|
||||||
|
CmmnCodeSearchVO crdnPrcsSttsCdSearchVO = CmmnCodeSearchVO.builder()
|
||||||
|
.searchCdGroupId("CRDN_PRCS_STTS_CD")
|
||||||
|
.sortColumn("SORT_ORDR")
|
||||||
|
.sortAscending(true)
|
||||||
|
.build();
|
||||||
|
model.addAttribute("crdnPrcsSttsCdList", commonCodeService.selectCodeDetailList(crdnPrcsSttsCdSearchVO));
|
||||||
|
|
||||||
|
return "levy/levyRelevy/list" + TilesConstants.BASE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 재부과 대상 목록을 조회하는 AJAX 메소드
|
||||||
|
* 공통 응답 형식(ApiResponse)을 사용하여 응답합니다.
|
||||||
|
*
|
||||||
|
* @param paramVO 검색 조건을 담은 VO 객체
|
||||||
|
* @return 재부과 대상 목록과 성공 상태를 담은 ResponseEntity 객체
|
||||||
|
*/
|
||||||
|
@Operation(summary = "재부과 대상 목록 조회 (AJAX)", description = "재부과 대상 목록을 조회하고 JSON 형식으로 반환합니다.")
|
||||||
|
@ApiResponses(value = {
|
||||||
|
@ApiResponse(responseCode = "200", description = "재부과 대상 목록 조회 성공"),
|
||||||
|
@ApiResponse(responseCode = "400", description = "재부과 대상 목록 조회 실패"),
|
||||||
|
@ApiResponse(description = "오류로 인한 실패")
|
||||||
|
})
|
||||||
|
@PostMapping("/list.ajax")
|
||||||
|
public ResponseEntity<?> listAjax(@ModelAttribute LevyRelevyVO paramVO) {
|
||||||
|
|
||||||
|
// 총 재부과 대상 수 조회
|
||||||
|
int totalCount = service.selectListTotalCount(paramVO);
|
||||||
|
paramVO.setTotalCount(totalCount);
|
||||||
|
|
||||||
|
// 페이징 처리를 위한 설정
|
||||||
|
paramVO.setPagingYn("Y");
|
||||||
|
|
||||||
|
// 페이징 처리된 재부과 대상 목록 조회
|
||||||
|
List<LevyRelevyVO> list = service.selectList(paramVO);
|
||||||
|
return ApiResponseUtil.successWithGrid(list, paramVO);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,38 @@
|
|||||||
|
package go.kr.project.levy.levyRelevy.mapper;
|
||||||
|
|
||||||
|
import go.kr.project.levy.levyRelevy.model.LevyRelevyVO;
|
||||||
|
import org.apache.ibatis.annotations.Mapper;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* packageName : go.kr.project.levy.levyRelevy.mapper
|
||||||
|
* fileName : LevyRelevyMapper
|
||||||
|
* author : 시스템 관리자
|
||||||
|
* date : 2025-08-25
|
||||||
|
* description : 재부과 관련 데이터베이스 접근을 위한 MyBatis 매퍼 인터페이스
|
||||||
|
* 중요한 로직 주석: 재부과 조회를 위해 단속 테이블(tb_crdn)에 대한 조회 작업을 수행하는 매퍼 인터페이스
|
||||||
|
* ===========================================================
|
||||||
|
* DATE AUTHOR NOTE
|
||||||
|
* -----------------------------------------------------------
|
||||||
|
* 2025-08-25 시스템 관리자 최초 생성
|
||||||
|
*/
|
||||||
|
@Mapper
|
||||||
|
public interface LevyRelevyMapper {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 재부과 대상 목록을 조회한다.
|
||||||
|
* @param vo 검색 조건과 페이징 정보를 담은 VO 객체
|
||||||
|
* @return 재부과 대상 목록
|
||||||
|
*/
|
||||||
|
List<LevyRelevyVO> selectList(LevyRelevyVO vo);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 재부과 대상 목록의 총 개수를 조회한다.
|
||||||
|
* @param vo 검색 조건을 담은 VO 객체
|
||||||
|
* @return 조회된 목록의 총 개수
|
||||||
|
*/
|
||||||
|
int selectListTotalCount(LevyRelevyVO vo);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,211 @@
|
|||||||
|
package go.kr.project.levy.levyRelevy.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.levy.levyRelevy.model
|
||||||
|
* fileName : LevyRelevyVO
|
||||||
|
* author : 시스템 관리자
|
||||||
|
* date : 2025-08-25
|
||||||
|
* description : 재부과 관련 데이터를 담는 Value Object 클래스
|
||||||
|
* 중요한 로직 주석: 재부과 조회를 위해 단속 테이블(tb_crdn)과 매핑되는 VO 클래스로 페이징 기능을 포함한다.
|
||||||
|
* ===========================================================
|
||||||
|
* DATE AUTHOR NOTE
|
||||||
|
* -----------------------------------------------------------
|
||||||
|
* 2025-08-25 시스템 관리자 최초 생성
|
||||||
|
*/
|
||||||
|
@EqualsAndHashCode(callSuper=true)
|
||||||
|
@Data
|
||||||
|
@Builder
|
||||||
|
@AllArgsConstructor
|
||||||
|
@NoArgsConstructor
|
||||||
|
@ToString
|
||||||
|
public class LevyRelevyVO extends PagingVO {
|
||||||
|
|
||||||
|
// ==================== 기본 테이블 컬럼 ====================
|
||||||
|
|
||||||
|
/** 단속 연도 */
|
||||||
|
private String crdnYr;
|
||||||
|
|
||||||
|
/** 단속 번호 */
|
||||||
|
private String crdnNo;
|
||||||
|
|
||||||
|
/** 시군구 코드(그룹코드:ORG_CD, 로그인한 사용자정보에서 ORG_CD 가져온다.) */
|
||||||
|
private String sggCd;
|
||||||
|
|
||||||
|
/** 지역 구분 코드 */
|
||||||
|
private String rgnSeCd;
|
||||||
|
|
||||||
|
/** 적발 방법 코드 */
|
||||||
|
private String dsclMthdCd;
|
||||||
|
|
||||||
|
/** 적발 일자 */
|
||||||
|
private String dsclYmd;
|
||||||
|
|
||||||
|
/** 조사원 */
|
||||||
|
private String exmnr;
|
||||||
|
|
||||||
|
|
||||||
|
/** 비고 */
|
||||||
|
private String rmrk;
|
||||||
|
|
||||||
|
/** 처분 사전 시작 일자 */
|
||||||
|
private String dspsBfhdBgngYmd;
|
||||||
|
|
||||||
|
/** 처분 사전 종료 일자 */
|
||||||
|
private String dspsBfhdEndYmd;
|
||||||
|
|
||||||
|
/** 시정 명령 시작 일자 */
|
||||||
|
private String crcCmdBgngYmd;
|
||||||
|
|
||||||
|
/** 시정 명령 종료 일자 */
|
||||||
|
private String crcCmdEndYmd;
|
||||||
|
|
||||||
|
/** 시정 촉구 시작 일자 */
|
||||||
|
private String crcUrgBgngYmd;
|
||||||
|
|
||||||
|
/** 시정 촉구 종료 일자 */
|
||||||
|
private String crcUrgEndYmd;
|
||||||
|
|
||||||
|
/** 부과 예고 시작 일자 */
|
||||||
|
private String levyPrvntcBgngYmd;
|
||||||
|
|
||||||
|
/** 부과 예고 종료 일자 */
|
||||||
|
private String levyPrvntcEndYmd;
|
||||||
|
|
||||||
|
/** 부과 시작 일자 */
|
||||||
|
private String levyBgngYmd;
|
||||||
|
|
||||||
|
/** 부과 종료 일자 */
|
||||||
|
private String levyEndYmd;
|
||||||
|
|
||||||
|
/** 납부 촉구 시작 일자 */
|
||||||
|
private String payUrgBgngYmd;
|
||||||
|
|
||||||
|
/** 납부 촉구 종료 일자 */
|
||||||
|
private String payUrgEndYmd;
|
||||||
|
|
||||||
|
/** 최초 단속 연도 */
|
||||||
|
private String frstCrdnYr;
|
||||||
|
|
||||||
|
/** 최초 단속 번호 */
|
||||||
|
private String frstCrdnNo;
|
||||||
|
|
||||||
|
/** 재부과 여부 */
|
||||||
|
private String relevyYn;
|
||||||
|
|
||||||
|
/** 가중 부과 대상 여부 */
|
||||||
|
private String agrvtnLevyTrgtYn;
|
||||||
|
|
||||||
|
/* 단속 처리 상태 코드 */
|
||||||
|
private String crdnPrcsSttsCd;
|
||||||
|
|
||||||
|
/* 단속 처리 일자 */
|
||||||
|
private String crdnPrcsYmd;
|
||||||
|
|
||||||
|
/* 법정동 읍면동 코드 */
|
||||||
|
private String stdgEmdCd;
|
||||||
|
|
||||||
|
/* 행위 유형 코드 */
|
||||||
|
private String actTypeCd;
|
||||||
|
|
||||||
|
/* 용도 지수 코드 */
|
||||||
|
private String usgIdxCd;
|
||||||
|
|
||||||
|
/** 등록 일시 */
|
||||||
|
@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 rgtrAcnt;
|
||||||
|
|
||||||
|
/** 등록자 사용자명 */
|
||||||
|
private String rgtrNm;
|
||||||
|
|
||||||
|
/** 삭제 여부 */
|
||||||
|
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 rgnSeCdNm;
|
||||||
|
|
||||||
|
/** 적발 방법 코드명 */
|
||||||
|
private String dsclMthdCdNm;
|
||||||
|
|
||||||
|
|
||||||
|
/** 단속 처리 상태 코드명 */
|
||||||
|
private String crdnPrcsSttsCdNm;
|
||||||
|
|
||||||
|
/** 소유자명들 (쉼표로 구분) */
|
||||||
|
private String ownrNams;
|
||||||
|
|
||||||
|
/** 행위자명들 (쉼표로 구분) */
|
||||||
|
private String actrNams;
|
||||||
|
|
||||||
|
/** 법정동 읍면동 코드명 */
|
||||||
|
private String stdgEmdCdNm;
|
||||||
|
|
||||||
|
/** 행위 유형 코드명 */
|
||||||
|
private String actTypeCdNm;
|
||||||
|
|
||||||
|
/** 용도 지수 코드명 */
|
||||||
|
private String usgIdxCdNm;
|
||||||
|
|
||||||
|
/** 지번 전체 주소 */
|
||||||
|
private String lotnoWholAddr;
|
||||||
|
|
||||||
|
/** 우편번호 */
|
||||||
|
private String zip;
|
||||||
|
|
||||||
|
/** 역순 행 번호 (그리드 표시용) */
|
||||||
|
private Integer rowNum;
|
||||||
|
|
||||||
|
|
||||||
|
// ==================== 검색 조건 ====================
|
||||||
|
|
||||||
|
/** 검색 조건 - 단속 연도 */
|
||||||
|
private String schCrdnYr;
|
||||||
|
|
||||||
|
/** 검색 조건 - 단속 번호 */
|
||||||
|
private String schCrdnNo;
|
||||||
|
|
||||||
|
/** 검색 조건 - 법정동 읍면동 코드 */
|
||||||
|
private String schStdgEmdCd;
|
||||||
|
|
||||||
|
/** 검색 조건 - 지역 구분 코드 */
|
||||||
|
private String schRgnSeCd;
|
||||||
|
|
||||||
|
/** 검색 조건 - 적발 방법 코드 */
|
||||||
|
private String schDsclMthdCd;
|
||||||
|
|
||||||
|
/** 검색 조건 - 조사원 */
|
||||||
|
private String schExmnr;
|
||||||
|
|
||||||
|
/** 검색 조건 - 진행단계 코드 */
|
||||||
|
private String schCrdnPrcsSttsCd;
|
||||||
|
|
||||||
|
/** 검색 조건 - 가중 부과 대상 여부 */
|
||||||
|
private String schAgrvtnLevyTrgtYn;
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,37 @@
|
|||||||
|
package go.kr.project.levy.levyRelevy.service;
|
||||||
|
|
||||||
|
import go.kr.project.levy.levyRelevy.model.LevyRelevyVO;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* packageName : go.kr.project.levy.levyRelevy.service
|
||||||
|
* fileName : LevyRelevyService
|
||||||
|
* author : 박성영
|
||||||
|
* date : 2025-08-25
|
||||||
|
* description : 재부과 관련 비즈니스 로직을 처리하는 서비스 인터페이스
|
||||||
|
* ===========================================================
|
||||||
|
* DATE AUTHOR NOTE
|
||||||
|
* -----------------------------------------------------------
|
||||||
|
* 2025-08-25 박성영 최초 생성
|
||||||
|
*/
|
||||||
|
public interface LevyRelevyService {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 재부과 대상 목록을 조회합니다.
|
||||||
|
*
|
||||||
|
* @param vo 검색 조건과 페이징 정보를 담은 VO 객체
|
||||||
|
* @return 재부과 대상 목록
|
||||||
|
*/
|
||||||
|
List<LevyRelevyVO> selectList(LevyRelevyVO vo);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 재부과 대상 목록의 총 개수를 조회합니다.
|
||||||
|
*
|
||||||
|
* @param vo 검색 조건을 담은 VO 객체
|
||||||
|
* @return 조회된 목록의 총 개수
|
||||||
|
*/
|
||||||
|
int selectListTotalCount(LevyRelevyVO vo);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,54 @@
|
|||||||
|
package go.kr.project.levy.levyRelevy.service.impl;
|
||||||
|
|
||||||
|
import go.kr.project.levy.levyRelevy.mapper.LevyRelevyMapper;
|
||||||
|
import go.kr.project.levy.levyRelevy.model.LevyRelevyVO;
|
||||||
|
import go.kr.project.levy.levyRelevy.service.LevyRelevyService;
|
||||||
|
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.levy.levyRelevy.service.impl
|
||||||
|
* fileName : LevyRelevyServiceImpl
|
||||||
|
* author : 박성영
|
||||||
|
* date : 2025-08-25
|
||||||
|
* description : 재부과 관련 비즈니스 로직을 처리하는 서비스 구현체
|
||||||
|
* 중요한 로직 주석: 재부과 대상 조회 시 페이징 처리와 검색 조건을 적용하여 목록을 제공한다.
|
||||||
|
* ===========================================================
|
||||||
|
* DATE AUTHOR NOTE
|
||||||
|
* -----------------------------------------------------------
|
||||||
|
* 2025-08-25 박성영 최초 생성
|
||||||
|
*/
|
||||||
|
@Service
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
@Slf4j
|
||||||
|
public class LevyRelevyServiceImpl extends EgovAbstractServiceImpl implements LevyRelevyService {
|
||||||
|
|
||||||
|
private final LevyRelevyMapper mapper;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 재부과 대상 목록을 조회합니다.
|
||||||
|
*
|
||||||
|
* @param vo 검색 조건과 페이징 정보를 담은 VO 객체
|
||||||
|
* @return 재부과 대상 목록
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public List<LevyRelevyVO> selectList(LevyRelevyVO vo) {
|
||||||
|
return mapper.selectList(vo);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 재부과 대상 목록의 총 개수를 조회합니다.
|
||||||
|
*
|
||||||
|
* @param vo 검색 조건을 담은 VO 객체
|
||||||
|
* @return 조회된 목록의 총 개수
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public int selectListTotalCount(LevyRelevyVO vo) {
|
||||||
|
return mapper.selectListTotalCount(vo);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,137 @@
|
|||||||
|
<?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.levy.levyRelevy.mapper.LevyRelevyMapper">
|
||||||
|
|
||||||
|
<!-- 단속 목록 조회 -->
|
||||||
|
<select id="selectList" parameterType="LevyRelevyVO" resultType="LevyRelevyVO">
|
||||||
|
/* CrdnRegistAndViewMapper.selectList : 단속 목록 조회 */
|
||||||
|
SELECT
|
||||||
|
c.CRDN_YR, /* 단속 연도 */
|
||||||
|
c.CRDN_NO, /* 단속 번호 */
|
||||||
|
c.SGG_CD, /* 시군구 코드 */
|
||||||
|
sgg.CD_NM AS SGG_CD_NM,
|
||||||
|
c.RGN_SE_CD, /* 지역 구분 코드 */
|
||||||
|
rgn.CD_NM AS RGN_SE_CD_NM,
|
||||||
|
c.DSCL_MTHD_CD, /* 단속 방법 코드 */
|
||||||
|
dscl.CD_NM AS DSCL_MTHD_CD_NM,
|
||||||
|
c.DSCL_YMD, /* 적발 일자 */
|
||||||
|
c.EXMNR, /* 조사원 */
|
||||||
|
c.RMRK, /* 비고 */
|
||||||
|
c.DSPS_BFHD_BGNG_YMD, /* 사전처분 시작일 */
|
||||||
|
c.DSPS_BFHD_END_YMD, /* 사전처분 종료일 */
|
||||||
|
c.CRC_CMD_BGNG_YMD, /* 시정명령 시작일 */
|
||||||
|
c.CRC_CMD_END_YMD, /* 시정명령 종료일 */
|
||||||
|
c.CRC_URG_BGNG_YMD, /* 시정촉구 시작일 */
|
||||||
|
c.CRC_URG_END_YMD, /* 시정촉구 종료일 */
|
||||||
|
c.LEVY_PRVNTC_BGNG_YMD, /* 부과예고 시작일 */
|
||||||
|
c.LEVY_PRVNTC_END_YMD, /* 부과예고 종료일 */
|
||||||
|
c.LEVY_BGNG_YMD, /* 부과 시작일 */
|
||||||
|
c.LEVY_END_YMD, /* 부과 종료일 */
|
||||||
|
c.PAY_URG_BGNG_YMD, /* 납부촉구 시작일 */
|
||||||
|
c.PAY_URG_END_YMD, /* 납부촉구 종료일 */
|
||||||
|
c.FRST_CRDN_YR, /* 최초 단속 연도 */
|
||||||
|
c.FRST_CRDN_NO, /* 최초 단속 번호 */
|
||||||
|
c.RELEVY_YN, /* 재과 여부 */
|
||||||
|
c.AGRVTN_LEVY_TRGT_YN, /* 가중 부과 대상 여부 */
|
||||||
|
c.CRDN_PRCS_STTS_CD, /* 단속 처리 상태 코드 */
|
||||||
|
stts.CD_NM AS CRDN_PRCS_STTS_CD_NM,
|
||||||
|
c.CRDN_PRCS_YMD, /* 단속 처리 일자 */
|
||||||
|
c.REG_DT,
|
||||||
|
c.RGTR,
|
||||||
|
u.USER_ACNT AS RGTR_ACNT,
|
||||||
|
u.USER_NM AS RGTR_NM,
|
||||||
|
p.LOTNO_WHOL_ADDR, /* 지번 전체 주소 */
|
||||||
|
p.STDG_EMD_CD, /* 법정동 읍면동 코드 */
|
||||||
|
emd.CD_NM AS STDG_EMD_CD_NM,
|
||||||
|
p.ZIP,
|
||||||
|
(SELECT GROUP_CONCAT(DISTINCT o2.FLNM SEPARATOR ', ')
|
||||||
|
FROM tb_ownr_info oi2
|
||||||
|
LEFT JOIN tb_ownr o2 ON o2.OWNR_ID = oi2.OWNR_ID AND o2.DEL_YN = 'N'
|
||||||
|
WHERE oi2.CRDN_YR = c.CRDN_YR
|
||||||
|
AND oi2.CRDN_NO = c.CRDN_NO
|
||||||
|
AND oi2.DEL_YN = 'N') AS OWNR_NAMS,
|
||||||
|
(SELECT GROUP_CONCAT(DISTINCT o2.FLNM SEPARATOR ', ')
|
||||||
|
FROM tb_actr_info ai
|
||||||
|
LEFT JOIN tb_ownr o2 ON o2.OWNR_ID = ai.OWNR_ID AND o2.DEL_YN = 'N'
|
||||||
|
WHERE ai.CRDN_YR = c.CRDN_YR
|
||||||
|
AND ai.CRDN_NO = c.CRDN_NO
|
||||||
|
AND ai.DEL_YN = 'N') AS ACTR_NAMS,
|
||||||
|
a.ACT_TYPE_CD, /* 행위 유형 코드 */
|
||||||
|
CASE WHEN (SELECT COUNT(1) FROM tb_act_info a2 WHERE a2.CRDN_YR = a.CRDN_YR AND a2.CRDN_NO = a.CRDN_NO AND a2.DEL_YN='N') > 1 THEN
|
||||||
|
CONCAT(act.VLTN_BDST, ' 등 ', (SELECT COUNT(1) FROM tb_act_info a2 WHERE a2.CRDN_YR = a.CRDN_YR AND a2.CRDN_NO = a.CRDN_NO AND a2.DEL_YN='N'), '건')
|
||||||
|
ELSE act.VLTN_BDST END ACT_TYPE_CD_NM,
|
||||||
|
a.USG_IDX_CD, /* 용도 지수 코드 */
|
||||||
|
usg.USG_NM AS USG_IDX_CD_NM
|
||||||
|
FROM tb_crdn c
|
||||||
|
LEFT JOIN tb_cd_detail sgg ON sgg.CD_GROUP_ID = 'ORG_CD' AND sgg.CD_ID = c.SGG_CD
|
||||||
|
LEFT JOIN tb_cd_detail rgn ON rgn.CD_GROUP_ID = 'RGN_SE_CD' AND rgn.CD_ID = c.RGN_SE_CD
|
||||||
|
LEFT JOIN tb_cd_detail dscl ON dscl.CD_GROUP_ID = 'DSCL_MTHD_CD' AND dscl.CD_ID = c.DSCL_MTHD_CD
|
||||||
|
LEFT JOIN tb_cd_detail stts ON stts.CD_GROUP_ID = 'CRDN_PRCS_STTS_CD' AND stts.CD_ID = c.CRDN_PRCS_STTS_CD
|
||||||
|
LEFT JOIN tb_user u ON u.USER_ID = c.RGTR AND u.USE_YN = 'Y'
|
||||||
|
LEFT JOIN tb_pstn_info p ON p.CRDN_YR = c.CRDN_YR AND p.CRDN_NO = c.CRDN_NO AND p.DEL_YN = 'N'
|
||||||
|
LEFT JOIN tb_cd_detail emd ON emd.CD_GROUP_ID = 'STDG_EMD_CD' AND emd.CD_ID = p.STDG_EMD_CD
|
||||||
|
LEFT Join tb_act_info a ON a.CRDN_YR = c.CRDN_YR and a.CRDN_NO = c.CRDN_NO AND a.DEL_YN = 'N' AND a.ACT_NO = (SELECT MIN(a1.ACT_NO) FROM tb_act_info a1 WHERE a1.CRDN_YR = a.CRDN_YR AND a1.CRDN_NO = a.CRDN_NO AND a1.DEL_YN='N')
|
||||||
|
LEFT JOIN tb_act_type act ON act.ACT_TYPE_CD = a.ACT_TYPE_CD
|
||||||
|
LEFT JOIN tb_usg_idx usg ON usg.USG_IDX_CD = a.USG_IDX_CD AND usg.DEL_YN = 'N'
|
||||||
|
WHERE c.DEL_YN = 'N'
|
||||||
|
<if test='schCrdnYr != null and schCrdnYr != ""'>
|
||||||
|
AND c.CRDN_YR = #{schCrdnYr}
|
||||||
|
</if>
|
||||||
|
<if test='schCrdnNo != null and schCrdnNo != ""'>
|
||||||
|
AND c.CRDN_NO LIKE CONCAT('%', #{schCrdnNo}, '%')
|
||||||
|
</if>
|
||||||
|
<if test='schStdgEmdCd != null and schStdgEmdCd != ""'>
|
||||||
|
AND p.STDG_EMD_CD = #{schStdgEmdCd}
|
||||||
|
</if>
|
||||||
|
<if test='schRgnSeCd != null and schRgnSeCd != ""'>
|
||||||
|
AND c.RGN_SE_CD = #{schRgnSeCd}
|
||||||
|
</if>
|
||||||
|
<if test='schDsclMthdCd != null and schDsclMthdCd != ""'>
|
||||||
|
AND c.DSCL_MTHD_CD = #{schDsclMthdCd}
|
||||||
|
</if>
|
||||||
|
<if test='schExmnr != null and schExmnr != ""'>
|
||||||
|
AND c.EXMNR LIKE CONCAT('%', #{schExmnr}, '%')
|
||||||
|
</if>
|
||||||
|
<if test='schCrdnPrcsSttsCd != null and schCrdnPrcsSttsCd != ""'>
|
||||||
|
AND c.CRDN_PRCS_STTS_CD = #{schCrdnPrcsSttsCd}
|
||||||
|
</if>
|
||||||
|
<if test='schAgrvtnLevyTrgtYn != null and schAgrvtnLevyTrgtYn != ""'>
|
||||||
|
AND c.AGRVTN_LEVY_TRGT_YN = #{schAgrvtnLevyTrgtYn}
|
||||||
|
</if>
|
||||||
|
ORDER BY c.CRDN_YR DESC, c.CRDN_NO DESC
|
||||||
|
<if test='pagingYn != null and pagingYn == "Y"'>
|
||||||
|
limit #{startIndex}, #{perPage} /* 서버사이드 페이징 처리 */
|
||||||
|
</if>
|
||||||
|
</select>
|
||||||
|
|
||||||
|
<!-- 단속 목록 총 개수 조회 -->
|
||||||
|
<select id="selectListTotalCount" parameterType="LevyRelevyVO" resultType="int">
|
||||||
|
/* CrdnRegistAndViewMapper.selectListTotalCount : 단속 목록 총 개수 조회 */
|
||||||
|
SELECT COUNT(*)
|
||||||
|
FROM tb_crdn c
|
||||||
|
WHERE c.DEL_YN = 'N'
|
||||||
|
<if test='schCrdnYr != null and schCrdnYr != ""'>
|
||||||
|
AND c.CRDN_YR = #{schCrdnYr}
|
||||||
|
</if>
|
||||||
|
<if test='schCrdnNo != null and schCrdnNo != ""'>
|
||||||
|
AND c.CRDN_NO LIKE CONCAT('%', #{schCrdnNo}, '%')
|
||||||
|
</if>
|
||||||
|
<if test='schRgnSeCd != null and schRgnSeCd != ""'>
|
||||||
|
AND c.RGN_SE_CD = #{schRgnSeCd}
|
||||||
|
</if>
|
||||||
|
<if test='schDsclMthdCd != null and schDsclMthdCd != ""'>
|
||||||
|
AND c.DSCL_MTHD_CD = #{schDsclMthdCd}
|
||||||
|
</if>
|
||||||
|
<if test='schExmnr != null and schExmnr != ""'>
|
||||||
|
AND c.EXMNR LIKE CONCAT('%', #{schExmnr}, '%')
|
||||||
|
</if>
|
||||||
|
<if test='schCrdnPrcsSttsCd != null and schCrdnPrcsSttsCd != ""'>
|
||||||
|
AND c.CRDN_PRCS_STTS_CD = #{schCrdnPrcsSttsCd}
|
||||||
|
</if>
|
||||||
|
<if test='schAgrvtnLevyTrgtYn != null and schAgrvtnLevyTrgtYn != ""'>
|
||||||
|
AND c.AGRVTN_LEVY_TRGT_YN = #{schAgrvtnLevyTrgtYn}
|
||||||
|
</if>
|
||||||
|
</select>
|
||||||
|
|
||||||
|
</mapper>
|
||||||
@ -0,0 +1,559 @@
|
|||||||
|
<%@ 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="schCrdnYr" name="schCrdnYr" maxlength="4" class="input calender yearpicker" style="width: 80px;" autocomplete="off" value="${dateUtil:getCurrentDateTime('yyyy')}"/>
|
||||||
|
</li>
|
||||||
|
<li class="th">단속 번호</li>
|
||||||
|
<li>
|
||||||
|
<input type="text" id="schCrdnNo" name="schCrdnNo" maxlength="6" class="input" style="width: 100px;" autocomplete="off"/>
|
||||||
|
</li>
|
||||||
|
<li class="th">법정동</li>
|
||||||
|
<li>
|
||||||
|
<select id="schStdgEmdCd" name="schStdgEmdCd" class="input" style="width: 120px;">
|
||||||
|
<option value="">전체</option>
|
||||||
|
<c:forEach var="code" items="${stdgEmdCdList}">
|
||||||
|
<option value="${code.cdId}" <c:if test="${param.schStdgEmdCd eq code.cdId}">selected</c:if>>
|
||||||
|
${code.cdNm}
|
||||||
|
</option>
|
||||||
|
</c:forEach>
|
||||||
|
</select>
|
||||||
|
</li>
|
||||||
|
<li class="th">지역 구분</li>
|
||||||
|
<li>
|
||||||
|
<select id="schRgnSeCd" name="schRgnSeCd" class="input" style="width: 120px;">
|
||||||
|
<option value="">전체</option>
|
||||||
|
<c:forEach var="code" items="${regionList}">
|
||||||
|
<option value="${code.cdId}" <c:if test="${param.schRgnSeCd eq code.cdId}">selected</c:if>>
|
||||||
|
${code.cdNm}
|
||||||
|
</option>
|
||||||
|
</c:forEach>
|
||||||
|
</select>
|
||||||
|
</li>
|
||||||
|
<li class="th">적발 방법</li>
|
||||||
|
<li>
|
||||||
|
<select id="schDsclMthdCd" name="schDsclMthdCd" class="input" style="width: 150px;">
|
||||||
|
<option value="">전체</option>
|
||||||
|
<c:forEach var="code" items="${dsclMthdCdList}">
|
||||||
|
<option value="${code.cdId}" <c:if test="${param.schDsclMthdCd eq code.cdId}">selected</c:if>>
|
||||||
|
${code.cdNm}
|
||||||
|
</option>
|
||||||
|
</c:forEach>
|
||||||
|
</select>
|
||||||
|
</li>
|
||||||
|
<li class="th">조사원</li>
|
||||||
|
<li>
|
||||||
|
<input type="text" id="schExmnr" name="schExmnr" maxlength="50" class="input" style="width: 150px;" autocomplete="off"/>
|
||||||
|
</li>
|
||||||
|
<li class="th">진행단계</li>
|
||||||
|
<li>
|
||||||
|
<select id="schCrdnPrcsSttsCd" name="schCrdnPrcsSttsCd" class="input" style="width: 120px;">
|
||||||
|
<option value="">전체</option>
|
||||||
|
<c:forEach var="code" items="${crdnPrcsSttsCdList}">
|
||||||
|
<option value="${code.cdId}" <c:if test="${param.schCrdnPrcsSttsCd eq code.cdId}">selected</c:if>>
|
||||||
|
${code.cdNm}
|
||||||
|
</option>
|
||||||
|
</c:forEach>
|
||||||
|
</select>
|
||||||
|
</li>
|
||||||
|
<li class="th">가중 부과 대상</li>
|
||||||
|
<li>
|
||||||
|
<select id="schAgrvtnLevyTrgtYn" name="schAgrvtnLevyTrgtYn" class="input" style="width: 120px;">
|
||||||
|
<option value="">전체</option>
|
||||||
|
<option value="Y" <c:if test="${param.schAgrvtnLevyTrgtYn eq 'Y'}">selected</c:if>>대상</option>
|
||||||
|
<option value="N" <c:if test="${param.schAgrvtnLevyTrgtYn eq 'N'}">selected</c:if>>비대상</option>
|
||||||
|
</select>
|
||||||
|
</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 schCrdnYr = $.trim(nvl($("#schCrdnYr").val(), ""));
|
||||||
|
var schCrdnNo = $.trim(nvl($("#schCrdnNo").val(), ""));
|
||||||
|
var schStdgEmdCd = $.trim(nvl($("#schStdgEmdCd").val(), ""));
|
||||||
|
var schRgnSeCd = $.trim(nvl($("#schRgnSeCd").val(), ""));
|
||||||
|
var schDsclMthdCd = $.trim(nvl($("#schDsclMthdCd").val(), ""));
|
||||||
|
var schExmnr = $.trim(nvl($("#schExmnr").val(), ""));
|
||||||
|
var schCrdnPrcsSttsCd = $.trim(nvl($("#schCrdnPrcsSttsCd").val(), ""));
|
||||||
|
var schAgrvtnLevyTrgtYn = $.trim(nvl($("#schAgrvtnLevyTrgtYn").val(), ""));
|
||||||
|
|
||||||
|
SEARCH_COND.schCrdnYr = schCrdnYr;
|
||||||
|
SEARCH_COND.schCrdnNo = schCrdnNo;
|
||||||
|
SEARCH_COND.schStdgEmdCd = schStdgEmdCd;
|
||||||
|
SEARCH_COND.schRgnSeCd = schRgnSeCd;
|
||||||
|
SEARCH_COND.schDsclMthdCd = schDsclMthdCd;
|
||||||
|
SEARCH_COND.schExmnr = schExmnr;
|
||||||
|
SEARCH_COND.schCrdnPrcsSttsCd = schCrdnPrcsSttsCd;
|
||||||
|
SEARCH_COND.schAgrvtnLevyTrgtYn = schAgrvtnLevyTrgtYn;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 단속 목록 관리 네임스페이스
|
||||||
|
*/
|
||||||
|
var LevyRelevyList = {
|
||||||
|
/**
|
||||||
|
* 선택된 행 정보
|
||||||
|
*/
|
||||||
|
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: '_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: 'crdnYr', align: 'center', width: 80, sortingType: 'desc' },
|
||||||
|
{ header: '단속번호', name: 'crdnNo', align: 'center', width: 90 },
|
||||||
|
{ header: '법정동', name: 'stdgEmdCdNm', align: 'center', width: 90 },
|
||||||
|
{ header: '지역구분', name: 'rgnSeCdNm', align: 'center', width: 100 },
|
||||||
|
{ header: '적발방법', name: 'dsclMthdCdNm', align: 'center', width: 120 },
|
||||||
|
{
|
||||||
|
header: '적발일자',
|
||||||
|
name: 'dsclYmd',
|
||||||
|
align: 'center',
|
||||||
|
width: 100,
|
||||||
|
formatter: function (e) {
|
||||||
|
return e.value ? moment(e.value).format('YYYY-MM-DD') : '';
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ header: '조사원', name: 'exmnr', align: 'left', width: 130 },
|
||||||
|
{
|
||||||
|
header: '재부과여부',
|
||||||
|
name: 'relevyYn',
|
||||||
|
align: 'center',
|
||||||
|
width: 80,
|
||||||
|
formatter: function(e) {
|
||||||
|
return e.value === 'Y' ? '재부과' : '일반';
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
header: '가중부과대상',
|
||||||
|
name: 'agrvtnLevyTrgtYn',
|
||||||
|
align: 'center',
|
||||||
|
width: 100,
|
||||||
|
formatter: function(e) {
|
||||||
|
return e.value === 'Y' ? '대상' : '비대상';
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ header: '진행단계', name: 'crdnPrcsSttsCdNm', align: 'center', width: 100 },
|
||||||
|
{
|
||||||
|
header: '위치',
|
||||||
|
name: 'lotnoWholAddr',
|
||||||
|
align: 'left',
|
||||||
|
minWidth: 300,
|
||||||
|
formatter: function(e) {
|
||||||
|
return e.value;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
header: '행위유형',
|
||||||
|
name: 'actTypeCdNm',
|
||||||
|
align: 'left',
|
||||||
|
width: 130,
|
||||||
|
formatter: function(e) {
|
||||||
|
return e.value;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
header: '용도',
|
||||||
|
name: 'usgIdxCdNm',
|
||||||
|
align: 'left',
|
||||||
|
width: 130,
|
||||||
|
formatter: function(e) {
|
||||||
|
return e.value;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
header: '소유자',
|
||||||
|
name: 'ownrNams',
|
||||||
|
align: 'left',
|
||||||
|
width: 130,
|
||||||
|
formatter: function(e) {
|
||||||
|
return e.value;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
header: '행위자',
|
||||||
|
name: 'actrNams',
|
||||||
|
align: 'left',
|
||||||
|
width: 130,
|
||||||
|
formatter: function(e) {
|
||||||
|
return e.value;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ header: '처분사전 일자', name: 'dspsBfhdBgngYmd', align: 'center', width: 120,
|
||||||
|
formatter: function (e) {
|
||||||
|
return e.value ? moment(e.value).format('YYYY-MM-DD') : '';
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ header: '시정명령 일자', name: 'crcCmdBgngYmd', align: 'center', width: 120,
|
||||||
|
formatter: function (e) {
|
||||||
|
return e.value ? moment(e.value).format('YYYY-MM-DD') : '';
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ header: '시정촉구 일자', name: 'crcUrgBgngYmd', align: 'center', width: 120,
|
||||||
|
formatter: function (e) {
|
||||||
|
return e.value ? moment(e.value).format('YYYY-MM-DD') : '';
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ header: '부과예고 일자', name: 'levyPrvntcBgngYmd', align: 'center', width: 120,
|
||||||
|
formatter: function (e) {
|
||||||
|
return e.value ? moment(e.value).format('YYYY-MM-DD') : '';
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ header: '부과 일자', name: 'levyBgngYmd', align: 'center', width: 120,
|
||||||
|
formatter: function (e) {
|
||||||
|
return e.value ? moment(e.value).format('YYYY-MM-DD') : '';
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ header: '납부촉구 일자', name: 'payUrgBgngYmd', align: 'center', width: 120,
|
||||||
|
formatter: function (e) {
|
||||||
|
return e.value ? moment(e.value).format('YYYY-MM-DD') : '';
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ header: '등록일시', name: 'regDt', align: 'center', width: 150 },
|
||||||
|
{ header: '등록자', name: 'rgtrNm', align: 'center', width: 100 },
|
||||||
|
];
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 데이터 소스 생성
|
||||||
|
* @returns {Object} 데이터 소스 설정 객체
|
||||||
|
*/
|
||||||
|
createDataSource: function() {
|
||||||
|
return {
|
||||||
|
api: {
|
||||||
|
readData: {
|
||||||
|
url: '<c:url value="/levy/levyRelevy/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;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 선택된 행 초기화
|
||||||
|
LevyRelevyList.selectedRow = null;
|
||||||
|
});
|
||||||
|
|
||||||
|
this.instance.on('focusChange', function(ev) {
|
||||||
|
LevyRelevyList.selectedRow = self.instance.getRow(ev.rowKey);
|
||||||
|
});
|
||||||
|
|
||||||
|
// 행 선택 이벤트
|
||||||
|
this.instance.on('selection', function(ev) {
|
||||||
|
if (ev.range && ev.range.row && ev.range.row.length > 0) {
|
||||||
|
var rowKey = ev.range.row[0];
|
||||||
|
LevyRelevyList.selectedRow = self.instance.getRow(rowKey);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// 행 클릭 이벤트 - 라디오 버튼 즉시 체크를 위해 추가
|
||||||
|
this.instance.on('click', function(ev) {
|
||||||
|
if (ev.rowKey !== undefined && ev.rowKey !== null) {
|
||||||
|
LevyRelevyList.selectedRow = self.instance.getRow(ev.rowKey);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// 행 더블클릭 이벤트 - 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.crdnYr = rowData.crdnYr;
|
||||||
|
paramCond.crdnNo = rowData.crdnNo;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
},
|
||||||
|
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 목록 현재 페이징 새로고침
|
||||||
|
*/
|
||||||
|
refreshList: function() {
|
||||||
|
if (this.grid.instance) {
|
||||||
|
this.grid.instance.readData(GRID_PAGINATION_INFO.page);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 목록 조회
|
||||||
|
*/
|
||||||
|
search: function() {
|
||||||
|
if (this.grid.instance) {
|
||||||
|
this.grid.instance.readData();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 이벤트 핸들러 설정
|
||||||
|
*/
|
||||||
|
eventBindEvents: function() {
|
||||||
|
var self = this;
|
||||||
|
|
||||||
|
// 검색 버튼 클릭 이벤트
|
||||||
|
$("#search_btn").on('click', function() {
|
||||||
|
self.grid.instance.readData(1);
|
||||||
|
});
|
||||||
|
|
||||||
|
// 초기화 버튼 클릭 이벤트
|
||||||
|
$("#reset_btn").on('click', function() {
|
||||||
|
// 모든 검색 조건 초기화
|
||||||
|
$("#schCrdnYr").val("${dateUtil:getCurrentDateTime('yyyy')}"); // 현재 년도로 초기화
|
||||||
|
$("#schCrdnNo").val("");
|
||||||
|
$("#schStdgEmdCd").val("");
|
||||||
|
$("#schRgnSeCd").val("");
|
||||||
|
$("#schDsclMthdCd").val("");
|
||||||
|
$("#schExmnr").val("");
|
||||||
|
$("#schCrdnPrcsSttsCd").val("");
|
||||||
|
$("#schAgrvtnLevyTrgtYn").val("");
|
||||||
|
|
||||||
|
// 그리드 데이터 새로고침
|
||||||
|
self.grid.instance.readData(1);
|
||||||
|
});
|
||||||
|
|
||||||
|
// 수정 버튼 클릭 이벤트
|
||||||
|
$("#updaterBtn").on('click', function() {
|
||||||
|
// 선택된 행 확인
|
||||||
|
if (!self.selectedRow) {
|
||||||
|
alert('수정할 단속 건을 선택해주세요.');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 선택된 행의 데이터로 팝업 열기
|
||||||
|
self.openViewPopup(self.selectedRow.crdnYr, self.selectedRow.crdnNo);
|
||||||
|
});
|
||||||
|
|
||||||
|
// 재부과 버튼 클릭 이벤트
|
||||||
|
$("#btnRelevy").on('click', function() {
|
||||||
|
// 선택된 행 확인
|
||||||
|
if (!self.selectedRow) {
|
||||||
|
alert('재부과를 진행할 단속 건을 선택해주세요.');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 재부과 팝업 열기
|
||||||
|
self.openRelevyPopup(self.selectedRow.crdnYr, self.selectedRow.crdnNo);
|
||||||
|
});
|
||||||
|
|
||||||
|
// 엔터키 검색
|
||||||
|
$(".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);
|
||||||
|
|
||||||
|
// 선택된 행 초기화
|
||||||
|
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.refreshCrdnList = function() {
|
||||||
|
LevyRelevyList.refreshList();
|
||||||
|
};
|
||||||
|
|
||||||
|
// DOM 준비 완료 시 초기화
|
||||||
|
$(document).ready(function() {
|
||||||
|
LevyRelevyList.init();
|
||||||
|
});
|
||||||
|
|
||||||
|
// 전역 네임스페이스에 모듈 노출
|
||||||
|
window.LevyRelevyList = LevyRelevyList;
|
||||||
|
|
||||||
|
})(window, jQuery);
|
||||||
|
</script>
|
||||||
Loading…
Reference in New Issue