김의진 3 months ago
commit 44b0992434

@ -24,7 +24,10 @@ create table tb_act_info
DEL_YN char not null comment '삭제 여부',
DEL_DT datetime null comment '삭제 일시',
DLTR varchar(11) null comment '삭제자',
ACT_NO varchar(1) null comment '행위 번호'
ACT_NO varchar(1) null comment '행위 번호',
ACTN_YMD varchar(8) null,
ACTN_AREA decimal(10, 2) null,
ACTN_RMRK varchar(1000) null
)
comment '행위 정보';

@ -0,0 +1,16 @@
create table tb_act_type
(
ACT_TYPE_CD varchar(3) not null comment '행위 유형 코드'
primary key,
VLTN_BDST varchar(100) null comment '위반 건축물',
LAWLPRVS varchar(100) null comment '법조문',
CMPTTN_RT decimal(3) null comment '산정 률',
VLTN_BDST_DTL varchar(1000) null comment '위반 건축물 상세',
USE_YN char not null comment '사용 여부',
REG_DT datetime null comment '등록 일시',
RGTR varchar(11) null comment '등록자',
MDFCN_DT datetime null comment '수정 일시',
MDFR varchar(11) null comment '수정자'
)
comment '행위 유형';

@ -5,6 +5,9 @@
This project is the "Ilsan Dong-gu Illegal Building Integrated Management System" (일산 동구 건축물 위법행위 통합관리시스템). It appears to be a web application for government officials to manage and track violations related to illegal buildings.
## 기본 중요 가이드
### **[최우선 원칙] 파일 수정 시 최신 내용 보존**
**파일을 수정(예: `replace`, `write_file`)하기 직전에는 반드시 `read_file`을 통해 파일의 최신 내용을 다시 읽어와야 합니다. 이는 Gemini가 작업하는 동안 사용자가 파일을 수정했을 경우, 해당 내용이 유실되는 것을 방지하기 위함입니다. 이 원칙은 다른 모든 가이드라인에 우선합니다.**
### 한글로 대화, 한글 필수
### junie 의 중간 진행상황도 한글로 작성해서 보여줘
### 테스트소스는 작성 불가!!

@ -131,6 +131,22 @@ public class CrdnActInfoController {
return mav;
}
/**
* (AJAX)
* @return
*/
@Operation(summary = "전체 위반행위코드 조회", description = "전체 위반행위코드 목록을 조회합니다.")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "조회 성공"),
@ApiResponse(responseCode = "500", description = "서버 오류")
})
@PostMapping("/getAllActType.ajax")
public ResponseEntity<?> getAllActType( @ModelAttribute CrdnActTypeVO vo ) {
log.debug("전체 위반행위코드 조회 요청");
List<CrdnActTypeVO> list = service.getAllActType(vo);
return ApiResponseUtil.success(list);
}
/**
* (AJAX)
* @return

@ -54,6 +54,12 @@ public interface CrdnActInfoMapper {
*/
int deleteActInfo(CrdnActInfoVO vo);
/**
*
* @return
*/
List<CrdnActTypeVO> getAllActType(CrdnActTypeVO vo);
/**
*
* @return

@ -37,6 +37,9 @@ public class CrdnActInfoVO extends PagingVO {
private BigDecimal vrtc; // 세로
private BigDecimal area; // 면적
private String rmrk; // 비고
private String actnYmd; // 조치 일자
private BigDecimal actnArea; // 조치 면적
private String actnRmrk; // 조치 비고
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Seoul")

@ -0,0 +1,39 @@
package go.kr.project.crdn.crndRegistAndView.crdnActInfo.model;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.*;
import org.springframework.format.annotation.DateTimeFormat;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
* VO
* : tb_cmpttn_rt , .
*/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class CrdnActTypeVO {
// ============ 테이블 컬럼 ============
private String actTypeCd;
private String vltnBdst;
private String lawlprvs;
private BigDecimal cmpttnRt;
private String vltnBdstDtl;
private String useYn;
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Seoul")
private LocalDateTime regDt; // 등록 일시
private String rgtr; // 등록자
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Seoul")
private LocalDateTime mdfcnDt; // 수정 일시
private String mdfr; // 수정자
}

@ -66,6 +66,12 @@ public interface CrdnActInfoService {
*/
int deleteActInfos(List<String> actInfoIds);
/**
*
* @return
*/
List<CrdnActTypeVO> getAllActType(CrdnActTypeVO vo);
/**
*
* @return

@ -140,6 +140,12 @@ public class CrdnActInfoServiceImpl extends EgovAbstractServiceImpl implements C
return mapper.deleteActInfo(vo);
}
@Override
public List<CrdnActTypeVO> getAllActType(CrdnActTypeVO vo) {
log.debug("전체 위반행위코드 조회");
return mapper.getAllActType(vo);
}
@Override
public List<CrdnStrctIdxVO> getAllStrctIdx(CrdnStrctIdxVO vo) {
log.debug("전체 구조지수 조회");

@ -10,10 +10,7 @@ import go.kr.project.crdn.crndRegistAndView.crdnActInfo.model.CrdnActInfoVO;
import go.kr.project.crdn.crndRegistAndView.crdnActInfo.service.CrdnActInfoService;
import go.kr.project.crdn.crndRegistAndView.crdnPstnInfo.model.CrdnPstnInfoVO;
import go.kr.project.crdn.crndRegistAndView.crdnPstnInfo.service.CrdnPstnInfoService;
import go.kr.project.crdn.crndRegistAndView.main.model.CrdnImpltTaskVO;
import go.kr.project.crdn.crndRegistAndView.main.model.CrdnImpltTrprInfoVO;
import go.kr.project.crdn.crndRegistAndView.main.model.CrdnRegistAndViewVO;
import go.kr.project.crdn.crndRegistAndView.main.model.LevyPrvntcActInfoVO;
import go.kr.project.crdn.crndRegistAndView.main.model.*;
import go.kr.project.crdn.crndRegistAndView.main.service.CrdnImpltTaskService;
import go.kr.project.crdn.crndRegistAndView.main.service.CrdnLevyPrvntcService;
import go.kr.project.crdn.crndRegistAndView.main.service.CrdnRegistAndViewService;
@ -31,7 +28,11 @@ import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* packageName : go.kr.project.crdn.crndRegistAndView.controller
@ -111,6 +112,11 @@ public class CrdnLevyPrvntcController {
CrdnRegistAndViewVO crdnData = crdnRegistAndViewService.selectOne(crdnParamVO);
mav.addObject("crdnData", crdnData);
// 산정률2
List<CrdnCmpttnRt2VO> crdnCmpttnRt2List = crdnLevyPrvntcService.getAllCmpttnRt2( new CrdnCmpttnRt2VO() );
mav.addObject("crdnCmpttnRt2List", crdnCmpttnRt2List);
// 기초공사구분 코드
List<CodeDetailVO> bscsCstrnSeCdList = commonCodeService.selectCodeDetailListByGroupId("BSCS_CSTRN_SE_CD");
mav.addObject("bscsCstrnSeCdList", bscsCstrnSeCdList);
@ -168,4 +174,68 @@ public class CrdnLevyPrvntcController {
}
/**
* (AJAX)
* @param bldgNewPrcCrtrAmt
* @param strctIdx
* @param usgIdx
* @param pstnIdx
* @param elpsYrRdvlrt
* @param bscsCstrnRt
* @return
*/
@Operation(summary = "건축물 과세 시가표준액 계산", description = "BigDecimal을 사용하여 건축물 과세 시가표준액을 정확하게 계산합니다.")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "계산 성공"),
@ApiResponse(responseCode = "400", description = "잘못된 숫자 형식"),
@ApiResponse(responseCode = "500", description = "서버 오류")
})
@PostMapping("/calculateTaxableMarketPrice.ajax")
@ResponseBody
public ResponseEntity<?> calculateTaxableMarketPrice(
@Parameter(description = "건물신축가격기준액") @RequestParam String bldgNewPrcCrtrAmt,
@Parameter(description = "구조지수") @RequestParam String strctIdx,
@Parameter(description = "용도지수") @RequestParam String usgIdx,
@Parameter(description = "위치지수") @RequestParam String pstnIdx,
@Parameter(description = "경과년수잔가율") @RequestParam String elpsYrRdvlrt,
@Parameter(description = "기초공사비율") @RequestParam String bscsCstrnRt) {
Map<String, Object> result = new HashMap<>();
try {
// 중요로직: BigDecimal을 사용하여 정확한 소수점 연산을 수행
BigDecimal bldgNewPrcCrtrAmtDecimal = new BigDecimal(bldgNewPrcCrtrAmt);
BigDecimal strctIdxDecimal = new BigDecimal(strctIdx);
BigDecimal usgIdxDecimal = new BigDecimal(usgIdx);
BigDecimal pstnIdxDecimal = new BigDecimal(pstnIdx);
BigDecimal elpsYrRdvlrtDecimal = new BigDecimal(elpsYrRdvlrt);
BigDecimal bscsCstrnRtDecimal = new BigDecimal(bscsCstrnRt);
BigDecimal taxableMarketPrice = bldgNewPrcCrtrAmtDecimal
.multiply(strctIdxDecimal)
.multiply(usgIdxDecimal)
.multiply(pstnIdxDecimal)
.multiply(elpsYrRdvlrtDecimal)
.multiply(bscsCstrnRtDecimal);
// 최종 계산된 값을 소수점 없이 반올림하여 문자열로 반환
String finalResult = taxableMarketPrice.setScale(0, RoundingMode.HALF_UP).toPlainString();
result.put("success", true);
result.put("taxableMarketPrice", finalResult);
return ApiResponseUtil.success(result, "계산이 수행되었습니다.");
} catch (NumberFormatException e) {
log.error("숫자 형식 변환 오류", e);
result.put("success", false);
result.put("message", "계산 값 중 잘못된 숫자 형식이 있습니다.");
return ResponseEntity.badRequest().body(result);
} catch (Exception e) {
log.error("과세 시가표준액 계산 중 오류 발생", e);
result.put("success", false);
result.put("message", "계산 중 오류가 발생했습니다.");
return ResponseEntity.internalServerError().body(result);
}
}
}

@ -1,5 +1,6 @@
package go.kr.project.crdn.crndRegistAndView.main.mapper;
import go.kr.project.crdn.crndRegistAndView.main.model.CrdnCmpttnRt2VO;
import go.kr.project.crdn.crndRegistAndView.main.model.CrdnImpltTaskVO;
import go.kr.project.crdn.crndRegistAndView.main.model.CrdnImpltTrprInfoVO;
import go.kr.project.crdn.crndRegistAndView.main.model.LevyPrvntcActInfoVO;
@ -25,4 +26,6 @@ public interface CrdnLevyPrvntcMapper {
List<LevyPrvntcActInfoVO> selectActInfoList(LevyPrvntcActInfoVO vo);
List<CrdnCmpttnRt2VO> getAllCmpttnRt2(CrdnCmpttnRt2VO vo);
}

@ -0,0 +1,69 @@
package go.kr.project.crdn.crndRegistAndView.main.model;
import com.fasterxml.jackson.annotation.JsonFormat;
import go.kr.project.common.model.PagingVO;
import lombok.*;
import org.apache.poi.hpsf.Decimal;
import org.springframework.format.annotation.DateTimeFormat;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
* packageName : go.kr.project.crdn.crndRegistAndView.main.model
* fileName : CrdnCmpttnRt2VO
* author :
* date : 25. 9. 18.
* description :
* ===========================================================
* DATE AUTHOR NOTE
* -----------------------------------------------------------
* 25. 9. 18.
*/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class CrdnCmpttnRt2VO {
private String cmpttnRt2Cd;
private String vltnMttr;
private BigDecimal cmpttnRt2;
private BigDecimal cmpttnRt2Rate;
private String useYn;
/** 등록 일시 */
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Seoul")
private LocalDateTime regDt;
/** 등록자 */
private String rgtr;
/** 수정 일시 */
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Seoul")
private LocalDateTime mdfcnDt;
/** 수정자 */
private String mdfr;
/**
* cmpttnRt2 , 100 cmpttnRt2Rate .
* @param cmpttnRt2 (: 90, 70)
*/
public void setCmpttnRt2(BigDecimal cmpttnRt2) {
// 중요로직: cmpttnRt2(산정률)이 설정될 때, cmpttnRt2Rate(계산용 비율)을 자동으로 계산하여 설정합니다.
// 예를 들어 cmpttnRt2가 90이면, cmpttnRt2Rate는 0.90이 됩니다.
this.cmpttnRt2 = cmpttnRt2;
if (cmpttnRt2 != null) {
// 100으로 나누고, 소수점 2자리까지 반올림하여 설정
this.cmpttnRt2Rate = cmpttnRt2.divide(new BigDecimal("100"), 2, java.math.RoundingMode.HALF_UP);
} else {
this.cmpttnRt2Rate = null;
}
}
}

@ -35,20 +35,28 @@ public class LevyPrvntcActInfoVO extends PagingVO {
private String actBgngYmd; //행위시작일자
private String actTypeCd; //행위유형코드
private String actTypeCdNm; //행위유형코드명
private BigDecimal actCmpttnRt; //행위유형 산정률(%) (산정률-1)
private BigDecimal actCmpttnRtRate; //행위유형 산정률 / 100 실제 곱하기 계산값에 필요한 값 (산정률-1)
private String vltnLwrgCd1; //위반법규코드
private String vltnLaw1; //위반법
private String crcLaw1; //시정법
private String impltLaw1; //이행법
private String strctIdxCd; //구조지수코드
private BigDecimal strctIdx; //구조지수
private String strctIdxCdNm; //구조지수명
private String usgIdxCd; //용도지수코드
private BigDecimal usgIdx; //용도지수
private String usgIdxCdNm; //용도지수명
private BigDecimal area; //면적
private String actnYmd; // 조치 일자
private BigDecimal actnArea; // 조치 면적
private BigDecimal calcArea; // 면적 - 조치면적
private String no; //건물 신축 가격 기준액 NO
private BigDecimal bldgNewPrcCrtrAmt; //건물 신축 가격 기준액
private String pstnIdxNo; //위치지수 NO
private BigDecimal pstnIdx; //위치지수
private String elpsYrRdvlrtYr; //경과년수별잔가율-최초위반행위 년도
private BigDecimal elpsYrRdvlrt; //경과년수별잔가율
private BigDecimal bscsCstrnYBdstCmpttnRt; //기초공사율(철콘)
private BigDecimal bscsCstrnNBdstCmpttnRt; //기초공사율(철콘 이외)
@ -60,4 +68,20 @@ public class LevyPrvntcActInfoVO extends PagingVO {
private String crdnYr; //단속년도
private String crdnNo; //단속번호
/**
* actCmpttnRt , 100 actCmpttnRtRate .
* @param actCmpttnRt (: 50)
*/
public void setActCmpttnRt(BigDecimal actCmpttnRt) {
// 중요로직: actCmpttnRt(산정률)이 설정될 때, actCmpttnRtRate(계산용 비율)을 자동으로 계산하여 설정합니다.
this.actCmpttnRt = actCmpttnRt;
if (actCmpttnRt != null) {
// 100으로 나누고, 소수점 2자리까지 반올림하여 설정
this.actCmpttnRtRate = actCmpttnRt.divide(new BigDecimal("100"), 2, java.math.RoundingMode.HALF_UP);
} else {
this.actCmpttnRtRate = null;
}
}
}

@ -1,5 +1,6 @@
package go.kr.project.crdn.crndRegistAndView.main.service;
import go.kr.project.crdn.crndRegistAndView.main.model.CrdnCmpttnRt2VO;
import go.kr.project.crdn.crndRegistAndView.main.model.CrdnImpltTaskVO;
import go.kr.project.crdn.crndRegistAndView.main.model.CrdnImpltTrprInfoVO;
import go.kr.project.crdn.crndRegistAndView.main.model.LevyPrvntcActInfoVO;
@ -25,4 +26,6 @@ public interface CrdnLevyPrvntcService {
* */
List<LevyPrvntcActInfoVO> selectActInfoList(LevyPrvntcActInfoVO vo);
List<CrdnCmpttnRt2VO> getAllCmpttnRt2(CrdnCmpttnRt2VO vo);
}

@ -2,6 +2,7 @@ package go.kr.project.crdn.crndRegistAndView.main.service.impl;
import go.kr.project.crdn.crndRegistAndView.main.mapper.CrdnImpltTaskMapper;
import go.kr.project.crdn.crndRegistAndView.main.mapper.CrdnLevyPrvntcMapper;
import go.kr.project.crdn.crndRegistAndView.main.model.CrdnCmpttnRt2VO;
import go.kr.project.crdn.crndRegistAndView.main.model.CrdnRegistAndViewVO;
import go.kr.project.crdn.crndRegistAndView.main.model.LevyPrvntcActInfoVO;
import go.kr.project.crdn.crndRegistAndView.main.service.CrdnLevyPrvntcService;
@ -10,6 +11,7 @@ import lombok.extern.slf4j.Slf4j;
import org.egovframe.rte.fdl.cmmn.EgovAbstractServiceImpl;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.List;
/**
@ -38,7 +40,31 @@ public class CrdnLevyPrvntcServiceImpl extends EgovAbstractServiceImpl implement
* */
@Override
public List<LevyPrvntcActInfoVO> selectActInfoList(LevyPrvntcActInfoVO vo) {
return crdnLevyPrvntcMapper.selectActInfoList(vo);
// 중요로직: 행위정보 목록을 조회한 후, 각 항목에 대해 '면적 - 조치면적'을 계산하여 'calcArea' 필드에 설정합니다.
// BigDecimal을 사용하여 정확한 소수점 연산을 보장합니다.
// 1. DB에서 행위정보 목록 조회
List<LevyPrvntcActInfoVO> actInfoList = crdnLevyPrvntcMapper.selectActInfoList(vo);
// 2. 각 행위정보에 대해 계산 수행
for (LevyPrvntcActInfoVO actInfo : actInfoList) {
// null일 경우 0으로 처리하여 NullPointerException 방지
BigDecimal area = (actInfo.getArea() != null) ? actInfo.getArea() : BigDecimal.ZERO;
BigDecimal actnArea = (actInfo.getActnArea() != null) ? actInfo.getActnArea() : BigDecimal.ZERO;
// 3. 면적 - 조치면적 계산
BigDecimal calcArea = area.subtract(actnArea);
// 4. 계산된 값을 소수점 둘째자리까지 설정하여 VO에 저장
actInfo.setCalcArea(calcArea.setScale(2, java.math.RoundingMode.HALF_UP));
}
return actInfoList;
}
@Override
public List<CrdnCmpttnRt2VO> getAllCmpttnRt2(CrdnCmpttnRt2VO vo) {
return crdnLevyPrvntcMapper.getAllCmpttnRt2(vo);
}
}

@ -16,7 +16,7 @@
a.PSTN_INFO_ID,
a.ACT_BGNG_YMD,
a.ACT_TYPE_CD,
act.CD_NM AS ACT_TYPE_CD_NM,
act.VLTN_BDST AS ACT_TYPE_CD_NM,
a.ACT_NO,
a.VLTN_LWRG_CD_1,
vltn1.VLTN_LAW AS VLTN_LAW_1,
@ -31,6 +31,9 @@
a.VRTC,
a.AREA,
a.RMRK,
a.ACTN_YMD,
a.ACTN_AREA,
a.ACTN_RMRK,
a.REG_DT,
a.RGTR,
regUser.USER_ACNT AS RGTR_ACNT,
@ -44,7 +47,7 @@
a.DLTR
FROM tb_act_info a
LEFT JOIN tb_cd_detail sgg ON sgg.CD_GROUP_ID = 'ORG_CD' AND sgg.CD_ID = a.SGG_CD
LEFT JOIN tb_cd_detail act ON act.CD_GROUP_ID = 'ACT_TYPE_CD' AND act.CD_ID = a.ACT_TYPE_CD
LEFT JOIN TB_ACT_TYPE act ON act.ACT_TYPE_CD = a.ACT_TYPE_CD
LEFT JOIN tb_vltn_lwrg vltn1 ON vltn1.VLTN_LWRG_CD = a.VLTN_LWRG_CD_1 AND vltn1.DEL_YN = 'N'
LEFT JOIN tb_vltn_lwrg vltn2 ON vltn2.VLTN_LWRG_CD = a.VLTN_LWRG_CD_2 AND vltn2.DEL_YN = 'N'
LEFT JOIN tb_strct_idx strct ON strct.STRCT_IDX_CD = a.STRCT_IDX_CD AND strct.DEL_YN = 'N'
@ -96,6 +99,9 @@
VRTC,
AREA,
RMRK,
ACTN_YMD,
ACTN_AREA,
ACTN_RMRK,
REG_DT,
RGTR,
MDFCN_DT,
@ -123,11 +129,14 @@
#{vrtc},
#{area},
#{rmrk},
replace(#{actnYmd},'-',''),
#{actnArea},
#{actnRmrk},
NOW(),
#{rgtr},
NOW(),
#{mdfr},
'N'
NOW(),
#{mdfr},
'N'
)
</insert>
@ -143,7 +152,7 @@
a.PSTN_INFO_ID,
a.ACT_BGNG_YMD,
a.ACT_TYPE_CD,
act.CD_NM AS ACT_TYPE_CD_NM,
act.VLTN_BDST AS ACT_TYPE_CD_NM,
a.ACT_NO,
a.VLTN_LWRG_CD_1,
vltn1.VLTN_LAW AS VLTN_LAW_1,
@ -158,6 +167,9 @@
a.VRTC,
a.AREA,
a.RMRK,
a.ACTN_YMD,
a.ACTN_AREA,
a.ACTN_RMRK,
a.REG_DT,
a.RGTR,
regUser.USER_ACNT AS RGTR_ACNT,
@ -171,7 +183,7 @@
a.DLTR
FROM tb_act_info a
LEFT JOIN tb_cd_detail sgg ON sgg.CD_GROUP_ID = 'ORG_CD' AND sgg.CD_ID = a.SGG_CD
LEFT JOIN tb_cd_detail act ON act.CD_GROUP_ID = 'ACT_TYPE_CD' AND act.CD_ID = a.ACT_TYPE_CD
LEFT JOIN TB_ACT_TYPE act ON act.ACT_TYPE_CD = a.ACT_TYPE_CD
LEFT JOIN tb_vltn_lwrg vltn1 ON vltn1.VLTN_LWRG_CD = a.VLTN_LWRG_CD_1 AND vltn1.DEL_YN = 'N'
LEFT JOIN tb_vltn_lwrg vltn2 ON vltn2.VLTN_LWRG_CD = a.VLTN_LWRG_CD_2 AND vltn2.DEL_YN = 'N'
LEFT JOIN tb_strct_idx strct ON strct.STRCT_IDX_CD = a.STRCT_IDX_CD AND strct.DEL_YN = 'N'
@ -197,6 +209,9 @@
VRTC = #{vrtc},
AREA = #{area},
RMRK = #{rmrk},
ACTN_YMD = #{actnYmd},
ACTN_AREA = #{actnArea},
ACTN_RMRK = #{actnRmrk},
MDFCN_DT = NOW(),
MDFR = #{mdfr}
WHERE ACT_INFO_ID = #{actInfoId}
@ -214,6 +229,24 @@
AND DEL_YN = 'N'
</update>
<!-- 전체 위반행위코드 목록 조회 -->
<select id="getAllActType" parameterType="CrdnActTypeVO" resultType="CrdnActTypeVO">
/* ActInfoMapper.getAllActType : 전체 위반행위코드 목록 조회 */
SELECT
ACT_TYPE_CD,
VLTN_BDST,
LAWLPRVS,
CMPTTN_RT,
VLTN_BDST_DTL,
USE_YN,
REG_DT,
RGTR,
MDFCN_DT,
MDFR
FROM TB_ACT_TYPE
WHERE USE_YN = 'Y'
ORDER BY ACT_TYPE_CD
</select>
<!-- 전체 구조지수 목록 조회 -->
<select id="getAllStrctIdx" parameterType="CrdnStrctIdxVO" resultType="CrdnStrctIdxVO">

@ -213,12 +213,12 @@
) > 0 THEN true ELSE false END as selected,
aio.ACT_NO,
aio.ACT_TYPE_CD,
act.CD_NM AS ACT_TYPE_CD_NM
act.VLTN_BDST AS ACT_TYPE_CD_NM
FROM tb_act_info aio
inner JOIN tb_ownr_info oi ON aio.CRDN_YR = oi.CRDN_YR AND aio.CRDN_NO = oi.CRDN_NO AND oi.DEL_YN = 'N'
INNER JOIN tb_ownr o ON o.OWNR_ID = oi.OWNR_ID AND o.DEL_YN = 'N'
LEFT JOIN tb_cd_detail impltTrprSe ON impltTrprSe.CD_GROUP_ID = 'IMPLT_TRPR_SE_CD' AND impltTrprSe.CD_ID = '1'
LEFT JOIN tb_cd_detail act ON act.CD_GROUP_ID = 'ACT_TYPE_CD' AND act.CD_ID = aio.ACT_TYPE_CD
LEFT JOIN TB_ACT_TYPE act ON act.ACT_TYPE_CD = aio.ACT_TYPE_CD
WHERE aio.CRDN_YR = #{crdnYr}
AND aio.CRDN_NO = #{crdnNo}
AND aio.DEL_YN = 'N'
@ -245,12 +245,12 @@
) > 0 THEN true ELSE false END as selected,
aio.ACT_NO,
aio.ACT_TYPE_CD,
act.CD_NM AS ACT_TYPE_CD_NM
act.VLTN_BDST AS ACT_TYPE_CD_NM
FROM tb_act_info aio
INNER JOIN tb_actr_info ai ON ai.ACT_INFO_ID = aio.ACT_INFO_ID AND ai.DEL_YN = 'N'
INNER JOIN tb_ownr o ON o.OWNR_ID = ai.OWNR_ID AND o.DEL_YN = 'N'
LEFT JOIN tb_cd_detail impltTrprSe ON impltTrprSe.CD_GROUP_ID = 'IMPLT_TRPR_SE_CD' AND impltTrprSe.CD_ID = '2'
LEFT JOIN tb_cd_detail act ON act.CD_GROUP_ID = 'ACT_TYPE_CD' AND act.CD_ID = aio.ACT_TYPE_CD
LEFT JOIN TB_ACT_TYPE act ON act.ACT_TYPE_CD = aio.ACT_TYPE_CD
WHERE aio.CRDN_YR = #{crdnYr}
AND aio.CRDN_NO = #{crdnNo}
AND aio.DEL_YN = 'N'

@ -15,20 +15,26 @@
t3.ACT_INFO_ID,
t3.ACT_BGNG_YMD,
t3.ACT_TYPE_CD,
act.CD_NM AS ACT_TYPE_CD_NM,
act.VLTN_BDST AS ACT_TYPE_CD_NM,
act.CMPTTN_RT AS ACT_CMPTTN_RT,
t3.VLTN_LWRG_CD_1,
vltn1.VLTN_LAW as VLTN_LAW_1,
vltn1.IMPLT_LAW as IMPLT_LAW_1,
vltn1.CRC_LAW as CRC_LAW_1,
t3.STRCT_IDX_CD,
strct.STRCT_NM AS STRCT_IDX_CD_NM,
strct.STRCT_IDX,
t3.USG_IDX_CD,
usg.USG_NM AS USG_IDX_CD_NM,
usg.USG_IDX AS USG_IDX,
t3.AREA,
t3.ACTN_YMD,
t3.ACTN_AREA,
bnpca.no, -- 건물기준가액 NO
bnpca.BLDG_NEW_PRC_CRTR_AMT, -- 건물기준시가액
pi.PSTN_IDX_NO, -- 위치지수 NO
pi.PSTN_IDX, -- 위치지수
substring(t3.ACT_BGNG_YMD,1,4) as ELPS_YR_RDVLRT_YR,
CASE WHEN (CAST(substring(t3.ACT_BGNG_YMD,1,4) as SIGNED)-CAST(t1.CRDN_YR as SIGNED)) >= strct.RDVLRT_CN_YR_CNT THEN strct.LAST_YR_RDVLRT
ELSE 1-((CAST(substring(t3.ACT_BGNG_YMD,1,4) as SIGNED)-CAST(t1.CRDN_YR as SIGNED)) * strct.DPRT)
end as ELPS_YR_RDVLRT, -- 경과 연도 잔가율
@ -43,7 +49,7 @@
LEFT JOIN tb_cd_detail sgg ON sgg.CD_GROUP_ID = 'ORG_CD' AND sgg.CD_ID = t2.SGG_CD
LEFT JOIN tb_cd_detail emd ON emd.CD_GROUP_ID = 'STDG_EMD_CD' AND emd.CD_ID = t2.STDG_EMD_CD
LEFT JOIN tb_cd_detail ld ON ld.CD_GROUP_ID = 'LDCG_CD' AND ld.CD_ID = t2.LDCG_CD
LEFT JOIN tb_cd_detail act ON act.CD_GROUP_ID = 'ACT_TYPE_CD' AND act.CD_ID = t3.ACT_TYPE_CD
LEFT JOIN TB_ACT_TYPE act ON act.ACT_TYPE_CD = t3.ACT_TYPE_CD
LEFT JOIN tb_vltn_lwrg vltn1 ON vltn1.VLTN_LWRG_CD = t3.VLTN_LWRG_CD_1 AND vltn1.DEL_YN = 'N'
LEFT JOIN tb_vltn_lwrg vltn2 ON vltn2.VLTN_LWRG_CD = t3.VLTN_LWRG_CD_2 AND vltn2.DEL_YN = 'N'
LEFT JOIN tb_strct_idx strct ON strct.STRCT_IDX_CD = t3.STRCT_IDX_CD AND strct.DEL_YN = 'N'
@ -54,4 +60,17 @@
and t1.CRDN_NO = #{crdnNo}
</select>
<select id="getAllCmpttnRt2" parameterType="CrdnCmpttnRt2VO" resultType="CrdnCmpttnRt2VO">
select CMPTTN_RT_2_CD,
VLTN_MTTR,
CMPTTN_RT_2,
USE_YN,
REG_DT,
RGTR,
MDFCN_DT,
MDFR
from tb_cmpttn_rt_2
where USE_YN = 'Y'
</select>
</mapper>

@ -43,12 +43,8 @@
</td>
<th class="th"><span class="required">*</span> 행위유형</th>
<td>
<select id="actTypeCd" name="actTypeCd" class="input" style="width: 180px;" validation-check="required">
<option value="">선택하세요</option>
<c:forEach var="code" items="${actTypeCdList}">
<option value="${code.cdId}" <c:if test="${data.actTypeCd eq code.cdId}">selected</c:if>>${code.cdNm}</option>
</c:forEach>
</select>
<input type="text" id="actTypeCdNm" name="actTypeCdNm" class="input" style="width: 250px;" placeholder="행위유형을 입력하거나 선택하세요" autocomplete="off" value="${data.actTypeCdNm}" validation-check="required"/>
<input type="hidden" id="actTypeCd" name="actTypeCd" value="${data.actTypeCd}"/>
</td>
</tr>
<tr>
@ -179,6 +175,7 @@
});
// 각 드롭다운 초기화 (XIT 공통 컴포넌트 사용)
initActTypeCdDropdown();
initStrctIdxDropdown();
initVltnLwrgDropdowns();
initUsgIdxDropdown();
@ -190,11 +187,55 @@
});
// 드롭다운 인스턴스들
var actTypeCdDropdown;
var strctIdxDropdown;
var vltnLwrg1Dropdown;
var vltnLwrg2Dropdown;
var usgIdxDropdown;
/**
* 위반행위 드롭다운 초기화
* 중요한 로직 주석: XIT 공통 드롭다운 컴포넌트를 사용하여 구조지수 선택 기능을 구현한다.
*/
function initActTypeCdDropdown() {
actTypeCdDropdown = new XitDropdown({
inputSelector: '#actTypeCdNm',
hiddenSelector: '#actTypeCd',
dataUrl: '<c:url value="/crdn/crndRegistAndView/crdnActInfo/getAllActType.ajax"/>',
width: '400px',
maxHeight: '300px',
valueField: 'actTypeCd',
textField: 'vltnBdst',
searchField: 'vltnBdst',
placeholder: '위반행위를 입력하거나 선택하세요',
noResultsText: '검색 결과가 없습니다',
cssClass: 'strct-idx-dropdown',
displayFields: [
{
name: 'vltnBdst',
label: '위반 건축물',
formatter: function(value) {
return value;
}
},
{
name: 'lawlprvs',
label: '법조문',
formatter: function(value) {
return value ? value : '-';
}
},
{
name: 'cmpttnRt',
label: '산정률',
formatter: function(value) {
return value ? parseFloat(value).toFixed(2) : '-';
}
}
]
});
}
/**
* 구조지수 드롭다운 초기화
* 중요한 로직 주석: XIT 공통 드롭다운 컴포넌트를 사용하여 구조지수 선택 기능을 구현한다.

@ -128,7 +128,7 @@
<div class="tabels cols2 no-info">
<table class="display">
<tr>
<th rowspan="3" style="width: 100px;">이행강제금산출</th>
<th rowspan="4" style="width: 100px;">이행강제금산출</th>
<th style="border-right: 0; border-bottom: 0;">시가표준액</th>
<th style="width: 23px; border-right: 0; border-bottom: 0;"></th>
<th style="border-right: 0; border-bottom: 0;">위반면적</th>
@ -142,27 +142,55 @@
<th style="border-bottom: 0;">산정액</th>
</tr>
<tr>
<td style="border-right: 0; border-bottom: 0;"><input type="text" class="input" value=""/></td>
<td style="width: 23px; border-right: 0; border-bottom: 0;">X</td>
<td style="border-right: 0; border-bottom: 0;"><input type="text" class="input" value=""/></td>
<td style="width: 23px; border-right: 0; border-bottom: 0;">X</td>
<td style="border-right: 0; border-bottom: 0;"><input type="text" class="input" value=""/></td>
<td style="width: 23px; border-right: 0; border-bottom: 0;">X</td>
<td style="border-right: 0; border-bottom: 0;"><input type="text" class="input" value=""/></td>
<td style="width: 23px; border-right: 0; border-bottom: 0;">X</td>
<td style="border-right: 0; border-bottom: 0;"><input type="text" class="input" value=""/></td>
<td style="width: 23px; border-right: 0; border-bottom: 0;">=</td>
<td style="border-bottom: 0;"><input type="text" class="input" value=""/></td>
<td rowspan="2" style="border-right: 0; border-bottom: 0;">
<input type="text" class="input numericMask" id="standardMarketPrice_top" readonly/>
</td>
<td rowspan="2" style="width: 23px; border-right: 0; border-bottom: 0;">X</td>
<td rowspan="2" style="border-right: 0; border-bottom: 0;">
<input type="text" id="vltnArea" class="input decimalMask" value=""/>
</td>
<td rowspan="2" style="width: 23px; border-right: 0; border-bottom: 0;">X</td>
<td style="border-right: 0; border-bottom: 0; padding: 0 !important;">
<button type="button" id="" class="newbtn bg2-1" style="width: 93px; padding: 5px 5px;">+ 가산 [100%]</button>
<button type="button" id="" class="newbtn bg6" style="width: 90px;padding: 5px 5px;">- 감산 [100%]</button>
</td>
<td rowspan="2" style="width: 23px; border-right: 0; border-bottom: 0;">X</td>
<td rowspan="2" style="border-right: 0; border-bottom: 0;">
<input type="text" class="input" id="cmpttnRt" value="" style="text-align: right;" readonly/>
<input type="hidden" class="input" id="cmpttnRtRate" value="" readonly/>
</td>
<td rowspan="2" style="width: 23px; border-right: 0; border-bottom: 0;">X</td>
<td style="border-right: 0; border-bottom: 0;">
<select id="cmpttnRt2Cd" class="input">
<option value="">선택하세요.</option>
<c:forEach var="code" items="${crdnCmpttnRt2List}">
<option value="${code.cmpttnRt2Cd}" rateValueAttribute="${code.cmpttnRt2} %" rateValueAttribute2="${code.cmpttnRt2Rate}" >
${code.vltnMttr}
</option>
</c:forEach>
</select>
</td>
<td rowspan="2" style="width: 23px; border-right: 0; border-bottom: 0;">=</td>
<td rowspan="2" style="border-bottom: 0;"><input type="text" class="input" value=""/></td>
</tr>
<tr>
<td colspan="12"><strong>부과총액 = 결과값</strong></td>
<td style="border-top: 0; border-right: 0; border-bottom: 0;">
<input type="text" class="input" id="" value="" readonly/>
</td>
<td style="border-top: 0; border-right: 0; border-bottom: 0;">
<input type="text" id="actCmpttnRt" class="input" style="text-align: right;" value="" readonly/>
</td>
</tr>
<tr>
<td colspan="12" style="border-top: 0;"><strong>부과총액 = 결과값 계산로직 진행 중</strong></td>
</tr>
</table>
</div>
</div>
<%-- 해당년도 시가표준액 계산 --%>
<div class="containers">
<div class="tabels cols2 no-info">
<table class="display">
<table class="display" id="calculationTable">
<tr>
<th rowspan="3" style="width: 100px;">${crdnData.crdnYr} 년도</th>
<th style="border-right: 0; border-bottom: 0;">건물<br/>기준시가액</th>
@ -181,28 +209,18 @@
<th style="border-bottom: 0;">시가표준액<br/>(1,000원미만절삭)</th>
</tr>
<tr>
<td style="border-right: 0; border-bottom: 0;">
<input type="text" class="input" value="" readonly/>
</td>
<td style="border-right: 0; border-bottom: 0;"><input type="text" class="input numericMask" id="bldgNewPrcCrtrAmt_nm" readonly/></td>
<td rowspan="2" style="width: 23px; border-right: 0;">X</td>
<td style="border-right: 0; border-bottom: 0;">
<input type="text" class="input" value="" readonly/>
</td>
<td style="border-right: 0; border-bottom: 0;"><input type="text" class="input" id="strctIdx_nm" readonly/></td>
<td rowspan="2" style="width: 23px; border-right: 0;">X</td>
<td style="border-right: 0; border-bottom: 0;">
<input type="text" class="input" value="" readonly/>
</td>
<td style="border-right: 0; border-bottom: 0;"><input type="text" class="input" id="usgIdx_nm" readonly/></td>
<td rowspan="2" style="width: 23px; border-right: 0;">X</td>
<td style="border-right: 0; border-bottom: 0;">
<input type="text" class="input" value="" readonly/>
</td>
<td style="border-right: 0; border-bottom: 0;"><input type="text" class="input numericMask" id="pstnIdx_nm" readonly/></td>
<td rowspan="2" style="width: 23px; border-right: 0;">X</td>
<td style="border-right: 0; border-bottom: 0;">
<input type="text" class="input" value="" readonly/>
</td>
<td style="border-right: 0; border-bottom: 0;"><input type="text" class="input" style="text-align: right;" id="elpsYrRdvlrt_yr" readonly/></td>
<td rowspan="2" style="width: 23px; border-right: 0;">X</td>
<td style="border-right: 0; border-bottom: 0;">
<select id="bscsCstrnSeCd" name="bscsCstrnSeCd" class="input" style="width: 180px;" validation-check="required">
<select id="bscsCstrnSeCd" name="bscsCstrnSeCd" class="input" validation-check="required">
<option value="">선택하세요</option>
<c:forEach var="code" items="${bscsCstrnSeCdList}">
<option value="${code.cdId}">${code.cdNm}</option>
@ -210,16 +228,16 @@
</select>
</td>
<td rowspan="2" style="width: 23px; border-right: 0;">=</td>
<td rowspan="2" style="border-right: 0; border-bottom: 0;"><input type="text" class="input" value=""/></td>
<td rowspan="2" style="border-bottom: 0;"><input type="text" class="input" value=""/></td>
<td rowspan="2" style="border-right: 0; border-bottom: 0;"><input type="text" class="input numericMask" id="taxableMarketPrice" readonly/></td>
<td rowspan="2" style="border-bottom: 0;"><input type="text" class="input numericMask" id="standardMarketPrice" readonly/></td>
</tr>
<tr>
<td style="border-right: 0; border-top: 0;"><input type="text" class="input" value=""/></td>
<td style="border-right: 0; border-top: 0;"><input type="text" class="input" value=""/></td>
<td style="border-right: 0; border-top: 0;"><input type="text" class="input" value=""/></td>
<td style="border-right: 0; border-top: 0;"><input type="text" class="input" value=""/></td>
<td style="border-right: 0; border-top: 0;"><input type="text" class="input" value=""/></td>
<td style="border-right: 0; border-top: 0;"><input type="text" class="input" value=""/></td>
<td style="border-right: 0; border-top: 0;"><input type="text" class="input numericMask" id="bldgNewPrcCrtrAmt" readonly/></td>
<td style="border-right: 0; border-top: 0;"><input type="text" class="input decimalMask" id="strctIdx" readonly/></td>
<td style="border-right: 0; border-top: 0;"><input type="text" class="input decimalMask" id="usgIdx" readonly/></td>
<td style="border-right: 0; border-top: 0;"><input type="text" class="input decimalMask" id="pstnIdx" readonly/></td>
<td style="border-right: 0; border-top: 0;"><input type="text" class="input numericMask" id="elpsYrRdvlrt" readonly/></td>
<td style="border-right: 0; border-top: 0;"><input type="text" class="input decimalMask" id="bscsCstrnRt" readonly/></td>
</tr>
</table>
</div>
@ -248,7 +266,7 @@
(function(window, $) {
'use strict';
var ImpltTaskPopup = {
var LevyPrvntcPopup = {
// 팝업 모드 및 기본 정보
mode: '${mode}',
crdnYr: '${crdnYr}',
@ -297,6 +315,7 @@
var self = this;
return [
{ header: '행위유형코드', name: 'actTypeCd', align: 'center', width: 60, hidden: true},
{ header: '행위유형산정률1', name: 'actCmpttnRt', align: 'center', width: 60, hidden: true},
{ header: '행위유형명', name: 'actTypeCdNm', align: 'center', width: 180},
{ header: '위반법규코드', name: 'vltnLwrgCd1', align: 'center', width: 60, hidden: true},
{ header: '위반법', name: 'vltnLaw1', align: 'center', width: 130},
@ -312,6 +331,11 @@
return e.value ? parseFloat(e.value).toFixed(2) : '-';
}
},
{ header: '조치면적', name: 'actnArea', align: 'right', width: 100, formatter: function(e){
//return e.value != null ? Number(e.value).toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 }) : '';
return e.value ? parseFloat(e.value).toFixed(2) : '0';
}
},
{ header: '우편번호', name: 'zip', align: 'center', width: 90, hidden: true },
{ header: '지번 전체주소', name: 'lotnoWholAddr', align: 'left', width: 300, hidden: true },
{ header: '지번', name: 'lotnoMSno', align: 'center', width: 80, hidden: true, formatter: function(row, col, cellValue, item, rowIndex) {
@ -327,8 +351,10 @@
}
},
{ header: '구조지수코드', name: 'strctIdxCd', align: 'center', width: 60, hidden: true},
{ header: '구조지수', name: 'strctIdx', align: 'right', width: 150, formatter: function(e){ return e.value != null ? Number(e.value).toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 }) : ''; } },
{ header: '구조지수명', name: 'strctIdxCdNm', align: 'left', width: 150},
{ header: '용도지수코드', name: 'usgIdxCd', align: 'center', width: 60, hidden: true},
{ header: '용도지수', name: 'usgIdx', align: 'right', formatter: function(e){ return e.value != null ? Number(e.value).toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 }) : ''; } },
{ header: '용도지수명', name: 'usgIdxCdNm', align: 'left'},
{ header: '건물신축가격기준액NO', name: 'no', hidden: true },
{ header: '건물신축가격기준액', name: 'bldgNewPrcCrtrAmt', align: 'right', width: 140, formatter: function(e){ return e.value != null ? Number(e.value).toLocaleString() : ''; } },
@ -360,7 +386,7 @@
initialRequest: false, // 초기 데이터 요청 여부
serializer: function(params) {
var defaultParams = $.param(params);
var extra = $.param({ "crdnYr": ImpltTaskPopup.crdnYr, "crdnNo": ImpltTaskPopup.crdnNo, "impltInfoId": $("#impltInfoId").val() });
var extra = $.param({ "crdnYr": LevyPrvntcPopup.crdnYr, "crdnNo": LevyPrvntcPopup.crdnNo, "impltInfoId": $("#impltInfoId").val() });
return defaultParams + '&' + extra;
}
};
@ -389,7 +415,6 @@
// 데이터 로딩 완료 이벤트
this.instance.on('successResponse', function(ev) {
var responseObj = JSON.parse(ev.xhr.response);
console.log(responseObj);
if( responseObj && responseObj.data ){
// 총 개수 업데이트
$('#totalCount').text('총 ' + responseObj.data.contents.length + '건');
@ -398,18 +423,52 @@
// 렌더링완료 후 check box
this.instance.on('onGridUpdated', function() {
var allRows = self.instance.getData();
var rowKey = null;
allRows.forEach(function(row) {
if (row.selected) {
rowKey = row.rowKey
}
// 1. 체크박스 선택
self.instance.check(rowKey);
});
});
/**
* 중요로직: 행 선택 시 공통 처리 함수
* rowData를 통해 actInfoId 설정 및 다른 그리드 새로고침
* @param {Object} rowData - 선택된 행의 데이터
*/
var handleRowSelection = function(rowData) {
if (!rowData) return;
var vltnArea = rowData.calcArea; // 면적 - 조치면적 : 위반면적
$('#vltnArea').val(vltnArea); // 위반면적
// 행위유형에 따른 산정률1 설정
$('#cmpttnRt').val(rowData.actCmpttnRt+ ' %');
$('#cmpttnRtRate').val(rowData.actCmpttnRtRate);
$('#bscsCstrnRt').val(''); // 기초공사율
$('#bscsCstrnSeCd').val(''); // 기초공사구분
$('#bldgNewPrcCrtrAmt_nm').val(rowData.bldgNewPrcCrtrAmt).trigger('focus'); // 건물기준시가액(상단)
$('#bldgNewPrcCrtrAmt').val(rowData.bldgNewPrcCrtrAmt).trigger('focus'); // 건물기준시가액(하단)
$('#strctIdx_nm').val(rowData.strctIdxCdNm); // 구조지수(상단)
$('#strctIdx').val(rowData.strctIdx); // 구조지수(하단)
$('#usgIdx_nm').val(rowData.usgIdxCdNm); // 용도지수(상단)
$('#usgIdx').val(rowData.usgIdx); // 용도지수(하단)
$('#pstnIdx_nm').val(rowData.oalp).trigger('focus'); // 위치지수(상단)
$('#pstnIdx').val(rowData.pstnIdx); // 위치지수(하단)
$('#elpsYrRdvlrt_yr').val(rowData.elpsYrRdvlrtYr+' 년'); // 경과년수별잔가율(상단)
$('#elpsYrRdvlrt').val(rowData.elpsYrRdvlrt); // 경과년수별잔가율(하단)
$('#bscsCstrnSeCd').trigger('change'); // 기초공사구분 변경 이벤트 트리거
};
this.instance.on('focusChange', function(ev) {
if (ev.rowKey !== undefined && ev.rowKey !== null) {
var rowData = self.instance.getRow(ev.rowKey);
handleRowSelection(rowData);
}
});
},
},
@ -447,6 +506,41 @@
e.preventDefault();
self.cancel();
});
$('#bscsCstrnSeCd').on('change', function() { // 기초공사구분 변경 시
var focusedCell = self.grid.instance.getFocusedCell();
if (focusedCell && focusedCell.rowKey !== null) {
var rowData = self.grid.instance.getRow(focusedCell.rowKey);
if (rowData) {
var selectedValue = $(this).val();
var rate = 0;
if (selectedValue === '1') {
rate = rowData.bscsCstrnYBdstCmpttnRt;
} else if (selectedValue === '2') {
rate = rowData.bscsCstrnNBdstCmpttnRt;
} else if (selectedValue === '3') {
rate = rowData.dupEtbldgBdstCmpttnRt;
} else {
rate = "";
}
$('#bscsCstrnRt').val(rate).trigger('focus'); // 기초공사율 설정
// 자동계산 함수 호출
calculateAuto();
}
}
});
// 산정률2 선택 시 산정률2 input에 값 설정
$('#cmpttnRt2Cd').on('change', function() {
var selectedOption = $(this).find('option:selected');
var rateValue = selectedOption.attr('rateValueAttribute');
$('#actCmpttnRt').val(rateValue || '').trigger('focus');
});
// 계산에 사용되는 입력 필드 변경 시 자동 계산 호출
var calculationInputs = '#bldgNewPrcCrtrAmt, #strctIdx, #usgIdx, #pstnIdx, #elpsYrRdvlrt';
$(document).on('change', calculationInputs, calculateAuto);
},
/**
@ -530,42 +624,6 @@
};
},
/**
* 그리드에서 선택된 이행 대상자 정보 수집
* 중요한 로직 주석: 체크박스가 선택된 행의 데이터를 수집하여 이행 대상자 정보 배열을 생성합니다.
*/
collectSelectedTrprInfo: function() {
var selectedTrprInfoList = [];
var checkedRowKeys = this.grid.instance.getCheckedRowKeys();
if (checkedRowKeys && checkedRowKeys.length > 0) {
for (var i = 0; i < checkedRowKeys.length; i++) {
var rowKey = checkedRowKeys[i];
var rowData = this.grid.instance.getRow(rowKey);
if (rowData) {
// 이행 대상자 정보 객체 생성
var trprInfo = {
ownrActrInfoId: rowData.ownrActrInfoId,
impltTrprSeCd: rowData.impltTrprSeCd || '1', // 1:소유자, 2:행위자 (기본값: 소유자)
impltTrprFlnm: rowData.impltTrprFlnm,
impltTrprZip: rowData.impltTrprZip,
impltTrprAddr: rowData.impltTrprAddr,
impltTrprDaddr: rowData.impltTrprDaddr,
actNo: rowData.actNo,
actTypeCd: rowData.actTypeCd,
lotnoMno: rowData.lotnoMno,
lotnoSno: rowData.lotnoSno
};
selectedTrprInfoList.push(trprInfo);
}
}
}
return selectedTrprInfoList;
},
/**
* 폼 유효성 검증
*/
@ -593,6 +651,68 @@
};
/**
* 자동 계산 (서버 API 호출)
* @description 각 항목의 값을 서버로 보내 건축물과세시가를 계산하고, 그 결과를 받아 시가표준액을 계산합니다.
* - 건축물과세시가 = 서버 API를 통해 계산
* - 시가표준액 = 건축물과세시가에서 1,000원 미만 절사
*/
function calculateAuto() {
var bldgNewPrcCrtrAmt = $('#bldgNewPrcCrtrAmt').inputmask('unmaskedvalue') || '0'; // 건물기준시가액
var strctIdx = $('#strctIdx').inputmask('unmaskedvalue') || '0'; // 구조지수
var usgIdx = $('#usgIdx').inputmask('unmaskedvalue') || '0'; // 용도지수
var pstnIdx = $('#pstnIdx').inputmask('unmaskedvalue') || '0'; // 위치지수
var elpsYrRdvlrt = $('#elpsYrRdvlrt').inputmask('unmaskedvalue') || '0'; // 경과년수별잔가율
var bscsCstrnRt = $('#bscsCstrnRt').inputmask('unmaskedvalue') || '0'; // 기초공사율
// 기초공사율이 선택되지 않았으면 계산을 수행하지 않고 필드를 초기화합니다.
if (!bscsCstrnRt || parseFloat(bscsCstrnRt) === 0) {
$('#taxableMarketPrice').val('').trigger('focus'); // 건축물과세시가
$('#standardMarketPrice').val('').trigger('focus'); // 시가표준액
$('#standardMarketPrice_top').val('').trigger('focus'); // 시가표준액(상단)
return;
}
var params = {
bldgNewPrcCrtrAmt: bldgNewPrcCrtrAmt,
strctIdx: strctIdx,
usgIdx: usgIdx,
pstnIdx: pstnIdx,
elpsYrRdvlrt: elpsYrRdvlrt,
bscsCstrnRt: bscsCstrnRt
};
$.ajax({
url: '<c:url value="/crdn/crndRegistAndView/crdnLevyPrvntc/calculateTaxableMarketPrice.ajax"/>',
type: 'POST',
data: params,
success: function(response) {
if (response && response.data && response.success) {
var taxableMarketPrice = parseFloat(response.data.taxableMarketPrice) || 0;
// 시가표준액 계산: 1,000원 미만 절사
var standardMarketPrice = Math.floor(taxableMarketPrice / 1000) * 1000;
// 계산된 값을 input 필드에 설정
$('#taxableMarketPrice').val(taxableMarketPrice).trigger('focus'); // 건축물과세시가
$('#standardMarketPrice').val(standardMarketPrice).trigger('focus'); // 시가표준액
$('#standardMarketPrice_top').val(standardMarketPrice).trigger('focus'); // 시가표준액(상단)
} else {
alert(response.message || '계산 중 오류가 발생했습니다.');
$('#taxableMarketPrice').val('').trigger('focus'); // 건축물과세시가
$('#standardMarketPrice').val('').trigger('focus'); // 시가표준액
$('#standardMarketPrice_top').val('').trigger('focus'); // 시가표준액(상단)
}
},
error: function() {
alert('서버와 통신 중 오류가 발생했습니다.');
$('#taxableMarketPrice').val('').trigger('focus'); // 건축물과세시가
$('#standardMarketPrice').val('').trigger('focus'); // 시가표준액
$('#standardMarketPrice_top').val('').trigger('focus'); // 시가표준액(상단)
}
});
}
/**
* 행정처분 간격일 자동 계산 함수
* 중요한 로직 주석: 시작일과 종료일 입력시 자동으로 간격일을 계산한다.
@ -618,8 +738,11 @@
// 초기화 실행
$(document).ready(function() {
ImpltTaskPopup.init();
LevyPrvntcPopup.init();
});
// 전역 네임스페이스에 모듈 노출
window.LevyPrvntcPopup = LevyPrvntcPopup;
})(window, jQuery);
</script>

@ -66,12 +66,6 @@
align: 'center',
width: 120
},
{
header: '행위유형',
name: 'actTypeCdNm',
align: 'center',
width: 120
},
{
header: '행위번호',
name: 'actNo',

@ -57,6 +57,9 @@
<script type="text/javascript" src="<c:url value='/plugins/DataTables/datatables.js' />"></script>
<script type="text/javascript" src="<c:url value='/plugins/crypto-js/crypto-js-4.0.0.js' />"></script>
<script type="text/javascript" src="<c:url value='/plugins/inputmask-4.x/jquery.inputmask.bundle.js' />"></script>
<%-- inputmask 변경 테스트 필요 --%>
<%--<script src="https://cdnjs.cloudflare.com/ajax/libs/inputmask/5.0.7/jquery.inputmask.min.js"></script>--%>
<%--<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.inputmask/3.3.11/jquery.inputmask.bundle.min.js"></script>--%>
<%-- tui grid --%>
<link rel="stylesheet" type="text/css" href="<c:url value='/plugins/tuiGrid/tui-date-picker.css' />">

@ -53,6 +53,9 @@
<script type="text/javascript" src="<c:url value='/plugins/DataTables/datatables.js' />"></script>
<script type="text/javascript" src="<c:url value='/plugins/crypto-js/crypto-js-4.0.0.js' />"></script>
<script type="text/javascript" src="<c:url value='/plugins/inputmask-4.x/jquery.inputmask.bundle.js' />"></script>
<%-- inputmask 변경 테스트 필요 --%>
<%--<script src="https://cdnjs.cloudflare.com/ajax/libs/inputmask/5.0.7/jquery.inputmask.min.js"></script>--%>
<%--<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.inputmask/3.3.11/jquery.inputmask.bundle.min.js"></script>--%>
<%-- tui grid --%>
<link rel="stylesheet" type="text/css" href="<c:url value='/plugins/tuiGrid/tui-date-picker.css' />">

@ -84,6 +84,7 @@ $(document).ready(function () {
});
});
// 중요로직: Strct_Idx_Cd 전용 마스크 - 숫자 3자리
$("body").on("focus", ".strctIdxCdMask", function () {
$(this).inputmask({

Loading…
Cancel
Save