기준자료 -행위유형, 산정률2 추가
parent
5d68532315
commit
6a94605ab7
@ -0,0 +1,145 @@
|
|||||||
|
<?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.baseData.actType.mapper.ActTypeMapper">
|
||||||
|
|
||||||
|
<!--
|
||||||
|
행위 유형 목록 조회
|
||||||
|
- 검색 조건: 행위유형코드, 위반 건축물(schTypeTxt)
|
||||||
|
- 정렬: 행위유형코드 오름차순
|
||||||
|
-->
|
||||||
|
<select id="selectList" parameterType="ActTypeVO" resultType="ActTypeVO">
|
||||||
|
SELECT a.ACT_TYPE_CD /* 행위 유형 코드 */
|
||||||
|
, a.VLTN_BDST /* 위반 건축물 */
|
||||||
|
, a.LAWLPRVS /* 법조문 */
|
||||||
|
, a.CMPTTN_RT /* 산정률 */
|
||||||
|
, a.VLTN_BDST_DTL /* 위반 건축물 상세 */
|
||||||
|
, a.USE_YN /* 사용 여부 */
|
||||||
|
, a.REG_DT /* 등록 일시 */
|
||||||
|
, a.RGTR /* 등록자 */
|
||||||
|
, a.MDFCN_DT /* 수정 일시 */
|
||||||
|
, a.MDFR /* 수정자 */
|
||||||
|
, ru.USER_NM AS RGTR_NM /* 등록자 명 */
|
||||||
|
, mu.USER_NM AS MDFR_NM /* 수정자 명 */
|
||||||
|
FROM tb_act_type a
|
||||||
|
LEFT JOIN tb_user ru ON a.RGTR = ru.USER_ID
|
||||||
|
LEFT JOIN tb_user mu ON a.MDFR = mu.USER_ID
|
||||||
|
WHERE 1=1
|
||||||
|
<if test='schTypeTxt != null and schTypeTxt != ""'>
|
||||||
|
<choose>
|
||||||
|
<when test='schType == "1"'>
|
||||||
|
and a.VLTN_BDST like concat('%',#{schTypeTxt},'%') /* 검색 조건 - 위반 건축물 */
|
||||||
|
</when>
|
||||||
|
<when test='schType == "2"'>
|
||||||
|
and a.ACT_TYPE_CD = #{schTypeTxt} /* 검색 조건 - 행위 유형 코드 */
|
||||||
|
</when>
|
||||||
|
</choose>
|
||||||
|
</if>
|
||||||
|
<if test='schUseYn != null and schUseYn != ""'>
|
||||||
|
and a.USE_YN = #{schUseYn} /* 검색 조건 - 사용 여부 */
|
||||||
|
</if>
|
||||||
|
ORDER BY a.ACT_TYPE_CD asc /* 코드 오름차순 정렬 */
|
||||||
|
</select>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
행위 유형 목록 총 개수 조회
|
||||||
|
- 검색 조건: 행위유형코드, 위반 건축물(schTypeTxt)
|
||||||
|
-->
|
||||||
|
<select id="selectListTotalCount" parameterType="ActTypeVO" resultType="int">
|
||||||
|
SELECT count(*) /* 총 개수 조회 */
|
||||||
|
FROM tb_act_type a
|
||||||
|
where 1=1
|
||||||
|
<if test='schTypeTxt != null and schTypeTxt != ""'>
|
||||||
|
<choose>
|
||||||
|
<when test='schType == "1"'>
|
||||||
|
and a.VLTN_BDST like concat('%',#{schTypeTxt},'%') /* 검색 조건 - 위반 건축물 */
|
||||||
|
</when>
|
||||||
|
<when test='schType == "2"'>
|
||||||
|
and a.ACT_TYPE_CD = #{schTypeTxt} /* 검색 조건 - 행위 유형 코드 */
|
||||||
|
</when>
|
||||||
|
</choose>
|
||||||
|
</if>
|
||||||
|
<if test='schUseYn != null and schUseYn != ""'>
|
||||||
|
and a.USE_YN = #{schUseYn} /* 검색 조건 - 사용 여부 */
|
||||||
|
</if>
|
||||||
|
</select>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
행위 유형 단건 조회
|
||||||
|
- 조건: PK(코드)
|
||||||
|
- 팝업에서 수정 모드 시 사용
|
||||||
|
-->
|
||||||
|
<select id="selectOne" parameterType="ActTypeVO" resultType="ActTypeVO">
|
||||||
|
SELECT a.ACT_TYPE_CD /* 행위 유형 코드 */
|
||||||
|
, a.VLTN_BDST /* 위반 건축물 */
|
||||||
|
, a.LAWLPRVS /* 법조문 */
|
||||||
|
, a.CMPTTN_RT /* 산정률 */
|
||||||
|
, a.VLTN_BDST_DTL /* 위반 건축물 상세 */
|
||||||
|
, a.USE_YN /* 사용 여부 */
|
||||||
|
, a.REG_DT /* 등록 일시 */
|
||||||
|
, a.RGTR /* 등록자 */
|
||||||
|
, a.MDFCN_DT /* 수정 일시 */
|
||||||
|
, a.MDFR /* 수정자 */
|
||||||
|
, ru.USER_NM AS RGTR_NM /* 등록자 명 */
|
||||||
|
, mu.USER_NM AS MDFR_NM /* 수정자 명 */
|
||||||
|
FROM tb_act_type a
|
||||||
|
LEFT JOIN tb_user ru ON a.RGTR = ru.USER_ID
|
||||||
|
LEFT JOIN tb_user mu ON a.MDFR = mu.USER_ID
|
||||||
|
WHERE a.ACT_TYPE_CD = #{actTypeCd} /* 코드 검색 조건 */
|
||||||
|
</select>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
행위 유형 정보 등록
|
||||||
|
- PK: 행위유형코드
|
||||||
|
-->
|
||||||
|
<insert id="insert" parameterType="ActTypeVO">
|
||||||
|
INSERT INTO tb_act_type (
|
||||||
|
ACT_TYPE_CD /* 행위 유형 코드 */
|
||||||
|
, VLTN_BDST /* 위반 건축물 */
|
||||||
|
, LAWLPRVS /* 법조문 */
|
||||||
|
, CMPTTN_RT /* 산정률 */
|
||||||
|
, VLTN_BDST_DTL /* 위반 건축물 상세 */
|
||||||
|
, USE_YN /* 사용 여부 */
|
||||||
|
, REG_DT /* 등록 일시 */
|
||||||
|
, RGTR /* 등록자 */
|
||||||
|
) VALUES (
|
||||||
|
#{actTypeCd} /* 행위 유형 코드 */
|
||||||
|
, #{vltnBdst} /* 위반 건축물 */
|
||||||
|
, #{lawlprvs} /* 법조문 */
|
||||||
|
, #{cmpttnRt} /* 산정률 */
|
||||||
|
, #{vltnBdstDtl} /* 위반 건축물 상세 */
|
||||||
|
, #{useYn} /* 사용 여부 */
|
||||||
|
, NOW() /* 등록 일시 - 현재 날짜 자동 설정 */
|
||||||
|
, #{rgtr} /* 등록자 - 세션 사용자 ID */
|
||||||
|
)
|
||||||
|
</insert>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
행위 유형 정보 수정
|
||||||
|
- 조건: PK(코드)
|
||||||
|
- 수정 대상: 위반 건축물, 법조문, 산정률, 위반 건축물 상세, 사용 여부, 수정일시, 수정자
|
||||||
|
-->
|
||||||
|
<update id="update" parameterType="ActTypeVO">
|
||||||
|
UPDATE tb_act_type
|
||||||
|
SET VLTN_BDST = #{vltnBdst} /* 위반 건축물 */
|
||||||
|
, LAWLPRVS = #{lawlprvs} /* 법조문 */
|
||||||
|
, CMPTTN_RT = #{cmpttnRt} /* 산정률 */
|
||||||
|
, VLTN_BDST_DTL = #{vltnBdstDtl} /* 위반 건축물 상세 */
|
||||||
|
, USE_YN = #{useYn} /* 사용 여부 */
|
||||||
|
, MDFCN_DT = NOW() /* 수정 일시 */
|
||||||
|
, MDFR = #{mdfr} /* 수정자 */
|
||||||
|
WHERE ACT_TYPE_CD = #{actTypeCd} /* 행위 유형 코드 */
|
||||||
|
</update>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
PK(코드) 중복 체크
|
||||||
|
- 등록 시 동일한 PK가 존재하는지 확인
|
||||||
|
- 반환값: 0이면 중복 없음, 1이상이면 중복 존재
|
||||||
|
-->
|
||||||
|
<select id="selectDuplicateCheck" parameterType="ActTypeVO" resultType="int">
|
||||||
|
select count(*) /* 중복 건수 조회 */
|
||||||
|
from tb_act_type
|
||||||
|
where ACT_TYPE_CD = #{actTypeCd} /* 행위 유형 코드 */
|
||||||
|
</select>
|
||||||
|
</mapper>
|
||||||
@ -0,0 +1,135 @@
|
|||||||
|
<?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.baseData.cmpttnRt2.mapper.CmpttnRt2Mapper">
|
||||||
|
|
||||||
|
<!--
|
||||||
|
산정률2 목록 조회
|
||||||
|
- 검색 조건: 산정률2코드, 위반 사항(schTypeTxt)
|
||||||
|
- 정렬: 산정률2코드 오름차순
|
||||||
|
-->
|
||||||
|
<select id="selectList" parameterType="CmpttnRt2VO" resultType="CmpttnRt2VO">
|
||||||
|
SELECT a.CMPTTN_RT_2_CD /* 산정률2 코드 */
|
||||||
|
, a.VLTN_MTTR /* 위반 사항 */
|
||||||
|
, a.CMPTTN_RT_2 /* 산정률2 */
|
||||||
|
, a.USE_YN /* 사용 여부 */
|
||||||
|
, a.REG_DT /* 등록 일시 */
|
||||||
|
, a.RGTR /* 등록자 */
|
||||||
|
, a.MDFCN_DT /* 수정 일시 */
|
||||||
|
, a.MDFR /* 수정자 */
|
||||||
|
, ru.USER_NM AS RGTR_NM /* 등록자 명 */
|
||||||
|
, mu.USER_NM AS MDFR_NM /* 수정자 명 */
|
||||||
|
FROM tb_cmpttn_rt_2 a
|
||||||
|
LEFT JOIN tb_user ru ON a.RGTR = ru.USER_ID
|
||||||
|
LEFT JOIN tb_user mu ON a.MDFR = mu.USER_ID
|
||||||
|
WHERE 1=1
|
||||||
|
<if test='schTypeTxt != null and schTypeTxt != ""'>
|
||||||
|
<choose>
|
||||||
|
<when test='schType == "1"'>
|
||||||
|
and a.VLTN_MTTR like concat('%',#{schTypeTxt},'%') /* 검색 조건 - 위반 사항 */
|
||||||
|
</when>
|
||||||
|
<when test='schType == "2"'>
|
||||||
|
and a.CMPTTN_RT_2_CD = #{schTypeTxt} /* 검색 조건 - 산정률2 코드 */
|
||||||
|
</when>
|
||||||
|
</choose>
|
||||||
|
</if>
|
||||||
|
<if test='schUseYn != null and schUseYn != ""'>
|
||||||
|
and a.USE_YN = #{schUseYn} /* 검색 조건 - 사용 여부 */
|
||||||
|
</if>
|
||||||
|
ORDER BY a.CMPTTN_RT_2_CD asc /* 코드 오름차순 정렬 */
|
||||||
|
</select>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
산정률2 목록 총 개수 조회
|
||||||
|
- 검색 조건: 산정률2코드, 위반 사항(schTypeTxt)
|
||||||
|
-->
|
||||||
|
<select id="selectListTotalCount" parameterType="CmpttnRt2VO" resultType="int">
|
||||||
|
SELECT count(*) /* 총 개수 조회 */
|
||||||
|
FROM tb_cmpttn_rt_2 a
|
||||||
|
where 1=1
|
||||||
|
<if test='schTypeTxt != null and schTypeTxt != ""'>
|
||||||
|
<choose>
|
||||||
|
<when test='schType == "1"'>
|
||||||
|
and a.VLTN_MTTR like concat('%',#{schTypeTxt},'%') /* 검색 조건 - 위반 사항 */
|
||||||
|
</when>
|
||||||
|
<when test='schType == "2"'>
|
||||||
|
and a.CMPTTN_RT_2_CD = #{schTypeTxt} /* 검색 조건 - 산정률2 코드 */
|
||||||
|
</when>
|
||||||
|
</choose>
|
||||||
|
</if>
|
||||||
|
<if test='schUseYn != null and schUseYn != ""'>
|
||||||
|
and a.USE_YN = #{schUseYn} /* 검색 조건 - 사용 여부 */
|
||||||
|
</if>
|
||||||
|
</select>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
산정률2 단건 조회
|
||||||
|
- 조건: PK(코드)
|
||||||
|
- 팝업에서 수정 모드 시 사용
|
||||||
|
-->
|
||||||
|
<select id="selectOne" parameterType="CmpttnRt2VO" resultType="CmpttnRt2VO">
|
||||||
|
SELECT a.CMPTTN_RT_2_CD /* 산정률2 코드 */
|
||||||
|
, a.VLTN_MTTR /* 위반 사항 */
|
||||||
|
, a.CMPTTN_RT_2 /* 산정률2 */
|
||||||
|
, a.USE_YN /* 사용 여부 */
|
||||||
|
, a.REG_DT /* 등록 일시 */
|
||||||
|
, a.RGTR /* 등록자 */
|
||||||
|
, a.MDFCN_DT /* 수정 일시 */
|
||||||
|
, a.MDFR /* 수정자 */
|
||||||
|
, ru.USER_NM AS RGTR_NM /* 등록자 명 */
|
||||||
|
, mu.USER_NM AS MDFR_NM /* 수정자 명 */
|
||||||
|
FROM tb_cmpttn_rt_2 a
|
||||||
|
LEFT JOIN tb_user ru ON a.RGTR = ru.USER_ID
|
||||||
|
LEFT JOIN tb_user mu ON a.MDFR = mu.USER_ID
|
||||||
|
WHERE a.CMPTTN_RT_2_CD = #{cmpttnRt2Cd} /* 코드 검색 조건 */
|
||||||
|
</select>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
산정률2 정보 등록
|
||||||
|
- PK: 산정률2코드
|
||||||
|
-->
|
||||||
|
<insert id="insert" parameterType="CmpttnRt2VO">
|
||||||
|
INSERT INTO tb_cmpttn_rt_2 (
|
||||||
|
CMPTTN_RT_2_CD /* 산정률2 코드 */
|
||||||
|
, VLTN_MTTR /* 위반 사항 */
|
||||||
|
, CMPTTN_RT_2 /* 산정률2 */
|
||||||
|
, USE_YN /* 사용 여부 */
|
||||||
|
, REG_DT /* 등록 일시 */
|
||||||
|
, RGTR /* 등록자 */
|
||||||
|
) VALUES (
|
||||||
|
#{cmpttnRt2Cd} /* 산정률2 코드 */
|
||||||
|
, #{vltnMttr} /* 위반 사항 */
|
||||||
|
, #{cmpttnRt2} /* 산정률2 */
|
||||||
|
, #{useYn} /* 사용 여부 */
|
||||||
|
, NOW() /* 등록 일시 - 현재 날짜 자동 설정 */
|
||||||
|
, #{rgtr} /* 등록자 - 세션 사용자 ID */
|
||||||
|
)
|
||||||
|
</insert>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
산정률2 정보 수정
|
||||||
|
- 조건: PK(코드)
|
||||||
|
- 수정 대상: 위반 사항, 산정률2, 사용 여부, 수정일시, 수정자
|
||||||
|
-->
|
||||||
|
<update id="update" parameterType="CmpttnRt2VO">
|
||||||
|
UPDATE tb_cmpttn_rt_2
|
||||||
|
SET VLTN_MTTR = #{vltnMttr} /* 위반 사항 */
|
||||||
|
, CMPTTN_RT_2 = #{cmpttnRt2} /* 산정률2 */
|
||||||
|
, USE_YN = #{useYn} /* 사용 여부 */
|
||||||
|
, MDFCN_DT = NOW() /* 수정 일시 */
|
||||||
|
, MDFR = #{mdfr} /* 수정자 */
|
||||||
|
WHERE CMPTTN_RT_2_CD = #{cmpttnRt2Cd} /* 산정률2 코드 */
|
||||||
|
</update>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
PK(코드) 중복 체크
|
||||||
|
- 등록 시 동일한 PK가 존재하는지 확인
|
||||||
|
- 반환값: 0이면 중복 없음, 1이상이면 중복 존재
|
||||||
|
-->
|
||||||
|
<select id="selectDuplicateCheck" parameterType="CmpttnRt2VO" resultType="int">
|
||||||
|
select count(*) /* 중복 건수 조회 */
|
||||||
|
from tb_cmpttn_rt_2
|
||||||
|
where CMPTTN_RT_2_CD = #{cmpttnRt2Cd} /* 산정률2 코드 */
|
||||||
|
</select>
|
||||||
|
</mapper>
|
||||||
@ -0,0 +1,167 @@
|
|||||||
|
package go.kr.project.baseData.actType.controller;
|
||||||
|
|
||||||
|
import egovframework.constant.MessageConstants;
|
||||||
|
import egovframework.constant.TilesConstants;
|
||||||
|
import egovframework.exception.MessageException;
|
||||||
|
import egovframework.util.ApiResponseUtil;
|
||||||
|
import egovframework.util.SessionUtil;
|
||||||
|
import go.kr.project.baseData.actType.model.ActTypeVO;
|
||||||
|
import go.kr.project.baseData.actType.service.ActTypeService;
|
||||||
|
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;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* packageName : go.kr.project.baseData.actType.controller
|
||||||
|
* fileName : ActTypeController
|
||||||
|
* author : 김의진
|
||||||
|
* date : 2025-09-22
|
||||||
|
* description : 기준자료 > 행위 유형 웹 컨트롤러
|
||||||
|
* 중요 로직 주석:
|
||||||
|
* ===========================================================
|
||||||
|
* DATE AUTHOR NOTE
|
||||||
|
* -----------------------------------------------------------
|
||||||
|
* 2025-09-22 김의진 최초 생성
|
||||||
|
*/
|
||||||
|
@Controller
|
||||||
|
@RequestMapping("/baseData/actType")
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
@Slf4j
|
||||||
|
@Tag(name = "기준자료: 행위 유형", description = "행위 유형 관리 API")
|
||||||
|
public class ActTypeController {
|
||||||
|
|
||||||
|
/** 행위 유형 서비스 */
|
||||||
|
private final ActTypeService service;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 행위 유형 목록 페이지를 조회한다.
|
||||||
|
* @param vo 검색 조건을 담은 VO 객체
|
||||||
|
* @param model 뷰에 전달할 데이터를 담는 모델 객체
|
||||||
|
* @return 목록 페이지 뷰 이름
|
||||||
|
*/
|
||||||
|
@GetMapping("/list.do")
|
||||||
|
@Operation(summary = "행위 유형 목록 페이지", description = "목록 페이지를 조회합니다.")
|
||||||
|
public String listPage(ActTypeVO vo, Model model){
|
||||||
|
log.debug("행위 유형 목록 페이지 조회");
|
||||||
|
return "baseData/actType/list" + TilesConstants.BASE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 행위 유형 목록을 AJAX로 조회한다.
|
||||||
|
* 서버사이드 페이징을 지원하며 검색 조건에 따라 필터링된 결과를 반환한다.
|
||||||
|
* @param vo 검색 조건과 페이징 정보를 담은 VO 객체
|
||||||
|
* @return 목록 데이터와 페이징 정보를 담은 ResponseEntity
|
||||||
|
*/
|
||||||
|
@PostMapping("/list.ajax")
|
||||||
|
@Operation(summary = "목록 조회(AJAX)", description = "페이징 목록을 JSON으로 반환")
|
||||||
|
@ApiResponse(responseCode = "200", description = "성공")
|
||||||
|
public ResponseEntity<?> listAjax(@ModelAttribute ActTypeVO vo){
|
||||||
|
log.debug("행위 유형 목록 AJAX 조회 - 검색조건: {}", vo);
|
||||||
|
int total = service.selectListTotalCount(vo); // 1. 총 개수 조회
|
||||||
|
vo.setTotalCount(total); // 2. setTotalCount
|
||||||
|
//vo.setPagingYn("Y"); // 3. 페이징 처리
|
||||||
|
return ApiResponseUtil.successWithGrid(service.selectList(vo), vo);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 행위 유형 등록/수정/조회 팝업 페이지를 조회한다.
|
||||||
|
* mode 파라미터에 따라 등록(C), 수정(U), 조회(V) 모드로 동작한다.
|
||||||
|
* @param vo PK 정보를 담은 VO 객체
|
||||||
|
* @param mode 화면 모드 (C: 등록, U: 수정, V: 조회)
|
||||||
|
* @param model 뷰에 전달할 데이터를 담는 모델 객체
|
||||||
|
* @return 팝업 페이지 뷰 이름
|
||||||
|
*/
|
||||||
|
@GetMapping("/popup.do")
|
||||||
|
@Operation(summary = "등록/수정/조회 팝업", description = "window.open으로 호출되는 팝업, mode 파라미터로 C/U/V 구분")
|
||||||
|
public ModelAndView popup(
|
||||||
|
@Parameter(description = "행위 유형 코드") @RequestParam(required = false) String actTypeCd,
|
||||||
|
@Parameter(description = "화면 모드 (C:등록, U:수정, V:보기)") @RequestParam String mode,
|
||||||
|
Model model) {
|
||||||
|
|
||||||
|
try {
|
||||||
|
log.debug("행위 유형 팝업 화면 요청 - 모드: {}, 구조지수코드: {}", mode, actTypeCd);
|
||||||
|
|
||||||
|
ModelAndView mav = new ModelAndView("baseData/actType/popup" + TilesConstants.POPUP);
|
||||||
|
mav.addObject("mode", mode);
|
||||||
|
|
||||||
|
// 수정/조회 모드인 경우 기존 데이터 조회
|
||||||
|
if (("U".equals(mode) || "V".equals(mode)) && actTypeCd != null) {
|
||||||
|
ActTypeVO paramVO = new ActTypeVO();
|
||||||
|
paramVO.setActTypeCd(actTypeCd);
|
||||||
|
|
||||||
|
ActTypeVO data = service.selectOne(paramVO);
|
||||||
|
if (data != null) {
|
||||||
|
mav.addObject("data", data);
|
||||||
|
} else {
|
||||||
|
throw new MessageException("해당 행위 유형 정보를 찾을 수 없습니다.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return mav;
|
||||||
|
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("행위 유형 팝업 화면 제공 중 오류 발생", e);
|
||||||
|
throw new MessageException("팝업 화면을 불러오는 중 오류가 발생했습니다.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 새로운 행위 유형 정보를 등록한다.
|
||||||
|
* @param vo 등록할 행위 유형 정보를 담은 VO 객체
|
||||||
|
* @return 등록 결과를 담은 ResponseEntity
|
||||||
|
*/
|
||||||
|
@Operation(summary = "행위 유형 등록", description = "새로운 행위 유형 정보를 등록합니다.")
|
||||||
|
@ApiResponses(value = {
|
||||||
|
@ApiResponse(responseCode = "200", description = "행위 유형 등록 성공"),
|
||||||
|
@ApiResponse(responseCode = "400", description = "행위 유형 등록 실패"),
|
||||||
|
@ApiResponse(description = "오류로 인한 실패")
|
||||||
|
})
|
||||||
|
@PostMapping("/insert.ajax")
|
||||||
|
public ResponseEntity<?> insert(@ModelAttribute ActTypeVO paramVO) throws Exception {
|
||||||
|
// 등록자 정보 설정
|
||||||
|
paramVO.setRgtr(SessionUtil.getUserId());
|
||||||
|
|
||||||
|
int result = service.insert(paramVO);
|
||||||
|
|
||||||
|
if (result > 0) {
|
||||||
|
return ApiResponseUtil.success(MessageConstants.Common.SAVE_SUCCESS);
|
||||||
|
} else {
|
||||||
|
return ApiResponseUtil.error(MessageConstants.Common.SAVE_ERROR);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 기존 행위 유형 정보를 수정한다.
|
||||||
|
* @param vo 수정할 행위 유형 정보를 담은 VO 객체
|
||||||
|
* @return 수정 결과를 담은 ResponseEntity
|
||||||
|
*/
|
||||||
|
@Operation(summary = "행위 유형 수정", description = "기존 행위 유형 정보를 수정합니다.")
|
||||||
|
@ApiResponses(value = {
|
||||||
|
@ApiResponse(responseCode = "200", description = "행위 유형 수정 성공"),
|
||||||
|
@ApiResponse(responseCode = "400", description = "행위 유형 수정 실패"),
|
||||||
|
@ApiResponse(description = "오류로 인한 실패")
|
||||||
|
})
|
||||||
|
@PostMapping("/update.ajax")
|
||||||
|
public ResponseEntity<?> update(@ModelAttribute ActTypeVO paramVO) throws Exception {
|
||||||
|
// 수정자 정보 설정
|
||||||
|
paramVO.setMdfr(SessionUtil.getUserId());
|
||||||
|
|
||||||
|
int result = service.update(paramVO);
|
||||||
|
|
||||||
|
if (result > 0) {
|
||||||
|
return ApiResponseUtil.success(MessageConstants.Common.UPDATE_SUCCESS);
|
||||||
|
} else {
|
||||||
|
return ApiResponseUtil.error(MessageConstants.Common.UPDATE_ERROR);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,71 @@
|
|||||||
|
package go.kr.project.baseData.actType.mapper;
|
||||||
|
|
||||||
|
import go.kr.project.baseData.actType.model.ActTypeVO;
|
||||||
|
import org.apache.ibatis.annotations.Mapper;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* packageName : go.kr.project.baseData.actType.mapper
|
||||||
|
* fileName : ActTypeMapper
|
||||||
|
* author : 김의진
|
||||||
|
* date : 2025-09-22
|
||||||
|
* description : 행위 유형 MyBatis Mapper 인터페이스
|
||||||
|
* 중요한 로직 주석: SQL 쿼리와 매핑되는 메서드들을 정의하여 데이터베이스 접근을 담당한다.
|
||||||
|
* ===========================================================
|
||||||
|
* DATE AUTHOR NOTE
|
||||||
|
* -----------------------------------------------------------
|
||||||
|
* 2025-09-22 김의진 최초 생성
|
||||||
|
*/
|
||||||
|
@Mapper
|
||||||
|
public interface ActTypeMapper {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 행위 유형 목록을 조회한다.
|
||||||
|
* @param vo 검색 조건과 페이징 정보를 담은 VO 객체
|
||||||
|
* @return 행위 유형 목록
|
||||||
|
*/
|
||||||
|
List<ActTypeVO> selectList(ActTypeVO vo);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 행위 유형 목록의 총 개수를 조회한다.
|
||||||
|
* @param vo 검색 조건을 담은 VO 객체
|
||||||
|
* @return 조회된 목록의 총 개수
|
||||||
|
*/
|
||||||
|
int selectListTotalCount(ActTypeVO vo);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 특정 코드의 행위 유형 정보를 조회한다.
|
||||||
|
* @param vo 조회할 PK 정보(yr, no)를 담은 VO 객체
|
||||||
|
* @return 조회된 행위 유형 정보
|
||||||
|
*/
|
||||||
|
ActTypeVO selectOne(ActTypeVO vo);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 새로운 행위 유형 정보를 등록한다.
|
||||||
|
* @param vo 등록할 행위 유형 정보를 담은 VO 객체
|
||||||
|
* @return 등록된 행의 수
|
||||||
|
*/
|
||||||
|
int insert(ActTypeVO vo);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 기존 행위 유형 정보를 수정한다.
|
||||||
|
* @param vo 수정할 행위 유형 정보를 담은 VO 객체
|
||||||
|
* @return 수정된 행의 수
|
||||||
|
*/
|
||||||
|
int update(ActTypeVO vo);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 행위 유형 정보를 삭제한다.
|
||||||
|
* @param vo 삭제할 PK 정보(actTypeCd)를 담은 VO 객체
|
||||||
|
* @return 삭제된 행의 수
|
||||||
|
*/
|
||||||
|
int delete(ActTypeVO vo);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PK(코드) 중복 체크를 수행한다.
|
||||||
|
* @param vo 중복 체크할 PK 정보(actTypeCd)를 담은 VO 객체
|
||||||
|
* @return 중복 건수 (0이면 중복 없음, 1이상이면 중복 존재)
|
||||||
|
*/
|
||||||
|
int selectDuplicateCheck(ActTypeVO vo);
|
||||||
|
}
|
||||||
@ -0,0 +1,86 @@
|
|||||||
|
package go.kr.project.baseData.actType.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;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* packageName : go.kr.project.baseData.actType.model
|
||||||
|
* fileName : ActTypeVO
|
||||||
|
* author : 김의진
|
||||||
|
* date : 2025-09-22
|
||||||
|
* description : 행위 유형 관련 데이터를 담는 Value Object 클래스
|
||||||
|
* 중요한 로직 주석: 행위 유형 테이블(tb_act_type)과 매핑되는 VO 클래스로 페이징 기능을 포함한다. *
|
||||||
|
* ===========================================================
|
||||||
|
* DATE AUTHOR NOTE
|
||||||
|
* -----------------------------------------------------------
|
||||||
|
* 2025-09-22 김의진 최초 생성
|
||||||
|
*/
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
|
@Data
|
||||||
|
@Builder
|
||||||
|
@AllArgsConstructor
|
||||||
|
@NoArgsConstructor
|
||||||
|
@ToString
|
||||||
|
public class ActTypeVO extends PagingVO {
|
||||||
|
|
||||||
|
// ==================== 기본 테이블 컬럼 ====================
|
||||||
|
|
||||||
|
/** 행위 유형 코드 (PK) - 3자리 코드 */
|
||||||
|
private String actTypeCd;
|
||||||
|
|
||||||
|
/** 위반 건축물 */
|
||||||
|
private String vltnBdst;
|
||||||
|
|
||||||
|
/** 법조문 */
|
||||||
|
private String lawlprvs;
|
||||||
|
|
||||||
|
/** 산정률 - DECIMAL(3,0) */
|
||||||
|
private BigDecimal cmpttnRt;
|
||||||
|
|
||||||
|
/** 위반 건축물 상세 */
|
||||||
|
private String vltnBdstDtl;
|
||||||
|
|
||||||
|
/** 사용 여부 */
|
||||||
|
private String useYn;
|
||||||
|
|
||||||
|
/** 등록 일시 - 테이블은 date 컬럼을 사용하지만 화면 표시용으로 문자열 타입 사용 */
|
||||||
|
@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;
|
||||||
|
|
||||||
|
/** 등록자 ID */
|
||||||
|
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;
|
||||||
|
|
||||||
|
/** 수정자 ID */
|
||||||
|
private String mdfr;
|
||||||
|
|
||||||
|
// ==================== 조인 컬럼 (코드명) ====================
|
||||||
|
|
||||||
|
/** 등록자 */
|
||||||
|
private String rgtrNm;
|
||||||
|
|
||||||
|
/** 수정자 */
|
||||||
|
private String mdfrNm;
|
||||||
|
|
||||||
|
/** 행 번호 (그리드 표시용) */
|
||||||
|
private Integer rowNum;
|
||||||
|
|
||||||
|
// ==================== 검색 조건 ====================
|
||||||
|
|
||||||
|
/** 검색 조건 선택 */
|
||||||
|
private String schType;
|
||||||
|
private String schTypeTxt;
|
||||||
|
|
||||||
|
/** 검색 조건 - 사용 여부 */
|
||||||
|
private String schUseYn;
|
||||||
|
}
|
||||||
@ -0,0 +1,69 @@
|
|||||||
|
package go.kr.project.baseData.actType.service;
|
||||||
|
|
||||||
|
import go.kr.project.baseData.actType.model.ActTypeVO;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* packageName : go.kr.project.baseData.actType.service
|
||||||
|
* fileName : ActTypeService
|
||||||
|
* author : 김의진
|
||||||
|
* date : 2025-09-22
|
||||||
|
* description : 행위 유형 비즈니스 로직 처리를 위한 서비스 인터페이스
|
||||||
|
* 중요한 로직 주석: 컨트롤러와 매퍼 사이의 비즈니스 로직을 정의하고 데이터 처리 규칙을 관리한다.
|
||||||
|
* ===========================================================
|
||||||
|
* DATE AUTHOR NOTE
|
||||||
|
* -----------------------------------------------------------
|
||||||
|
* 2025-09-22 김의진 최초 생성
|
||||||
|
*/
|
||||||
|
public interface ActTypeService {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 행위 유형 목록을 조회한다.
|
||||||
|
* @param vo 검색 조건과 페이징 정보를 담은 VO 객체
|
||||||
|
* @return 행위 유형 목록
|
||||||
|
*/
|
||||||
|
List<ActTypeVO> selectList(ActTypeVO vo);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 행위 유형 목록의 총 개수를 조회한다.
|
||||||
|
* @param vo 검색 조건을 담은 VO 객체
|
||||||
|
* @return 조회된 목록의 총 개수
|
||||||
|
*/
|
||||||
|
int selectListTotalCount(ActTypeVO vo);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 특정 코드의 행위 유형 정보를 조회한다.
|
||||||
|
* @param vo 조회할 PK 정보를 담은 VO 객체
|
||||||
|
* @return 조회된 행위 유형 정보
|
||||||
|
*/
|
||||||
|
ActTypeVO selectOne(ActTypeVO vo);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 새로운 행위 유형 정보를 등록한다.
|
||||||
|
* @param vo 등록할 행위 유형 정보를 담은 VO 객체
|
||||||
|
* @return 등록된 행의 수
|
||||||
|
*/
|
||||||
|
int insert(ActTypeVO vo);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 기존 행위 유형 정보를 수정한다.
|
||||||
|
* @param vo 수정할 행위 유형 정보를 담은 VO 객체
|
||||||
|
* @return 수정된 행의 수
|
||||||
|
*/
|
||||||
|
int update(ActTypeVO vo);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 행위 유형 정보를 삭제한다.
|
||||||
|
* @param vo 삭제할 PK 정보(actTypeCd)를 담은 VO 객체
|
||||||
|
* @return 삭제된 행의 수
|
||||||
|
*/
|
||||||
|
int delete(ActTypeVO vo);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PK(코드) 중복 체크를 수행한다.
|
||||||
|
* @param vo 중복 체크할 PK 정보(actTypeCd)를 담은 VO 객체
|
||||||
|
* @return 중복 건수 (0이면 중복 없음, 1이상이면 중복 존재)
|
||||||
|
*/
|
||||||
|
int selectDuplicateCheck(ActTypeVO vo);
|
||||||
|
}
|
||||||
@ -0,0 +1,194 @@
|
|||||||
|
package go.kr.project.baseData.actType.service.impl;
|
||||||
|
|
||||||
|
import egovframework.exception.MessageException;
|
||||||
|
import egovframework.util.SessionUtil;
|
||||||
|
import egovframework.util.StringUtil;
|
||||||
|
import go.kr.project.baseData.actType.mapper.ActTypeMapper;
|
||||||
|
import go.kr.project.baseData.actType.model.ActTypeVO;
|
||||||
|
import go.kr.project.baseData.actType.service.ActTypeService;
|
||||||
|
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.baseData.actType.service.impl
|
||||||
|
* fileName : ActTypeServiceImpl
|
||||||
|
* author : 김의진
|
||||||
|
* date : 2025-09-22
|
||||||
|
* description : 행위 유형 비즈니스 로직 처리를 위한 서비스 구현체
|
||||||
|
* 중요한 로직 주석: 서비스 인터페이스를 구현하여 실제 비즈니스 로직을 처리하고 매퍼를 호출한다.
|
||||||
|
* ===========================================================
|
||||||
|
* DATE AUTHOR NOTE
|
||||||
|
* -----------------------------------------------------------
|
||||||
|
* 2025-09-22 김의진 최초 생성
|
||||||
|
*/
|
||||||
|
@Service
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
@Slf4j
|
||||||
|
public class ActTypeServiceImpl extends EgovAbstractServiceImpl implements ActTypeService {
|
||||||
|
|
||||||
|
/** 행위 유형 매퍼 */
|
||||||
|
private final ActTypeMapper mapper;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 행위 유형 목록을 조회한다.
|
||||||
|
* @param vo 검색 조건과 페이징 정보를 담은 VO 객체
|
||||||
|
* @return 행위 유형 목록
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public List<ActTypeVO> selectList(ActTypeVO vo) {
|
||||||
|
log.debug("행위 유형 목록 조회 - 검색조건: {}", vo);
|
||||||
|
return mapper.selectList(vo);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 행위 유형 목록의 총 개수를 조회한다.
|
||||||
|
* @param vo 검색 조건을 담은 VO 객체
|
||||||
|
* @return 조회된 목록의 총 개수
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public int selectListTotalCount(ActTypeVO vo) {
|
||||||
|
log.debug("행위 유형 총 개수 조회 - 검색조건: {}", vo);
|
||||||
|
return mapper.selectListTotalCount(vo);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 특정 코드에 해당하는 행위 유형 정보를 조회한다.
|
||||||
|
* @param vo 조회할 PK 정보(actTypeCd)를 담은 VO 객체
|
||||||
|
* @return 조회된 행위 유형 정보
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public ActTypeVO selectOne(ActTypeVO vo) {
|
||||||
|
log.debug("행위 유형 단건 조회 - 코드: {}", vo.getActTypeCd());
|
||||||
|
return mapper.selectOne(vo);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 새로운 행위 유형 정보를 등록한다.
|
||||||
|
* PK(코드) 필수값 검증과 중복 체크를 수행한 후 등록을 진행한다.
|
||||||
|
* @param vo 등록할 행위 유형 정보를 담은 VO 객체
|
||||||
|
* @return 등록된 행의 수
|
||||||
|
* @throws MessageException PK 필수값 누락 또는 중복 시 발생
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public int insert(ActTypeVO vo) {
|
||||||
|
log.debug("행위 유형 등록 - 코드: {}, 위반 건축물: {}", vo.getActTypeCd(), vo.getVltnBdst());
|
||||||
|
|
||||||
|
// PK(코드) 필수값 검증
|
||||||
|
if (vo.getActTypeCd() == null || vo.getActTypeCd().trim().isEmpty()) {
|
||||||
|
log.warn("행위 유형 등록 실패 - 코드 미입력");
|
||||||
|
throw new MessageException("코드는 필수값입니다.");
|
||||||
|
}
|
||||||
|
|
||||||
|
// PK 중복 체크
|
||||||
|
int duplicateCount = mapper.selectDuplicateCheck(vo);
|
||||||
|
if (duplicateCount > 0) {
|
||||||
|
log.warn("행위 유형 등록 실패 - 중복된 PK: 코드={}", vo.getActTypeCd());
|
||||||
|
throw new MessageException("이미 존재하는 행위 유형 코드입니다. 다른 값을 입력해주세요.");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 위반 건축물 바이트 길이 검증 (한글 3바이트 기준 최대 100바이트)
|
||||||
|
if (vo.getVltnBdst() != null && !vo.getVltnBdst().trim().isEmpty()) {
|
||||||
|
int byteLength = StringUtil.calculateUtf8ByteLength(vo.getVltnBdst());
|
||||||
|
if (byteLength > 100) {
|
||||||
|
log.warn("행위 유형 등록 실패 - 위반 건축물 바이트 길이 초과: {}바이트", byteLength);
|
||||||
|
throw new MessageException("위반 건축물은 최대 100바이트까지 입력 가능합니다. (현재: " + byteLength + "바이트)");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 위반 건축물 상세 바이트 길이 검증 (한글 3바이트 기준 최대 1000바이트)
|
||||||
|
if (vo.getVltnBdstDtl() != null && !vo.getVltnBdstDtl().trim().isEmpty()) {
|
||||||
|
int byteLength = StringUtil.calculateUtf8ByteLength(vo.getVltnBdstDtl());
|
||||||
|
if (byteLength > 1000) {
|
||||||
|
log.warn("행위 유형 등록 실패 - 위반 건축물 상세 바이트 길이 초과: {}바이트", byteLength);
|
||||||
|
throw new MessageException("위반 건축물은 최대 1000바이트까지 입력 가능합니다. (현재: " + byteLength + "바이트)");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 등록자 정보 설정 및 등록 수행
|
||||||
|
vo.setRgtr(SessionUtil.getUserId());
|
||||||
|
int result = mapper.insert(vo);
|
||||||
|
log.debug("행위 유형 등록 완료 - 등록 건수: {}", result);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 기존 행위 유형 정보를 수정한다.
|
||||||
|
* PK(코드) 필수값 검증을 수행한 후 수정을 진행한다.
|
||||||
|
* @param vo 수정할 행위 유형 정보를 담은 VO 객체
|
||||||
|
* @return 수정된 행의 수
|
||||||
|
* @throws MessageException PK 필수값 누락 시 발생
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public int update(ActTypeVO vo) {
|
||||||
|
log.debug("행위 유형 수정 - 코드: {}, 위반 건축물: {}", vo.getActTypeCd(), vo.getVltnBdst());
|
||||||
|
|
||||||
|
// PK(코드) 필수값 검증
|
||||||
|
if (vo.getActTypeCd() == null || vo.getActTypeCd().trim().isEmpty()) {
|
||||||
|
log.warn("행위 유형 등록 실패 - 코드 미입력");
|
||||||
|
throw new MessageException("코드는 필수값입니다.");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 위반 건축물 바이트 길이 검증 (한글 3바이트 기준 최대 100바이트)
|
||||||
|
if (vo.getVltnBdst() != null && !vo.getVltnBdst().trim().isEmpty()) {
|
||||||
|
int byteLength = StringUtil.calculateUtf8ByteLength(vo.getVltnBdst());
|
||||||
|
if (byteLength > 100) {
|
||||||
|
log.warn("행위 유형 등록 실패 - 위반 건축물 바이트 길이 초과: {}바이트", byteLength);
|
||||||
|
throw new MessageException("위반 건축물은 최대 100바이트까지 입력 가능합니다. (현재: " + byteLength + "바이트)");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 위반 건축물 상세 바이트 길이 검증 (한글 3바이트 기준 최대 1000바이트)
|
||||||
|
if (vo.getVltnBdstDtl() != null && !vo.getVltnBdstDtl().trim().isEmpty()) {
|
||||||
|
int byteLength = StringUtil.calculateUtf8ByteLength(vo.getVltnBdstDtl());
|
||||||
|
if (byteLength > 1000) {
|
||||||
|
log.warn("행위 유형 등록 실패 - 위반 건축물 상세 바이트 길이 초과: {}바이트", byteLength);
|
||||||
|
throw new MessageException("위반 건축물은 최대 1000바이트까지 입력 가능합니다. (현재: " + byteLength + "바이트)");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 수정 수행
|
||||||
|
int result = mapper.update(vo);
|
||||||
|
log.debug("행위 유형 수정 완료 - 수정 건수: {}", result);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 행위 유형 정보를 삭제한다.
|
||||||
|
* PK(코드) 필수값 검증을 수행한 후 삭제를 진행한다.
|
||||||
|
* @param vo 삭제할 PK 정보(코드)를 담은 VO 객체
|
||||||
|
* @return 삭제된 행의 수
|
||||||
|
* @throws MessageException PK 필수값 누락 시 발생
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public int delete(ActTypeVO vo) {
|
||||||
|
log.debug("행위 유형 삭제 - 코드: {}", vo.getActTypeCd());
|
||||||
|
|
||||||
|
// PK(코드) 필수값 검증
|
||||||
|
if (vo.getActTypeCd() == null || vo.getActTypeCd().trim().isEmpty()) {
|
||||||
|
log.warn("행위 유형 삭제 실패 - 코드 미입력");
|
||||||
|
throw new MessageException("코드는 필수값입니다.");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 삭제 수행
|
||||||
|
int result = mapper.delete(vo);
|
||||||
|
log.debug("행위 유형 삭제 완료 - 삭제 건수: {}", result);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PK(코드) 중복 체크를 수행한다.
|
||||||
|
* @param vo 중복 체크할 PK 정보(actTypeCd)를 담은 VO 객체
|
||||||
|
* @return 중복 건수 (0이면 중복 없음, 1이상이면 중복 존재)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public int selectDuplicateCheck(ActTypeVO vo) {
|
||||||
|
log.debug("행위 유형 중복 체크 - 코드: {}", vo.getActTypeCd());
|
||||||
|
return mapper.selectDuplicateCheck(vo);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,167 @@
|
|||||||
|
package go.kr.project.baseData.cmpttnRt2.controller;
|
||||||
|
|
||||||
|
import egovframework.constant.MessageConstants;
|
||||||
|
import egovframework.constant.TilesConstants;
|
||||||
|
import egovframework.exception.MessageException;
|
||||||
|
import egovframework.util.ApiResponseUtil;
|
||||||
|
import egovframework.util.SessionUtil;
|
||||||
|
import go.kr.project.baseData.cmpttnRt2.model.CmpttnRt2VO;
|
||||||
|
import go.kr.project.baseData.cmpttnRt2.service.CmpttnRt2Service;
|
||||||
|
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;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* packageName : go.kr.project.baseData.cmpttnRt2.controller
|
||||||
|
* fileName : CmpttnRt2Controller
|
||||||
|
* author : 김의진
|
||||||
|
* date : 2025-09-24
|
||||||
|
* description : 기준자료 > 산정률2 웹 컨트롤러
|
||||||
|
* 중요 로직 주석:
|
||||||
|
* ===========================================================
|
||||||
|
* DATE AUTHOR NOTE
|
||||||
|
* -----------------------------------------------------------
|
||||||
|
* 2025-09-24 김의진 최초 생성
|
||||||
|
*/
|
||||||
|
@Controller
|
||||||
|
@RequestMapping("/baseData/cmpttnRt2")
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
@Slf4j
|
||||||
|
@Tag(name = "기준자료: 산정률2", description = "산정률2 관리 API")
|
||||||
|
public class CmpttnRt2Controller {
|
||||||
|
|
||||||
|
/** 산정률2 서비스 */
|
||||||
|
private final CmpttnRt2Service service;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 산정률2 목록 페이지를 조회한다.
|
||||||
|
* @param vo 검색 조건을 담은 VO 객체
|
||||||
|
* @param model 뷰에 전달할 데이터를 담는 모델 객체
|
||||||
|
* @return 목록 페이지 뷰 이름
|
||||||
|
*/
|
||||||
|
@GetMapping("/list.do")
|
||||||
|
@Operation(summary = "산정률2 목록 페이지", description = "목록 페이지를 조회합니다.")
|
||||||
|
public String listPage(CmpttnRt2VO vo, Model model){
|
||||||
|
log.debug("산정률2 목록 페이지 조회");
|
||||||
|
return "baseData/cmpttnRt2/list" + TilesConstants.BASE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 산정률2 목록을 AJAX로 조회한다.
|
||||||
|
* 서버사이드 페이징을 지원하며 검색 조건에 따라 필터링된 결과를 반환한다.
|
||||||
|
* @param vo 검색 조건과 페이징 정보를 담은 VO 객체
|
||||||
|
* @return 목록 데이터와 페이징 정보를 담은 ResponseEntity
|
||||||
|
*/
|
||||||
|
@PostMapping("/list.ajax")
|
||||||
|
@Operation(summary = "목록 조회(AJAX)", description = "페이징 목록을 JSON으로 반환")
|
||||||
|
@ApiResponse(responseCode = "200", description = "성공")
|
||||||
|
public ResponseEntity<?> listAjax(@ModelAttribute CmpttnRt2VO vo){
|
||||||
|
log.debug("산정률2 목록 AJAX 조회 - 검색조건: {}", vo);
|
||||||
|
int total = service.selectListTotalCount(vo); // 1. 총 개수 조회
|
||||||
|
vo.setTotalCount(total); // 2. setTotalCount
|
||||||
|
//vo.setPagingYn("Y"); // 3. 페이징 처리
|
||||||
|
return ApiResponseUtil.successWithGrid(service.selectList(vo), vo);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 산정률2 등록/수정/조회 팝업 페이지를 조회한다.
|
||||||
|
* mode 파라미터에 따라 등록(C), 수정(U), 조회(V) 모드로 동작한다.
|
||||||
|
* @param vo PK 정보를 담은 VO 객체
|
||||||
|
* @param mode 화면 모드 (C: 등록, U: 수정, V: 조회)
|
||||||
|
* @param model 뷰에 전달할 데이터를 담는 모델 객체
|
||||||
|
* @return 팝업 페이지 뷰 이름
|
||||||
|
*/
|
||||||
|
@GetMapping("/popup.do")
|
||||||
|
@Operation(summary = "등록/수정/조회 팝업", description = "window.open으로 호출되는 팝업, mode 파라미터로 C/U/V 구분")
|
||||||
|
public ModelAndView popup(
|
||||||
|
@Parameter(description = "산정률2 코드") @RequestParam(required = false) String cmpttnRt2Cd,
|
||||||
|
@Parameter(description = "화면 모드 (C:등록, U:수정, V:보기)") @RequestParam String mode,
|
||||||
|
Model model) {
|
||||||
|
|
||||||
|
try {
|
||||||
|
log.debug("산정률2 팝업 화면 요청 - 모드: {}, 구조지수코드: {}", mode, cmpttnRt2Cd);
|
||||||
|
|
||||||
|
ModelAndView mav = new ModelAndView("baseData/cmpttnRt2/popup" + TilesConstants.POPUP);
|
||||||
|
mav.addObject("mode", mode);
|
||||||
|
|
||||||
|
// 수정/조회 모드인 경우 기존 데이터 조회
|
||||||
|
if (("U".equals(mode) || "V".equals(mode)) && cmpttnRt2Cd != null) {
|
||||||
|
CmpttnRt2VO paramVO = new CmpttnRt2VO();
|
||||||
|
paramVO.setCmpttnRt2Cd(cmpttnRt2Cd);
|
||||||
|
|
||||||
|
CmpttnRt2VO data = service.selectOne(paramVO);
|
||||||
|
if (data != null) {
|
||||||
|
mav.addObject("data", data);
|
||||||
|
} else {
|
||||||
|
throw new MessageException("해당 산정률2 정보를 찾을 수 없습니다.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return mav;
|
||||||
|
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("산정률2 팝업 화면 제공 중 오류 발생", e);
|
||||||
|
throw new MessageException("팝업 화면을 불러오는 중 오류가 발생했습니다.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 새로운 산정률2 정보를 등록한다.
|
||||||
|
* @param vo 등록할 산정률2 정보를 담은 VO 객체
|
||||||
|
* @return 등록 결과를 담은 ResponseEntity
|
||||||
|
*/
|
||||||
|
@Operation(summary = "산정률2 등록", description = "새로운 산정률2 정보를 등록합니다.")
|
||||||
|
@ApiResponses(value = {
|
||||||
|
@ApiResponse(responseCode = "200", description = "산정률2 등록 성공"),
|
||||||
|
@ApiResponse(responseCode = "400", description = "산정률2 등록 실패"),
|
||||||
|
@ApiResponse(description = "오류로 인한 실패")
|
||||||
|
})
|
||||||
|
@PostMapping("/insert.ajax")
|
||||||
|
public ResponseEntity<?> insert(@ModelAttribute CmpttnRt2VO paramVO) throws Exception {
|
||||||
|
// 등록자 정보 설정
|
||||||
|
paramVO.setRgtr(SessionUtil.getUserId());
|
||||||
|
|
||||||
|
int result = service.insert(paramVO);
|
||||||
|
|
||||||
|
if (result > 0) {
|
||||||
|
return ApiResponseUtil.success(MessageConstants.Common.SAVE_SUCCESS);
|
||||||
|
} else {
|
||||||
|
return ApiResponseUtil.error(MessageConstants.Common.SAVE_ERROR);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 기존 산정률2 정보를 수정한다.
|
||||||
|
* @param vo 수정할 산정률2 정보를 담은 VO 객체
|
||||||
|
* @return 수정 결과를 담은 ResponseEntity
|
||||||
|
*/
|
||||||
|
@Operation(summary = "산정률2 수정", description = "기존 산정률2 정보를 수정합니다.")
|
||||||
|
@ApiResponses(value = {
|
||||||
|
@ApiResponse(responseCode = "200", description = "산정률2 수정 성공"),
|
||||||
|
@ApiResponse(responseCode = "400", description = "산정률2 수정 실패"),
|
||||||
|
@ApiResponse(description = "오류로 인한 실패")
|
||||||
|
})
|
||||||
|
@PostMapping("/update.ajax")
|
||||||
|
public ResponseEntity<?> update(@ModelAttribute CmpttnRt2VO paramVO) throws Exception {
|
||||||
|
// 수정자 정보 설정
|
||||||
|
paramVO.setMdfr(SessionUtil.getUserId());
|
||||||
|
|
||||||
|
int result = service.update(paramVO);
|
||||||
|
|
||||||
|
if (result > 0) {
|
||||||
|
return ApiResponseUtil.success(MessageConstants.Common.UPDATE_SUCCESS);
|
||||||
|
} else {
|
||||||
|
return ApiResponseUtil.error(MessageConstants.Common.UPDATE_ERROR);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,71 @@
|
|||||||
|
package go.kr.project.baseData.cmpttnRt2.mapper;
|
||||||
|
|
||||||
|
import go.kr.project.baseData.cmpttnRt2.model.CmpttnRt2VO;
|
||||||
|
import org.apache.ibatis.annotations.Mapper;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* packageName : go.kr.project.baseData.cmpttnRt2.mapper
|
||||||
|
* fileName : CmpttnRt2Mapper
|
||||||
|
* author : 김의진
|
||||||
|
* date : 2025-09-24
|
||||||
|
* description : 산정률2 MyBatis Mapper 인터페이스
|
||||||
|
* 중요한 로직 주석: SQL 쿼리와 매핑되는 메서드들을 정의하여 데이터베이스 접근을 담당한다.
|
||||||
|
* ===========================================================
|
||||||
|
* DATE AUTHOR NOTE
|
||||||
|
* -----------------------------------------------------------
|
||||||
|
* 2025-09-24 김의진 최초 생성
|
||||||
|
*/
|
||||||
|
@Mapper
|
||||||
|
public interface CmpttnRt2Mapper {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 산정률2 목록을 조회한다.
|
||||||
|
* @param vo 검색 조건과 페이징 정보를 담은 VO 객체
|
||||||
|
* @return 산정률2 목록
|
||||||
|
*/
|
||||||
|
List<CmpttnRt2VO> selectList(CmpttnRt2VO vo);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 산정률2 목록의 총 개수를 조회한다.
|
||||||
|
* @param vo 검색 조건을 담은 VO 객체
|
||||||
|
* @return 조회된 목록의 총 개수
|
||||||
|
*/
|
||||||
|
int selectListTotalCount(CmpttnRt2VO vo);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 특정 코드의 산정률2 정보를 조회한다.
|
||||||
|
* @param vo 조회할 PK 정보를 담은 VO 객체
|
||||||
|
* @return 조회된 산정률2 정보
|
||||||
|
*/
|
||||||
|
CmpttnRt2VO selectOne(CmpttnRt2VO vo);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 새로운 산정률2 정보를 등록한다.
|
||||||
|
* @param vo 등록할 산정률2 정보를 담은 VO 객체
|
||||||
|
* @return 등록된 행의 수
|
||||||
|
*/
|
||||||
|
int insert(CmpttnRt2VO vo);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 기존 산정률2 정보를 수정한다.
|
||||||
|
* @param vo 수정할 산정률2 정보를 담은 VO 객체
|
||||||
|
* @return 수정된 행의 수
|
||||||
|
*/
|
||||||
|
int update(CmpttnRt2VO vo);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 산정률2 정보를 삭제한다.
|
||||||
|
* @param vo 삭제할 PK 정보(cmpttnRt2Cd)를 담은 VO 객체
|
||||||
|
* @return 삭제된 행의 수
|
||||||
|
*/
|
||||||
|
int delete(CmpttnRt2VO vo);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PK(코드) 중복 체크를 수행한다.
|
||||||
|
* @param vo 중복 체크할 PK 정보(cmpttnRt2Cd)를 담은 VO 객체
|
||||||
|
* @return 중복 건수 (0이면 중복 없음, 1이상이면 중복 존재)
|
||||||
|
*/
|
||||||
|
int selectDuplicateCheck(CmpttnRt2VO vo);
|
||||||
|
}
|
||||||
@ -0,0 +1,80 @@
|
|||||||
|
package go.kr.project.baseData.cmpttnRt2.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;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* packageName : go.kr.project.baseData.cmpttnRt2.model
|
||||||
|
* fileName : CmpttnRt2VO
|
||||||
|
* author : 김의진
|
||||||
|
* date : 2025-09-24
|
||||||
|
* description : 산정률2 관련 데이터를 담는 Value Object 클래스
|
||||||
|
* 중요한 로직 주석: 산정률2 테이블(tb_cmpttn_rt2)과 매핑되는 VO 클래스로 페이징 기능을 포함한다. *
|
||||||
|
* ===========================================================
|
||||||
|
* DATE AUTHOR NOTE
|
||||||
|
* -----------------------------------------------------------
|
||||||
|
* 2025-09-24 김의진 최초 생성
|
||||||
|
*/
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
|
@Data
|
||||||
|
@Builder
|
||||||
|
@AllArgsConstructor
|
||||||
|
@NoArgsConstructor
|
||||||
|
@ToString
|
||||||
|
public class CmpttnRt2VO extends PagingVO {
|
||||||
|
|
||||||
|
// ==================== 기본 테이블 컬럼 ====================
|
||||||
|
|
||||||
|
/** 산정률2 코드 (PK) - 1자리 코드 */
|
||||||
|
private String cmpttnRt2Cd;
|
||||||
|
|
||||||
|
/** 위반 사항 */
|
||||||
|
private String vltnMttr;
|
||||||
|
|
||||||
|
/** 산정률2 - DECIMAL(3,0) */
|
||||||
|
private BigDecimal cmpttnRt2;
|
||||||
|
|
||||||
|
/** 사용 여부 */
|
||||||
|
private String useYn;
|
||||||
|
|
||||||
|
/** 등록 일시 - 테이블은 date 컬럼을 사용하지만 화면 표시용으로 문자열 타입 사용 */
|
||||||
|
@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;
|
||||||
|
|
||||||
|
/** 등록자 ID */
|
||||||
|
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;
|
||||||
|
|
||||||
|
/** 수정자 ID */
|
||||||
|
private String mdfr;
|
||||||
|
|
||||||
|
// ==================== 조인 컬럼 (코드명) ====================
|
||||||
|
|
||||||
|
/** 등록자 */
|
||||||
|
private String rgtrNm;
|
||||||
|
|
||||||
|
/** 수정자 */
|
||||||
|
private String mdfrNm;
|
||||||
|
|
||||||
|
/** 행 번호 (그리드 표시용) */
|
||||||
|
private Integer rowNum;
|
||||||
|
|
||||||
|
// ==================== 검색 조건 ====================
|
||||||
|
|
||||||
|
/** 검색 조건 선택 */
|
||||||
|
private String schType;
|
||||||
|
private String schTypeTxt;
|
||||||
|
|
||||||
|
/** 검색 조건 - 사용 여부 */
|
||||||
|
private String schUseYn;
|
||||||
|
}
|
||||||
@ -0,0 +1,69 @@
|
|||||||
|
package go.kr.project.baseData.cmpttnRt2.service;
|
||||||
|
|
||||||
|
import go.kr.project.baseData.cmpttnRt2.model.CmpttnRt2VO;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* packageName : go.kr.project.baseData.cmpttnRt2.service
|
||||||
|
* fileName : CmpttnRt2Service
|
||||||
|
* author : 김의진
|
||||||
|
* date : 2025-09-24
|
||||||
|
* description : 산정률2 비즈니스 로직 처리를 위한 서비스 인터페이스
|
||||||
|
* 중요한 로직 주석: 컨트롤러와 매퍼 사이의 비즈니스 로직을 정의하고 데이터 처리 규칙을 관리한다.
|
||||||
|
* ===========================================================
|
||||||
|
* DATE AUTHOR NOTE
|
||||||
|
* -----------------------------------------------------------
|
||||||
|
* 2025-09-24 김의진 최초 생성
|
||||||
|
*/
|
||||||
|
public interface CmpttnRt2Service {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 산정률2 목록을 조회한다.
|
||||||
|
* @param vo 검색 조건과 페이징 정보를 담은 VO 객체
|
||||||
|
* @return 산정률2 목록
|
||||||
|
*/
|
||||||
|
List<CmpttnRt2VO> selectList(CmpttnRt2VO vo);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 산정률2 목록의 총 개수를 조회한다.
|
||||||
|
* @param vo 검색 조건을 담은 VO 객체
|
||||||
|
* @return 조회된 목록의 총 개수
|
||||||
|
*/
|
||||||
|
int selectListTotalCount(CmpttnRt2VO vo);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 특정 코드의 산정률2 정보를 조회한다.
|
||||||
|
* @param vo 조회할 PK 정보를 담은 VO 객체
|
||||||
|
* @return 조회된 산정률2 정보
|
||||||
|
*/
|
||||||
|
CmpttnRt2VO selectOne(CmpttnRt2VO vo);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 새로운 산정률2 정보를 등록한다.
|
||||||
|
* @param vo 등록할 산정률2 정보를 담은 VO 객체
|
||||||
|
* @return 등록된 행의 수
|
||||||
|
*/
|
||||||
|
int insert(CmpttnRt2VO vo);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 기존 산정률2 정보를 수정한다.
|
||||||
|
* @param vo 수정할 산정률2 정보를 담은 VO 객체
|
||||||
|
* @return 수정된 행의 수
|
||||||
|
*/
|
||||||
|
int update(CmpttnRt2VO vo);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 산정률2 정보를 삭제한다.
|
||||||
|
* @param vo 삭제할 PK 정보(cmpttnRt2Cd)를 담은 VO 객체
|
||||||
|
* @return 삭제된 행의 수
|
||||||
|
*/
|
||||||
|
int delete(CmpttnRt2VO vo);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PK(코드) 중복 체크를 수행한다.
|
||||||
|
* @param vo 중복 체크할 PK 정보(cmpttnRt2Cd)를 담은 VO 객체
|
||||||
|
* @return 중복 건수 (0이면 중복 없음, 1이상이면 중복 존재)
|
||||||
|
*/
|
||||||
|
int selectDuplicateCheck(CmpttnRt2VO vo);
|
||||||
|
}
|
||||||
@ -0,0 +1,176 @@
|
|||||||
|
package go.kr.project.baseData.cmpttnRt2.service.impl;
|
||||||
|
|
||||||
|
import egovframework.exception.MessageException;
|
||||||
|
import egovframework.util.SessionUtil;
|
||||||
|
import egovframework.util.StringUtil;
|
||||||
|
import go.kr.project.baseData.cmpttnRt2.mapper.CmpttnRt2Mapper;
|
||||||
|
import go.kr.project.baseData.cmpttnRt2.model.CmpttnRt2VO;
|
||||||
|
import go.kr.project.baseData.cmpttnRt2.service.CmpttnRt2Service;
|
||||||
|
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.baseData.cmpttnRt2.service.impl
|
||||||
|
* fileName : CmpttnRt2ServiceImpl
|
||||||
|
* author : 김의진
|
||||||
|
* date : 2025-09-22
|
||||||
|
* description : 산정률2 비즈니스 로직 처리를 위한 서비스 구현체
|
||||||
|
* 중요한 로직 주석: 서비스 인터페이스를 구현하여 실제 비즈니스 로직을 처리하고 매퍼를 호출한다.
|
||||||
|
* ===========================================================
|
||||||
|
* DATE AUTHOR NOTE
|
||||||
|
* -----------------------------------------------------------
|
||||||
|
* 2025-09-22 김의진 최초 생성
|
||||||
|
*/
|
||||||
|
@Service
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
@Slf4j
|
||||||
|
public class CmpttnRt2ServiceImpl extends EgovAbstractServiceImpl implements CmpttnRt2Service {
|
||||||
|
|
||||||
|
/** 산정률2 매퍼 */
|
||||||
|
private final CmpttnRt2Mapper mapper;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 산정률2 목록을 조회한다.
|
||||||
|
* @param vo 검색 조건과 페이징 정보를 담은 VO 객체
|
||||||
|
* @return 산정률2 목록
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public List<CmpttnRt2VO> selectList(CmpttnRt2VO vo) {
|
||||||
|
log.debug("산정률2 목록 조회 - 검색조건: {}", vo);
|
||||||
|
return mapper.selectList(vo);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 산정률2 목록의 총 개수를 조회한다.
|
||||||
|
* @param vo 검색 조건을 담은 VO 객체
|
||||||
|
* @return 조회된 목록의 총 개수
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public int selectListTotalCount(CmpttnRt2VO vo) {
|
||||||
|
log.debug("산정률2 총 개수 조회 - 검색조건: {}", vo);
|
||||||
|
return mapper.selectListTotalCount(vo);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 특정 코드에 해당하는 산정률2 정보를 조회한다.
|
||||||
|
* @param vo 조회할 PK 정보(cmpttnRt2Cd)를 담은 VO 객체
|
||||||
|
* @return 조회된 산정률2 정보
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public CmpttnRt2VO selectOne(CmpttnRt2VO vo) {
|
||||||
|
log.debug("산정률2 단건 조회 - 코드: {}", vo.getCmpttnRt2Cd());
|
||||||
|
return mapper.selectOne(vo);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 새로운 산정률2 정보를 등록한다.
|
||||||
|
* PK(코드) 필수값 검증과 중복 체크를 수행한 후 등록을 진행한다.
|
||||||
|
* @param vo 등록할 산정률2 정보를 담은 VO 객체
|
||||||
|
* @return 등록된 행의 수
|
||||||
|
* @throws MessageException PK 필수값 누락 또는 중복 시 발생
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public int insert(CmpttnRt2VO vo) {
|
||||||
|
log.debug("산정률2 등록 - 코드: {}, 위반 건축물: {}", vo.getCmpttnRt2Cd(), vo.getVltnMttr());
|
||||||
|
|
||||||
|
// PK(코드) 필수값 검증
|
||||||
|
if (vo.getCmpttnRt2Cd() == null || vo.getCmpttnRt2Cd().trim().isEmpty()) {
|
||||||
|
log.warn("산정률2 등록 실패 - 코드 미입력");
|
||||||
|
throw new MessageException("코드는 필수값입니다.");
|
||||||
|
}
|
||||||
|
|
||||||
|
// PK 중복 체크
|
||||||
|
int duplicateCount = mapper.selectDuplicateCheck(vo);
|
||||||
|
if (duplicateCount > 0) {
|
||||||
|
log.warn("산정률2 등록 실패 - 중복된 PK: 코드={}", vo.getCmpttnRt2Cd());
|
||||||
|
throw new MessageException("이미 존재하는 산정률2 코드입니다. 다른 값을 입력해주세요.");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 위반 건축물 바이트 길이 검증 (한글 3바이트 기준 최대 100바이트)
|
||||||
|
if (vo.getVltnMttr() != null && !vo.getVltnMttr().trim().isEmpty()) {
|
||||||
|
int byteLength = StringUtil.calculateUtf8ByteLength(vo.getVltnMttr());
|
||||||
|
if (byteLength > 100) {
|
||||||
|
log.warn("산정률2 등록 실패 - 위반 건축물 바이트 길이 초과: {}바이트", byteLength);
|
||||||
|
throw new MessageException("위반 사항은 최대 100바이트까지 입력 가능합니다. (현재: " + byteLength + "바이트)");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 등록자 정보 설정 및 등록 수행
|
||||||
|
vo.setRgtr(SessionUtil.getUserId());
|
||||||
|
int result = mapper.insert(vo);
|
||||||
|
log.debug("산정률2 등록 완료 - 등록 건수: {}", result);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 기존 산정률2 정보를 수정한다.
|
||||||
|
* PK(코드) 필수값 검증을 수행한 후 수정을 진행한다.
|
||||||
|
* @param vo 수정할 산정률2 정보를 담은 VO 객체
|
||||||
|
* @return 수정된 행의 수
|
||||||
|
* @throws MessageException PK 필수값 누락 시 발생
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public int update(CmpttnRt2VO vo) {
|
||||||
|
log.debug("산정률2 수정 - 코드: {}, 위반 건축물: {}", vo.getCmpttnRt2Cd(), vo.getVltnMttr());
|
||||||
|
|
||||||
|
// PK(코드) 필수값 검증
|
||||||
|
if (vo.getCmpttnRt2Cd() == null || vo.getCmpttnRt2Cd().trim().isEmpty()) {
|
||||||
|
log.warn("산정률2 등록 실패 - 코드 미입력");
|
||||||
|
throw new MessageException("코드는 필수값입니다.");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 위반 건축물 바이트 길이 검증 (한글 3바이트 기준 최대 100바이트)
|
||||||
|
if (vo.getVltnMttr() != null && !vo.getVltnMttr().trim().isEmpty()) {
|
||||||
|
int byteLength = StringUtil.calculateUtf8ByteLength(vo.getVltnMttr());
|
||||||
|
if (byteLength > 100) {
|
||||||
|
log.warn("산정률2 등록 실패 - 위반 건축물 바이트 길이 초과: {}바이트", byteLength);
|
||||||
|
throw new MessageException("위반 사항은 최대 100바이트까지 입력 가능합니다. (현재: " + byteLength + "바이트)");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 수정 수행
|
||||||
|
int result = mapper.update(vo);
|
||||||
|
log.debug("산정률2 수정 완료 - 수정 건수: {}", result);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 산정률2 정보를 삭제한다.
|
||||||
|
* PK(코드) 필수값 검증을 수행한 후 삭제를 진행한다.
|
||||||
|
* @param vo 삭제할 PK 정보(코드)를 담은 VO 객체
|
||||||
|
* @return 삭제된 행의 수
|
||||||
|
* @throws MessageException PK 필수값 누락 시 발생
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public int delete(CmpttnRt2VO vo) {
|
||||||
|
log.debug("산정률2 삭제 - 코드: {}", vo.getCmpttnRt2Cd());
|
||||||
|
|
||||||
|
// PK(코드) 필수값 검증
|
||||||
|
if (vo.getCmpttnRt2Cd() == null || vo.getCmpttnRt2Cd().trim().isEmpty()) {
|
||||||
|
log.warn("산정률2 삭제 실패 - 코드 미입력");
|
||||||
|
throw new MessageException("코드는 필수값입니다.");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 삭제 수행
|
||||||
|
int result = mapper.delete(vo);
|
||||||
|
log.debug("산정률2 삭제 완료 - 삭제 건수: {}", result);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PK(코드) 중복 체크를 수행한다.
|
||||||
|
* @param vo 중복 체크할 PK 정보(cmpttnRt2Cd)를 담은 VO 객체
|
||||||
|
* @return 중복 건수 (0이면 중복 없음, 1이상이면 중복 존재)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public int selectDuplicateCheck(CmpttnRt2VO vo) {
|
||||||
|
log.debug("산정률2 중복 체크 - 코드: {}", vo.getCmpttnRt2Cd());
|
||||||
|
return mapper.selectDuplicateCheck(vo);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,145 @@
|
|||||||
|
<?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.baseData.actType.mapper.ActTypeMapper">
|
||||||
|
|
||||||
|
<!--
|
||||||
|
행위 유형 목록 조회
|
||||||
|
- 검색 조건: 행위유형코드, 위반 건축물(schTypeTxt)
|
||||||
|
- 정렬: 행위유형코드 오름차순
|
||||||
|
-->
|
||||||
|
<select id="selectList" parameterType="ActTypeVO" resultType="ActTypeVO">
|
||||||
|
SELECT a.ACT_TYPE_CD /* 행위 유형 코드 */
|
||||||
|
, a.VLTN_BDST /* 위반 건축물 */
|
||||||
|
, a.LAWLPRVS /* 법조문 */
|
||||||
|
, a.CMPTTN_RT /* 산정률 */
|
||||||
|
, a.VLTN_BDST_DTL /* 위반 건축물 상세 */
|
||||||
|
, a.USE_YN /* 사용 여부 */
|
||||||
|
, a.REG_DT /* 등록 일시 */
|
||||||
|
, a.RGTR /* 등록자 */
|
||||||
|
, a.MDFCN_DT /* 수정 일시 */
|
||||||
|
, a.MDFR /* 수정자 */
|
||||||
|
, ru.USER_NM AS RGTR_NM /* 등록자 명 */
|
||||||
|
, mu.USER_NM AS MDFR_NM /* 수정자 명 */
|
||||||
|
FROM tb_act_type a
|
||||||
|
LEFT JOIN tb_user ru ON a.RGTR = ru.USER_ID
|
||||||
|
LEFT JOIN tb_user mu ON a.MDFR = mu.USER_ID
|
||||||
|
WHERE 1=1
|
||||||
|
<if test='schTypeTxt != null and schTypeTxt != ""'>
|
||||||
|
<choose>
|
||||||
|
<when test='schType == "1"'>
|
||||||
|
and a.VLTN_BDST like concat('%',#{schTypeTxt},'%') /* 검색 조건 - 위반 건축물 */
|
||||||
|
</when>
|
||||||
|
<when test='schType == "2"'>
|
||||||
|
and a.ACT_TYPE_CD = #{schTypeTxt} /* 검색 조건 - 행위 유형 코드 */
|
||||||
|
</when>
|
||||||
|
</choose>
|
||||||
|
</if>
|
||||||
|
<if test='schUseYn != null and schUseYn != ""'>
|
||||||
|
and a.USE_YN = #{schUseYn} /* 검색 조건 - 사용 여부 */
|
||||||
|
</if>
|
||||||
|
ORDER BY a.ACT_TYPE_CD asc /* 코드 오름차순 정렬 */
|
||||||
|
</select>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
행위 유형 목록 총 개수 조회
|
||||||
|
- 검색 조건: 행위유형코드, 위반 건축물(schTypeTxt)
|
||||||
|
-->
|
||||||
|
<select id="selectListTotalCount" parameterType="ActTypeVO" resultType="int">
|
||||||
|
SELECT count(*) /* 총 개수 조회 */
|
||||||
|
FROM tb_act_type a
|
||||||
|
where 1=1
|
||||||
|
<if test='schTypeTxt != null and schTypeTxt != ""'>
|
||||||
|
<choose>
|
||||||
|
<when test='schType == "1"'>
|
||||||
|
and a.VLTN_BDST like concat('%',#{schTypeTxt},'%') /* 검색 조건 - 위반 건축물 */
|
||||||
|
</when>
|
||||||
|
<when test='schType == "2"'>
|
||||||
|
and a.ACT_TYPE_CD = #{schTypeTxt} /* 검색 조건 - 행위 유형 코드 */
|
||||||
|
</when>
|
||||||
|
</choose>
|
||||||
|
</if>
|
||||||
|
<if test='schUseYn != null and schUseYn != ""'>
|
||||||
|
and a.USE_YN = #{schUseYn} /* 검색 조건 - 사용 여부 */
|
||||||
|
</if>
|
||||||
|
</select>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
행위 유형 단건 조회
|
||||||
|
- 조건: PK(코드)
|
||||||
|
- 팝업에서 수정 모드 시 사용
|
||||||
|
-->
|
||||||
|
<select id="selectOne" parameterType="ActTypeVO" resultType="ActTypeVO">
|
||||||
|
SELECT a.ACT_TYPE_CD /* 행위 유형 코드 */
|
||||||
|
, a.VLTN_BDST /* 위반 건축물 */
|
||||||
|
, a.LAWLPRVS /* 법조문 */
|
||||||
|
, a.CMPTTN_RT /* 산정률 */
|
||||||
|
, a.VLTN_BDST_DTL /* 위반 건축물 상세 */
|
||||||
|
, a.USE_YN /* 사용 여부 */
|
||||||
|
, a.REG_DT /* 등록 일시 */
|
||||||
|
, a.RGTR /* 등록자 */
|
||||||
|
, a.MDFCN_DT /* 수정 일시 */
|
||||||
|
, a.MDFR /* 수정자 */
|
||||||
|
, ru.USER_NM AS RGTR_NM /* 등록자 명 */
|
||||||
|
, mu.USER_NM AS MDFR_NM /* 수정자 명 */
|
||||||
|
FROM tb_act_type a
|
||||||
|
LEFT JOIN tb_user ru ON a.RGTR = ru.USER_ID
|
||||||
|
LEFT JOIN tb_user mu ON a.MDFR = mu.USER_ID
|
||||||
|
WHERE a.ACT_TYPE_CD = #{actTypeCd} /* 코드 검색 조건 */
|
||||||
|
</select>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
행위 유형 정보 등록
|
||||||
|
- PK: 행위유형코드
|
||||||
|
-->
|
||||||
|
<insert id="insert" parameterType="ActTypeVO">
|
||||||
|
INSERT INTO tb_act_type (
|
||||||
|
ACT_TYPE_CD /* 행위 유형 코드 */
|
||||||
|
, VLTN_BDST /* 위반 건축물 */
|
||||||
|
, LAWLPRVS /* 법조문 */
|
||||||
|
, CMPTTN_RT /* 산정률 */
|
||||||
|
, VLTN_BDST_DTL /* 위반 건축물 상세 */
|
||||||
|
, USE_YN /* 사용 여부 */
|
||||||
|
, REG_DT /* 등록 일시 */
|
||||||
|
, RGTR /* 등록자 */
|
||||||
|
) VALUES (
|
||||||
|
#{actTypeCd} /* 행위 유형 코드 */
|
||||||
|
, #{vltnBdst} /* 위반 건축물 */
|
||||||
|
, #{lawlprvs} /* 법조문 */
|
||||||
|
, #{cmpttnRt} /* 산정률 */
|
||||||
|
, #{vltnBdstDtl} /* 위반 건축물 상세 */
|
||||||
|
, #{useYn} /* 사용 여부 */
|
||||||
|
, NOW() /* 등록 일시 - 현재 날짜 자동 설정 */
|
||||||
|
, #{rgtr} /* 등록자 - 세션 사용자 ID */
|
||||||
|
)
|
||||||
|
</insert>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
행위 유형 정보 수정
|
||||||
|
- 조건: PK(코드)
|
||||||
|
- 수정 대상: 위반 건축물, 법조문, 산정률, 위반 건축물 상세, 사용 여부, 수정일시, 수정자
|
||||||
|
-->
|
||||||
|
<update id="update" parameterType="ActTypeVO">
|
||||||
|
UPDATE tb_act_type
|
||||||
|
SET VLTN_BDST = #{vltnBdst} /* 위반 건축물 */
|
||||||
|
, LAWLPRVS = #{lawlprvs} /* 법조문 */
|
||||||
|
, CMPTTN_RT = #{cmpttnRt} /* 산정률 */
|
||||||
|
, VLTN_BDST_DTL = #{vltnBdstDtl} /* 위반 건축물 상세 */
|
||||||
|
, USE_YN = #{useYn} /* 사용 여부 */
|
||||||
|
, MDFCN_DT = NOW() /* 수정 일시 */
|
||||||
|
, MDFR = #{mdfr} /* 수정자 */
|
||||||
|
WHERE ACT_TYPE_CD = #{actTypeCd} /* 행위 유형 코드 */
|
||||||
|
</update>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
PK(코드) 중복 체크
|
||||||
|
- 등록 시 동일한 PK가 존재하는지 확인
|
||||||
|
- 반환값: 0이면 중복 없음, 1이상이면 중복 존재
|
||||||
|
-->
|
||||||
|
<select id="selectDuplicateCheck" parameterType="ActTypeVO" resultType="int">
|
||||||
|
select count(*) /* 중복 건수 조회 */
|
||||||
|
from tb_act_type
|
||||||
|
where ACT_TYPE_CD = #{actTypeCd} /* 행위 유형 코드 */
|
||||||
|
</select>
|
||||||
|
</mapper>
|
||||||
@ -0,0 +1,135 @@
|
|||||||
|
<?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.baseData.cmpttnRt2.mapper.CmpttnRt2Mapper">
|
||||||
|
|
||||||
|
<!--
|
||||||
|
산정률2 목록 조회
|
||||||
|
- 검색 조건: 산정률2코드, 위반 사항(schTypeTxt)
|
||||||
|
- 정렬: 산정률2코드 오름차순
|
||||||
|
-->
|
||||||
|
<select id="selectList" parameterType="CmpttnRt2VO" resultType="CmpttnRt2VO">
|
||||||
|
SELECT a.CMPTTN_RT_2_CD /* 산정률2 코드 */
|
||||||
|
, a.VLTN_MTTR /* 위반 사항 */
|
||||||
|
, a.CMPTTN_RT_2 /* 산정률2 */
|
||||||
|
, a.USE_YN /* 사용 여부 */
|
||||||
|
, a.REG_DT /* 등록 일시 */
|
||||||
|
, a.RGTR /* 등록자 */
|
||||||
|
, a.MDFCN_DT /* 수정 일시 */
|
||||||
|
, a.MDFR /* 수정자 */
|
||||||
|
, ru.USER_NM AS RGTR_NM /* 등록자 명 */
|
||||||
|
, mu.USER_NM AS MDFR_NM /* 수정자 명 */
|
||||||
|
FROM tb_cmpttn_rt_2 a
|
||||||
|
LEFT JOIN tb_user ru ON a.RGTR = ru.USER_ID
|
||||||
|
LEFT JOIN tb_user mu ON a.MDFR = mu.USER_ID
|
||||||
|
WHERE 1=1
|
||||||
|
<if test='schTypeTxt != null and schTypeTxt != ""'>
|
||||||
|
<choose>
|
||||||
|
<when test='schType == "1"'>
|
||||||
|
and a.VLTN_MTTR like concat('%',#{schTypeTxt},'%') /* 검색 조건 - 위반 사항 */
|
||||||
|
</when>
|
||||||
|
<when test='schType == "2"'>
|
||||||
|
and a.CMPTTN_RT_2_CD = #{schTypeTxt} /* 검색 조건 - 산정률2 코드 */
|
||||||
|
</when>
|
||||||
|
</choose>
|
||||||
|
</if>
|
||||||
|
<if test='schUseYn != null and schUseYn != ""'>
|
||||||
|
and a.USE_YN = #{schUseYn} /* 검색 조건 - 사용 여부 */
|
||||||
|
</if>
|
||||||
|
ORDER BY a.CMPTTN_RT_2_CD asc /* 코드 오름차순 정렬 */
|
||||||
|
</select>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
산정률2 목록 총 개수 조회
|
||||||
|
- 검색 조건: 산정률2코드, 위반 사항(schTypeTxt)
|
||||||
|
-->
|
||||||
|
<select id="selectListTotalCount" parameterType="CmpttnRt2VO" resultType="int">
|
||||||
|
SELECT count(*) /* 총 개수 조회 */
|
||||||
|
FROM tb_cmpttn_rt_2 a
|
||||||
|
where 1=1
|
||||||
|
<if test='schTypeTxt != null and schTypeTxt != ""'>
|
||||||
|
<choose>
|
||||||
|
<when test='schType == "1"'>
|
||||||
|
and a.VLTN_MTTR like concat('%',#{schTypeTxt},'%') /* 검색 조건 - 위반 사항 */
|
||||||
|
</when>
|
||||||
|
<when test='schType == "2"'>
|
||||||
|
and a.CMPTTN_RT_2_CD = #{schTypeTxt} /* 검색 조건 - 산정률2 코드 */
|
||||||
|
</when>
|
||||||
|
</choose>
|
||||||
|
</if>
|
||||||
|
<if test='schUseYn != null and schUseYn != ""'>
|
||||||
|
and a.USE_YN = #{schUseYn} /* 검색 조건 - 사용 여부 */
|
||||||
|
</if>
|
||||||
|
</select>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
산정률2 단건 조회
|
||||||
|
- 조건: PK(코드)
|
||||||
|
- 팝업에서 수정 모드 시 사용
|
||||||
|
-->
|
||||||
|
<select id="selectOne" parameterType="CmpttnRt2VO" resultType="CmpttnRt2VO">
|
||||||
|
SELECT a.CMPTTN_RT_2_CD /* 산정률2 코드 */
|
||||||
|
, a.VLTN_MTTR /* 위반 사항 */
|
||||||
|
, a.CMPTTN_RT_2 /* 산정률2 */
|
||||||
|
, a.USE_YN /* 사용 여부 */
|
||||||
|
, a.REG_DT /* 등록 일시 */
|
||||||
|
, a.RGTR /* 등록자 */
|
||||||
|
, a.MDFCN_DT /* 수정 일시 */
|
||||||
|
, a.MDFR /* 수정자 */
|
||||||
|
, ru.USER_NM AS RGTR_NM /* 등록자 명 */
|
||||||
|
, mu.USER_NM AS MDFR_NM /* 수정자 명 */
|
||||||
|
FROM tb_cmpttn_rt_2 a
|
||||||
|
LEFT JOIN tb_user ru ON a.RGTR = ru.USER_ID
|
||||||
|
LEFT JOIN tb_user mu ON a.MDFR = mu.USER_ID
|
||||||
|
WHERE a.CMPTTN_RT_2_CD = #{cmpttnRt2Cd} /* 코드 검색 조건 */
|
||||||
|
</select>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
산정률2 정보 등록
|
||||||
|
- PK: 산정률2코드
|
||||||
|
-->
|
||||||
|
<insert id="insert" parameterType="CmpttnRt2VO">
|
||||||
|
INSERT INTO tb_cmpttn_rt_2 (
|
||||||
|
CMPTTN_RT_2_CD /* 산정률2 코드 */
|
||||||
|
, VLTN_MTTR /* 위반 사항 */
|
||||||
|
, CMPTTN_RT_2 /* 산정률2 */
|
||||||
|
, USE_YN /* 사용 여부 */
|
||||||
|
, REG_DT /* 등록 일시 */
|
||||||
|
, RGTR /* 등록자 */
|
||||||
|
) VALUES (
|
||||||
|
#{cmpttnRt2Cd} /* 산정률2 코드 */
|
||||||
|
, #{vltnMttr} /* 위반 사항 */
|
||||||
|
, #{cmpttnRt2} /* 산정률2 */
|
||||||
|
, #{useYn} /* 사용 여부 */
|
||||||
|
, NOW() /* 등록 일시 - 현재 날짜 자동 설정 */
|
||||||
|
, #{rgtr} /* 등록자 - 세션 사용자 ID */
|
||||||
|
)
|
||||||
|
</insert>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
산정률2 정보 수정
|
||||||
|
- 조건: PK(코드)
|
||||||
|
- 수정 대상: 위반 사항, 산정률2, 사용 여부, 수정일시, 수정자
|
||||||
|
-->
|
||||||
|
<update id="update" parameterType="CmpttnRt2VO">
|
||||||
|
UPDATE tb_cmpttn_rt_2
|
||||||
|
SET VLTN_MTTR = #{vltnMttr} /* 위반 사항 */
|
||||||
|
, CMPTTN_RT_2 = #{cmpttnRt2} /* 산정률2 */
|
||||||
|
, USE_YN = #{useYn} /* 사용 여부 */
|
||||||
|
, MDFCN_DT = NOW() /* 수정 일시 */
|
||||||
|
, MDFR = #{mdfr} /* 수정자 */
|
||||||
|
WHERE CMPTTN_RT_2_CD = #{cmpttnRt2Cd} /* 산정률2 코드 */
|
||||||
|
</update>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
PK(코드) 중복 체크
|
||||||
|
- 등록 시 동일한 PK가 존재하는지 확인
|
||||||
|
- 반환값: 0이면 중복 없음, 1이상이면 중복 존재
|
||||||
|
-->
|
||||||
|
<select id="selectDuplicateCheck" parameterType="CmpttnRt2VO" resultType="int">
|
||||||
|
select count(*) /* 중복 건수 조회 */
|
||||||
|
from tb_cmpttn_rt_2
|
||||||
|
where CMPTTN_RT_2_CD = #{cmpttnRt2Cd} /* 산정률2 코드 */
|
||||||
|
</select>
|
||||||
|
</mapper>
|
||||||
@ -0,0 +1,376 @@
|
|||||||
|
<%@ 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><select id="schType" name="schType" class="input">
|
||||||
|
<option value="1">위반 건축물</option>
|
||||||
|
<option value="2">행위유형코드</option>
|
||||||
|
</select>
|
||||||
|
</li>
|
||||||
|
<li><input type="text" id="schTypeTxt" name="schTypeTxt"
|
||||||
|
maxlength="13" class="input" style="width: 120px;"
|
||||||
|
autocomplete="off" /></li>
|
||||||
|
<li class="th">사용 여부</li>
|
||||||
|
<li><select id="schUseYn" name="schUseYn" class="input">
|
||||||
|
<option value="Y">사용</option>
|
||||||
|
<option value="N">미사용</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></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 setSearchCond = function() {
|
||||||
|
var schType = $.trim(nvl($("#schType").val(), ""));
|
||||||
|
var schTypeTxt = $.trim(nvl($("#schTypeTxt").val(), ""));
|
||||||
|
var schUseYn = $.trim(nvl($("#schUseYn").val(), ""));
|
||||||
|
|
||||||
|
SEARCH_COND.schType = schType;
|
||||||
|
SEARCH_COND.schTypeTxt = schTypeTxt;
|
||||||
|
SEARCH_COND.schUseYn = schUseYn;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 행위 유형 목록 관리 네임스페이스
|
||||||
|
*/
|
||||||
|
var StrctIdxList = {
|
||||||
|
/**
|
||||||
|
* 선택된 행 정보
|
||||||
|
*/
|
||||||
|
selectedRow : null,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 그리드 관련 객체
|
||||||
|
*/
|
||||||
|
grid : {
|
||||||
|
/**
|
||||||
|
* 그리드 인스턴스
|
||||||
|
*/
|
||||||
|
instance : null,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 그리드 설정 초기화
|
||||||
|
* @returns {Object} 그리드 설정 객체
|
||||||
|
*/
|
||||||
|
initConfig : function() {
|
||||||
|
// 데이터 소스 설정
|
||||||
|
var dataSource = this.createDataSource();
|
||||||
|
|
||||||
|
// 그리드 설정 객체 생성
|
||||||
|
var gridConfig = new XitTuiGridConfig();
|
||||||
|
|
||||||
|
// 기본 설정
|
||||||
|
gridConfig.setOptDataSource(dataSource); // 데이터소스 연결
|
||||||
|
gridConfig.setOptGridId('grid'); // 그리드를 출력할 Element ID
|
||||||
|
gridConfig.setOptGridHeight(550); // 그리드 높이(단위: px)
|
||||||
|
gridConfig.setOptRowHeight(30); // 그리드 행 높이(단위: px)
|
||||||
|
gridConfig.setOptRowHeaderType('rowNum'); // 행 첫번째 셀 타입(rowNum: 순번, checkbox: 체크박스, '': 출력 안함)
|
||||||
|
gridConfig.setOptUseClientSort(true); // 서버사이드 정렬 false
|
||||||
|
gridConfig.setOptColumns(this.getGridColumns());
|
||||||
|
|
||||||
|
return gridConfig;
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 그리드 컬럼 정의
|
||||||
|
* @returns {Array} 그리드 컬럼 배열
|
||||||
|
*/
|
||||||
|
getGridColumns : function() {
|
||||||
|
var self = this;
|
||||||
|
return [ {
|
||||||
|
header : '행위유형코드',
|
||||||
|
name : 'actTypeCd',
|
||||||
|
align : 'center',
|
||||||
|
width : 90,
|
||||||
|
sortable : true
|
||||||
|
}, {
|
||||||
|
header : '위반건축물',
|
||||||
|
name : 'vltnBdst',
|
||||||
|
align : 'center',
|
||||||
|
width : 150,
|
||||||
|
sortable : true
|
||||||
|
}, {
|
||||||
|
header : '법조문',
|
||||||
|
name : 'lawlprvs',
|
||||||
|
align : 'center',
|
||||||
|
width : 200
|
||||||
|
}, {
|
||||||
|
header : '산정률',
|
||||||
|
name : 'cmpttnRt',
|
||||||
|
align : 'right',
|
||||||
|
width : 80
|
||||||
|
}, {
|
||||||
|
header : '위반건축물 상세',
|
||||||
|
name : 'vltnBdstDtl',
|
||||||
|
align : 'center',
|
||||||
|
minwidth : 300
|
||||||
|
}, {
|
||||||
|
header : '사용 여부',
|
||||||
|
name : 'useYn',
|
||||||
|
align : 'center',
|
||||||
|
width : 100,
|
||||||
|
formatter : function(e) {
|
||||||
|
return e.value === 'Y' ? '사용' : '미사용';
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
header : '등록일시',
|
||||||
|
name : 'regDt',
|
||||||
|
align : 'center',
|
||||||
|
width : 150
|
||||||
|
}, {
|
||||||
|
header : '등록자',
|
||||||
|
name : 'rgtrNm',
|
||||||
|
align : 'center',
|
||||||
|
width : 100
|
||||||
|
}, {
|
||||||
|
header : '수정일시',
|
||||||
|
name : 'mdfcnDt',
|
||||||
|
align : 'center',
|
||||||
|
width : 150
|
||||||
|
}, {
|
||||||
|
header : '수정자',
|
||||||
|
name : 'mdfrNm',
|
||||||
|
align : 'center',
|
||||||
|
width : 100
|
||||||
|
}
|
||||||
|
];
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 데이터 소스 생성
|
||||||
|
* @returns {Object} 데이터 소스 설정 객체
|
||||||
|
*/
|
||||||
|
createDataSource : function() {
|
||||||
|
return {
|
||||||
|
api : {
|
||||||
|
readData : {
|
||||||
|
url : '<c:url value="/baseData/actType/list.ajax"/>',
|
||||||
|
method : 'POST',
|
||||||
|
contentType : 'application/x-www-form-urlencoded',
|
||||||
|
processData : true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
initialRequest : false, // 초기 데이터 요청 여부
|
||||||
|
serializer : function(params) {
|
||||||
|
// 검색 폼 데이터
|
||||||
|
setSearchCond();
|
||||||
|
var searchParams = $.param(SEARCH_COND);
|
||||||
|
//console.log(searchParams);
|
||||||
|
return searchParams;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 그리드 인스턴스 생성
|
||||||
|
*/
|
||||||
|
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) {
|
||||||
|
var totalCount = responseObj.data.contents.length
|
||||||
|
//console.log(responseObj);
|
||||||
|
$("#totalCount").text(
|
||||||
|
'총 ' + totalCount.toLocaleString() + '건');
|
||||||
|
}
|
||||||
|
|
||||||
|
// 선택된 행 초기화
|
||||||
|
StrctIdxList.selectedRow = null;
|
||||||
|
});
|
||||||
|
|
||||||
|
// 행 선택 이벤트
|
||||||
|
this.instance.on('selection', function(ev) {
|
||||||
|
if (ev.range && ev.range.row && ev.range.row.length > 0) {
|
||||||
|
var rowKey = ev.range.row[0];
|
||||||
|
StrctIdxList.selectedRow = self.instance.getRow(rowKey);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// 행 클릭 이벤트
|
||||||
|
this.instance.on('click', function(ev) {
|
||||||
|
if (ev.rowKey !== undefined && ev.rowKey !== null) {
|
||||||
|
StrctIdxList.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) {
|
||||||
|
StrctIdxList.openViewPopup(rowData.actTypeCd);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
},
|
||||||
|
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 팝업 관련 기능
|
||||||
|
*/
|
||||||
|
openRegisterPopup : function() {
|
||||||
|
openPopup('<c:url value="/baseData/actType/popup.do"/>?mode=C', 650, 600, 'actTypeReg');
|
||||||
|
},
|
||||||
|
|
||||||
|
openViewPopup : function(actTypeCd) {
|
||||||
|
var url = '<c:url value="/baseData/actType/popup.do"/>?mode=V&actTypeCd=' + encodeURIComponent(actTypeCd);
|
||||||
|
//console.log(actTypeCd);
|
||||||
|
openPopup(url, 650, 500, 'actTypeMdf');
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 목록 새로고침
|
||||||
|
*/
|
||||||
|
refreshList: function() {
|
||||||
|
this.grid.instance.readData();
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 이벤트 핸들러 설정
|
||||||
|
*/
|
||||||
|
eventBindEvents : function() {
|
||||||
|
var self = this;
|
||||||
|
|
||||||
|
// 검색 버튼 클릭 이벤트
|
||||||
|
$("#search_btn").on('click', function() {
|
||||||
|
self.grid.instance.readData();
|
||||||
|
});
|
||||||
|
|
||||||
|
// 초기화 버튼 클릭 이벤트
|
||||||
|
$("#reset_btn").on('click', function() {
|
||||||
|
// 모든 검색 조건 초기화
|
||||||
|
$("#schType").val("1");
|
||||||
|
$("#schTypeTxt").val("");
|
||||||
|
$("#schUseYn").val("Y");
|
||||||
|
|
||||||
|
// 그리드 데이터 새로고침
|
||||||
|
self.grid.instance.readData();
|
||||||
|
});
|
||||||
|
|
||||||
|
// 등록 버튼 클릭 이벤트
|
||||||
|
$("#registerBtn").on('click', function() {
|
||||||
|
self.openRegisterPopup();
|
||||||
|
});
|
||||||
|
|
||||||
|
// 수정 버튼 클릭 이벤트
|
||||||
|
$("#updaterBtn").on('click', function() {
|
||||||
|
// 선택된 행 확인
|
||||||
|
if (!self.selectedRow) {
|
||||||
|
alert('수정할 행위 유형를 선택해주세요.');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 선택된 행의 데이터로 팝업 열기
|
||||||
|
self.openViewPopup(self.selectedRow.actTypeCd);
|
||||||
|
});
|
||||||
|
|
||||||
|
// 엔터키 검색
|
||||||
|
$(".gs_b_top input").on('keypress', function(e) {
|
||||||
|
if (e.which === 13) {
|
||||||
|
e.preventDefault();
|
||||||
|
$("#search_btn").trigger('click');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 모듈 초기화
|
||||||
|
*/
|
||||||
|
init : function() {
|
||||||
|
|
||||||
|
// 그리드 생성
|
||||||
|
this.grid.create();
|
||||||
|
|
||||||
|
// 이벤트 핸들러 설정
|
||||||
|
this.eventBindEvents();
|
||||||
|
|
||||||
|
this.grid.instance.readData();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// 팝업 콜백 함수 (팝업에서 호출)
|
||||||
|
window.refreshCrdnList = function() {
|
||||||
|
StrctIdxList.refreshList();
|
||||||
|
};
|
||||||
|
|
||||||
|
// DOM 준비 완료 시 초기화
|
||||||
|
$(document).ready(function() {
|
||||||
|
StrctIdxList.init();
|
||||||
|
});
|
||||||
|
|
||||||
|
})(window, jQuery);
|
||||||
|
</script>
|
||||||
@ -0,0 +1,160 @@
|
|||||||
|
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
|
||||||
|
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
|
||||||
|
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
|
||||||
|
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
|
||||||
|
<%@ taglib prefix="dateUtil" uri="http://egovframework.go.kr/functions/date-util" %>
|
||||||
|
|
||||||
|
<div class="popup_wrap">
|
||||||
|
<div class="popup_inner">
|
||||||
|
<div class="popup_tit">
|
||||||
|
<h2 class="tit">행위 유형 관리</h2>
|
||||||
|
<a href="#" class="pop-x-btn modalclose"></a>
|
||||||
|
</div>
|
||||||
|
<div class="popup_con">
|
||||||
|
<div class="forms_table_non">
|
||||||
|
<form id="crdnForm" name="crdnForm">
|
||||||
|
<input type="hidden" id="mode" name="mode" value="${param.mode}" />
|
||||||
|
<table>
|
||||||
|
<colgroup>
|
||||||
|
<col style="width: 20%;" />
|
||||||
|
<col style="width: 40%;" />
|
||||||
|
<col style="width: 20%;" />
|
||||||
|
<col style="width: 20%;"/>
|
||||||
|
</colgroup>
|
||||||
|
<tr>
|
||||||
|
<th class="th">행위 유형 코드</th>
|
||||||
|
<td colspan="3">
|
||||||
|
<c:choose>
|
||||||
|
<c:when test="${param.mode eq 'V'}">
|
||||||
|
<input type="text" id="actTypeCd" name="actTypeCd" class="input "
|
||||||
|
value="${data.actTypeCd}" readonly/>
|
||||||
|
</c:when>
|
||||||
|
<c:otherwise>
|
||||||
|
<input type="text" id="actTypeCd" name="actTypeCd" class="input actTypeCdMask" />
|
||||||
|
</c:otherwise>
|
||||||
|
</c:choose>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th class="th">위반 건축물</th>
|
||||||
|
<td colspan="3">
|
||||||
|
<input type="text" id="vltnBdst" name="vltnBdst" class="input"
|
||||||
|
value="${data.vltnBdst}" maxlength="100" />
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th class="th">법조문</th>
|
||||||
|
<td colspan="3">
|
||||||
|
<input type="text" id="lawlprvs" name="lawlprvs" class="input"
|
||||||
|
value="${data.lawlprvs}" maxlength="100" />
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th class="th">산정률</th>
|
||||||
|
<td colspan="3">
|
||||||
|
<input type="text" id="cmpttnRt" name="cmpttnRt" class="input cmpttnRtMask"
|
||||||
|
value="${data.cmpttnRt}" maxlength="100" />
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th class="th">위반 건축물 상세</th>
|
||||||
|
<td colspan="3">
|
||||||
|
<textarea id="vltnBdstDtl" name="vltnBdstDtl" class="textarea" rows="4" maxlength="1000" style="width: 100%; height: 100%;">${data.vltnBdstDtl}</textarea>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th class="th">사용 여부</th>
|
||||||
|
<td colspan="1">
|
||||||
|
<select id="useYn" name="useYn" class="input">
|
||||||
|
<option value="Y" <c:if test="${data.useYn eq 'Y'}">selected</c:if>>사용</option>
|
||||||
|
<option value="N" <c:if test="${data.useYn eq 'N'}">selected</c:if>>미사용</option>
|
||||||
|
</select>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="popup_foot">
|
||||||
|
<c:choose>
|
||||||
|
<c:when test="${param.mode eq 'V'}">
|
||||||
|
<a href="#" id="btnSave" class="newbtns bg4">수정</a>
|
||||||
|
</c:when>
|
||||||
|
<c:otherwise>
|
||||||
|
<a href="#" id="btnSave" class="newbtns bg4">저장</a>
|
||||||
|
</c:otherwise>
|
||||||
|
</c:choose>
|
||||||
|
<a href="#" class="newbtns bg2 modalclose">닫기</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
(function($) {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
var CrdnPopup = {
|
||||||
|
// 자식 팝업창 참조 저장 배열
|
||||||
|
childPopups: [],
|
||||||
|
|
||||||
|
init: function() {
|
||||||
|
this.bindEvents();
|
||||||
|
},
|
||||||
|
|
||||||
|
bindEvents: function() {
|
||||||
|
var self = this;
|
||||||
|
|
||||||
|
$("#btnSave").on('click', function() {
|
||||||
|
self.save();
|
||||||
|
});
|
||||||
|
|
||||||
|
// 닫기 버튼
|
||||||
|
$('.modalclose').on('click', function(e) {
|
||||||
|
e.preventDefault();
|
||||||
|
self.cancel();
|
||||||
|
});
|
||||||
|
|
||||||
|
//$("#dsclYmd").datepicker({
|
||||||
|
// container: '.popup_inner',
|
||||||
|
// language: "kr"
|
||||||
|
//});
|
||||||
|
|
||||||
|
},
|
||||||
|
|
||||||
|
cancel: function() {
|
||||||
|
// 공통 함수를 사용하여 자식 팝업창들을 닫고 현재 창 닫기
|
||||||
|
this.childPopups = closeChildPopupsAndSelf(this.childPopups);
|
||||||
|
},
|
||||||
|
|
||||||
|
save: function() {
|
||||||
|
|
||||||
|
var mode = $("#mode").val();
|
||||||
|
var url = mode === 'C' ? '/baseData/actType/insert.ajax' : '/baseData/actType/update.ajax';
|
||||||
|
var data = $("#crdnForm").serialize();
|
||||||
|
|
||||||
|
$.ajax({
|
||||||
|
url: url,
|
||||||
|
type: 'POST',
|
||||||
|
data: data,
|
||||||
|
success: function(response) {
|
||||||
|
if (response.success) {
|
||||||
|
alert(response.message || '처리되었습니다.');
|
||||||
|
if (window.opener && window.opener.refreshCrdnList) {
|
||||||
|
window.opener.refreshCrdnList();
|
||||||
|
}
|
||||||
|
window.close();
|
||||||
|
} else {
|
||||||
|
alert(response.message || '처리 중 오류가 발생했습니다.');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
$(document).ready(function() {
|
||||||
|
CrdnPopup.init();
|
||||||
|
});
|
||||||
|
|
||||||
|
})(jQuery);
|
||||||
|
</script>
|
||||||
@ -0,0 +1,366 @@
|
|||||||
|
<%@ 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><select id="schType" name="schType" class="input">
|
||||||
|
<option value="1">위반 사항</option>
|
||||||
|
<option value="2">산정률2코드</option>
|
||||||
|
</select>
|
||||||
|
</li>
|
||||||
|
<li><input type="text" id="schTypeTxt" name="schTypeTxt"
|
||||||
|
maxlength="13" class="input" style="width: 120px;"
|
||||||
|
autocomplete="off" /></li>
|
||||||
|
<li class="th">사용 여부</li>
|
||||||
|
<li><select id="schUseYn" name="schUseYn" class="input">
|
||||||
|
<option value="Y">사용</option>
|
||||||
|
<option value="N">미사용</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">산정률2 목록</li>
|
||||||
|
<li class="rig"><span id="totalCount" class="total-count"
|
||||||
|
style="padding-left: 25px; padding-right: 25px;">총 0건</span></li>
|
||||||
|
</ul>
|
||||||
|
<div class="containers">
|
||||||
|
<div id="grid"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- /Main body -->
|
||||||
|
|
||||||
|
<script type="text/javascript">
|
||||||
|
/**
|
||||||
|
* 산정률2 등록/조회 목록 관리 모듈
|
||||||
|
* 산정률2 목록을 조회하고 관리하는 기능을 제공합니다.
|
||||||
|
*/
|
||||||
|
(function(window, $) {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
var SEARCH_COND = {};
|
||||||
|
|
||||||
|
// 검색정보 설정
|
||||||
|
var setSearchCond = function() {
|
||||||
|
var schType = $.trim(nvl($("#schType").val(), ""));
|
||||||
|
var schTypeTxt = $.trim(nvl($("#schTypeTxt").val(), ""));
|
||||||
|
var schUseYn = $.trim(nvl($("#schUseYn").val(), ""));
|
||||||
|
|
||||||
|
SEARCH_COND.schType = schType;
|
||||||
|
SEARCH_COND.schTypeTxt = schTypeTxt;
|
||||||
|
SEARCH_COND.schUseYn = schUseYn;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 산정률2 목록 관리 네임스페이스
|
||||||
|
*/
|
||||||
|
var StrctIdxList = {
|
||||||
|
/**
|
||||||
|
* 선택된 행 정보
|
||||||
|
*/
|
||||||
|
selectedRow : null,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 그리드 관련 객체
|
||||||
|
*/
|
||||||
|
grid : {
|
||||||
|
/**
|
||||||
|
* 그리드 인스턴스
|
||||||
|
*/
|
||||||
|
instance : null,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 그리드 설정 초기화
|
||||||
|
* @returns {Object} 그리드 설정 객체
|
||||||
|
*/
|
||||||
|
initConfig : function() {
|
||||||
|
// 데이터 소스 설정
|
||||||
|
var dataSource = this.createDataSource();
|
||||||
|
|
||||||
|
// 그리드 설정 객체 생성
|
||||||
|
var gridConfig = new XitTuiGridConfig();
|
||||||
|
|
||||||
|
// 기본 설정
|
||||||
|
gridConfig.setOptDataSource(dataSource); // 데이터소스 연결
|
||||||
|
gridConfig.setOptGridId('grid'); // 그리드를 출력할 Element ID
|
||||||
|
gridConfig.setOptGridHeight(550); // 그리드 높이(단위: px)
|
||||||
|
gridConfig.setOptRowHeight(30); // 그리드 행 높이(단위: px)
|
||||||
|
gridConfig.setOptRowHeaderType('rowNum'); // 행 첫번째 셀 타입(rowNum: 순번, checkbox: 체크박스, '': 출력 안함)
|
||||||
|
gridConfig.setOptUseClientSort(true); // 서버사이드 정렬 false
|
||||||
|
gridConfig.setOptColumns(this.getGridColumns());
|
||||||
|
|
||||||
|
return gridConfig;
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 그리드 컬럼 정의
|
||||||
|
* @returns {Array} 그리드 컬럼 배열
|
||||||
|
*/
|
||||||
|
getGridColumns : function() {
|
||||||
|
var self = this;
|
||||||
|
return [ {
|
||||||
|
header : '산정률2코드',
|
||||||
|
name : 'cmpttnRt2Cd',
|
||||||
|
align : 'center',
|
||||||
|
width : 90,
|
||||||
|
sortable : true
|
||||||
|
}, {
|
||||||
|
header : '위반사항',
|
||||||
|
name : 'vltnMttr',
|
||||||
|
align : 'center',
|
||||||
|
minwidth : 150,
|
||||||
|
sortable : true
|
||||||
|
}, {
|
||||||
|
header : '산정률2',
|
||||||
|
name : 'cmpttnRt2',
|
||||||
|
align : 'right',
|
||||||
|
width : 80
|
||||||
|
}, {
|
||||||
|
header : '사용 여부',
|
||||||
|
name : 'useYn',
|
||||||
|
align : 'center',
|
||||||
|
width : 100,
|
||||||
|
formatter : function(e) {
|
||||||
|
return e.value === 'Y' ? '사용' : '미사용';
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
header : '등록일시',
|
||||||
|
name : 'regDt',
|
||||||
|
align : 'center',
|
||||||
|
width : 150
|
||||||
|
}, {
|
||||||
|
header : '등록자',
|
||||||
|
name : 'rgtrNm',
|
||||||
|
align : 'center',
|
||||||
|
width : 100
|
||||||
|
}, {
|
||||||
|
header : '수정일시',
|
||||||
|
name : 'mdfcnDt',
|
||||||
|
align : 'center',
|
||||||
|
width : 150
|
||||||
|
}, {
|
||||||
|
header : '수정자',
|
||||||
|
name : 'mdfrNm',
|
||||||
|
align : 'center',
|
||||||
|
width : 100
|
||||||
|
}
|
||||||
|
];
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 데이터 소스 생성
|
||||||
|
* @returns {Object} 데이터 소스 설정 객체
|
||||||
|
*/
|
||||||
|
createDataSource : function() {
|
||||||
|
return {
|
||||||
|
api : {
|
||||||
|
readData : {
|
||||||
|
url : '<c:url value="/baseData/cmpttnRt2/list.ajax"/>',
|
||||||
|
method : 'POST',
|
||||||
|
contentType : 'application/x-www-form-urlencoded',
|
||||||
|
processData : true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
initialRequest : false, // 초기 데이터 요청 여부
|
||||||
|
serializer : function(params) {
|
||||||
|
// 검색 폼 데이터
|
||||||
|
setSearchCond();
|
||||||
|
var searchParams = $.param(SEARCH_COND);
|
||||||
|
//console.log(searchParams);
|
||||||
|
return searchParams;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 그리드 인스턴스 생성
|
||||||
|
*/
|
||||||
|
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) {
|
||||||
|
var totalCount = responseObj.data.contents.length
|
||||||
|
//console.log(responseObj);
|
||||||
|
$("#totalCount").text(
|
||||||
|
'총 ' + totalCount.toLocaleString() + '건');
|
||||||
|
}
|
||||||
|
|
||||||
|
// 선택된 행 초기화
|
||||||
|
StrctIdxList.selectedRow = null;
|
||||||
|
});
|
||||||
|
|
||||||
|
// 행 선택 이벤트
|
||||||
|
this.instance.on('selection', function(ev) {
|
||||||
|
if (ev.range && ev.range.row && ev.range.row.length > 0) {
|
||||||
|
var rowKey = ev.range.row[0];
|
||||||
|
StrctIdxList.selectedRow = self.instance.getRow(rowKey);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// 행 클릭 이벤트
|
||||||
|
this.instance.on('click', function(ev) {
|
||||||
|
if (ev.rowKey !== undefined && ev.rowKey !== null) {
|
||||||
|
StrctIdxList.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) {
|
||||||
|
StrctIdxList.openViewPopup(rowData.cmpttnRt2Cd);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
},
|
||||||
|
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 팝업 관련 기능
|
||||||
|
*/
|
||||||
|
openRegisterPopup : function() {
|
||||||
|
openPopup('<c:url value="/baseData/cmpttnRt2/popup.do"/>?mode=C', 650, 350, 'cmpttnRt2Reg');
|
||||||
|
},
|
||||||
|
|
||||||
|
openViewPopup : function(cmpttnRt2Cd) {
|
||||||
|
var url = '<c:url value="/baseData/cmpttnRt2/popup.do"/>?mode=V&cmpttnRt2Cd=' + encodeURIComponent(cmpttnRt2Cd);
|
||||||
|
//console.log(cmpttnRt2Cd);
|
||||||
|
openPopup(url, 650, 350, 'cmpttnRt2Mdf');
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 목록 새로고침
|
||||||
|
*/
|
||||||
|
refreshList: function() {
|
||||||
|
this.grid.instance.readData();
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 이벤트 핸들러 설정
|
||||||
|
*/
|
||||||
|
eventBindEvents : function() {
|
||||||
|
var self = this;
|
||||||
|
|
||||||
|
// 검색 버튼 클릭 이벤트
|
||||||
|
$("#search_btn").on('click', function() {
|
||||||
|
self.grid.instance.readData();
|
||||||
|
});
|
||||||
|
|
||||||
|
// 초기화 버튼 클릭 이벤트
|
||||||
|
$("#reset_btn").on('click', function() {
|
||||||
|
// 모든 검색 조건 초기화
|
||||||
|
$("#schType").val("1");
|
||||||
|
$("#schTypeTxt").val("");
|
||||||
|
$("#schUseYn").val("Y");
|
||||||
|
|
||||||
|
// 그리드 데이터 새로고침
|
||||||
|
self.grid.instance.readData();
|
||||||
|
});
|
||||||
|
|
||||||
|
// 등록 버튼 클릭 이벤트
|
||||||
|
$("#registerBtn").on('click', function() {
|
||||||
|
self.openRegisterPopup();
|
||||||
|
});
|
||||||
|
|
||||||
|
// 수정 버튼 클릭 이벤트
|
||||||
|
$("#updaterBtn").on('click', function() {
|
||||||
|
// 선택된 행 확인
|
||||||
|
if (!self.selectedRow) {
|
||||||
|
alert('수정할 산정률2를 선택해주세요.');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 선택된 행의 데이터로 팝업 열기
|
||||||
|
self.openViewPopup(self.selectedRow.cmpttnRt2Cd);
|
||||||
|
});
|
||||||
|
|
||||||
|
// 엔터키 검색
|
||||||
|
$(".gs_b_top input").on('keypress', function(e) {
|
||||||
|
if (e.which === 13) {
|
||||||
|
e.preventDefault();
|
||||||
|
$("#search_btn").trigger('click');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 모듈 초기화
|
||||||
|
*/
|
||||||
|
init : function() {
|
||||||
|
|
||||||
|
// 그리드 생성
|
||||||
|
this.grid.create();
|
||||||
|
|
||||||
|
// 이벤트 핸들러 설정
|
||||||
|
this.eventBindEvents();
|
||||||
|
|
||||||
|
this.grid.instance.readData();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// 팝업 콜백 함수 (팝업에서 호출)
|
||||||
|
window.refreshCrdnList = function() {
|
||||||
|
StrctIdxList.refreshList();
|
||||||
|
};
|
||||||
|
|
||||||
|
// DOM 준비 완료 시 초기화
|
||||||
|
$(document).ready(function() {
|
||||||
|
StrctIdxList.init();
|
||||||
|
});
|
||||||
|
|
||||||
|
})(window, jQuery);
|
||||||
|
</script>
|
||||||
@ -0,0 +1,147 @@
|
|||||||
|
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
|
||||||
|
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
|
||||||
|
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
|
||||||
|
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
|
||||||
|
<%@ taglib prefix="dateUtil" uri="http://egovframework.go.kr/functions/date-util" %>
|
||||||
|
|
||||||
|
<div class="popup_wrap">
|
||||||
|
<div class="popup_inner">
|
||||||
|
<div class="popup_tit">
|
||||||
|
<h2 class="tit">산정률2 관리</h2>
|
||||||
|
<a href="#" class="pop-x-btn modalclose"></a>
|
||||||
|
</div>
|
||||||
|
<div class="popup_con">
|
||||||
|
<div class="forms_table_non">
|
||||||
|
<form id="crdnForm" name="crdnForm">
|
||||||
|
<input type="hidden" id="mode" name="mode" value="${param.mode}" />
|
||||||
|
<table>
|
||||||
|
<colgroup>
|
||||||
|
<col style="width: 20%;" />
|
||||||
|
<col style="width: 40%;" />
|
||||||
|
<col style="width: 20%;" />
|
||||||
|
<col style="width: 20%;"/>
|
||||||
|
</colgroup>
|
||||||
|
<tr>
|
||||||
|
<th class="th">산정률2 코드</th>
|
||||||
|
<td colspan="3">
|
||||||
|
<c:choose>
|
||||||
|
<c:when test="${param.mode eq 'V'}">
|
||||||
|
<input type="text" id="cmpttnRt2Cd" name="cmpttnRt2Cd" class="input "
|
||||||
|
value="${data.cmpttnRt2Cd}" readonly/>
|
||||||
|
</c:when>
|
||||||
|
<c:otherwise>
|
||||||
|
<input type="text" id="cmpttnRt2Cd" name="cmpttnRt2Cd" class="input cmpttnRt2CdMask" />
|
||||||
|
</c:otherwise>
|
||||||
|
</c:choose>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th class="th">위반 사항</th>
|
||||||
|
<td colspan="3">
|
||||||
|
<input type="text" id="vltnMttr" name="vltnMttr" class="input"
|
||||||
|
value="${data.vltnMttr}" maxlength="100" />
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th class="th">산정률2</th>
|
||||||
|
<td colspan="3">
|
||||||
|
<input type="text" id="cmpttnRt2" name="cmpttnRt2" class="input cmpttnRtMask"
|
||||||
|
value="${data.cmpttnRt2}" maxlength="100" />
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th class="th">사용 여부</th>
|
||||||
|
<td colspan="1">
|
||||||
|
<select id="useYn" name="useYn" class="input">
|
||||||
|
<option value="Y" <c:if test="${data.useYn eq 'Y'}">selected</c:if>>사용</option>
|
||||||
|
<option value="N" <c:if test="${data.useYn eq 'N'}">selected</c:if>>미사용</option>
|
||||||
|
</select>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="popup_foot">
|
||||||
|
<c:choose>
|
||||||
|
<c:when test="${param.mode eq 'V'}">
|
||||||
|
<a href="#" id="btnSave" class="newbtns bg4">수정</a>
|
||||||
|
</c:when>
|
||||||
|
<c:otherwise>
|
||||||
|
<a href="#" id="btnSave" class="newbtns bg4">저장</a>
|
||||||
|
</c:otherwise>
|
||||||
|
</c:choose>
|
||||||
|
<a href="#" class="newbtns bg2 modalclose">닫기</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
(function($) {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
var CrdnPopup = {
|
||||||
|
// 자식 팝업창 참조 저장 배열
|
||||||
|
childPopups: [],
|
||||||
|
|
||||||
|
init: function() {
|
||||||
|
this.bindEvents();
|
||||||
|
},
|
||||||
|
|
||||||
|
bindEvents: function() {
|
||||||
|
var self = this;
|
||||||
|
|
||||||
|
$("#btnSave").on('click', function() {
|
||||||
|
self.save();
|
||||||
|
});
|
||||||
|
|
||||||
|
// 닫기 버튼
|
||||||
|
$('.modalclose').on('click', function(e) {
|
||||||
|
e.preventDefault();
|
||||||
|
self.cancel();
|
||||||
|
});
|
||||||
|
|
||||||
|
//$("#dsclYmd").datepicker({
|
||||||
|
// container: '.popup_inner',
|
||||||
|
// language: "kr"
|
||||||
|
//});
|
||||||
|
|
||||||
|
},
|
||||||
|
|
||||||
|
cancel: function() {
|
||||||
|
// 공통 함수를 사용하여 자식 팝업창들을 닫고 현재 창 닫기
|
||||||
|
this.childPopups = closeChildPopupsAndSelf(this.childPopups);
|
||||||
|
},
|
||||||
|
|
||||||
|
save: function() {
|
||||||
|
|
||||||
|
var mode = $("#mode").val();
|
||||||
|
var url = mode === 'C' ? '/baseData/cmpttnRt2/insert.ajax' : '/baseData/cmpttnRt2/update.ajax';
|
||||||
|
var data = $("#crdnForm").serialize();
|
||||||
|
|
||||||
|
$.ajax({
|
||||||
|
url: url,
|
||||||
|
type: 'POST',
|
||||||
|
data: data,
|
||||||
|
success: function(response) {
|
||||||
|
if (response.success) {
|
||||||
|
alert(response.message || '처리되었습니다.');
|
||||||
|
if (window.opener && window.opener.refreshCrdnList) {
|
||||||
|
window.opener.refreshCrdnList();
|
||||||
|
}
|
||||||
|
window.close();
|
||||||
|
} else {
|
||||||
|
alert(response.message || '처리 중 오류가 발생했습니다.');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
$(document).ready(function() {
|
||||||
|
CrdnPopup.init();
|
||||||
|
});
|
||||||
|
|
||||||
|
})(jQuery);
|
||||||
|
</script>
|
||||||
Loading…
Reference in New Issue