구조 지수, 용도 지수 작업

dev
김의진 3 months ago
parent c024796a44
commit 0838ceaeb6

@ -0,0 +1,150 @@
<?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.strctIdx.mapper.StrctIdxMapper">
<!--
구조 지수 목록 조회
- 검색 조건: 구조지수코드, 구조명(schTypeTxt)
- 정렬: 구조지수코드 오름차순
-->
<select id="selectList" parameterType="StrctIdxVO" resultType="StrctIdxVO">
SELECT a.STRCT_IDX_CD /* 구조 지수 코드 */
, a.STRCT_NM /* 구조 명 */
, a.STRCT_IDX /* 구조 지수 */
, a.REG_DT /* 등록 일시 */
, a.RGTR /* 등록자 */
, a.MDFCN_DT /* 수정 일시 */
, a.MDFR /* 수정자 */
, a.DEL_YN /* 삭제 여부 */
, a.RDVLRT_CN_YR_CNT /* 잔가율 내용 연도 수 */
, a.LAST_YR_RDVLRT /* 최종 연도 잔가율 */
, a.DPRT /* 감가상각률 */
, ru.USER_NM AS RGTR_NM /* 등록자 명 */
, mu.USER_NM AS MDFR_NM /* 수정자 명 */
FROM tb_strct_idx 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.STRCT_NM like concat('%',#{schTypeTxt},'%') /* 검색 조건 - 구조 명 */
</when>
<when test='schType == "2"'>
and a.STRCT_IDX_CD = #{schTypeTxt} /* 검색 조건 - 구조 지수 코드 */
</when>
</choose>
</if>
<if test='schDelYn != null and schDelYn != ""'>
and a.DEL_YN = #{schDelYn} /* 검색 조건 - 구조 삭제 여부 */
</if>
ORDER BY a.STRCT_IDX_CD asc /* 연도 내림차순, 번호 오름차순 정렬 */
</select>
<!--
구조 지수 목록 총 개수 조회
- 검색 조건: 구조지수코드, 구조명(schTypeTxt)
-->
<select id="selectListTotalCount" parameterType="StrctIdxVO" resultType="int">
SELECT count(*) /* 총 개수 조회 */
FROM tb_strct_idx a
where 1=1
<if test='schTypeTxt != null and schTypeTxt != ""'>
<choose>
<when test='schType == "1"'>
and a.STRCT_NM like concat('%',#{schTypeTxt},'%') /* 검색 조건 - 구조 명 */
</when>
<when test='schType == "2"'>
and a.STRCT_IDX_CD = #{schTypeTxt} /* 검색 조건 - 구조 지수 코드 */
</when>
</choose>
</if>
<if test='schDelYn != null and schDelYn != ""'>
and a.DEL_YN = #{schDelYn} /* 검색 조건 - 구조 삭제 여부 */
</if>
</select>
<!--
구조 지수 단건 조회
- 조건: PK(코드)
- 팝업에서 수정/삭제 모드 시 사용
-->
<select id="selectOne" parameterType="StrctIdxVO" resultType="StrctIdxVO">
SELECT a.STRCT_IDX_CD /* 구조 지수 코드 */
, a.STRCT_NM /* 구조 명 */
, a.STRCT_IDX /* 구조 지수 */
, a.REG_DT /* 등록 일시 */
, a.RGTR /* 등록자 */
, a.MDFCN_DT /* 수정 일시 */
, a.MDFR /* 수정자 */
, a.DEL_YN /* 삭제 여부 */
, a.RDVLRT_CN_YR_CNT /* 잔가율 내용 연도 수 */
, a.LAST_YR_RDVLRT /* 최종 연도 잔가율 */
, a.DPRT /* 감가상각률 */
, ru.USER_NM AS RGTR_NM /* 등록자 명 */
, mu.USER_NM AS MDFR_NM /* 수정자 명 */
FROM tb_strct_idx 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.STRCT_IDX_CD = #{strctIdxCd} /* 코드 검색 조건 */
</select>
<!--
구조 지수 정보 등록
- PK: 구조지수코드
-->
<insert id="insert" parameterType="StrctIdxVO">
INSERT INTO tb_strct_idx (
STRCT_IDX_CD /* 구조 지수 코드 */
, STRCT_NM /* 구조 명 */
, STRCT_IDX /* 구조 지수 */
, REG_DT /* 등록 일시 */
, RGTR /* 등록자 */
, DEL_YN /* 삭제 여부 */
, RDVLRT_CN_YR_CNT /* 잔가율 내용 연도 수 */
, LAST_YR_RDVLRT /* 최종 연도 잔가율 */
, DPRT /* 감가상각률 */
) VALUES (
#{strctIdxCd} /* 구조 지수 코드 */
, #{strctNm} /* 구조 명 */
, #{strctIdx} /* 구조 지수 */
, NOW() /* 등록 일시 - 현재 날짜 자동 설정 */
, #{rgtr} /* 등록자 - 세션 사용자 ID */
, #{delYn} /* 삭제 여부 */
, #{rdvlrtCnYrCnt} /* 잔가율 내용 연도 수 */
, #{lastYrRdvlrt} /* 최종 연도 잔가율 */
, #{dprt} /* 감가상각률 */
)
</insert>
<!--
구조 지수 정보 수정
- 조건: PK(코드)
- 수정 대상: 구조명, 구조 지수, 수정일시, 수정자, 잔가율 내용 연도수, 최종 연도 잔가율, 감가상각률
-->
<update id="update" parameterType="StrctIdxVO">
UPDATE tb_strct_idx
SET STRCT_NM = #{strctNm} /* 구조 명 */
, STRCT_IDX = #{strctIdx} /* 구조 지수 */
, MDFCN_DT = NOW() /* 수정 일시 */
, MDFR = #{mdfr} /* 수정자 */
, DEL_YN = #{delYn} /* 삭제 여부 */
, RDVLRT_CN_YR_CNT = #{rdvlrtCnYrCnt} /* 잔가율 내용 연도 수 */
, LAST_YR_RDVLRT = #{lastYrRdvlrt} /* 최종 연도 잔가율 */
, DPRT = #{dprt} /* 감가상각률 */
WHERE STRCT_IDX_CD = #{strctIdxCd} /* 구조 지수 코드 */
</update>
<!--
PK(코드) 중복 체크
- 등록 시 동일한 PK가 존재하는지 확인
- 반환값: 0이면 중복 없음, 1이상이면 중복 존재
-->
<select id="selectDuplicateCheck" parameterType="StrctIdxVO" resultType="int">
select count(*) /* 중복 건수 조회 */
from tb_strct_idx
where STRCT_IDX_CD = #{strctIdxCd} /* 구조 지수 코드 */
</select>
</mapper>

@ -0,0 +1,153 @@
<?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.usgIdx.mapper.UsgIdxMapper">
<!--
용도 지수 목록 조회
- 검색 조건: 용도지수코드(schUsgIdxCd), 용도 명(schUsgNm), 주요 용도 명(schMainUsgNm), 하위 용도 명(schLwrUsgNm)
- 정렬: 용도지수코드 오름차순
-->
<select id="selectList" parameterType="UsgIdxVO" resultType="UsgIdxVO">
SELECT a.USG_IDX_CD /* 용도 지수 코드 */
, a.USG_NM /* 용도 명 */
, a.USG_IDX /* 용도 지수 */
, a.MAIN_USG_NM /* 주요 용도 지수 */
, a.LWR_USG_NM /* 하위 용도 지수 */
, a.REG_DT /* 등록 일시 */
, a.RGTR /* 등록자 */
, a.MDFCN_DT /* 수정 일시 */
, a.MDFR /* 수정자 */
, a.DEL_YN /* 삭제 여부 */
, ru.USER_NM AS RGTR_NM /* 등록자 명 */
, mu.USER_NM AS MDFR_NM /* 수정자 명 */
FROM tb_usg_idx 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.USG_NM like concat('%',#{schTypeTxt},'%') /** 검색 조건 - 용도 명 */
</when>
<when test='schType == "2"'>
and a.MAIN_USG_NM like concat('%',#{schTypeTxt},'%') /** 검색 조건 - 주요 용도 명 */
</when>
<when test='schType == "3"'>
and a.LWR_USG_NM like concat('%',#{schTypeTxt},'%') /** 검색 조건 - 하위 용도 명 */
</when>
<when test='schType == "4"'>
and a.USG_IDX_CD = #{schUsgIdxCd} /** 검색 조건 - 용도 지수 코드 */
</when>
</choose>
</if>
<if test='schDelYn != null and schDelYn != ""'>
and a.DEL_YN = #{schDelYn} /* 검색 조건 - 용도 삭제 여부 */
</if>
ORDER BY a.USG_IDX_CD asc /* 용도 지수 코드 오름차순 정렬 */
</select>
<!--
용도 지수 목록 총 개수 조회
- 검색 조건: 용도지수코드(schUsgIdxCd), 용도 명(schUsgNm), 주요 용도 명(schMainUsgNm), 하위 용도 명(schLwrUsgNm)
-->
<select id="selectListTotalCount" parameterType="UsgIdxVO" resultType="int">
SELECT count(*) /* 총 개수 조회 */
FROM tb_usg_idx a
where 1=1
<if test='schTypeTxt != null and schTypeTxt != ""'>
<choose>
<when test='schType == "1"'>
and a.USG_NM like concat('%',#{schTypeTxt},'%') /** 검색 조건 - 용도 명 */
</when>
<when test='schType == "2"'>
and a.MAIN_USG_NM like concat('%',#{schTypeTxt},'%') /** 검색 조건 - 주요 용도 명 */
</when>
<when test='schType == "3"'>
and a.LWR_USG_NM like concat('%',#{schTypeTxt},'%') /** 검색 조건 - 하위 용도 명 */
</when>
<when test='schType == "4"'>
and a.USG_IDX_CD = #{schUsgIdxCd} /** 검색 조건 - 용도 지수 코드 */
</when>
</choose>
</if>
<if test='schDelYn != null and schDelYn != ""'>
and a.DEL_YN = #{schDelYn} /* 검색 조건 - 용도 삭제 여부 */
</if>
</select>
<!--
용도 지수 단건 조회
- 조건: PK(코드)
- 팝업에서 수정/삭제 모드 시 사용
-->
<select id="selectOne" parameterType="UsgIdxVO" resultType="UsgIdxVO">
SELECT a.USG_IDX_CD /* 용도 지수 코드 */
, a.USG_NM /* 용도 명 */
, a.USG_IDX /* 용도 지수 */
, a.MAIN_USG_NM /* 주요 용도 지수 */
, a.LWR_USG_NM /* 하위 용도 지수 */
, a.REG_DT /* 등록 일시 */
, a.RGTR /* 등록자 */
, a.MDFCN_DT /* 수정 일시 */
, a.MDFR /* 수정자 */
, a.DEL_YN /* 삭제 여부 */
FROM tb_usg_idx a
WHERE a.USG_IDX_CD = #{usgIdxCd} /* 코드 검색 조건 */
</select>
<!--
용도 지수 정보 등록
- PK: 용도 지수 코드 (usgIdxCd)
-->
<insert id="insert" parameterType="UsgIdxVO">
INSERT INTO tb_usg_idx (
USG_IDX_CD /* 용도 지수 코드 */
, USG_NM /* 용도 명 */
, USG_IDX /* 용도 지수 */
, MAIN_USG_NM /* 주요 용도 명 */
, LWR_USG_NM /* 하위 용도 명 */
, REG_DT /* 등록 일시 */
, RGTR /* 등록자 */
, DEL_YN /* 삭제 여부 */
) VALUES (
#{usgIdxCd} /* 용도 지수 코드 */
, #{usgNm} /* 용도 명 */
, #{usgIdx} /* 용도 지수 */
, #{mainUsgNm} /* 주요 용도 명 */
, #{lwrUsgNm} /* 하위 용도 명 */
, NOW() /* 등록 일시 - 현재 날짜 자동 설정 */
, #{rgtr} /* 등록자 - 세션 사용자 ID */
, #{delYn} /* 삭제 여부 */
)
</insert>
<!--
용도 지수 정보 수정
- 조건: PK(코드)
- 수정 대상: 용도명, 용도 지수, 주요 용도 명, 하위 용도 명, 수정일시, 수정자, 삭제 여부
-->
<update id="update" parameterType="UsgIdxVO">
UPDATE tb_usg_idx
SET USG_NM = #{usgNm} /* 용도 명 */
, USG_IDX = #{usgIdx} /* 용도 지수 */
, MAIN_USG_NM = #{mainUsgNm} /* 주요 용도 명 */
, LWR_USG_NM = #{lwrUsgNm} /* 하위 용도 명 */
, MDFCN_DT = NOW() /* 수정 일시 */
, MDFR = #{mdfr} /* 수정자 */
, DEL_YN = #{delYn} /* 삭제 여부 */
WHERE USG_IDX_CD = #{usgIdxCd} /* 용도 지수 코드 */
</update>
<!--
PK(연도+번호) 중복 체크
- 등록 시 동일한 PK가 존재하는지 확인
- 반환값: 0이면 중복 없음, 1이상이면 중복 존재
-->
<select id="selectDuplicateCheck" parameterType="UsgIdxVO" resultType="int">
select count(*) /* 중복 건수 조회 */
from tb_usg_idx
where USG_IDX_CD = #{usgIdxCd} /* 용도 지수 코드 */
</select>
</mapper>

@ -0,0 +1,167 @@
package go.kr.project.baseData.strctIdx.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.strctIdx.model.StrctIdxVO;
import go.kr.project.baseData.strctIdx.service.StrctIdxService;
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.strctIdx.controller
* fileName : StrctIdxController
* author :
* date : 2025-09-03
* description : >
* :
* ===========================================================
* DATE AUTHOR NOTE
* -----------------------------------------------------------
* 2025-09-03
*/
@Controller
@RequestMapping("/baseData/strctIdx")
@RequiredArgsConstructor
@Slf4j
@Tag(name = "기준자료: 구조 지수", description = "구조 지수 관리 API")
public class StrctIdxController {
/** 구조 지수 서비스 */
private final StrctIdxService service;
/**
* .
* @param vo VO
* @param model
* @return
*/
@GetMapping("/list.do")
@Operation(summary = "구조 지수 목록 페이지", description = "목록 페이지를 조회합니다.")
public String listPage(StrctIdxVO vo, Model model){
log.debug("구조 지수 목록 페이지 조회");
return "baseData/strctIdx/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 StrctIdxVO 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 strctIdxCd,
@Parameter(description = "화면 모드 (C:등록, U:수정, V:보기)") @RequestParam String mode,
Model model) {
//try {
log.debug("구조 지수 팝업 화면 요청 - 모드: {}, 구조지수코드: {}", mode, strctIdxCd);
ModelAndView mav = new ModelAndView("baseData/strctIdx/popup" + TilesConstants.POPUP);
mav.addObject("mode", mode);
// 수정/조회 모드인 경우 기존 데이터 조회
if (("U".equals(mode) || "V".equals(mode)) && strctIdxCd != null) {
StrctIdxVO paramVO = new StrctIdxVO();
paramVO.setStrctIdxCd(strctIdxCd);
StrctIdxVO 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 StrctIdxVO 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 StrctIdxVO 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.strctIdx.mapper;
import go.kr.project.baseData.strctIdx.model.StrctIdxVO;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
/**
* packageName : go.kr.project.baseData.strctIdx.mapper
* fileName : StrctIdxMapper
* author :
* date : 2025-09-01
* description : MyBatis Mapper
* : SQL .
* ===========================================================
* DATE AUTHOR NOTE
* -----------------------------------------------------------
* 2025-09-01
*/
@Mapper
public interface StrctIdxMapper {
/**
* .
* @param vo VO
* @return
*/
List<StrctIdxVO> selectList(StrctIdxVO vo);
/**
* .
* @param vo VO
* @return
*/
int selectListTotalCount(StrctIdxVO vo);
/**
* .
* @param vo PK (yr, no) VO
* @return
*/
StrctIdxVO selectOne(StrctIdxVO vo);
/**
* .
* @param vo VO
* @return
*/
int insert(StrctIdxVO vo);
/**
* .
* @param vo VO
* @return
*/
int update(StrctIdxVO vo);
/**
* .
* @param vo PK (strctIdxCd) VO
* @return
*/
int delete(StrctIdxVO vo);
/**
* PK() .
* @param vo PK (strctIdxCd) VO
* @return (0 , 1 )
*/
int selectDuplicateCheck(StrctIdxVO vo);
}

@ -0,0 +1,104 @@
package go.kr.project.baseData.strctIdx.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.strctIdx.model
* fileName : StrctIdxVO
* author :
* date : 2025-09-01
* description : VO (// )
* : VO MyBatis camelCase DB (STRCT_IDX_CD, STRCT_NM, STRCT_IDX, REG_DT, RGTR, MDFCN_DT, MDFR, DEL_YN, DEL_DT, DLTR, RDVLRT_CN_YR_CNT, LAST_YR_RDVLRT, DPRT)
* (strctIdxCd, strctNm, strctIdx, regDt, rgtr, mdfcnDt, mdfr, delYn, delDt, dltr, rdvlrtCnYrCnt, lastYrRdvlrt, dprt) .
* ===========================================================
* DATE AUTHOR NOTE
* -----------------------------------------------------------
* 2025-09-01
*/
@EqualsAndHashCode(callSuper = true)
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class StrctIdxVO extends PagingVO {
// ==================== 기본 테이블 컬럼 ====================
/** 구조 지수 코드 (PK) - 3자리 코드 */
private String strctIdxCd;
/** 구조 명 */
private String strctNm;
/** 구조 지수 - DECIMAL(10,2) */
private BigDecimal strctIdx;
/** 등록 일시 - 테이블은 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 delYn;
/** 삭제 일시 */
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Seoul")
private LocalDateTime delDt;
/** 삭제자 ID */
private String dltr;
/** 잔가율 내용 연도 수 - DECIMAL(2,0) */
private BigDecimal rdvlrtCnYrCnt;
/** 최종 연도 잔가율 - DECIMAL(4,2) */
private BigDecimal lastYrRdvlrt;
/** 감가상각률 - DECIMAL(4,4) */
private BigDecimal dprt;
// ==================== 조인 컬럼 (코드명) ====================
/** 등록자 */
private String rgtrNm;
/** 수정자 */
private String mdfrNm;
/** 행 번호 (그리드 표시용) */
private Integer rowNum;
// ==================== 검색 조건 ====================
/** 검색 조건 - 구조 지수 코드 */
//private String schStrctIdxCd;
/** 검색 조건 - 구조 명 */
//private String schStrctNm;
/** 검색 조건 선택 */
private String schType;
private String schTypeTxt;
/** 검색 조건 - 삭제 여부 */
private String schDelYn;
}

@ -0,0 +1,69 @@
package go.kr.project.baseData.strctIdx.service;
import go.kr.project.baseData.strctIdx.model.StrctIdxVO;
import java.util.List;
/**
* packageName : go.kr.project.baseData.strctIdx.service
* fileName : StrctIdxService
* author :
* date : 2025-09-02
* description :
* : .
* ===========================================================
* DATE AUTHOR NOTE
* -----------------------------------------------------------
* 2025-09-02
*/
public interface StrctIdxService {
/**
* .
* @param vo VO
* @return
*/
List<StrctIdxVO> selectList(StrctIdxVO vo);
/**
* .
* @param vo VO
* @return
*/
int selectListTotalCount(StrctIdxVO vo);
/**
* .
* @param vo PK VO
* @return
*/
StrctIdxVO selectOne(StrctIdxVO vo);
/**
* .
* @param vo VO
* @return
*/
int insert(StrctIdxVO vo);
/**
* .
* @param vo VO
* @return
*/
int update(StrctIdxVO vo);
/**
* .
* @param vo PK (strctIdxCd) VO
* @return
*/
int delete(StrctIdxVO vo);
/**
* PK() .
* @param vo PK (strctIdxCd) VO
* @return (0 , 1 )
*/
int selectDuplicateCheck(StrctIdxVO vo);
}

@ -0,0 +1,176 @@
package go.kr.project.baseData.strctIdx.service.impl;
import egovframework.exception.MessageException;
import egovframework.util.SessionUtil;
import egovframework.util.StringUtil;
import go.kr.project.baseData.strctIdx.mapper.StrctIdxMapper;
import go.kr.project.baseData.strctIdx.model.StrctIdxVO;
import go.kr.project.baseData.strctIdx.service.StrctIdxService;
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.strctIdx.service.impl
* fileName : StrctIdxServiceImpl
* author :
* date : 2025-09-02
* description :
* : .
* ===========================================================
* DATE AUTHOR NOTE
* -----------------------------------------------------------
* 2025-09-02
*/
@Service
@RequiredArgsConstructor
@Slf4j
public class StrctIdxServiceImpl extends EgovAbstractServiceImpl implements StrctIdxService {
/** 구조 지수 매퍼 */
private final StrctIdxMapper mapper;
/**
* .
* @param vo VO
* @return
*/
@Override
public List<StrctIdxVO> selectList(StrctIdxVO vo) {
log.debug("구조 지수 목록 조회 - 검색조건: {}", vo);
return mapper.selectList(vo);
}
/**
* .
* @param vo VO
* @return
*/
@Override
public int selectListTotalCount(StrctIdxVO vo) {
log.debug("구조 지수 총 개수 조회 - 검색조건: {}", vo);
return mapper.selectListTotalCount(vo);
}
/**
* .
* @param vo PK (strctIdxCd) VO
* @return
*/
@Override
public StrctIdxVO selectOne(StrctIdxVO vo) {
log.debug("구조 지수 단건 조회 - 코드: {}", vo.getStrctIdxCd());
return mapper.selectOne(vo);
}
/**
* .
* PK() .
* @param vo VO
* @return
* @throws MessageException PK
*/
@Override
public int insert(StrctIdxVO vo) {
log.debug("구조 지수 등록 - 코드: {}, 구조명: {}", vo.getStrctIdxCd(), vo.getStrctNm());
// PK(코드) 필수값 검증
if (vo.getStrctIdxCd() == null || vo.getStrctIdxCd().trim().isEmpty()) {
log.warn("구조 지수 등록 실패 - 코드 미입력");
throw new MessageException("코드는 필수값입니다.");
}
// PK 중복 체크
int duplicateCount = mapper.selectDuplicateCheck(vo);
if (duplicateCount > 0) {
log.warn("구조 지수 등록 실패 - 중복된 PK: 코드={}", vo.getStrctIdxCd());
throw new MessageException("이미 존재하는 구조 지수 코드입니다. 다른 값을 입력해주세요.");
}
// 구조 명 바이트 길이 검증 (한글 3바이트 기준 최대 100바이트)
if (vo.getStrctNm() != null && !vo.getStrctNm().trim().isEmpty()) {
int byteLength = StringUtil.calculateUtf8ByteLength(vo.getStrctNm());
if (byteLength > 100) {
log.warn("구조 지수 등록 실패 - 구조 명 바이트 길이 초과: {}바이트", byteLength);
throw new MessageException("구조 명은 최대 100바이트까지 입력 가능합니다. (현재: " + 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(StrctIdxVO vo) {
log.debug("구조 지수 수정 - 코드: {}, 구조명: {}", vo.getStrctIdxCd(), vo.getStrctNm());
// PK(코드) 필수값 검증
if (vo.getStrctIdxCd() == null || vo.getStrctIdxCd().trim().isEmpty()) {
log.warn("구조 지수 등록 실패 - 코드 미입력");
throw new MessageException("코드는 필수값입니다.");
}
// 구조 명 바이트 길이 검증 (한글 3바이트 기준 최대 100바이트)
if (vo.getStrctNm() != null && !vo.getStrctNm().trim().isEmpty()) {
int byteLength = StringUtil.calculateUtf8ByteLength(vo.getStrctNm());
if (byteLength > 100) {
log.warn("구조 지수 수정 실패 - 구조 명 바이트 길이 초과: {}바이트", byteLength);
throw new MessageException("구조 명은 최대 100바이트까지 입력 가능합니다. (현재: " + byteLength + "바이트)");
}
}
// 수정 수행
int result = mapper.update(vo);
log.debug("구조 지수 수정 완료 - 수정 건수: {}", result);
return result;
}
/**
* .
* PK() .
* @param vo PK () VO
* @return
* @throws MessageException PK
*/
@Override
public int delete(StrctIdxVO vo) {
log.debug("구조 지수 삭제 - 코드: {}", vo.getStrctIdxCd());
// PK(코드) 필수값 검증
if (vo.getStrctIdxCd() == null || vo.getStrctIdxCd().trim().isEmpty()) {
log.warn("구조 지수 삭제 실패 - 코드 미입력");
throw new MessageException("코드는 필수값입니다.");
}
// 삭제 수행
int result = mapper.delete(vo);
log.debug("구조 지수 삭제 완료 - 삭제 건수: {}", result);
return result;
}
/**
* PK() .
* @param vo PK (strctIdxCd) VO
* @return (0 , 1 )
*/
@Override
public int selectDuplicateCheck(StrctIdxVO vo) {
log.debug("구조 지수 중복 체크 - 코드: {}", vo.getStrctIdxCd());
return mapper.selectDuplicateCheck(vo);
}
}

@ -0,0 +1,167 @@
package go.kr.project.baseData.usgIdx.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.usgIdx.model.UsgIdxVO;
import go.kr.project.baseData.usgIdx.service.UsgIdxService;
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.usgIdx.controller
* fileName : UsgIdxController
* author :
* date : 2025-09-05
* description : >
* :
* ===========================================================
* DATE AUTHOR NOTE
* -----------------------------------------------------------
* 2025-09-05
*/
@Controller
@RequestMapping("/baseData/usgIdx")
@RequiredArgsConstructor
@Slf4j
@Tag(name = "기준자료: 용도 지수", description = "용도 지수 관리 API")
public class UsgIdxController {
/** 용도 지수 서비스 */
private final UsgIdxService service;
/**
* .
* @param vo VO
* @param model
* @return
*/
@GetMapping("/list.do")
@Operation(summary = "용도 지수 목록 페이지", description = "목록 페이지를 조회합니다.")
public String listPage(UsgIdxVO vo, Model model){
log.debug("용도 지수 목록 페이지 조회");
return "baseData/usgIdx/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 UsgIdxVO 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 usgIdxCd,
@Parameter(description = "화면 모드 (C:등록, U:수정, V:보기)") @RequestParam String mode,
Model model) {
//try {
log.debug("용도 지수 팝업 화면 요청 - 모드: {}, 용도지수코드: {}", mode, usgIdxCd);
ModelAndView mav = new ModelAndView("baseData/usgIdx/popup" + TilesConstants.POPUP);
mav.addObject("mode", mode);
// 수정/조회 모드인 경우 기존 데이터 조회
if (("U".equals(mode) || "V".equals(mode)) && usgIdxCd != null) {
UsgIdxVO paramVO = new UsgIdxVO();
paramVO.setUsgIdxCd(usgIdxCd);
UsgIdxVO 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 UsgIdxVO 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 UsgIdxVO 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.usgIdx.mapper;
import go.kr.project.baseData.usgIdx.model.UsgIdxVO;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
/**
* packageName : go.kr.project.baseData.usgIdx.mapper
* fileName : UsgIdxMapper
* author :
* date : 2025-09-01
* description : MyBatis Mapper
* : SQL .
* ===========================================================
* DATE AUTHOR NOTE
* -----------------------------------------------------------
* 2025-09-01
*/
@Mapper
public interface UsgIdxMapper {
/**
* .
* @param vo VO
* @return
*/
List<UsgIdxVO> selectList(UsgIdxVO vo);
/**
* .
* @param vo VO
* @return
*/
int selectListTotalCount(UsgIdxVO vo);
/**
* .
* @param vo PK (yr, no) VO
* @return
*/
UsgIdxVO selectOne(UsgIdxVO vo);
/**
* .
* @param vo VO
* @return
*/
int insert(UsgIdxVO vo);
/**
* .
* @param vo VO
* @return
*/
int update(UsgIdxVO vo);
/**
* .
* @param vo PK (usgIdxCd) VO
* @return
*/
int delete(UsgIdxVO vo);
/**
* PK() .
* @param vo PK (usgIdxCd) VO
* @return (0 , 1 )
*/
int selectDuplicateCheck(UsgIdxVO vo);
}

@ -0,0 +1,108 @@
package go.kr.project.baseData.usgIdx.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.usgIdx.model
* fileName : UsgIdxVO
* author :
* date : 2025-09-01
* description : VO (// )
* : VO MyBatis camelCase DB (USG_IDX_CD, USG_NM, USG_IDX, MAIN_USG_NM, LWR_USG_NM, REG_DT, RGTR, MDFCN_DT, MDFR, DEL_YN, DEL_DT, DLTR)
* (usgIdxCd, usgNm, usgIdx, mainUsgNm, lwrUsgNm, regDt, rgtr, mdfcnDt, mdfr, delYn, delDt, dltr) .
* ===========================================================
* DATE AUTHOR NOTE
* -----------------------------------------------------------
* 2025-09-01
*/
@EqualsAndHashCode(callSuper = true)
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class UsgIdxVO extends PagingVO {
// ==================== 기본 테이블 컬럼 ====================
/** 용도 지수 코드 (PK) - 5자리 코드 */
private String usgIdxCd;
/** 용도 명 */
private String usgNm;
/** 용도 지수 - DECIMAL(10,2) */
private BigDecimal usgIdx;
/** 주요 용도 명 */
private String mainUsgNm;
/** 하위 용도 명 */
private String lwrUsgNm;
/** 등록 일시 - 테이블은 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 delYn;
/** 삭제 일시 */
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Seoul")
private LocalDateTime delDt;
/** 삭제자 ID */
private String dltr;
// ==================== 조인 컬럼 (코드명) ====================
/** 등록자 */
private String rgtrNm;
/** 수정자 */
private String mdfrNm;
/** 행 번호 (그리드 표시용) */
private Integer rowNum;
// ==================== 검색 조건 ====================
/** 검색 조건 - 용도 지수 코드 */
//private String schUsgIdxCd;
/** 검색 조건 - 용도 명 */
//private String schUsgNm;
/** 검색 조건 - 주요 용도 명 */
//private String schMainUsgNm;
/** 검색 조건 - 하위 용도 명 */
//private String schLwrUsgNm;
/** 검색 조건 선택 */
private String schType;
private String schTypeTxt;
/** 검색 조건 - 삭제 여부 */
private String schDelYn;
}

@ -0,0 +1,69 @@
package go.kr.project.baseData.usgIdx.service;
import go.kr.project.baseData.usgIdx.model.UsgIdxVO;
import java.util.List;
/**
* packageName : go.kr.project.baseData.usgIdx.service
* fileName : UsgIdxService
* author :
* date : 2025-09-02
* description :
* : .
* ===========================================================
* DATE AUTHOR NOTE
* -----------------------------------------------------------
* 2025-09-02
*/
public interface UsgIdxService {
/**
* .
* @param vo VO
* @return
*/
List<UsgIdxVO> selectList(UsgIdxVO vo);
/**
* .
* @param vo VO
* @return
*/
int selectListTotalCount(UsgIdxVO vo);
/**
* .
* @param vo PK VO
* @return
*/
UsgIdxVO selectOne(UsgIdxVO vo);
/**
* .
* @param vo VO
* @return
*/
int insert(UsgIdxVO vo);
/**
* .
* @param vo VO
* @return
*/
int update(UsgIdxVO vo);
/**
* .
* @param vo PK (usgIdxCd) VO
* @return
*/
int delete(UsgIdxVO vo);
/**
* PK() .
* @param vo PK (usgIdxCd) VO
* @return (0 , 1 )
*/
int selectDuplicateCheck(UsgIdxVO vo);
}

@ -0,0 +1,194 @@
package go.kr.project.baseData.usgIdx.service.impl;
import egovframework.exception.MessageException;
import egovframework.util.SessionUtil;
import egovframework.util.StringUtil;
import go.kr.project.baseData.usgIdx.mapper.UsgIdxMapper;
import go.kr.project.baseData.usgIdx.model.UsgIdxVO;
import go.kr.project.baseData.usgIdx.service.UsgIdxService;
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.usgIdx.service.impl
* fileName : UsgIdxServiceImpl
* author :
* date : 2025-09-02
* description :
* : .
* ===========================================================
* DATE AUTHOR NOTE
* -----------------------------------------------------------
* 2025-09-02
*/
@Service
@RequiredArgsConstructor
@Slf4j
public class UsgIdxServiceImpl extends EgovAbstractServiceImpl implements UsgIdxService {
/** 용도 지수 매퍼 */
private final UsgIdxMapper mapper;
/**
* .
* @param vo VO
* @return
*/
@Override
public List<UsgIdxVO> selectList(UsgIdxVO vo) {
log.debug("용도 지수 목록 조회 - 검색조건: {}", vo);
return mapper.selectList(vo);
}
/**
* .
* @param vo VO
* @return
*/
@Override
public int selectListTotalCount(UsgIdxVO vo) {
log.debug("용도 지수 총 개수 조회 - 검색조건: {}", vo);
return mapper.selectListTotalCount(vo);
}
/**
* .
* @param vo PK () VO
* @return
*/
@Override
public UsgIdxVO selectOne(UsgIdxVO vo) {
log.debug("용도 지수 단건 조회 - 코드: {}", vo.getUsgIdxCd());
return mapper.selectOne(vo);
}
/**
* .
* PK() .
* @param vo VO
* @return
* @throws MessageException PK
*/
@Override
public int insert(UsgIdxVO vo) {
log.debug("용도 지수 등록 - 코드: {}, 용도명: {}", vo.getUsgIdxCd(), vo.getUsgNm());
// PK(코드) 필수값 검증
if (vo.getUsgIdxCd() == null || vo.getUsgIdxCd().trim().isEmpty()) {
log.warn("용도 지수 등록 실패 - 코드 미입력");
throw new MessageException("코드는 필수값입니다.");
}
// PK 중복 체크
int duplicateCount = mapper.selectDuplicateCheck(vo);
if (duplicateCount > 0) {
log.warn("용도 지수 등록 실패 - 중복된 PK: 코드={}", vo.getUsgIdxCd());
throw new MessageException("이미 존재하는 용도 지수 코드입니다. 다른 값을 입력해주세요.");
}
// 용도 명 바이트 길이 검증 (한글 3바이트 기준 최대 100바이트)
if (vo.getUsgNm() != null && !vo.getUsgNm().trim().isEmpty()) {
int byteLength = StringUtil.calculateUtf8ByteLength(vo.getUsgNm());
if (byteLength > 300) {
log.warn("용도 지수 등록 실패 - 용도 명 바이트 길이 초과: {}바이트", byteLength);
throw new MessageException("용도 명은 최대 100바이트까지 입력 가능합니다. (현재: " + 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(UsgIdxVO vo) {
log.debug("용도 지수 수정 - 코드: {}, 용도명: {}", vo.getUsgIdxCd(), vo.getUsgNm());
// PK(코드) 필수값 검증
if (vo.getUsgIdxCd() == null || vo.getUsgIdxCd().trim().isEmpty()) {
log.warn("용도 지수 등록 실패 - 코드 미입력");
throw new MessageException("코드는 필수값입니다.");
}
// 용도 명 바이트 길이 검증 (한글 3바이트 기준 최대 300바이트)
if (vo.getUsgNm() != null && !vo.getUsgNm().trim().isEmpty()) {
int byteLength = StringUtil.calculateUtf8ByteLength(vo.getUsgNm());
if (byteLength > 300) {
log.warn("용도 지수 수정 실패 - 용도 명 바이트 길이 초과: {}바이트", byteLength);
throw new MessageException("용도 명은 최대 300바이트까지 입력 가능합니다. (현재: " + byteLength + "바이트)");
}
}
// 주요 용도 명 바이트 길이 검증 (한글 3바이트 기준 최대 100바이트)
if (vo.getMainUsgNm() != null && !vo.getMainUsgNm().trim().isEmpty()) {
int byteLength = StringUtil.calculateUtf8ByteLength(vo.getMainUsgNm());
if (byteLength > 100) {
log.warn("용도 지수 수정 실패 - 주요 용도 명 바이트 길이 초과: {}바이트", byteLength);
throw new MessageException("주요 용도 명은 최대 100바이트까지 입력 가능합니다. (현재: " + byteLength + "바이트)");
}
}
// 하위 용도 명 바이트 길이 검증 (한글 3바이트 기준 최대 100바이트)
if (vo.getLwrUsgNm() != null && !vo.getLwrUsgNm().trim().isEmpty()) {
int byteLength = StringUtil.calculateUtf8ByteLength(vo.getLwrUsgNm());
if (byteLength > 100) {
log.warn("용도 지수 수정 실패 - 하위 용도 명 바이트 길이 초과: {}바이트", byteLength);
throw new MessageException("하위 용도 명은 최대 100바이트까지 입력 가능합니다. (현재: " + byteLength + "바이트)");
}
}
// 수정 수행
int result = mapper.update(vo);
log.debug("용도 지수 수정 완료 - 수정 건수: {}", result);
return result;
}
/**
* .
* PK() .
* @param vo PK () VO
* @return
* @throws MessageException PK
*/
@Override
public int delete(UsgIdxVO vo) {
log.debug("용도 지수 삭제 - 코드: {}", vo.getUsgIdxCd());
// PK(코드) 필수값 검증
if (vo.getUsgIdxCd() == null || vo.getUsgIdxCd().trim().isEmpty()) {
log.warn("용도 지수 삭제 실패 - 코드 미입력");
throw new MessageException("코드는 필수값입니다.");
}
// 삭제 수행
int result = mapper.delete(vo);
log.debug("용도 지수 삭제 완료 - 삭제 건수: {}", result);
return result;
}
/**
* PK() .
* @param vo PK (UsgIdxCd) VO
* @return (0 , 1 )
*/
@Override
public int selectDuplicateCheck(UsgIdxVO vo) {
log.debug("용도 지수 중복 체크 - 코드: {}", vo.getUsgIdxCd());
return mapper.selectDuplicateCheck(vo);
}
}

@ -65,7 +65,7 @@ public class ExmnrVO extends PagingVO {
/** 등록자*/
private String rgtrNm;
/** 역순 행 번호 (그리드 표시용) */
/** 행 번호 (그리드 표시용) */
private Integer rowNum;
// ==================== 검색 조건 ====================

@ -0,0 +1,150 @@
<?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.strctIdx.mapper.StrctIdxMapper">
<!--
구조 지수 목록 조회
- 검색 조건: 구조지수코드, 구조명(schTypeTxt)
- 정렬: 구조지수코드 오름차순
-->
<select id="selectList" parameterType="StrctIdxVO" resultType="StrctIdxVO">
SELECT a.STRCT_IDX_CD /* 구조 지수 코드 */
, a.STRCT_NM /* 구조 명 */
, a.STRCT_IDX /* 구조 지수 */
, a.REG_DT /* 등록 일시 */
, a.RGTR /* 등록자 */
, a.MDFCN_DT /* 수정 일시 */
, a.MDFR /* 수정자 */
, a.DEL_YN /* 삭제 여부 */
, a.RDVLRT_CN_YR_CNT /* 잔가율 내용 연도 수 */
, a.LAST_YR_RDVLRT /* 최종 연도 잔가율 */
, a.DPRT /* 감가상각률 */
, ru.USER_NM AS RGTR_NM /* 등록자 명 */
, mu.USER_NM AS MDFR_NM /* 수정자 명 */
FROM tb_strct_idx 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.STRCT_NM like concat('%',#{schTypeTxt},'%') /* 검색 조건 - 구조 명 */
</when>
<when test='schType == "2"'>
and a.STRCT_IDX_CD = #{schTypeTxt} /* 검색 조건 - 구조 지수 코드 */
</when>
</choose>
</if>
<if test='schDelYn != null and schDelYn != ""'>
and a.DEL_YN = #{schDelYn} /* 검색 조건 - 구조 삭제 여부 */
</if>
ORDER BY a.STRCT_IDX_CD asc /* 연도 내림차순, 번호 오름차순 정렬 */
</select>
<!--
구조 지수 목록 총 개수 조회
- 검색 조건: 구조지수코드, 구조명(schTypeTxt)
-->
<select id="selectListTotalCount" parameterType="StrctIdxVO" resultType="int">
SELECT count(*) /* 총 개수 조회 */
FROM tb_strct_idx a
where 1=1
<if test='schTypeTxt != null and schTypeTxt != ""'>
<choose>
<when test='schType == "1"'>
and a.STRCT_NM like concat('%',#{schTypeTxt},'%') /* 검색 조건 - 구조 명 */
</when>
<when test='schType == "2"'>
and a.STRCT_IDX_CD = #{schTypeTxt} /* 검색 조건 - 구조 지수 코드 */
</when>
</choose>
</if>
<if test='schDelYn != null and schDelYn != ""'>
and a.DEL_YN = #{schDelYn} /* 검색 조건 - 구조 삭제 여부 */
</if>
</select>
<!--
구조 지수 단건 조회
- 조건: PK(코드)
- 팝업에서 수정/삭제 모드 시 사용
-->
<select id="selectOne" parameterType="StrctIdxVO" resultType="StrctIdxVO">
SELECT a.STRCT_IDX_CD /* 구조 지수 코드 */
, a.STRCT_NM /* 구조 명 */
, a.STRCT_IDX /* 구조 지수 */
, a.REG_DT /* 등록 일시 */
, a.RGTR /* 등록자 */
, a.MDFCN_DT /* 수정 일시 */
, a.MDFR /* 수정자 */
, a.DEL_YN /* 삭제 여부 */
, a.RDVLRT_CN_YR_CNT /* 잔가율 내용 연도 수 */
, a.LAST_YR_RDVLRT /* 최종 연도 잔가율 */
, a.DPRT /* 감가상각률 */
, ru.USER_NM AS RGTR_NM /* 등록자 명 */
, mu.USER_NM AS MDFR_NM /* 수정자 명 */
FROM tb_strct_idx 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.STRCT_IDX_CD = #{strctIdxCd} /* 코드 검색 조건 */
</select>
<!--
구조 지수 정보 등록
- PK: 구조지수코드
-->
<insert id="insert" parameterType="StrctIdxVO">
INSERT INTO tb_strct_idx (
STRCT_IDX_CD /* 구조 지수 코드 */
, STRCT_NM /* 구조 명 */
, STRCT_IDX /* 구조 지수 */
, REG_DT /* 등록 일시 */
, RGTR /* 등록자 */
, DEL_YN /* 삭제 여부 */
, RDVLRT_CN_YR_CNT /* 잔가율 내용 연도 수 */
, LAST_YR_RDVLRT /* 최종 연도 잔가율 */
, DPRT /* 감가상각률 */
) VALUES (
#{strctIdxCd} /* 구조 지수 코드 */
, #{strctNm} /* 구조 명 */
, #{strctIdx} /* 구조 지수 */
, NOW() /* 등록 일시 - 현재 날짜 자동 설정 */
, #{rgtr} /* 등록자 - 세션 사용자 ID */
, #{delYn} /* 삭제 여부 */
, #{rdvlrtCnYrCnt} /* 잔가율 내용 연도 수 */
, #{lastYrRdvlrt} /* 최종 연도 잔가율 */
, #{dprt} /* 감가상각률 */
)
</insert>
<!--
구조 지수 정보 수정
- 조건: PK(코드)
- 수정 대상: 구조명, 구조 지수, 수정일시, 수정자, 잔가율 내용 연도수, 최종 연도 잔가율, 감가상각률
-->
<update id="update" parameterType="StrctIdxVO">
UPDATE tb_strct_idx
SET STRCT_NM = #{strctNm} /* 구조 명 */
, STRCT_IDX = #{strctIdx} /* 구조 지수 */
, MDFCN_DT = NOW() /* 수정 일시 */
, MDFR = #{mdfr} /* 수정자 */
, DEL_YN = #{delYn} /* 삭제 여부 */
, RDVLRT_CN_YR_CNT = #{rdvlrtCnYrCnt} /* 잔가율 내용 연도 수 */
, LAST_YR_RDVLRT = #{lastYrRdvlrt} /* 최종 연도 잔가율 */
, DPRT = #{dprt} /* 감가상각률 */
WHERE STRCT_IDX_CD = #{strctIdxCd} /* 구조 지수 코드 */
</update>
<!--
PK(코드) 중복 체크
- 등록 시 동일한 PK가 존재하는지 확인
- 반환값: 0이면 중복 없음, 1이상이면 중복 존재
-->
<select id="selectDuplicateCheck" parameterType="StrctIdxVO" resultType="int">
select count(*) /* 중복 건수 조회 */
from tb_strct_idx
where STRCT_IDX_CD = #{strctIdxCd} /* 구조 지수 코드 */
</select>
</mapper>

@ -0,0 +1,153 @@
<?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.usgIdx.mapper.UsgIdxMapper">
<!--
용도 지수 목록 조회
- 검색 조건: 용도지수코드(schUsgIdxCd), 용도 명(schUsgNm), 주요 용도 명(schMainUsgNm), 하위 용도 명(schLwrUsgNm)
- 정렬: 용도지수코드 오름차순
-->
<select id="selectList" parameterType="UsgIdxVO" resultType="UsgIdxVO">
SELECT a.USG_IDX_CD /* 용도 지수 코드 */
, a.USG_NM /* 용도 명 */
, a.USG_IDX /* 용도 지수 */
, a.MAIN_USG_NM /* 주요 용도 지수 */
, a.LWR_USG_NM /* 하위 용도 지수 */
, a.REG_DT /* 등록 일시 */
, a.RGTR /* 등록자 */
, a.MDFCN_DT /* 수정 일시 */
, a.MDFR /* 수정자 */
, a.DEL_YN /* 삭제 여부 */
, ru.USER_NM AS RGTR_NM /* 등록자 명 */
, mu.USER_NM AS MDFR_NM /* 수정자 명 */
FROM tb_usg_idx 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.USG_NM like concat('%',#{schTypeTxt},'%') /** 검색 조건 - 용도 명 */
</when>
<when test='schType == "2"'>
and a.MAIN_USG_NM like concat('%',#{schTypeTxt},'%') /** 검색 조건 - 주요 용도 명 */
</when>
<when test='schType == "3"'>
and a.LWR_USG_NM like concat('%',#{schTypeTxt},'%') /** 검색 조건 - 하위 용도 명 */
</when>
<when test='schType == "4"'>
and a.USG_IDX_CD = #{schUsgIdxCd} /** 검색 조건 - 용도 지수 코드 */
</when>
</choose>
</if>
<if test='schDelYn != null and schDelYn != ""'>
and a.DEL_YN = #{schDelYn} /* 검색 조건 - 용도 삭제 여부 */
</if>
ORDER BY a.USG_IDX_CD asc /* 용도 지수 코드 오름차순 정렬 */
</select>
<!--
용도 지수 목록 총 개수 조회
- 검색 조건: 용도지수코드(schUsgIdxCd), 용도 명(schUsgNm), 주요 용도 명(schMainUsgNm), 하위 용도 명(schLwrUsgNm)
-->
<select id="selectListTotalCount" parameterType="UsgIdxVO" resultType="int">
SELECT count(*) /* 총 개수 조회 */
FROM tb_usg_idx a
where 1=1
<if test='schTypeTxt != null and schTypeTxt != ""'>
<choose>
<when test='schType == "1"'>
and a.USG_NM like concat('%',#{schTypeTxt},'%') /** 검색 조건 - 용도 명 */
</when>
<when test='schType == "2"'>
and a.MAIN_USG_NM like concat('%',#{schTypeTxt},'%') /** 검색 조건 - 주요 용도 명 */
</when>
<when test='schType == "3"'>
and a.LWR_USG_NM like concat('%',#{schTypeTxt},'%') /** 검색 조건 - 하위 용도 명 */
</when>
<when test='schType == "4"'>
and a.USG_IDX_CD = #{schUsgIdxCd} /** 검색 조건 - 용도 지수 코드 */
</when>
</choose>
</if>
<if test='schDelYn != null and schDelYn != ""'>
and a.DEL_YN = #{schDelYn} /* 검색 조건 - 용도 삭제 여부 */
</if>
</select>
<!--
용도 지수 단건 조회
- 조건: PK(코드)
- 팝업에서 수정/삭제 모드 시 사용
-->
<select id="selectOne" parameterType="UsgIdxVO" resultType="UsgIdxVO">
SELECT a.USG_IDX_CD /* 용도 지수 코드 */
, a.USG_NM /* 용도 명 */
, a.USG_IDX /* 용도 지수 */
, a.MAIN_USG_NM /* 주요 용도 지수 */
, a.LWR_USG_NM /* 하위 용도 지수 */
, a.REG_DT /* 등록 일시 */
, a.RGTR /* 등록자 */
, a.MDFCN_DT /* 수정 일시 */
, a.MDFR /* 수정자 */
, a.DEL_YN /* 삭제 여부 */
FROM tb_usg_idx a
WHERE a.USG_IDX_CD = #{usgIdxCd} /* 코드 검색 조건 */
</select>
<!--
용도 지수 정보 등록
- PK: 용도 지수 코드 (usgIdxCd)
-->
<insert id="insert" parameterType="UsgIdxVO">
INSERT INTO tb_usg_idx (
USG_IDX_CD /* 용도 지수 코드 */
, USG_NM /* 용도 명 */
, USG_IDX /* 용도 지수 */
, MAIN_USG_NM /* 주요 용도 명 */
, LWR_USG_NM /* 하위 용도 명 */
, REG_DT /* 등록 일시 */
, RGTR /* 등록자 */
, DEL_YN /* 삭제 여부 */
) VALUES (
#{usgIdxCd} /* 용도 지수 코드 */
, #{usgNm} /* 용도 명 */
, #{usgIdx} /* 용도 지수 */
, #{mainUsgNm} /* 주요 용도 명 */
, #{lwrUsgNm} /* 하위 용도 명 */
, NOW() /* 등록 일시 - 현재 날짜 자동 설정 */
, #{rgtr} /* 등록자 - 세션 사용자 ID */
, #{delYn} /* 삭제 여부 */
)
</insert>
<!--
용도 지수 정보 수정
- 조건: PK(코드)
- 수정 대상: 용도명, 용도 지수, 주요 용도 명, 하위 용도 명, 수정일시, 수정자, 삭제 여부
-->
<update id="update" parameterType="UsgIdxVO">
UPDATE tb_usg_idx
SET USG_NM = #{usgNm} /* 용도 명 */
, USG_IDX = #{usgIdx} /* 용도 지수 */
, MAIN_USG_NM = #{mainUsgNm} /* 주요 용도 명 */
, LWR_USG_NM = #{lwrUsgNm} /* 하위 용도 명 */
, MDFCN_DT = NOW() /* 수정 일시 */
, MDFR = #{mdfr} /* 수정자 */
, DEL_YN = #{delYn} /* 삭제 여부 */
WHERE USG_IDX_CD = #{usgIdxCd} /* 용도 지수 코드 */
</update>
<!--
PK(연도+번호) 중복 체크
- 등록 시 동일한 PK가 존재하는지 확인
- 반환값: 0이면 중복 없음, 1이상이면 중복 존재
-->
<select id="selectDuplicateCheck" parameterType="UsgIdxVO" resultType="int">
select count(*) /* 중복 건수 조회 */
from tb_usg_idx
where USG_IDX_CD = #{usgIdxCd} /* 용도 지수 코드 */
</select>
</mapper>

@ -0,0 +1,380 @@
<%@ 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="schDelYn" name="schDelYn" class="input">
<option value="N">사용</option>
<option value="Y">미사용</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 schDelYn = $.trim(nvl($("#schDelYn").val(), ""));
SEARCH_COND.schType = schType;
SEARCH_COND.schTypeTxt = schTypeTxt;
SEARCH_COND.schDelYn = schDelYn;
};
/**
* 구조 지수 목록 관리 네임스페이스
*/
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 : 'strctIdxCd',
align : 'center',
width : 90,
sortable : true
}, {
header : '구조명',
name : 'strctNm',
align : 'center',
width : 300,
sortable : true
}, {
header : '구조지수',
name : 'strctIdx',
align : 'right',
width : 110
}, {
header : '잔가율 내용 연도 수',
name : 'rdvlrtCnYrCnt',
align : 'right',
width : 110
}, {
header : '최종 연도 잔가율',
name : 'lastYrRdvlrt',
align : 'right',
width : 110
}, {
header : '감가상각률',
name : 'dprt',
align : 'right',
width : 110
}, {
header : '사용 여부',
name : 'delYn',
align : 'center',
width : 100,
formatter : function(e) {
return e.value === 'N' ? '사용' : '미사용';
}
}, {
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/strctIdx/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.strctIdxCd);
}
});
},
},
/**
* 팝업 관련 기능
*/
openRegisterPopup : function() {
window.open('<c:url value="/baseData/strctIdx/popup.do"/>?mode=C', 'strctIdxReg', 'width=480,height=480');
},
openViewPopup : function(strctIdxCd) {
var url = '<c:url value="/baseData/strctIdx/popup.do"/>?mode=V&strctIdxCd=' + encodeURIComponent(strctIdxCd);
//console.log(strctIdxCd);
window.open(url, 'strctIdxMdf', 'width=480,height=480');
},
/**
* 목록 새로고침
*/
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("");
// 그리드 데이터 새로고침
self.grid.instance.readData();
});
// 등록 버튼 클릭 이벤트
$("#registerBtn").on('click', function() {
self.openRegisterPopup();
});
// 수정 버튼 클릭 이벤트
$("#updaterBtn").on('click', function() {
// 선택된 행 확인
if (!self.selectedRow) {
alert('수정할 구조 지수를 선택해주세요.');
return;
}
// 선택된 행의 데이터로 팝업 열기
self.openViewPopup(self.selectedRow.strctIdxCd);
});
// 엔터키 검색
$(".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,168 @@
<%@ 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: 30%;" />
<col style="width: 30%;" />
<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="strctIdxCd" name="strctIdxCd" class="input "
value="${data.strctIdxCd}" readonly/>
</c:when>
<c:otherwise>
<input type="text" id="strctIdxCd" name="strctIdxCd" class="input strctIdxCdMask" />
</c:otherwise>
</c:choose>
</td>
</tr>
<tr>
<th class="th">구조 명</th>
<td colspan="3">
<input type="text" id="strctNm" name="strctNm" class="input"
value="${data.strctNm}" maxlength="100" />
</td>
</tr>
<tr>
<th class="th">구조 지수</th>
<td colspan="3">
<input type="text" id="strctIdx" name="strctIdx" class="input strctIdxMask"
value="${data.strctIdx}" maxlength="100" />
</td>
</tr>
<tr>
<th class="th">잔가율 내용 연도 수</th>
<td colspan="3">
<input type="text" id="rdvlrtCnYrCnt" name="rdvlrtCnYrCnt" class="input rdvlrtCnYrCntMask"
value="${data.rdvlrtCnYrCnt}" maxlength="100" />
</td>
</tr>
<tr>
<th class="th">최종 연도 잔가율</th>
<td colspan="3">
<input type="text" id="lastYrRdvlrt" name="lastYrRdvlrt" class="input lastYrRdvlrtMask"
value="${data.lastYrRdvlrt}" maxlength="100" />
</td>
</tr>
<tr>
<th class="th">감가상각률</th>
<td colspan="3">
<input type="text" id="dprt" name="dprt" class="input dprtMask"
value="${data.dprt}" maxlength="100" />
</td>
</tr>
<tr>
<th class="th">사용 여부</th>
<td colspan="1">
<select id="delYn" name="delYn" class="input">
<option value="N" <c:if test="${data.delYn eq 'N'}">selected</c:if>>사용</option>
<option value="Y" <c:if test="${data.delYn eq 'Y'}">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/strctIdx/insert.ajax' : '/baseData/strctIdx/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,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>
<option value="3">하위 용도명</option>
<option value="4">용도지수코드</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="schDelYn" name="schDelYn" class="input">
<option value="N">사용</option>
<option value="Y">미사용</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 schDelYn = $.trim(nvl($("#schDelYn").val(), ""));
SEARCH_COND.schType = schType;
SEARCH_COND.schTypeTxt = schTypeTxt;
SEARCH_COND.schDelYn = schDelYn;
};
/**
* 용도 지수 목록 관리 네임스페이스
*/
var UsgIdxList = {
/**
* 선택된 행 정보
*/
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 : 'usgIdxCd',
align : 'center',
width : 90,
sortable : true
}, {
header : '용도명',
name : 'usgNm',
align : 'center',
width : 400,
sortable : true
}, {
header : '용도지수',
name : 'usgIdx',
align : 'right',
width : 100
}, {
header : '주요 용도명',
name : 'mainUsgNm',
align : 'center',
width : 150,
}, {
header : '하위 용도명',
name : 'lwrUsgNm',
align : 'center',
width : 150,
}, {
header : '사용 여부',
name : 'delYn',
align : 'center',
width : 100,
formatter : function(e) {
return e.value === 'N' ? '사용' : '미사용';
}
}, {
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/usgIdx/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() + '건');
}
// 선택된 행 초기화
UsgIdxList.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];
UsgIdxList.selectedRow = self.instance.getRow(rowKey);
}
});
// 행 클릭 이벤트
this.instance.on('click', function(ev) {
if (ev.rowKey !== undefined && ev.rowKey !== null) {
UsgIdxList.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) {
UsgIdxList.openViewPopup(rowData.usgIdxCd);
}
});
},
},
/**
* 팝업 관련 기능
*/
openRegisterPopup : function() {
window.open('<c:url value="/baseData/usgIdx/popup.do"/>?mode=C', 'usgIdxReg', 'width=480,height=480');
},
openViewPopup : function(usgIdxCd) {
var url = '<c:url value="/baseData/usgIdx/popup.do"/>?mode=V&usgIdxCd=' + encodeURIComponent(usgIdxCd);
window.open(url, 'usgIdxMdf', 'width=480,height=480');
},
/**
* 목록 새로고침
*/
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("");
// 그리드 데이터 새로고침
self.grid.instance.readData();
});
// 등록 버튼 클릭 이벤트
$("#registerBtn").on('click', function() {
self.openRegisterPopup();
});
// 수정 버튼 클릭 이벤트
$("#updaterBtn").on('click', function() {
// 선택된 행 확인
if (!self.selectedRow) {
alert('수정할 용도 지수를 선택해주세요.');
return;
}
// 선택된 행의 데이터로 팝업 열기
self.openViewPopup(self.selectedRow.usgIdxCd);
});
// 엔터키 검색
$(".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() {
UsgIdxList.refreshList();
};
// DOM 준비 완료 시 초기화
$(document).ready(function() {
UsgIdxList.init();
});
})(window, jQuery);
</script>

@ -0,0 +1,156 @@
<%@ 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: 30%;" />
<col style="width: 30%;" />
<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="usgIdxCd" name="usgIdxCd" class="input "
value="${data.usgIdxCd}" readonly/>
</c:when>
<c:otherwise>
<input type="text" id="usgIdxCd" name="usgIdxCd" class="input usgIdxCdMask" />
</c:otherwise>
</c:choose>
</td>
</tr>
<tr>
<th class="th">용도 명</th>
<td colspan="3">
<input type="text" id="usgNm" name="usgNm" class="input"
value="${data.usgNm}" maxlength="100" />
</td>
</tr>
<tr>
<th class="th">용도 지수</th>
<td colspan="3">
<input type="text" id="usgIdx" name="usgIdx" class="input usgIdxMask"
value="${data.usgIdx}" maxlength="100" />
</td>
</tr>
<tr>
<th class="th">주요 용도 명</th>
<td colspan="3">
<input type="text" id="mainUsgNm" name="mainUsgNm" class="input"
value="${data.mainUsgNm}" maxlength="100" />
</td>
</tr>
<tr>
<th class="th">하위 용도 명</th>
<td colspan="3">
<input type="text" id="lwrUsgNm" name="lwrUsgNm" class="input"
value="${data.lwrUsgNm}" maxlength="100" />
</td>
</tr>
<tr>
<th class="th">사용 여부</th>
<td colspan="1">
<select id="delYn" name="delYn" class="input">
<option value="N" <c:if test="${data.delYn eq 'N'}">selected</c:if>>사용</option>
<option value="Y" <c:if test="${data.delYn eq 'Y'}">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();
});
},
cancel: function() {
// 공통 함수를 사용하여 자식 팝업창들을 닫고 현재 창 닫기
this.childPopups = closeChildPopupsAndSelf(this.childPopups);
},
save: function() {
var mode = $("#mode").val();
var url = mode === 'C' ? '/baseData/usgIdx/insert.ajax' : '/baseData/usgIdx/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>

@ -223,7 +223,9 @@
setSearchCond();
SEARCH_COND.perPage = params.perPage;
SEARCH_COND.page = params.page;
return $.param(SEARCH_COND);
var searchParams = $.param(SEARCH_COND);
//console.log(searchParams);
return searchParams;
}
};
},
@ -321,7 +323,7 @@
openViewPopup: function(exmnrId) {
var url = '<c:url value="/crdn/exmnr/popup.do"/>?mode=V&exmnrId=' + encodeURIComponent(exmnrId);
window.open(url, 'exmnr', 'width=450,height=280');
window.open(url, 'exmnrMdf', 'width=450,height=280');
},
/**

@ -72,6 +72,104 @@ $(document).ready(function () {
});
});
// 중요로직: Strct_Idx_Cd 전용 마스크 - 숫자 3자리
$("body").on("focus", ".strctIdxCdMask", function () {
$(this).inputmask({
mask: "999", // 3자리 숫자 패턴 (선행 0 포함)
placeholder: "000", // 입력 안내용 플레이스홀더
definitions: {
"9": {
validator: "[0-9]", // 숫자만 허용
cardinality: 1
}
},
autoUnmask: true, // 마스크 제거 후 실제 값 반환
rightAlign: false // 왼쪽 정렬
});
});
// 중요로직: Strct_Idx 전용 마스크 - decimal(10,2) 스펙에 맞춤
$("body").on("focus", ".strctIdxMask", function () {
$(this).inputmask("numeric", {
autoGroup: true, // 그룹화 사용 안함
allowMinus: false, // 음수 사용 안함
autoUnmask: true,
rightAlign: false,
groupSeparator: ",", // 그룹 구분자 없음
repeat: 8, // 정수부 최대 2자리
digits: 2 // 소수점 사용 안함
});
});
// 중요로직: RDVLRT_CN_YR_CNT 잔가율 내용 연도 수 전용 마스크 - decimal(2,0) 스펙에 맞춤
$("body").on("focus", ".rdvlrtCnYrCntMask", function () {
$(this).inputmask("numeric", {
autoGroup: true, // 그룹화 사용 안함
allowMinus: false, // 음수 사용 안함
autoUnmask: true,
rightAlign: false,
groupSeparator: ",", // 그룹 구분자 없음
repeat: 2, // 정수부 최대 2자리
digits: 0 // 소수점 사용 안함
});
});
// 중요로직: LAST_YR_RDVLRT 최종 연도 잔가율 전용 마스크 - decimal(4,2) 스펙에 맞춤
$("body").on("focus", ".lastYrRdvlrtMask", function () {
$(this).inputmask("numeric", {
autoGroup: true, // 그룹화 사용 안함
allowMinus: false, // 음수 사용 안함
autoUnmask: true,
rightAlign: false,
groupSeparator: ",", // 그룹 구분자 없음
repeat: 2, // 정수부 최대 2자리
digits: 2 // 소수점 최대 2자리
});
});
// 중요로직: DPRT 감가상각률 전용 마스크 - decimal(4,4) 스펙에 맞춤
$("body").on("focus", ".dprtMask", function () {
$(this).inputmask("numeric", {
autoGroup: true, // 그룹화 사용 안함
allowMinus: false, // 음수 사용 안함
autoUnmask: true,
rightAlign: false,
groupSeparator: ",", // 그룹 구분자 없음
repeat: 1, // 정수부 최대 1자리 (0)
digits: 4, // 소수점 최대 4자리
max: 0.9999
});
});
// 중요로직: Usg_Idx_Cd 전용 마스크 - 숫자 5자리
$("body").on("focus", ".usgIdxCdMask", function () {
$(this).inputmask({
mask: "99999", // 3자리 숫자 패턴 (선행 0 포함)
placeholder: "00000", // 입력 안내용 플레이스홀더
definitions: {
"9": {
validator: "[0-9]", // 숫자만 허용
cardinality: 1
}
},
autoUnmask: true, // 마스크 제거 후 실제 값 반환
rightAlign: false // 왼쪽 정렬
});
});
// 중요로직: Usg_Idx 전용 마스크 - decimal(10,2) 스펙에 맞춤
$("body").on("focus", ".usgIdxMask", function () {
$(this).inputmask("numeric", {
autoGroup: true, // 그룹화 사용 안함
allowMinus: false, // 음수 사용 안함
autoUnmask: true,
rightAlign: false,
groupSeparator: ",", // 그룹 구분자 없음
repeat: 8, // 정수부 최대 2자리
digits: 2 // 소수점 사용 안함
});
});
});

Loading…
Cancel
Save