Compare commits

..

No commits in common. 'dev' and 'krc/receipt_waiting' have entirely different histories.

@ -93,7 +93,6 @@ dependencies {
// ===== =====
// - MVC, REST,
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-webflux'
// - JPA
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
// - Bean Validation API

@ -1,38 +0,0 @@
package egovframework.config.WebClient;
import io.netty.channel.ChannelOption;
import io.netty.handler.timeout.ReadTimeoutHandler;
import io.netty.handler.timeout.WriteTimeoutHandler;
import org.springframework.context.annotation.Bean;
import org.springframework.http.client.reactive.ReactorClientHttpConnector;
import org.springframework.stereotype.Component;
import org.springframework.web.reactive.function.client.ExchangeStrategies;
import org.springframework.web.reactive.function.client.WebClient;
import reactor.netty.http.client.HttpClient;
import java.time.Duration;
import java.util.concurrent.TimeUnit;
@Component
public class WebClientConf {
@Bean
public WebClient webClient() {
HttpClient httpClient = HttpClient.create()
.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 5000)
.responseTimeout(Duration.ofSeconds(10))
.doOnConnected(conn -> conn
.addHandlerLast(new ReadTimeoutHandler(10, TimeUnit.SECONDS))
.addHandlerLast(new WriteTimeoutHandler(10, TimeUnit.SECONDS)));
return WebClient.builder()
.clientConnector(new ReactorClientHttpConnector(httpClient))
.exchangeStrategies(
ExchangeStrategies.builder()
.codecs(c -> c.defaultCodecs().maxInMemorySize(4 * 1024 * 1024))
.build()
)
.build();
}
}

@ -1,7 +0,0 @@
package egovframework.exception;
public class DtoConvertException extends RuntimeException {
public DtoConvertException(String message, Throwable cause) {
super(message, cause);
}
}

@ -1,53 +0,0 @@
package egovframework.util;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.ObjectReader;
import egovframework.exception.DtoConvertException;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
import java.io.IOException;
import java.util.Map;
@Component
@RequiredArgsConstructor
public class DtoConverter {
private final ObjectMapper objectMapper;
/**
* Map<String, Object> DTO
* unknown
*/
public <T> T toDto(Map<String, Object> body, Class<T> clazz) {
return toDto(body, clazz, false);
}
/**
* strict
* */
public <T> T toStrictDto(Map<String, Object> body, Class<T> clazz) {
return toDto(body, clazz, true);
}
/**
* Map<String, Object> DTO
* @param strict true > unknown
*/
public <T> T toDto(Map<String, Object> body, Class<T> clazz, boolean strict) {
try {
ObjectReader reader = objectMapper.readerFor(clazz);
if (strict) {
reader = reader.with(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
}
return reader.readValue(objectMapper.writeValueAsBytes(body));
} catch (IOException e) {
throw new DtoConvertException("DTO 변환 실패: " + clazz.getSimpleName(), e);
}
}
}

@ -1,16 +1,14 @@
package go.kr.project.biz.common.controller;
import go.kr.project.biz.common.dto.CommonDto;
import go.kr.project.biz.common.dto.WebClientCallDto;
import go.kr.project.biz.common.service.CommonService;
import go.kr.project.biz.minwon.init.dto.MinwonInitDto;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import java.util.List;
import java.util.Map;
@Controller
@RequiredArgsConstructor
@ -22,7 +20,7 @@ public class CommonContorller {
* , ,
*/
@GetMapping("/common/code/find.ajax")
public ResponseEntity<?> getCode(@ModelAttribute CommonDto.Request.Code commonDto) {
public ResponseEntity<?> getCode(@ModelAttribute CommonDto.Request commonDto) {
CommonDto.Response.CodeResult result = commonService.findCode(commonDto);
@ -35,47 +33,21 @@ public class CommonContorller {
*
*/
@GetMapping("/common/car/info/find.ajax")
public ResponseEntity<?> findCarInfo(@RequestParam String mmCarno, @RequestParam String mmDate) {
public ResponseEntity<?> findCarInfo() {
return ResponseEntity.ok(commonService.findCarInfo(mmCarno, mmDate));
return ResponseEntity.ok("aaa");
}
/**
*
*/
// @PutMapping("/common/car/info/{mmCode}/update.ajax")
// public ResponseEntity<?> updateCarInfo(@PathVariable String mmCode, @RequestBody WebClientCallDto.CarInfoResponse.CarInfoIfBody carInfoIfBody) {
//
// commonService.updateCarInfoFromCpMain(mmCode, carInfoIfBody);
//
// return ResponseEntity.ok("Success");
// }
/**
*
*/
@GetMapping("/cover/info/find.ajax")
public ResponseEntity<?> findCoverInfo(@RequestParam String carNo) throws Exception {
public ResponseEntity<?> findCoverInfo() {
return ResponseEntity.ok(commonService.findCoverInfo(carNo));
return ResponseEntity.ok("aaa");
}
/**
*
* */
@PutMapping("/common/update/{mmCode}/{state}/state.ajax")
public ResponseEntity<?> test(@PathVariable String mmCode,
@PathVariable String state,
@RequestBody Map<String, Object> req)
{
commonService.updateState(mmCode, state, req);
return ResponseEntity.ok("수정되었습니다");
}
}

@ -2,7 +2,6 @@ package go.kr.project.biz.common.dto;
import go.kr.project.vo.CpBdongVO;
import go.kr.project.vo.CpCancelAnswerVO;
import go.kr.project.vo.CpInstructAnswerVO;
import go.kr.project.vo.CpViolationVO;
import lombok.Builder;
import lombok.Getter;
@ -12,19 +11,13 @@ import java.util.List;
public class CommonDto {
@Getter
@Setter
public static class Request {
@Getter
@Setter
public static class Code {
private String sggCode;
private String jobGroup;
private String code;
}
private String sggCode;
private String jobGroup;
private String code;
}
@ -44,7 +37,6 @@ public class CommonDto {
private List<CpViolationVO> cpViolation;
private List<CpBdongVO> cpBdong;
private List<CpCancelAnswerVO> cpCancelAnswer;
private List<CpInstructAnswerVO> cpInstructAnswer;
}

@ -1,382 +0,0 @@
package go.kr.project.biz.common.dto;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.*;
import java.util.List;
public class WebClientCallDto {
public static class CarInfoRequest {
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Builder
public static class BodyWrapper {
@JsonProperty("data")
private List<Body> data;
}
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Builder
public static class Body {
// ===== 헤더 영역 =====
@JsonProperty("INFO_SYS_ID")
private String infoSysId;
@JsonProperty("INFO_SYS_IP")
private String infoSysIp;
@JsonProperty("SIGUNGU_CODE")
private String sigunguCode;
@JsonProperty("CNTC_INFO_CODE")
private String cntcInfoCode;
@JsonProperty("CHARGER_ID")
private String chargerId;
@JsonProperty("CHARGER_IP")
private String chargerIp;
@JsonProperty("CHARGER_NM")
private String chargerNm;
// record 배열
@JsonProperty("record")
private List<IfBody> record;
}
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Builder
public static class IfBody {
@JsonProperty("VHRNO")
private String vhrno; // 자동차등록번호
@JsonProperty("VIN")
private String vin; // 차대번호
@JsonProperty("LEVY_STDDE")
private String levyStdde; // 부과기준일
@JsonProperty("INQIRE_SE_CODE")
private String inqireSeCode; // 조회구분코드
}
}
public static class CoverRequest {
}
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@Builder
public static class CarInfoResponse {
@JsonProperty("LINK_RSLT_CD")
private String linkRsltCd;
@JsonProperty("LINK_RSLT_DTL")
private String linkRsltDtl;
private List<CarInfoIfBody> record;
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@Builder
public static class CarInfoIfBody {
@JsonProperty("VHRNO")
private String vhrno; // 차량번호
// ===== 상단 (연식 / 등록정보 / 사용본거지) =====
@JsonProperty("PRYE")
private String prye; // 연식
@JsonProperty("REGIST_DE")
private String registDe; // 등록일(변경일)
@JsonProperty("ERSR_REGIST_SE_CODE")
private String ersrRegistSeCode; // 말소등록구분코드
@JsonProperty("ERSR_REGIST_SE_NM")
private String ersrRegistSeNm; // 말소등록구분명
@JsonProperty("ERSR_REGIST_DE")
private String ersrRegistDe; // 말소등록일
@JsonProperty("REGIST_DETAIL_CODE")
private String registDetailCode; // 등록상세코드
@JsonProperty("DSPLVL")
private String dsplvl; // 배기량
@JsonProperty("USE_STRNGHLD_LEGALDONG_CODE")
private String useStrnghldLegaldongCode; // 사용본거지법정동코드
@JsonProperty("USE_STRNGHLD_ADSTRD_CODE")
private String useStrnghldAdstrdCode; // 사용본거지행정동코드
@JsonProperty("USE_STRNGHLD_MNTN")
private String useStrnghldMntn; // 사용본거지산
@JsonProperty("USE_STRNGHLD_LNBR")
private String useStrnghldLnbr; // 사용본거지번지
@JsonProperty("USE_STRNGHLD_HO")
private String useStrnghldHo; // 사용본거지호
@JsonProperty("USE_STRNGHLD_ADRES_NM")
private String useStrnghldAdresNm; // 사용본거지상세주소
@JsonProperty("USE_STRNGHLD_ROAD_NM_CODE")
private String useStrnghldRoadNmCode; // 사용본거지도로명코드
@JsonProperty("USGSRHLD_UNDGRND_BULD_SE_CODE")
private String usgsrhldUndgrndBuldSeCode; // 사용본거지지하건물구분코드
@JsonProperty("USE_STRNGHLD_BULD_MAIN_NO")
private String useStrnghldBuldMainNo; // 사용본거지건물주요번호
@JsonProperty("USE_STRNGHLD_BULD_SUB_NO")
private String useStrnghldBuldSubNo; // 사용본거지건물부번호
@JsonProperty("USGSRHLD_ADRES_FULL")
private String usgsrhldAdresFull; // 사용본거지전체주소
// ===== 대표소유자/소유자 정보 =====
@JsonProperty("MBER_SE_CODE")
private String mberSeCode; // 대표소유자회원구분코드
@JsonProperty("MBER_NM")
private String mberNm; // 대표소유자성명
@JsonProperty("MBER_SE_NO")
private String mberSeNo; // 대표소유자회원번호
@JsonProperty("TELNO")
private String telno; // 대표소유자전화번호
@JsonProperty("OWNER_LEGALDONG_CODE")
private String ownerLegaldongCode; // 소유자법정동코드
@JsonProperty("OWNER_ADSTRD_CODE")
private String ownerAdstrdCode; // 소유자행정동코드
@JsonProperty("OWNER_MNTN")
private String ownerMntn; // 소유자산
@JsonProperty("OWNER_LNBR")
private String ownerLnbr; // 소유자번지
@JsonProperty("OWNER_HO")
private String ownerHo; // 소유자호
@JsonProperty("OWNER_ADRES_NM")
private String ownerAdresNm; // 소유자상세주소
@JsonProperty("OWNER_ROAD_NM_CODE")
private String ownerRoadNmCode; // 소유자도로명코드
@JsonProperty("OWNER_UNDGRND_BULD_SE_CODE")
private String ownerUndgrndBuldSeCode; // 소유자지하건물구분코드
@JsonProperty("OWNER_BULD_MAIN_NO")
private String ownerBuldMainNo; // 소유자건물주요번호
@JsonProperty("OWNER_BULD_SUB_NO")
private String ownerBuldSubNo; // 소유자건물부번호
@JsonProperty("OWNER_ADRES_FULL")
private String ownerAdresFull; // 소유자전체주소
// ===== 차량번호/차량 기본 =====
@JsonProperty("AFTR_VHRNO")
private String aftrVhrno; // 신차량번호
@JsonProperty("FRNT_VHRNO")
private String frntVhrno; // 이전차량번호
@JsonProperty("VIN")
private String vin; // 차대번호
@JsonProperty("CNM")
private String cnm; // 차명
@JsonProperty("VHCTLE_TOT_WT")
private String vhctleTotWt; // 차량총중량
@JsonProperty("CAAG_ENDDE")
private String caagEndde; // 차량만료일자
@JsonProperty("CHANGE_DE")
private String changeDe; // 차변변경시기
@JsonProperty("USE_FUEL_CODE")
private String useFuelCode; // 사용연료코드
@JsonProperty("PRPOS_SE_CODE")
private String prposSeCode; // 용도구분코드
@JsonProperty("MTRS_FOM_NM")
private String mtrsFomNm; // 원동기형식명
// ===== 차종/제원 =====
@JsonProperty("VHCTY_ASORT_CODE")
private String vhctyAsortCode; // 차종종별코드
@JsonProperty("VHCTY_TY_CODE")
private String vhctyTyCode; // 차종유형코드
@JsonProperty("VHCTY_SE_CODE")
private String vhctySeCode; // 차종분류코드
@JsonProperty("MXMM_LDG")
private String mxmmLdg; // 최대적재량
@JsonProperty("VHCTY_ASORT_NM")
private String vhctyAsortNm; // 차종종별명
@JsonProperty("VHCTY_TY_NM")
private String vhctyTyNm; // 차종유형명
@JsonProperty("VHCTY_SE_NM")
private String vhctySeNm; // 차종분류명
@JsonProperty("FRST_REGIST_DE")
private String frstRegistDe; // 최초등록일
@JsonProperty("FOM_NM")
private String fomNm; // 형식
@JsonProperty("ACQS_DE")
private String acqsDe; // 취득일자
@JsonProperty("ACQS_END_DE")
private String acqsEndDe; // 취득종료일자
@JsonProperty("YBL_MD")
private String yblMd; // 제작년월일
@JsonProperty("TRANSR_REGIST_DE")
private String transrRegistDe; // 이전등록일(양수일)
// ===== 상태 / 검사 / 금액 =====
@JsonProperty("SPCF_REGIST_STTUS_CODE")
private String spcfRegistSttusCode; // 제원등록상태코드
@JsonProperty("COLOR_NM")
private String colorNm; // 색상명
@JsonProperty("MRTG_CO")
private String mrtgCo; // 저당수
@JsonProperty("SEIZR_CO")
private String seizrCo; // 압류건수
@JsonProperty("STMD_CO")
private String stmdCo; // 구조변경수
@JsonProperty("NMPL_CSDY_AT")
private String nmplCsdyAt; // 번호판영치여부
@JsonProperty("NMPL_CSDY_REMNR_DE")
private String nmplCsdyRemnrDe; // 번호판영치최고일
@JsonProperty("ORIGIN_SE_CODE")
private String originSeCode; // 출처구분코드
@JsonProperty("NMPL_STNDRD_CODE")
private String nmplStndrdCode; // 번호판규격코드
@JsonProperty("ACQS_AMOUNT")
private String acqsAmount; // 취득금액(최종/최초)
@JsonProperty("INSPT_VALID_PD_BGNDE")
private String insptValidPdBgnde; // 검사유효기간시작일
@JsonProperty("INSPT_VALID_PD_ENDDE")
private String insptValidPdEndde; // 검사유효기간종료일
@JsonProperty("USE_STRNGHLD_GRC_CODE")
private String useStrnghldGrcCode; // 사용본거지관청코드
@JsonProperty("TKCAR_PSCAP_CO")
private String tkcarPscapCo; // 승차정원수
@JsonProperty("SPMNNO")
private String spmnno; // 제원관리번호
@JsonProperty("TRVL_DSTNC")
private String trvlDstnc; // 주행거리
@JsonProperty("FRST_REGIST_RQRCNO")
private String frstRegistRqrcno; // 최초등록접수번호
@JsonProperty("VLNT_ERSR_PRVNTC_NTICE_DE")
private String vlntErsrPrvntcNticeDe; // 예고통지일
@JsonProperty("REGIST_INSTT_NM")
private String registInsttNm; // 등록기관명
@JsonProperty("PROCESS_IMPRTY_RESN_CODE")
private String processImprtyResnCode; // 처리불가사유코드
@JsonProperty("PROCESS_IMPRTY_RESN_DTLS")
private String processImprtyResnDtls; // 처리불가사유명세
@JsonProperty("CBD_LT")
private String cbdLt; // 차체길이
@JsonProperty("CBD_BT")
private String cbdBt; // 차체너비
@JsonProperty("CBD_HG")
private String cbdHg; // 차체높이
@JsonProperty("FRST_MXMM_LDG")
private String frstMxmmLdg; // 최초최대적재량
@JsonProperty("FUEL_CNSMP_RT")
private String fuelCnsmpRt; // 연료소비율
@JsonProperty("ELCTY_CMPND_FUEL_CNSMP_RT")
private String elctyCmpndFuelCnsmpRt; // 전기복합연료소비율
}
// @Getter
// @Setter
// @AllArgsConstructor
// @NoArgsConstructor
// @Builder
// public static class CoverInfoResponse {
//
// }
}
}

@ -1,195 +0,0 @@
package go.kr.project.biz.common.repository;
import com.querydsl.core.types.Projections;
import com.querydsl.jpa.impl.JPAQueryFactory;
import go.kr.project.biz.common.dto.CommonDto;
import go.kr.project.biz.common.dto.WebClientCallDto;
import go.kr.project.domain.entity.CpOwner;
import go.kr.project.vo.CpBdongVO;
import go.kr.project.vo.CpCancelAnswerVO;
import go.kr.project.vo.CpInstructAnswerVO;
import go.kr.project.vo.CpViolationVO;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;
import javax.persistence.LockModeType;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;
import static go.kr.project.domain.entity.QCpBdong.cpBdong;
import static go.kr.project.domain.entity.QCpCancelAnswer.cpCancelAnswer;
import static go.kr.project.domain.entity.QCpInstructAnswer.cpInstructAnswer;
import static go.kr.project.domain.entity.QCpMain.cpMain;
import static go.kr.project.domain.entity.QCpOwner.cpOwner;
import static go.kr.project.domain.entity.QCpSetinfo.cpSetinfo;
import static go.kr.project.domain.entity.QCpViolation.cpViolation;
@Repository
@RequiredArgsConstructor
public class CommonQueryDslRepository {
private final JPAQueryFactory queryFactory;
public List<CpViolationVO> findViolationCode(CommonDto.Request.Code commonDto) {
commonDto.setSggCode("41590");
commonDto.setJobGroup("1");
List<CpViolationVO> result = queryFactory
.select(
Projections.fields(
CpViolationVO.class,
cpViolation.id.vlCode,
cpViolation.id.vlJobgroup,
cpViolation.id.vlSggcode,
cpViolation.vlId,
cpViolation.vlAnswer,
cpViolation.vlEnable,
cpViolation.vlKeum,
cpViolation.vlLaw1,
cpViolation.vlLaw2,
cpViolation.vlLaw3,
cpViolation.vlSemok1,
cpViolation.vlSemok2,
cpViolation.vlSemok3
)
)
.from(cpViolation)
.where(
cpViolation.id.vlJobgroup.eq(commonDto.getJobGroup()),
cpViolation.id.vlSggcode.eq(commonDto.getSggCode())
)
.fetch();
return result;
}
public List<CpBdongVO> findBdongCode() {
List<CpBdongVO> result = queryFactory
.select(
Projections.fields(
CpBdongVO.class,
cpBdong.bdCode,
cpBdong.bdDongName,
cpBdong.bdSggName
)
)
.from(cpBdong)
.where(cpBdong.bdEnable.eq("1"))
.fetch();
return result;
}
public List<CpCancelAnswerVO> findCancelAnswerCode(CommonDto.Request.Code commonDto) {
commonDto.setSggCode("41590");
List<CpCancelAnswerVO> result = queryFactory
.select(
Projections.fields(
CpCancelAnswerVO.class,
cpCancelAnswer.id.caSggCode,
cpCancelAnswer.id.caCode,
cpCancelAnswer.caId,
cpCancelAnswer.caAnswerText,
cpCancelAnswer.caIsAnswer
)
)
.from(cpCancelAnswer)
.where(cpCancelAnswer.id.caSggCode.eq(commonDto.getSggCode()))
.fetch();
return result;
}
public List<CpInstructAnswerVO> findInstructAnswer(CommonDto.Request.Code commonDto) {
commonDto.setSggCode("41590");
List<CpInstructAnswerVO> result = queryFactory
.select(
Projections.fields(
CpInstructAnswerVO.class,
cpInstructAnswer.id.iaSggcode,
cpInstructAnswer.id.iaCode,
cpInstructAnswer.iaId
)
)
.from(cpInstructAnswer)
.where(cpInstructAnswer.id.iaSggcode.eq(commonDto.getSggCode()))
.fetch();
return result;
}
/** CpMain 차적조회 결과 업데이트 */
public void updateCarinfoFromCpMain(String mmCode, CpOwner cpOwner, WebClientCallDto.CarInfoResponse.CarInfoIfBody carInfoIfBody) {
long resultCnt = queryFactory.update(cpMain)
.set(cpMain.mmCarno, carInfoIfBody.getVhrno())
.set(cpMain.mmVhmno, carInfoIfBody.getVin())
.set(cpMain.mmCargb, carInfoIfBody.getVhctySeCode())
.set(cpMain.mmCarkind, carInfoIfBody.getVhctyAsortCode())
.set(cpMain.mmOmcode, cpOwner.getOmCode())
.set(cpMain.mmState, "21")
.set(cpMain.mmStateDt, LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")))
// .set(cpMain.mmViorcnt, "위반횟수")
.set(cpMain.mmCarname, carInfoIfBody.getCnm())
.set(cpMain.mmCarcheck, "1")
.where(
cpMain.mmCode.eq(mmCode)
)
.execute();
if (resultCnt == 0) {
throw new IllegalStateException("cp_main 업데이트 대상이 없습니다. mmCode=" + mmCode);
}
}
public Boolean isGateWay() {
String result = queryFactory
.select(
cpSetinfo.strValue1
)
.from(cpSetinfo)
.where(
cpSetinfo.id.codeName.eq("GATEWAY"),
cpSetinfo.id.groupCode.eq("YN"),
cpSetinfo.id.detailCode.eq("LOCAL")
)
.fetchOne();
return "Y".equals(result);
}
public String pairProjectIp() {
return queryFactory
.select(
cpSetinfo.strValue1
)
.from(cpSetinfo)
.where(
cpSetinfo.id.codeName.eq("GATEWAY"),
cpSetinfo.id.groupCode.eq("PAIR"),
cpSetinfo.id.detailCode.eq("LOCAL")
)
.fetchOne();
}
public String findMaxOmCode() {
return queryFactory
.select(cpOwner.omCode.max())
.from(cpOwner)
.setLockMode(LockModeType.PESSIMISTIC_WRITE)
.fetchOne();
}
}

@ -0,0 +1,103 @@
package go.kr.project.biz.common.repository;
import com.querydsl.core.types.Projections;
import com.querydsl.jpa.impl.JPAQueryFactory;
import go.kr.project.biz.common.dto.CommonDto;
import go.kr.project.domain.entity.CpBdong;
import go.kr.project.domain.entity.CpViolation;
import go.kr.project.vo.CpBdongVO;
import go.kr.project.vo.CpCancelAnswerVO;
import go.kr.project.vo.CpViolationVO;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;
import java.util.List;
import static go.kr.project.domain.entity.QCpBdong.cpBdong;
import static go.kr.project.domain.entity.QCpCancelAnswer.cpCancelAnswer;
import static go.kr.project.domain.entity.QCpViolation.cpViolation;
@Repository
@RequiredArgsConstructor
public class CommonRepository {
private final JPAQueryFactory queryFactory;
public List<CpViolationVO> findViolationCode(CommonDto.Request commonDto) {
commonDto.setSggCode("41590");
commonDto.setJobGroup("1");
List<CpViolationVO> result = queryFactory
.select(
Projections.fields(
CpViolationVO.class,
cpViolation.id.vlCode,
cpViolation.id.vlJobgroup,
cpViolation.id.vlSggcode,
cpViolation.vlId,
cpViolation.vlAnswer,
cpViolation.vlEnable,
cpViolation.vlKeum,
cpViolation.vlLaw1,
cpViolation.vlLaw2,
cpViolation.vlLaw3,
cpViolation.vlSemok1,
cpViolation.vlSemok2,
cpViolation.vlSemok3
)
)
.from(cpViolation)
.where(
cpViolation.id.vlJobgroup.eq(commonDto.getJobGroup()),
cpViolation.id.vlSggcode.eq(commonDto.getSggCode())
)
.fetch();
return result;
}
public List<CpBdongVO> findBdongCode() {
List<CpBdongVO> result = queryFactory
.select(
Projections.fields(
CpBdongVO.class,
cpBdong.bdCode,
cpBdong.bdDongName,
cpBdong.bdSggName
)
)
.from(cpBdong)
.where(cpBdong.bdEnable.eq("1"))
.fetch();
return result;
}
public List<CpCancelAnswerVO> findCancelAnswerCode(CommonDto.Request commonDto) {
commonDto.setSggCode("41590");
List<CpCancelAnswerVO> result = queryFactory
.select(
Projections.fields(
CpCancelAnswerVO.class,
cpCancelAnswer.id.caSggCode,
cpCancelAnswer.id.caCode,
cpCancelAnswer.caId,
cpCancelAnswer.caAnswerText,
cpCancelAnswer.caIsAnswer
)
)
.from(cpCancelAnswer)
.where(cpCancelAnswer.id.caSggCode.eq(commonDto.getSggCode()))
.fetch();
return result;
}
}

@ -1,21 +1,11 @@
package go.kr.project.biz.common.service;
import go.kr.project.biz.common.dto.CommonDto;
import go.kr.project.biz.common.dto.WebClientCallDto;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
public interface CommonService {
CommonDto.Response.CodeResult findCode(CommonDto.Request.Code commonDto);
WebClientCallDto.CarInfoResponse findCarInfo(String carNo, String mmDate);
// void updateCarInfoFromCpMain(String mmCode, WebClientCallDto.CarInfoResponse.CarInfoIfBody carInfoIfBody);
Boolean findCoverInfo(String carNo) throws Exception;
void updateState(String reqMmCode, String reqState, Map<String, Object> req);
CommonDto.Response.CodeResult findCode(CommonDto.Request commonDto);
}

@ -1,120 +1,33 @@
package go.kr.project.biz.common.service.impl;
import com.fasterxml.jackson.databind.ObjectMapper;
import egovframework.util.DtoConverter;
import go.kr.project.biz.common.dto.CommonDto;
import go.kr.project.biz.common.dto.WebClientCallDto;
import go.kr.project.biz.common.repository.CommonQueryDslRepository;
import go.kr.project.biz.common.repository.CommonRepository;
import go.kr.project.biz.common.service.CommonService;
import go.kr.project.domain.entity.CpMainhist;
import go.kr.project.domain.entity.CpOwner;
import go.kr.project.domain.entity.CpSetinfo;
import go.kr.project.domain.entity.CpSetinfoId;
import go.kr.project.domain.repo.cp.CpMainhistRepository;
import go.kr.project.domain.repo.cp.CpOwnerRepository;
import go.kr.project.domain.repo.cp.CpSetinfoRepository;
import go.kr.project.vo.code.MmStateEnum;
import go.kr.project.vo.mapper.EntityVoMapper;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import javax.transaction.Transactional;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Map;
import java.util.Optional;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
@Service
@RequiredArgsConstructor
public class CommonServiceImpl implements CommonService {
private final EntityVoMapper mapper;
private final DtoConverter dtoConverter;
private final WebClientCallService webClientCallService;
private final UpdateStateService updateStateService;
private final CommonQueryDslRepository commonQueryDslRepository;
private final CpSetinfoRepository cpSetinfoRepository;
private final CommonRepository commonRepository;
@Override
public CommonDto.Response.CodeResult findCode(CommonDto.Request.Code commonDto) {
// todo: 추후 코드값이 추가되서 너무 무거워지면 분리 예정.
public CommonDto.Response.CodeResult findCode(CommonDto.Request commonDto) {
return CommonDto.Response.CodeResult.builder()
.cpViolation(commonQueryDslRepository.findViolationCode(commonDto))
.cpBdong(commonQueryDslRepository.findBdongCode())
.cpCancelAnswer(commonQueryDslRepository.findCancelAnswerCode(commonDto))
.cpInstructAnswer(commonQueryDslRepository.findInstructAnswer(commonDto))
.cpViolation(commonRepository.findViolationCode(commonDto))
.cpBdong(commonRepository.findBdongCode())
.cpCancelAnswer(commonRepository.findCancelAnswerCode(commonDto))
.build();
}
@Override
public WebClientCallDto.CarInfoResponse findCarInfo(String mmCarno, String mmDate) {
//게이트웨이 여부 조회
boolean isGateWay = commonQueryDslRepository.isGateWay();
//게이트웨이가 아니라면 해당 변수에 null이 들어간다.
String pairProjectIp = commonQueryDslRepository.pairProjectIp();
return webClientCallService.carInfoCall(mmCarno, mmDate, pairProjectIp);
}
/** 표지조회 */
@Override
public Boolean findCoverInfo(String carNo) throws Exception {
CpSetinfo cpSetinfo = cpSetinfoRepository.findById(
new CpSetinfoId("COVER_INFO_IP", "0", "0"))
.orElseThrow(() -> new Exception("표지조회 연계작업이 되어있지 않은 서버입니다."));
return webClientCallService.CoverInfoCall(cpSetinfo, carNo);
}
/** 상태 업데이트 */
@Override
public void updateState(String mmCode, String state, Map<String, Object> req) {
//Enum으로 변환
MmStateEnum stateEnum = MmStateEnum.fromCode(state);
switch(stateEnum) {
case VEHICLE_CHECKED:
updateStateService.updateCarInfoFromCpMain(mmCode, dtoConverter.toStrictDto(req, WebClientCallDto.CarInfoResponse.CarInfoIfBody.class));
break;
case DESTRUCTION_DOC:
break;
case GUIDANCE:
break;
case GUIDANCE_PROCESSED:
break;
case PRE_NOTICE:
break;
case IMPOSITION_CANCEL:
break;
case DEMAND:
break;
case DESTRUCTION_DOC_DELETE:
break;
case STATEMENT_DELETE:
break;
case DELETED:
break;
}
}

@ -1,95 +0,0 @@
package go.kr.project.biz.common.service.impl;
import go.kr.project.biz.common.dto.WebClientCallDto;
import go.kr.project.biz.common.repository.CommonQueryDslRepository;
import go.kr.project.domain.entity.CpMainhist;
import go.kr.project.domain.entity.CpOwner;
import go.kr.project.domain.repo.cp.CpMainhistRepository;
import go.kr.project.domain.repo.cp.CpOwnerRepository;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import javax.transaction.Transactional;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Optional;
@Service
@RequiredArgsConstructor
@Slf4j
public class UpdateStateService {
private final CommonQueryDslRepository commonQueryDslRepository;
private final CpOwnerRepository cpOwnerRepository;
private final CpMainhistRepository cpMainhistRepository;
@Transactional
public void updateCarInfoFromCpMain(String mmCode, WebClientCallDto.CarInfoResponse.CarInfoIfBody carInfoIfBody) {
long maxOmCode = Long.parseLong(commonQueryDslRepository.findMaxOmCode());
// owner 인서트
CpOwner cpOwner = CpOwner.builder()
.omCode(String.valueOf(maxOmCode + 1))
// .omSggcode()
.omName(carInfoIfBody.getMberNm())
.omNo1(carInfoIfBody.getMberSeNo().substring(0,6))
.omJno(carInfoIfBody.getMberSeNo())
.omNOGb(carInfoIfBody.getMberSeCode())
.omJuso(carInfoIfBody.getUsgsrhldAdresFull())
.omBunji(carInfoIfBody.getOwnerLnbr())
.omZip(carInfoIfBody.getUseStrnghldBuldMainNo())
.omDoroCode(carInfoIfBody.getOwnerRoadNmCode())
.omBldPosition(carInfoIfBody.getUsgsrhldUndgrndBuldSeCode())
.omBldNo1(carInfoIfBody.getUseStrnghldBuldMainNo())
.omBldNo2(carInfoIfBody.getUseStrnghldBuldSubNo())
// .omBldAdmno()
.omIngb(carInfoIfBody.getErsrRegistSeCode())
.omIndt(carInfoIfBody.getTransrRegistDe())
.build();
cpOwnerRepository.save(cpOwner);
// main 업데이트
commonQueryDslRepository.updateCarinfoFromCpMain(mmCode, cpOwner, carInfoIfBody);
// main hist 인서트
StateChangeHistSaveToMainHist("21", mmCode);
}
public void StateChangeHistSaveToMainHist(String mmState, String mmCode) {
Optional<CpMainhist> prevOpt = cpMainhistRepository.findTopByMhMmcodeOrderByMhIndtDesc(mmCode);
CpMainhist prevCpMainHist = prevOpt.orElse(null);
String mhStateOld = null;
String mhStateOldDt = null;
if (prevCpMainHist != null) {
mhStateOld = prevCpMainHist.getMhStateNew();
mhStateOldDt = prevCpMainHist.getMhIndt();
}
CpMainhist cpMainhist = CpMainhist.builder()
.mhMmcode(mmCode)
.mhStateOld(mhStateOld)
.mhStateOldDt(mhStateOldDt)
.mhStateNew(mmState)
.mhIndt(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")))
/** todo : 세션에 있는 inuser 세팅*/
// .mhInuser()
.build();
cpMainhistRepository.save(cpMainhist);
}
}

@ -1,111 +0,0 @@
package go.kr.project.biz.common.service.impl;
import go.kr.project.biz.common.dto.WebClientCallDto;
import go.kr.project.domain.entity.CpSetinfo;
import lombok.RequiredArgsConstructor;
import org.springframework.core.env.Environment;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
import org.springframework.web.reactive.function.client.WebClient;
import reactor.core.publisher.Mono;
import java.util.Arrays;
@Component
@RequiredArgsConstructor
public class WebClientCallService {
private final Environment env;
private final WebClient webClient;
public WebClientCallDto.CarInfoResponse carInfoCall(String mmCarno, String mmDate, String pairProjectIp) {
WebClientCallDto.CarInfoRequest.BodyWrapper reqBody = WebClientCallDto.CarInfoRequest.BodyWrapper.builder()
.data(
Arrays.asList(
WebClientCallDto.CarInfoRequest.Body.builder()
.infoSysId("")
.infoSysIp("")
.sigunguCode("")
.cntcInfoCode("")
.chargerId("")
.chargerIp("")
.chargerNm("")
.record(
Arrays.asList(
WebClientCallDto.CarInfoRequest.IfBody.builder()
.vhrno(mmCarno)
.levyStdde(mmDate)
.build()
))
.build())
)
.build();
// pair or gateway set
String PROTOCOL = env.getProperty("car-info.protocol");
String DOMAIN = pairProjectIp != null ? env.getProperty("car-info.domain") : pairProjectIp;
String PORT = pairProjectIp != null ? env.getProperty("car-info.port") : "";
String DIR = pairProjectIp != null ? env.getProperty("car-info.path.basic") : "/common/car/info/find.ajax";
Mono<WebClientCallDto.CarInfoResponse> carInfoMono = webClient.post()
.uri(PROTOCOL + DOMAIN + PORT + DIR)
.contentType(MediaType.APPLICATION_JSON)
.accept(MediaType.APPLICATION_JSON)
.bodyValue(reqBody)
.retrieve()
.bodyToMono(WebClientCallDto.CarInfoResponse.class);
WebClientCallDto.CarInfoResponse res = carInfoMono.block();
return res;
}
public Boolean CoverInfoCall(CpSetinfo cpSetinfo, String carNo) {
String soapXml = String.format(
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
"<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\"\n" +
" xmlns:typ=\"http://ccais.mopas.go.kr/dh/rid/services/swsdn/DisabledParkingYn/types\">\n" +
" <soap:Header>\n" +
" <typ:commonHeader>\n" +
" <serviceName>DisabledParkingYnService</serviceName>\n" +
" <useSystemCode>ESBTEST</useSystemCode>\n" +
" <certServerId>SVR1311000030</certServerId>\n" +
" <transactionUniqueId>2010111020382700773722611</transactionUniqueId>\n" +
" <userDeptCode>1234567</userDeptCode>\n" +
" <userName>김공무</userName>\n" +
" </typ:commonHeader>\n" +
" </soap:Header>\n" +
" <soap:Body>\n" +
" <typ:getDisabledParkingYn>\n" +
" <ReqOrgCd>%s</ReqOrgCd>\n" +
" <ReqBizCd>%s</ReqBizCd>\n" +
" <CARS_NO>%s</CARS_NO>\n" +
" </typ:getDisabledParkingYn>\n" +
" </soap:Body>\n" +
"</soap:Envelope>",
cpSetinfo.getStrValue7(), cpSetinfo.getStrValue8(), carNo
);
String PROTOCOL = env.getProperty("cover-info.protocol");
String DOMAIN = env.getProperty("cover-info.domain");
String PORT = env.getProperty("cover-info.port");
String DIR = env.getProperty("cover-info.path");
String response = webClient.post()
.uri(PROTOCOL + DOMAIN + PORT + DIR)
.header(HttpHeaders.CONTENT_TYPE, "text/xml; charset=UTF-8")
.bodyValue(soapXml)
.retrieve()
.bodyToMono(String.class)
.block();
return true;
}
}

@ -45,6 +45,11 @@ public class MinwonInitController {
return "biz/minwon/init/init_popup" + TilesConstants.POPUP;
}
@PostMapping("/car-info")
public String carInfo(){
return null;
}
@PostMapping("/minwon/init/list.ajax")
@ -63,6 +68,10 @@ public class MinwonInitController {
return ApiResponseUtil.successWithGrid(result, dto);
}
@PostMapping("/postman/test")
public ResponseEntity<?> test(@RequestBody MinwonInitDto.Request.Test test) {
return ResponseEntity.ok(minwonInitService.insertSometing(test));
}
}

@ -48,10 +48,9 @@ public class MinwonInitDto {
private String mmDate; //위반일자
private String mmImagegb; //첨부
private int mmImagecnt; //사진
private String mmLawgb; //위반항목
private String mmSgcont; //위반내용
private String asJsno; //접수번호
private String mmCarno; //차량번호
private String vlId; //차량번호
private String mmCode;
}

@ -10,7 +10,6 @@ import java.util.List;
import static go.kr.project.domain.entity.QCpAnswer.cpAnswer;
import static go.kr.project.domain.entity.QCpMain.cpMain;
import static go.kr.project.domain.entity.QCpViolation.cpViolation;
@Repository
@RequiredArgsConstructor
@ -28,25 +27,20 @@ public class MinwonInitQueryDslRepository {
cpAnswer.asBbsNo,
cpAnswer.asUser,
cpMain.mmSgtel,
cpMain.mmSgnm,
cpAnswer.asTel,
cpAnswer.asJsdate,
cpAnswer.asLimitDt,
cpMain.mmDate,
cpMain.mmImagegb,
cpMain.mmImagecnt,
cpMain.mmLawgb,
cpMain.mmSgcont,
cpAnswer.asJsno,
cpMain.mmCarno,
cpViolation.vlId,
cpMain.mmCode
)
)
.from(cpMain)
.innerJoin(cpAnswer).on(cpMain.mmCode.eq(cpAnswer.asMmcode))
.innerJoin(cpViolation).on(
cpMain.mmLawgb.eq(cpViolation.id.vlCode),
cpMain.mmSggcode.eq(cpViolation.id.vlSggcode))
.where(
cpMain.mmState.eq("01"),
cpMain.mmDlgb.eq("2")

@ -28,6 +28,7 @@ public class MinwonInitServiceImpl implements MinwonInitService {
// Enum Desc 변환
result.forEach(item -> {
item.setMmDlgb(MmDlgbEnum.getDescByCode(item.getMmDlgb()));
//item. (MmDlgbEnum.getDescByCode(item.getMmDlgb()));
});

@ -45,7 +45,7 @@ public class PreNoticeSendTargetController {
dto.setPagingYn("N");
// 리스트 조회
List<PreNoticeSendTargetDto.Response.PreNoticeSendTargetFlat> result = preNoticeSendTargetService.findPreNoticeSendTarget(dto);
List<PreNoticeSendTargetDto.Response.PreNoticeSendTarget> result = preNoticeSendTargetService.findPreNoticeSendTarget(dto);
return ApiResponseUtil.successWithGrid(result, dto);
}

@ -33,7 +33,6 @@ public class PreNoticeSendTargetDto {
private CpMain cpMain;
private CpAnswer cpAnswer;
private CpOwner cpOwner;
private String vlId;
}
@Getter
@ -43,27 +42,7 @@ public class PreNoticeSendTargetDto {
private CpMainVO cpMain;
private CpAnswerVO cpAnswer;
private CpOwnerVO cpOwner;
private String vlId;
}
@Getter
@Setter
@Builder
public static class PreNoticeSendTargetFlat {
private String mmDlgb;
private String asBbsNo;
private String asJsdate;
private String mmSgnm;
private String mmSgtel;
private String vlId;
private String mmDate;
private String mmCarno;
private String omName;
private String omNogb;
private String omJno;
private String mmSgpos;
private String mmCode;
}
}
}

@ -14,7 +14,6 @@ import static go.kr.project.domain.entity.QCpAnswer.cpAnswer;
import static go.kr.project.domain.entity.QCpMain.cpMain;
import static go.kr.project.domain.entity.QCpOwner.cpOwner;
import static go.kr.project.domain.entity.QCpUser.cpUser;
import static go.kr.project.domain.entity.QCpViolation.cpViolation;
@Repository
@RequiredArgsConstructor
@ -33,17 +32,13 @@ public class PreNoticeSendTargetQueryDslRepository {
PreNoticeSendTargetDto.Response.PreNoticeSendTargetEntities.class,
cpMain,
cpAnswer,
cpOwner,
cpViolation.vlId
cpOwner
)
)
.from(cpMain)
.leftJoin(cpAnswer).on(cpMain.mmCode.eq(cpAnswer.asMmcode))
.leftJoin(cpUser).on(cpAnswer.asReuser.eq(cpUser.umCode))
.leftJoin(cpOwner).on(cpMain.mmOmcode.eq(cpOwner.omCode))
.innerJoin(cpViolation).on(
cpMain.mmLawgb.eq(cpViolation.id.vlCode),
cpMain.mmSggcode.eq(cpViolation.id.vlSggcode))
.where(
// cpMain.mmSggcode.eq(dto.getMmSggcode()),
cpMain.mmState.eq(MmStateEnum.VEHICLE_CHECKED.getCode()),

@ -5,5 +5,5 @@ import go.kr.project.biz.post.preNotice.sendTarget.dto.PreNoticeSendTargetDto;
import java.util.List;
public interface PreNoticeSendTargetService {
List<PreNoticeSendTargetDto.Response.PreNoticeSendTargetFlat> findPreNoticeSendTarget(PreNoticeSendTargetDto.Request.Search dto);
List<PreNoticeSendTargetDto.Response.PreNoticeSendTarget> findPreNoticeSendTarget(PreNoticeSendTargetDto.Request.Search dto);
}

@ -4,10 +4,6 @@ import go.kr.project.biz.minwon.init.dto.MinwonInitDto;
import go.kr.project.biz.post.preNotice.sendTarget.dto.PreNoticeSendTargetDto;
import go.kr.project.biz.post.preNotice.sendTarget.repository.PreNoticeSendTargetQueryDslRepository;
import go.kr.project.biz.post.preNotice.sendTarget.service.PreNoticeSendTargetService;
import go.kr.project.vo.CpAnswerVO;
import go.kr.project.vo.CpMainVO;
import go.kr.project.vo.CpOwnerVO;
import go.kr.project.vo.code.MmDlgbEnum;
import go.kr.project.vo.mapper.EntityVoMapper;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
@ -23,35 +19,18 @@ public class PreNoticeSendTargetServiceImpl implements PreNoticeSendTargetServic
private final PreNoticeSendTargetQueryDslRepository preNoticeSendTargetQueryDslRepository;
@Override
public List<PreNoticeSendTargetDto.Response.PreNoticeSendTargetFlat> findPreNoticeSendTarget(PreNoticeSendTargetDto.Request.Search dto) {
public List<PreNoticeSendTargetDto.Response.PreNoticeSendTarget> findPreNoticeSendTarget(PreNoticeSendTargetDto.Request.Search dto) {
List<PreNoticeSendTargetDto.Response.PreNoticeSendTargetEntities> list = preNoticeSendTargetQueryDslRepository.findPreNoticeSendTarget(dto);
List<PreNoticeSendTargetDto.Response.PreNoticeSendTargetFlat> result =
list.stream()
.map(e -> {
CpMainVO cpMainVO = mapper.toCpMainVO(e.getCpMain());
CpAnswerVO cpAnswerVO = mapper.toCpAnswerVO(e.getCpAnswer());
CpOwnerVO cpOwnerVO = mapper.toCpOwnerVO(e.getCpOwner());
return PreNoticeSendTargetDto.Response.PreNoticeSendTargetFlat.builder()
// 평탄화 필드
.mmDlgb(MmDlgbEnum.getDescByCode(cpMainVO.getMmDlgb()))
.asBbsNo(cpMainVO.getMmBdcode())
.asJsdate(cpAnswerVO.getAsJsdate())
.mmSgnm(cpMainVO.getMmSgnm())
.mmSgtel(cpMainVO.getMmSgtel())
.vlId(e.getVlId())
.mmDate(cpMainVO.getMmDate())
.mmCarno(cpMainVO.getMmCarno())
.omName(cpOwnerVO.getOmName())
.omNogb(cpOwnerVO.getOmNOGb())
.omJno(cpOwnerVO.getOmJno())
.mmSgpos(cpMainVO.getMmSgpos())
.mmCode(cpMainVO.getMmCode())
.build();
})
.collect(Collectors.toList());
List<PreNoticeSendTargetDto.Response.PreNoticeSendTarget> result =
list.stream().map(e ->
PreNoticeSendTargetDto.Response.PreNoticeSendTarget.builder()
.cpMain(mapper.toCpMainVO(e.getCpMain()))
.cpAnswer(mapper.toCpAnswerVO(e.getCpAnswer()))
.cpOwner(mapper.toCpOwnerVO(e.getCpOwner()))
.build()
).collect(Collectors.toList());
return result;
}

@ -74,7 +74,14 @@ public class TotalInfoController {
}
@PostMapping("/total/info/{mmCode}/{state}/state.ajax")
public ResponseEntity<?> updateMinwonState(@PathVariable String mmCode, @PathVariable String state) {
totalInfoService.updateState(mmCode, state);
return ApiResponseUtil.success("수정되었습니다.");
}
}

@ -35,7 +35,7 @@ public enum MmStateEnum {
STATUTE_LIMIT("76", "시효결손"),
IMPOSITION_CANCEL("80", "부과취소"),
DESTRUCTION_DOC("81", "서손처리"),
SEOCHON_PROCESS("81", "서촌처리"),
STATEMENT_ACCEPTED("82", "의견진술수용"),
GUIDANCE("83", "계도"),
@ -44,7 +44,7 @@ public enum MmStateEnum {
TRANSFER_OTHER_AGENCY("85", "타기관이첩"),
SUSPENSION_10_DAYS("86", "운행정지처분(10일)"),
DESTRUCTION_DOC_DELETE("91", "서손처리 삭제"),
SEOCHON_DELETE("91", "서손처리 삭제"),
STATEMENT_DELETE("92", "의견진술 삭제"),
DELETED("99", "삭제자료");

@ -116,27 +116,3 @@ batch:
error-archive-dir: d:/data/xit-framework/batch/zip/error-archive # ZIP 파일 에러 아카이브 디렉토리
error-extract-dir: d:/data/xit-framework/batch/zip/error-extract # ZIP 파일 에러 압축해제파일 디렉토리 (하위 :/yyyy/zip file name/)
create-date-subdir-pattern: yyyy # yyyy, yyyyMM, yyyyMMdd 하위 디렉토리 구조
car-info :
protocol: http://
domain: 211.119.124.122
port: :8440
path:
basic: /api/test/carInfo/basic
cover-info :
protocol: http://
domain: 211.119.124.122
port: :8440
path: /api/test/coverInfo
texelse :
protocol: http://
domain: 211.119.124.122
port: :8440
path:
lavy: /api/test/preLavy
match: /api/test/match
sunap: /api/test/sunap

@ -39,7 +39,7 @@ spring:
# #hikari.connection-test-query 는 JDBC 4.0 이상을 사용하면 설정하지 않는 것을 권장. (공식문서)
# #connection-test-query: select 1
jpa:
# show-sql: true
show-sql: false
hibernate:
ddl-auto: none
properties:
@ -85,8 +85,6 @@ logging:
go.kr.project: DEBUG
egovframework: DEBUG
org.mybatis: INFO
org.hibernate.SQL: debug
org.hibernate.orm.jdbc.bind: trace
# File upload configuration
file:
@ -123,27 +121,3 @@ file:
# error-archive-dir: d:/data/xit-framework/batch/zip/error-archive # ZIP 파일 에러 아카이브 디렉토리
# error-extract-dir: d:/data/xit-framework/batch/zip/error-extract # ZIP 파일 에러 압축해제파일 디렉토리 (하위 :/yyyy/zip file name/)
# create-date-subdir-pattern: yyyy # yyyy, yyyyMM, yyyyMMdd 하위 디렉토리 구조
car-info :
protocol: http://
domain: 211.119.124.122
port: :8440
path:
basic: /api/test/carInfo/basic
cover-info :
protocol: http://
domain: 211.119.124.122
port: :8440
path: /api/test/coverInfo
texelse :
protocol: http://
domain: 211.119.124.122
port: :8440
path:
lavy: /api/test/preLavy
match: /api/test/match
sunap: /api/test/sunap

@ -99,10 +99,6 @@
eventListener: () => {
$("#dis-doc").on("click", () => {
// 처리사유 벨리데이션
// 날짜 벨리데이션
fnDesDocFn.updateDestructionDoc();
})

@ -1,132 +0,0 @@
<%--
Created by IntelliJ IDEA.
User: kurt
Date: 2025. 11. 28.
Time: 오후 1:46
To change this template use File | Settings | File Templates.
--%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<div id="guidance_dialog" style="display:none;">
<div class="left">
<div class="form-grid">
<!-- 1줄 -->
<div class="form-row">
<div class="field-group">
<div class="lbl">처리사유</div>
<div class="fld">
<select name="cpInstructAnswer" id="cpInstructAnswer">
<option value=""></option>
</select>
</div>
</div>
<div class="field-group empty"></div>
</div>
<!-- 2줄 -->
<div class="form-row">
<div class="field-group">
<div class="lbl">처리일자</div>
<div class="fld">
<input type="text" id="desDate" name="desDate" class="input calender datepicker" />
</div>
</div>
<div class="field-group empty"></div>
</div>
</div>
</div>
<div class="disdoc-btn-area">
<button type="button" class="btn btn-light disdoc-btn" name="" id="guide">계도처리</button>
</div>
</div>
<script type="text/javascript">
let fnGuide = {
init: () => {
},
setCode: () => {
},
updateGuide: () => {
$.ajax({
url: "",
type: "post",
contentType: 'application/json',
success: function(response) {
//다이얼로그 하이드
//네이게이팅 다음으로
//로컬스토리지 mmCodes에 해당 mmCode 제거
},
error: function(xhr, status, error) {
$("#result").text("서손처리 실패");
}
});
},
eventListener: () => {
$("#guide").on("click", () => {
// 처리사유 벨리데이션
// 날짜 벨리데이션
fnGuide.updateGuide();
})
}
}
$(function () {
/* 다이얼로그 설정 */
$("#guidance_dialog").dialog({
autoOpen: false,
modal: true,
resizable: true,
// width: "auto",
width: 1000,
maxHeight: 800,
show: { effect: "drop", direction: "left", duration: 200 },
hide: { effect: "drop", direction: "left", duration: 200 },
title: "계도처리",
open: function () {
}
});
/* 오늘날짜 기본세팅 */
$('#desDate').datepicker('setDate', new Date());
});
</script>

@ -168,19 +168,19 @@
/** tui-grid Set */
let initGrid = () => {
const gridColumns = [
{header: '등록구분', name: 'mmDlgb', sortable: true, width: 100,},
{header: '목록번호', name: 'asBbsNo', sortable: true, width: 100,},
{header: '등록구분', name: 'mmDlgb', sortable: true, width: 50,},
{header: '목록번호', name: 'asBbsNo', sortable: true, width: 70,},
{header: '신고자', name: 'mmSgnm', sortable: true, width: 100,},
{header: '담당자', name: 'mmSgtel', sortable: true, width: 100,},
{header: '전화번호', name: 'asTel', width: 150,},
{header: '접수일자', name: 'asJsdate', sortable: true, width: 120,},
{header: '처리기한', name: 'asLimitDt', sortable: true, width: 120,},
{header: '위반일자', name: 'mmDate', sortable: true, width: 120,},
{header: '차량번호', name: 'mmCarno', sortable: true, width: 150,},
{header: '첨부', name: 'mmImagegb', width: 50,},
{header: '사진', name: 'mmImagecnt', width: 50,},
{header: '위반내용', name: 'vlId', width: 250,},
{header: '접수일자', name: 'asJsdate', sortable: true, width: 70,},
{header: '처리기한', name: 'asLimitDt', sortable: true, width: 70,},
{header: '위반일자', name: 'mmDate', sortable: true, width: 150,},
{header: '첨부', name: 'mmImagegb', width: 150,},
{header: '사진갯수', name: 'mmImagecnt', width: 50,},
{header: '위반내용', name: 'mmSgcont', width: 250,},
{header: '접수번호', name: 'asJsno', sortable: true, width: 150,},
{header: '차량번호', name: 'mmCarno', sortable: true, width: 150,},
{header: 'mmCode', name: 'mmCode', sortable: true, width: 150, align: 'center', hidden: true}
];
let gridDatasource = {

@ -74,7 +74,7 @@
<div class="field-group">
<div class="lbl">위반시간</div>
<div class="fld">
<input type="text" name="cpMain" data-field="mmTime" id="mmTime" value="" readonly>
<input type="text" name="cpMain" data-field="mmLawgb" id="mmLawgb" value="" readonly>
</div>
</div>
</div>
@ -84,13 +84,13 @@
<div class="field-group">
<div class="lbl">위반내용</div>
<div class="fld">
<select name="cpViolation" id="cpViolation"></select>
<input type="text" name="cpMain" data-field="mmSgnm" id="mmSgnm" value="" readonly>
</div>
</div>
<div class="field-group">
<div class="lbl">영상매체</div>
<div class="fld">
<input type="text" name="cpAnswer" data-field="" id="" value="" readonly>
<input type="text" name="cpAnswer" data-field="asCell" id="asCell" value="" readonly>
</div>
</div>
</div>
@ -137,7 +137,7 @@
<div class="field-group full">
<div class="lbl">위반장소</div>
<div class="fld">
<input type="text" data-field="mmSgpos" id="mmSgpos" value="" readonly>
<input type="text" data-field="" id="" value="" readonly>
</div>
</div>
</div>
@ -147,7 +147,7 @@
<div class="field-group">
<div class="lbl">시군구</div>
<div class="fld">
<input type="text" name="cpAnswer" data-field="" id="" value="" readonly>
<input type="text" name="cpAnswer" data-field="asJsno" id="asJsno" value="" readonly>
</div>
</div>
<div class="field-group">
@ -165,13 +165,13 @@
<div class="field-group">
<div class="lbl">접수일</div>
<div class="fld">
<input type="text" name="cpAnswer" data-field="asJsdate" id="asJsdate" value="" readonly>
<input type="text" name="cpAnswer" data-field="asJsno" id="asJsno" value="" readonly>
</div>
</div>
<div class="field-group">
<div class="lbl">답변기한</div>
<div class="fld">
<input type="text" name="cpAnswer" data-field="asLimitDt" id="asLimitDt" value="" readonly>
<input type="text" name="cpAnswer" data-field="asJsno" id="asJsno" value="" readonly>
</div>
</div>
</div>
@ -185,14 +185,10 @@
<div class="field-group">
<div class="lbl">차량번호</div>
<div class="fld">
<input type="text" name="cpMain" data-field="" id="mmCarno" value="">
</div>
</div>
<div class="field-group">
<div class="fld">
<button type="button" class="btn btn-light" name="changeSt" id="car-info">차적조회</button>
<input type="text" name="cpAnswer" data-field="" id="" value="" readonly>
</div>
</div>
<div class="field-group empty"></div>
</div>
<!-- 11줄: 특기사항 (textarea, 한 줄 전체) -->
@ -210,13 +206,13 @@
<div class="field-group">
<div class="lbl">차량명</div>
<div class="fld">
<input type="text" data-field="" id="CNM" value="" >
<input type="text" data-field="" value="" >
</div>
</div>
<div class="field-group">
<div class="lbl">차량색상</div>
<div class="fld">
<input type="text" data-field="" id="COLOR_NM" value="" >
<input type="text" data-field="" value="" >
</div>
</div>
</div>
@ -226,7 +222,7 @@
<div class="field-group">
<div class="lbl">연료구분</div>
<div class="fld">
<input type="text" data-field="" id="MTRS_FOM_NM" value="" >
<input type="text" data-field="" value="" >
</div>
</div>
<div class="field-group empty"></div>
@ -237,7 +233,7 @@
<div class="field-group">
<div class="lbl">소유주</div>
<div class="fld">
<input type="text" data-field="MBER_NM" id="MBER_NM" value="" >
<input type="text" data-field="" value="" >
</div>
</div>
<div class="field-group">
@ -253,13 +249,13 @@
<div class="field-group">
<div class="lbl">주민번호</div>
<div class="fld">
<input type="text" data-field="MBER_SE_NO" id="MBER_SE_NO" value="" >
<input type="text" data-field="" value="" >
</div>
</div>
<div class="field-group">
<div class="lbl">우편번호</div>
<div class="fld">
<input type="text" data-field="USE_STRNGHLD_BULD_MAIN_NO" id ="USE_STRNGHLD_BULD_MAIN_NO" value="" >
<input type="text" data-field="" value="" >
</div>
</div>
</div>
@ -269,7 +265,7 @@
<div class="field-group full">
<div class="lbl">주소</div>
<div class="fld">
<input type="text" data-field="USE_STRNGHLD_ADRES_NM" id="USE_STRNGHLD_ADRES_NM" value="" >
<input type="text" data-field="" value="" >
</div>
</div>
</div>
@ -279,13 +275,13 @@
<div class="field-group">
<div class="lbl">번지</div>
<div class="fld">
<input type="text" data-field="USE_STRNGHLD_LNBR" id="USE_STRNGHLD_LNBR" value="" >
<input type="text" data-field="" value="" >
</div>
</div>
<div class="field-group">
<div class="lbl">차대번호</div>
<div class="fld">
<input type="text" data-field="VIN" id="VIN" value="" >
<input type="text" data-field="" value="" >
</div>
</div>
</div>
@ -295,7 +291,7 @@
<div class="field-group">
<div class="lbl">도로코드</div>
<div class="fld">
<input type="text" data-field="USE_STRNGHLD_ROAD_NM_CODE" id="USE_STRNGHLD_ROAD_NM_CODE" value="" >
<input type="text" data-field="" value="" >
</div>
</div>
<div class="field-group empty"></div>
@ -320,18 +316,16 @@
</div>
</div>
<div class="left">
<div class="btn-align">
<div class="align-left">
<button type="button" class="btn btn-light" name="changeSt" id="non-target" value="81">미부과처리</button>
<button type="button" class="btn btn-light" name="changeSt" id="guidance" value="">계도처리</button>
<button type="button" class="btn btn-light" name="changeSt" id="return" value="">회수처리</button>
<button type="button" class="btn btn-light" name="changeSt" id="copy" value="">자료복사</button>
</div>
<div class="align-right">
<button type="button" class="btn btn-light" id="save" value="21">저장</button>
</div>
</div>
<div id="btn-area">
<button type="button" class="btn btn-light" name="changeSt" id="non-target" value="81">미부과처리</button>
<button type="button" class="btn btn-light" name="changeSt" id="guide" value="">계도처리</button>
<button type="button" class="btn btn-light" name="changeSt" id="return" value="">회수처리</button>
<button type="button" class="btn btn-light" name="changeSt" id="copy" value="">자료복사</button>
<button type="button" class="btn btn-light" id="delay">처리보류</button>
<button type="button" class="btn btn-light" id="init">되돌리기</button>
<button type="button" class="btn btn-light" id="lavyTarget">되돌리기</button>
<button type="button" class="btn btn-light" id="stateChange" hidden>처리상태 변경</button>
</div>
</div>
@ -346,17 +340,12 @@
<jsp:include page="/WEB-INF/views/biz/totalInfo/totalInfo_photo_dialog.jsp" />
<jsp:include page="/WEB-INF/views/biz/dialog/destruction_doc_dialog.jsp" />
<jsp:include page="/WEB-INF/views/biz/dialog/guidance_dialog.jsp" />
</div>
<!-- /Main body -->
<%--<script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>--%>
<%--<script src="https://code.jquery.com/ui/1.13.2/jquery-ui.min.js"></script>--%>
<script type="text/javascript">
let CAR_INFO_STATE = false;
let CAR_INFO = {};
window.INIT_POP_API = {
search: () => {
const { cursor, mmCodes } = JSON.parse(localStorage.getItem("TOTAL_INFO_STATE"));
@ -370,26 +359,20 @@
console.log(response.data)
$("#mmIngb").val(response.data.cpMain.mmIngb);
$("#mmDlgb").val(response.data.cpMain.mmDlgb);
$("#cpViolation").val(response.data.cpMain.mmLawgb).prop("selected", true);
$("#mmLawgb").val(response.data.cpMain.mmLawgb);
$("#mmKeum1").val(response.data.cpMain.mmKeum1);
$("#mmKeum2").val(response.data.cpMain.mmKeum2);
$("#mmSgcont").val(response.data.cpMain.mmSgcont);
$("#mmSgnm").val(response.data.cpMain.mmSgnm);
$("#mmSgtel").val(response.data.cpMain.mmSgtel);
$("#mmDate").val(response.data.cpMain.mmDate);
$("#mmTime").val(response.data.cpMain.mmTime);
$("#mmSgpos").val(response.data.cpMain.mmSgpos);
$("#mmBdcode").val(response.data.cpMain.mmBdcode).prop("selected", true);
$("#asBbsNo").val(response.data.cpAnswer.asBbsNo);
$("#asState").val(response.data.cpAnswer.asState);
$("#asStateDt").val(response.data.cpAnswer.asStateDt);
$("#asCell").val(response.data.cpAnswer.asCell);
// $("#asJsno").val(response.data.cpAnswer.asJsno);
$("#asJsno").val(response.data.cpAnswer.asJsno);
$("#asJsdate").val(response.data.cpAnswer.asJsdate);
$("#asLimitDt").val(response.data.cpAnswer.asLimitDt);
$("#mmCode").text(response.data.cpMain.mmCode.substring(5).replace(/^(\d{4})(.*)$/, '$1-$2'))
@ -447,65 +430,6 @@
response.cpCancelAnswer.forEach((item) => {
$("#cpCancelAnswer").append('<option value="' +item.caCode+'">' +item.caId+ '</option>')
})
response.cpViolation.forEach((item) => {
$("#cpViolation").append('<option value="' +item.vlCode+'">' +item.vlId+ '</option>')
})
response.cpInstructAnswer.forEach((item) => {
$("#cpInstructAnswer").append('<option value="' +item.iaCode+'">' +item.iaId+ '</option>')
})
INIT_POP_API.search();
},
error: function(xhr, status, error) {
$("#result").text("조회 실패");
}
});
},
searchCarInfo: () => {
// 차량번호 위반일자
let data = {
"mmCarno": $("#mmCarno").val(),
"mmDate": $("#mmDate").val()
}
$.ajax({
url: "/common/car/info/find.ajax",
type: "get",
data: data,
contentType: 'application/json',
success: function(response) {
console.log(response);
console.log();
if(response.record.length == 0) {
alert("조회결과가 없습니다.")
return;
};
$("#MTRS_FOM_NM").val(response.record[0].MTRS_FOM_NM);
$("#CNM").val(response.record[0].CNM);
$("#COLOR_NM").val(response.record[0].COLOR_NM);
$("#MBER_NM").val(response.record[0].MBER_NM);
$("#MBER_SE_NO").val(response.record[0].MBER_SE_NO);
$("#USE_STRNGHLD_ADRES_NM").val(response.record[0].USE_STRNGHLD_ADRES_NM);
$("#USE_STRNGHLD_BULD_MAIN_NO").val(response.record[0].USE_STRNGHLD_BULD_MAIN_NO);
$("#VIN").val(response.record[0].VIN);
$("#USE_STRNGHLD_LNBR").val(response.record[0].USE_STRNGHLD_LNBR);
$("#USE_STRNGHLD_ROAD_NM_CODE").val(response.record[0].USE_STRNGHLD_ROAD_NM_CODE);
console.log(response)
console.log(response.record)
console.log(response.record[0])
CAR_INFO = response.record;
console.log("CAR_INFO", CAR_INFO);
CAR_INFO_STATE = true;
},
error: function(xhr, status, error) {
@ -536,10 +460,6 @@
},
saveOnwer: () => {
},
changeState: (e) => {
let state = e.target.value;
const { cursor, mmCodes } = JSON.parse(localStorage.getItem("TOTAL_INFO_STATE"));
@ -551,26 +471,6 @@
success: function(response) {
alert("완료.")
},
error: function(xhr, status, error) {
$("#result").text("수정 실패");
}
});
},
carInfoUpdate: () => {
const { cursor, mmCodes } = JSON.parse(localStorage.getItem("TOTAL_INFO_STATE"));
console.log("!!!!!!!!!!!!!",CAR_INFO)
$.ajax({
url: `/common/update/\${cursor}/21/update.ajax`,
type: "PUT",
data: JSON.stringify(CAR_INFO[0]),
contentType: "application/json",
success: function(response) {
alert("차적조회 완료 상태로 변경 완료.")
},
error: function(xhr, status, error) {
$("#result").text("수정 실패");
@ -631,44 +531,13 @@
$("#photoDialog").dialog("open");
});
/** 미부과처리 버튼 클릭 - 다이얼로그 오픈 */
$("#non-target").on("click", () => {
$("#destruction_doc_dialog").dialog("open");
})
/** 계도처리 버튼 클릭 - 다이얼로그 오픈 */
$("#guidance").on("click", () => {
$("#guidance_dialog").dialog("open");
})
/** 차적조회 */
$("#car-info").on("click", () => {
fnBiz.searchCarInfo();
})
/** 저장 */
$("#save").on("click", (e) => {
//차량번호 유무 확인
if(!CAR_INFO_STATE) {
alert("차량조회가 필요합니다.")
return false;
}
// 오너 테이블 인서트
// 차량조회가 완료되었으면 스테이트 변경
fnBiz.carInfoUpdate(e);
})
}
}
@ -679,6 +548,7 @@
fnBiz.init();
INIT_POP_API.search();
fnBiz.eventListener();

@ -216,18 +216,18 @@
/** tui-grid Set */
let initGrid = () => {
const gridColumns = [
{header: '등록구분', name: 'mmDlgb', sortable: true, width: 100,},
{header: '목록번호', name: 'asBbsNo', sortable: true, width: 100,},
{header: '접수일', name: 'asJsdate', sortable: true, width: 100,},
{header: '신고자', name: 'mmSgnm', sortable: true, width: 100,},
{header: '담당자', name: 'mmSgtel', width: 100,},
{header: '위반내용', name: 'vlId', sortable: true, width: 100,},
{header: '위반일시', name: 'mmDate', sortable: true, width: 100,},
{header: '차량번호', name: 'mmCarno', sortable: true, width: 150,},
{header: '소유자', name: 'omName', width: 150,},
{header: '소유주구분', name: 'omNogb', width: 100,},
{header: '주민번호', name: 'omJno', width: 250,},
{header: '위반장소', name: 'mmSgpos', sortable: true, width: 150,},
{header: '등록구분', name: '', sortable: true, width: 50,},
{header: '목록번호', name: '', sortable: true, width: 70,},
{header: '접수일', name: '', sortable: true, width: 100,},
{header: '신고자', name: '', sortable: true, width: 100,},
{header: '담당자', name: '', width: 150,},
{header: '위반내용', name: '', sortable: true, width: 70,},
{header: '위반일시', name: '', sortable: true, width: 70,},
{header: '차량번호', name: '', sortable: true, width: 150,},
{header: '소유자', name: '', width: 150,},
{header: '소유주구분', name: '', width: 50,},
{header: '주민번호', name: '', width: 250,},
{header: '위반장소', name: '', sortable: true, width: 150,},
{header: 'mmCode', name: 'mmCode', sortable: true, width: 150, align: 'center', hidden: true}
];
let gridDatasource = {

@ -11,43 +11,44 @@
<div class="main_body">
<div id="tabs" class="main_body">
<div class="detail-card">
<div class="card-header">
<div class="title">개별 총정보</div>
<div class="actions">
<span class="pill">Double Click 민원원본보기</span>
<button type="button" class="close-btn">닫기 Esc</button>
<ul>
<li><a href="#tabs-a">위반정보</a></li>
<li><a href="#tabs-b">의견진술</a></li>
<li><a href="#tabs-c">세부내역</a></li>
<li><a href="#tabs-d">부과이후</a></li>
<li><a href="#tabs-e">민원내역</a></li>
</ul>
<div id="tabs-a">
<div class="detail-card">
<div class="card-header">
<div class="title">개별 총정보</div>
<div class="actions">
<span class="pill">Double Click 민원원본보기</span>
<button type="button" class="close-btn">닫기 Esc</button>
</div>
</div>
</div>
<ul>
<li><a href="#tabs-a">위반정보</a></li>
<li><a href="#tabs-b">의견진술</a></li>
<li><a href="#tabs-c">세부내역</a></li>
<li><a href="#tabs-d">부과이후</a></li>
<li><a href="#tabs-e">민원내역</a></li>
</ul>
<!-- 상단 네비/페이지 인디케이터 -->
<div class="card-toolbar">
<%-- 부모창에서 받아오는 리스트 배열 --%>
<input type="hidden" id="mmCodes"/>
<%-- 부모창에서 받아오는 리스크 커서 --%>
<input type="hidden" id="cursor"/>
<%-- 개별총정보 상태값 --%>
<input type="hidden" id="infoState" value="init"/>
<div class="page-indicator">
<span id="cursorCnt">0</span>of <span id="total">0</span>
</div>
<div class="nav-group">
<button type="button" class="nav-btn" name="navigate" data-act="first" id="first">◀◀</button>
<button type="button" class="nav-btn" name="navigate" data-act="prev">◀</button>
<button type="button" class="nav-btn" name="navigate" data-act="next">▶</button>
<button type="button" class="nav-btn" name="navigate" data-act="last">▶▶</button>
<!-- 상단 네비/페이지 인디케이터 -->
<div class="card-toolbar">
<%-- 부모창에서 받아오는 리스트 배열 --%>
<input type="hidden" id="mmCodes" />
<%-- 부모창에서 받아오는 리스크 커서 --%>
<input type="hidden" id="cursor" />
<%-- 개별총정보 상태값 --%>
<input type="hidden" id="infoState" value="init" />
<div class="page-indicator">
<span id="cursorCnt">0</span>of <span id="total">0</span>
</div>
<div class="nav-group">
<button type="button" class="nav-btn" name="navigate" data-act="first" id="first">◀◀</button>
<button type="button" class="nav-btn" name="navigate" data-act="prev">◀</button>
<button type="button" class="nav-btn" name="navigate" data-act="next">▶</button>
<button type="button" class="nav-btn" name="navigate" data-act="last">▶▶</button>
</div>
</div>
</div>
<div class="page-no-padding" id="tabs-a">
<div class="detail-body">
<!-- 좌측 정보 -->
<div class="left">
@ -61,15 +62,13 @@
<div class="field-group">
<div class="lbl">등록구분</div>
<div class="fld">
<input type="text" name="cpMain" data-field="mmDlgb" id="mmDlgb" value=""
readonly>
<input type="text" name="cpMain" data-field="mmDlgb" id="mmDlgb" value="" readonly>
</div>
</div>
<div class="field-group">
<div class="lbl">자료출처</div>
<div class="fld">
<input type="text" name="cpMain" data-field="mmIngb" id="mmIngb" value=""
readonly>
<input type="text" name="cpMain" data-field="mmIngb" id="mmIngb" value="" readonly>
</div>
</div>
</div>
@ -79,15 +78,13 @@
<div class="field-group">
<div class="lbl">위반일시</div>
<div class="fld">
<input type="text" name="cpMain" data-field="mmDate" id="mmDate" value=""
readonly>
<input type="text" name="cpMain" data-field="mmDate" id="mmDate" value="" readonly>
</div>
</div>
<div class="field-group">
<div class="lbl">위반내용</div>
<div class="fld">
<input type="text" name="cpMain" data-field="mmLawgb" id="mmLawgb" value=""
readonly>
<input type="text" name="cpMain" data-field="mmLawgb" id="mmLawgb" value="" readonly>
</div>
</div>
</div>
@ -97,15 +94,13 @@
<div class="field-group">
<div class="lbl">신고자</div>
<div class="fld">
<input type="text" name="cpMain" data-field="mmSgnm" id="mmSgnm" value=""
readonly>
<input type="text" name="cpMain" data-field="mmSgnm" id="mmSgnm" value="" readonly>
</div>
</div>
<div class="field-group">
<div class="lbl">연락처</div>
<div class="fld">
<input type="text" name="cpAnswer" data-field="asCell" id="asCell" value=""
readonly>
<input type="text" name="cpAnswer" data-field="asCell" id="asCell" value="" readonly>
</div>
</div>
</div>
@ -115,8 +110,7 @@
<div class="field-group">
<div class="lbl">담당자</div>
<div class="fld">
<input type="text" name="cpMain" data-field="mmSgtel" id="mmSgtel" value=""
readonly>
<input type="text" name="cpMain" data-field="mmSgtel" id="mmSgtel" value="" readonly>
</div>
</div>
<div class="field-group">
@ -132,8 +126,7 @@
<div class="field-group full">
<div class="lbl">신고내용</div>
<div class="fld">
<textarea name="cpMain" data-field="mmSgcont" id="mmSgcont" value=""
readonly></textarea>
<textarea name="cpMain" data-field="mmSgcont" id="mmSgcont" value="" readonly></textarea>
</div>
</div>
</div>
@ -149,8 +142,7 @@
<div class="field-group">
<div class="lbl">접수번호</div>
<div class="fld">
<input type="text" name="cpAnswer" data-field="asJsno" id="asJsno" value=""
readonly>
<input type="text" name="cpAnswer" data-field="asJsno" id="asJsno" value="" readonly>
</div>
</div>
</div>
@ -160,15 +152,13 @@
<div class="field-group">
<div class="lbl">접수일자</div>
<div class="fld">
<input type="text" name="cpAnswer" data-field="asJsdate" id="asJsdate" value=""
readonly>
<input type="text" name="cpAnswer" data-field="asJsdate" id="asJsdate" value="" readonly>
</div>
</div>
<div class="field-group">
<div class="lbl">목록번호</div>
<div class="fld">
<input type="text" name="cpAnswer" data-field="asBbsNo" id="asBbsNo" value=""
readonly>
<input type="text" name="cpAnswer" data-field="asBbsNo" id="asBbsNo" value="" readonly>
</div>
</div>
</div>
@ -189,15 +179,13 @@
<div class="field-group">
<div class="lbl">사진등록금액</div>
<div class="fld">
<input type="text" name="cpMain" data-field="mmKeum1" id="mmKeum1" value=""
readonly>
<input type="text" name="cpMain" data-field="mmKeum1" id="mmKeum1" value="" readonly>
</div>
</div>
<div class="field-group">
<div class="lbl">부과금액</div>
<div class="fld">
<input type="text" name="cpMain" data-field="mmKeum2" id="mmKeum2" value=""
readonly>
<input type="text" name="cpMain" data-field="mmKeum2" id="mmKeum2" value="" readonly>
</div>
</div>
</div>
@ -207,7 +195,7 @@
<div class="field-group">
<div class="lbl">감액금액</div>
<div class="fld">
<input type="text" data-field="mmMinusKeum" id="mmMinusKeum" value="" readonly>
<input type="text" data-field="" id="" value="" readonly>
</div>
</div>
<div class="field-group">
@ -226,21 +214,14 @@
<input class="hl" data-field="" type="text" value="" readonly>
</div>
</div>
<div class="field-group empty"></div>
</div>
<div class="form-row">
<div class="field-group full">
<div class="field-group">
<div class="lbl">특기사항</div>
<div class="fld">
<textarea name="cpMain" data-field="mmSgcont" id="mmSgcont" value=""
readonly></textarea>
<%-- <button type="button" class="btn btn-light" id="btnSpecial">특기사항 보기</button>--%>
<button type="button" class="btn btn-light" id="btnSpecial">특기사항 보기</button>
</div>
</div>
</div>
<!-- 구분선 -->
<div class="bar"></div>
@ -249,15 +230,13 @@
<div class="field-group">
<div class="lbl">처리상태일시</div>
<div class="fld">
<input type="text" name="cpAnswer" data-field="asStateDt" id="asStateDt"
value="" readonly>
<input type="text" name="cpAnswer" data-field="asStateDt" id="asStateDt" value="" readonly>
</div>
</div>
<div class="field-group">
<div class="lbl">처리상태</div>
<div class="fld">
<input type="text" class="hl" name="cpAnswer" data-field="asState" id="asState"
value="" readonly>
<input type="text" class="hl" name="cpAnswer" data-field="asState" id="asState" value="" readonly>
</div>
</div>
</div>
@ -267,13 +246,13 @@
<div class="field-group">
<div class="lbl">차량명</div>
<div class="fld">
<input type="text" data-field="mmCarname" id="mmCarname" value="" readonly>
<input type="text" data-field="" value="" readonly>
</div>
</div>
<div class="field-group">
<div class="lbl">차량색상</div>
<div class="fld">
<input type="text" data-field="mmCarcolor" id="mmCarcolor" value="" readonly>
<input type="text" data-field="" value="" readonly>
</div>
</div>
</div>
@ -283,7 +262,7 @@
<div class="field-group">
<div class="lbl">연료구분</div>
<div class="fld">
<input type="text" data-field="" id="" value="" readonly>
<input type="text" data-field="" value="" readonly>
</div>
</div>
<div class="field-group empty"></div>
@ -300,13 +279,13 @@
<div class="field-group">
<div class="lbl">소유주</div>
<div class="fld">
<input type="text" data-field="omName" id="omName" value="" readonly>
<input type="text" data-field="" value="" readonly>
</div>
</div>
<div class="field-group">
<div class="lbl">등록구분</div>
<div class="fld">
<input type="text" data-field="omCode" id="omCode" value="" readonly>
<input type="text" data-field="" value="" readonly>
</div>
</div>
</div>
@ -316,13 +295,13 @@
<div class="field-group">
<div class="lbl">주민번호</div>
<div class="fld">
<input type="text" data-field="omJno" id="omJno" value="" readonly>
<input type="text" data-field="" value="" readonly>
</div>
</div>
<div class="field-group">
<div class="lbl">우편번호</div>
<div class="fld">
<input type="text" data-field="omZip" id="omZip" value="" readonly>
<input type="text" data-field="" value="" readonly>
</div>
</div>
</div>
@ -332,7 +311,7 @@
<div class="field-group full">
<div class="lbl">주소</div>
<div class="fld">
<input type="text" data-field="omJuso" id="omJuso" value="" readonly>
<input type="text" data-field="" value="" readonly>
</div>
</div>
</div>
@ -342,13 +321,13 @@
<div class="field-group">
<div class="lbl">번지</div>
<div class="fld">
<input type="text" data-field="omBunji" id="omBunji" value="" readonly>
<input type="text" data-field="" value="" readonly>
</div>
</div>
<div class="field-group">
<div class="lbl">차대번호</div>
<div class="fld">
<input type="text" data-field="mmVhmno" id="mmVhmno" value="" readonly>
<input type="text" data-field="" value="" readonly>
</div>
</div>
</div>
@ -358,7 +337,7 @@
<div class="field-group">
<div class="lbl">도로코드</div>
<div class="fld">
<input type="text" data-field="omDoroCode" id="omDoroCode" value="" readonly>
<input type="text" data-field="" value="" readonly>
</div>
</div>
<div class="field-group empty"></div>
@ -379,8 +358,7 @@
</div>
<div class="preview" id="photoPreviewBox">
<img id="photoPreview" src="${pageContext.request.contextPath}/static/img/sample-1.jpg"
alt="미리보기">
<img id="photoPreview" src="${pageContext.request.contextPath}/static/img/sample-1.jpg" alt="미리보기">
</div>
</div>
@ -406,29 +384,36 @@
</div>
</div>
</div>
</div>
<div id="photoEditSection" style="display:none;">
<jsp:include page="/WEB-INF/views/biz/totalInfo/totalInfo_photo_dialog.jsp"/>
</div>
<div id="photoEditSection" style="display:none;">
<jsp:include page="/WEB-INF/views/biz/totalInfo/totalInfo_photo_dialog.jsp" />
</div>
<div id="tabs-b">
의견진술
</div>
<div id="tabs-c">
세부내역
</div>
<div id="tabs-d">
부과이후
</div>
<div id="tabs-e">
민원내역
</div>
<div id="tabs-b">
의견진술
</div>
<div id="tabs-c">
세부내역
</div>
<div id="tabs-d">
부과이후
</div>
<div id="tabs-e">
민원내역
</div>
</div>
</div>
<!-- /Main body -->
<%--<script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>--%>
<%--<script src="https://code.jquery.com/ui/1.13.2/jquery-ui.min.js"></script>--%>
<script type="text/javascript">
// const { cursor, mmCodes } = JSON.parse(localStorage.getItem("TOTAL_INFO_STATE"));
//해당 객체는 팝업으로 인한 브라우저 전역선언이다.
//일반적으로 함수를 선언할땐 그냥 fnBiz로 선언하면 된다.
//window 전역을 그냥 복사하면 덮어씌워져서 난리남.
//sample.jsp 형태로 하면됨
window.TOTAL_INFO_POPUP_API = {
search: () => {
console.log("Total Info Search!!!!")
@ -436,6 +421,8 @@
const { cursor, mmCodes } = JSON.parse(localStorage.getItem("TOTAL_INFO_STATE"));
$.ajax({
// PathVariable 형태로 url를 동적으로 쓰는방식이다.
// 해당 방식 이외에 그냥 쿼리스트링으로 넘기는 방법도 있다.
url: "/total/info/" + cursor + "/info.ajax",
type: "GET",
dataType: 'json',
@ -461,17 +448,6 @@
$("#asJsno").val(response.data.cpAnswer.asJsno);
$("#asJsdate").val(response.data.cpAnswer.asJsdate);
$("#mmCarname").val(response.data.cpMain.mmCarname);
$("#mmCarcolor").val(response.data.cpMain.mmCarcolor);
$("#omName").val(response.data.cpOwner.omName);
$("#omCode").val(response.data.cpOwner.omCode);
$("#omJno").val(response.data.cpOwner.omJno);
$("#omZip").val(response.data.cpOwner.omZip);
$("#omJuso").val(response.data.cpOwner.omJuso);
$("#omBunji").val(response.data.cpOwner.omBunji);
$("#mmVhmno").val(response.data.cpMain.mmVhmno);
$("#omDoroCode").val(response.data.cpOwner.omDoroCode);
$("#mmCode").text(response.data.cpMain.mmCode.substring(5).replace(/^(\d{4})(.*)$/, '$1-$2'))

@ -1,10 +1,5 @@
/** totalInfo Start */
/* 탭 패딩 제거 */
.page-no-padding {
padding: 0 !important;
}
/* 팝업 기본 스타일 */
.popup_wrap {
position: fixed;
@ -377,27 +372,3 @@
/** totalInfo End */
/** btn area */
.btn-align {display: flex; width: 100%}
.btn-align > .align-left {display: flex; justify-content: flex-start;}
.btn-align > .align-center {display: flex; justify-content: center;}
.btn-align > .align-right {display: flex; justify-content: flex-end; margin-left: auto;}
/** 정렬 common start */
.btn-align-left {
text-align: left;
}
.btn-align-right {
text-align: right;
}
/** 정렬 common end */

@ -122,7 +122,7 @@ const TuiGrid = {
//frozenCount: 0 //고정컬럼 갯수
frozenBorderWidth: 2 //고정컬럼 보더(border) 두께
, resizable: true
, minWidth: 30 //최소 사이즈
, minWidth: 100 //최소 사이즈
},
summary: [], //[선택]하단합계
treeColumnOptions: {}, //[선택]tree 구조 grid

@ -1,54 +0,0 @@
package go.kr.project.domain.entity;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import javax.persistence.*;
@Entity
@Table(name = "cp_mainhist")
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class CpMainhist {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "MH_CODE", columnDefinition = "bigint unsigned")
private Long mhCode;
// CP_MAIN.MM_CODE
@Column(name = "MH_MMCODE", length = 16)
private String mhMmcode;
// 이전 상태
@Column(name = "MH_STATE_OLD", length = 2)
private String mhStateOld;
// 변경 후 상태
@Column(name = "MH_STATE_NEW", length = 2)
private String mhStateNew;
// 이전 상태 일시 (YYYYMMDDHH24MISS)
@Column(name = "MH_STATE_OLD_DT", length = 14)
private String mhStateOldDt;
// 사용 여부
@Column(name = "MH_ENABLE", length = 1)
private String mhEnable;
// 비고
@Column(name = "MH_ETC", length = 50)
private String mhEtc;
// 등록일시 (YYYYMMDDHH24MISS)
@Column(name = "MH_INDT", length = 14)
private String mhIndt;
// 등록자
@Column(name = "MH_INUSER")
private Integer mhInuser;
}

@ -1,55 +0,0 @@
package go.kr.project.domain.entity;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import javax.persistence.*;
@Entity
@Table(name = "cp_mainhist")
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class CpMainhist {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "CRDN_LOG_ID", columnDefinition = "bigint unsigned")
private Long mhCode;
// CP_MAIN.MM_CODE
@Column(name = "CRDN_ID", length = 16)
private String mhMmcode;
// 이전 상태
@Column(name = "BFR_PRCS_STTS", length = 2)
private String mhStateOld;
// 변경 후 상태
@Column(name = "CHG_PRCS_STTS", length = 2)
private String mhStateNew;
// 이전 상태 일시 (YYYYMMDDHH24MISS)
@Column(name = "BFR_REG_DT", length = 14)
private String mhStateOldDt;
// 사용 여부
@Column(name = "USE_YN", length = 1)
private String mhEnable;
// 비고
@Column(name = "EXCPTNMTTR", length = 50)
private String mhEtc;
// 등록일시 (YYYYMMDDHH24MISS)
@Column(name = "REG_DT", length = 14)
private String mhIndt;
// 등록자
@Column(name = "PIC_CD")
private Integer mhInuser;
}

@ -1,12 +0,0 @@
package go.kr.project.domain.repo.cp;
import go.kr.project.domain.entity.CpMainhist;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.Optional;
public interface CpMainhistRepository extends JpaRepository<CpMainhist, Long> {
CpMainhist findByMhMmcode(String mmCode);
Optional<CpMainhist> findTopByMhMmcodeOrderByMhIndtDesc(String mmCode);
}

@ -1,7 +0,0 @@
package go.kr.project.domain.repo.cp;
import go.kr.project.domain.entity.CpOwner;
import org.springframework.data.jpa.repository.JpaRepository;
public interface CpOwnerRepository extends JpaRepository<CpOwner, String> {
}

@ -1,12 +0,0 @@
package go.kr.project.domain.repo.cp;
import go.kr.project.domain.entity.CpMainhist;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.Optional;
public interface CpMainhistRepository extends JpaRepository<CpMainhist, Long> {
CpMainhist findByMhMmcode(String mmCode);
Optional<CpMainhist> findTopByMhMmcodeOrderByMhIndtDesc(String mmCode);
}

@ -1,7 +0,0 @@
package go.kr.project.domain.repo.cp;
import go.kr.project.domain.entity.CpOwner;
import org.springframework.data.jpa.repository.JpaRepository;
public interface CpOwnerRepository extends JpaRepository<CpOwner, String> {
}
Loading…
Cancel
Save