parent
193d6ef04c
commit
c6a5057ab6
@ -0,0 +1,11 @@
|
||||
-- 자동차 등록 원부(갑) 마스터 ID 시퀀스
|
||||
-- CLFB000000000001, CLFB000000000002, ... 형태로 생성
|
||||
CREATE SEQUENCE seq_car_ledger_frmbk
|
||||
START WITH 1
|
||||
INCREMENT BY 1
|
||||
MINVALUE 1
|
||||
MAXVALUE 9999999999
|
||||
CACHE 1000
|
||||
NOCYCLE;
|
||||
|
||||
-- SELECT CONCAT('CLFB', LPAD(NEXTVAL(seq_car_ledger_frmbk), 16, '0'));
|
||||
@ -0,0 +1,11 @@
|
||||
-- 자동차 등록 원부(갑) 상세 ID 시퀀스
|
||||
-- CLFD000000000001, CLFD000000000002, ... 형태로 생성
|
||||
CREATE SEQUENCE seq_car_ledger_frmbk_dtl
|
||||
START WITH 1
|
||||
INCREMENT BY 1
|
||||
MINVALUE 1
|
||||
MAXVALUE 9999999999
|
||||
CACHE 1000
|
||||
NOCYCLE;
|
||||
|
||||
-- SELECT CONCAT('CLFD', LPAD(NEXTVAL(seq_car_ledger_frmbk_dtl), 16, '0'));
|
||||
@ -0,0 +1,87 @@
|
||||
create table tb_car_ledger_frmbk
|
||||
(
|
||||
CAR_LEDGER_FRMBK_ID varchar(20) not null comment '자동차 등록 원부 갑 ID'
|
||||
primary key,
|
||||
INFO_SYS_ID varchar(6) null comment '정보 시스템 ID',
|
||||
INFO_SYS_IP varchar(23) null comment '정보 시스템 IP',
|
||||
SIGUNGU_CODE varchar(5) null comment '시군구 코드',
|
||||
CNTC_INFO_CODE varchar(15) null comment '연계 정보 코드',
|
||||
CHARGER_ID varchar(15) null comment '담당자 ID',
|
||||
CHARGER_IP varchar(23) null comment '담당자 IP',
|
||||
CHARGER_NM varchar(75) null comment '담당자명',
|
||||
DMND_VHRNO varchar(30) null comment '요청 자동차등록번호',
|
||||
DMND_ONES_INFORMATION_OPEN varchar(1) null comment '요청 개인 정보 공개',
|
||||
DMND_CPTTR_NM varchar(75) null comment '요청 민원인 성명',
|
||||
DMND_CPTTR_IHIDNUM varchar(100) null comment '요청 민원인 주민번호',
|
||||
DMND_CPTTR_LEGALDONG_CODE varchar(10) null comment '요청 민원인 법정동 코드',
|
||||
DMND_ROUTE_SE_CODE varchar(1) null comment '요청 경로 구분 코드',
|
||||
DMND_DETAIL_EXPRESSION varchar(1) null comment '요청 내역 표시',
|
||||
DMND_INQIRE_SE_CODE varchar(1) null comment '요청 조회 구분 코드',
|
||||
CNTC_RESULT_CODE varchar(8) null comment '연계 결과 코드',
|
||||
CNTC_RESULT_DTLS varchar(4000) null comment '연계 결과 상세',
|
||||
LEDGER_GROUP_NO varchar(6) null comment '원부 그룹 번호',
|
||||
LEDGER_INDVDLZ_NO varchar(6) null comment '원부 개별 번호',
|
||||
VHMNO varchar(20) null comment '차량관리번호',
|
||||
VHRNO varchar(30) null comment '차량등록번호',
|
||||
VIN varchar(17) null comment '차대번호',
|
||||
VHCTY_ASORT_CODE varchar(1) null comment '차종 종별 코드',
|
||||
VHCTY_ASORT_NM varchar(30) null comment '차종 종별명',
|
||||
CNM varchar(75) null comment '차명',
|
||||
COLOR_CODE varchar(2) null comment '색상 코드',
|
||||
COLOR_NM varchar(30) null comment '색상명',
|
||||
NMPL_STNDRD_CODE varchar(1) null comment '번호판 규격 코드',
|
||||
NMPL_STNDRD_NM varchar(30) null comment '번호판 규격명',
|
||||
PRPOS_SE_CODE varchar(2) null comment '용도 구분 코드',
|
||||
PRPOS_SE_NM varchar(20) null comment '용도 구분명',
|
||||
MTRS_FOM_NM varchar(75) null comment '원동기 형식명',
|
||||
FOM_NM varchar(75) null comment '형식명',
|
||||
ACQS_AMOUNT varchar(50) null comment '취득 금액',
|
||||
REGIST_DETAIL_CODE varchar(8) null comment '등록 상세 코드',
|
||||
REGIST_DETAIL_NM varchar(30) null comment '등록 상세명',
|
||||
FRST_REGIST_DE varchar(8) null comment '최초 등록일',
|
||||
CAAG_ENDDE varchar(8) null comment '차령 종료일',
|
||||
PRYE varchar(4) null comment '연식',
|
||||
SPMNNO1 varchar(3) null comment '제원관리번호1',
|
||||
SPMNNO2 varchar(14) null comment '제원관리번호2',
|
||||
YBL_MD varchar(8) null comment '제작 년월일',
|
||||
TRVL_DSTNC varchar(10) null comment '주행 거리',
|
||||
INSPT_VALID_PD_BGNDE varchar(8) null comment '검사 유효 기간 시작일',
|
||||
INSPT_VALID_PD_ENDDE varchar(8) null comment '검사 유효 기간 종료일',
|
||||
CHCK_VALID_PD_BGNDE varchar(8) null comment '점검 유효 기간 시작일',
|
||||
CHCK_VALID_PD_ENDDE varchar(8) null comment '점검 유효 기간 종료일',
|
||||
REGIST_REQST_SE_NM varchar(75) null comment '등록 신청 구분명',
|
||||
FRST_REGIST_RQRCNO varchar(20) null comment '최초 등록 접수번호',
|
||||
NMPL_CSDY_REMNR_DE varchar(8) null comment '번호판 영치 최고일',
|
||||
NMPL_CSDY_AT varchar(1) null comment '번호판 영치 여부',
|
||||
BSS_USE_PD varchar(30) null comment '사업용 사용 기간',
|
||||
OCTHT_ERSR_PRVNTC_NTICE_DE varchar(8) null comment '직권 말소 예고 통지일',
|
||||
ERSR_REGIST_DE varchar(8) null comment '말소 등록일',
|
||||
ERSR_REGIST_SE_CODE varchar(4) null comment '말소 등록 구분 코드',
|
||||
ERSR_REGIST_SE_NM varchar(200) null comment '말소 등록 구분명',
|
||||
MRTGCNT varchar(4) null comment '저당수',
|
||||
VHCLECNT varchar(4) null comment '압류건수',
|
||||
STMDCNT varchar(4) null comment '구조변경수',
|
||||
ADRES1 varchar(750) null comment '사용 본거지 주소',
|
||||
ADRES_NM1 varchar(300) null comment '사용 본거지 주소상세',
|
||||
ADRES varchar(750) null comment '소유자 주소',
|
||||
ADRES_NM varchar(300) null comment '소유자 주소상세',
|
||||
INDVDL_BSNM_AT varchar(1) null comment '개인 사업자 여부',
|
||||
TELNO varchar(30) null comment '대표소유자 전화번호',
|
||||
MBER_NM varchar(75) null comment '대표소유자 성명',
|
||||
MBER_SE_CODE varchar(2) null comment '대표소유자 회원 구분 코드',
|
||||
MBER_SE_NO varchar(100) null comment '대표소유자 회원 번호',
|
||||
TAXXMPT_TRGTER_SE_CODE varchar(2) null comment '비과세 대상 구분 코드',
|
||||
TAXXMPT_TRGTER_SE_CODE_NM varchar(30) null comment '비과세 대상 구분 코드명',
|
||||
CNT_MATTER varchar(5) null comment '특기사항 건수',
|
||||
EMD_NM varchar(75) null comment '사용 본거지 행정동명',
|
||||
PRVNTCCNT varchar(4) null comment '예고수',
|
||||
XPORT_FLFL_AT_STTEMNT_DE varchar(8) null comment '수출 이행 여부 신고일',
|
||||
PARTN_RQRCNO varchar(13) null comment '발급번호',
|
||||
FRST_TRNSFR_DE varchar(8) null comment '최초 양도일',
|
||||
PROCESS_IMPRTY_RESN_CODE varchar(2) null comment '처리 불가 사유 코드',
|
||||
PROCESS_IMPRTY_RESN_DTLS varchar(200) null comment '처리 불가 사유 명세',
|
||||
REG_DT datetime null comment '등록 일시',
|
||||
RGTR varchar(11) null comment '등록자'
|
||||
)
|
||||
comment '자동차 등록 원부 갑';
|
||||
|
||||
@ -0,0 +1,23 @@
|
||||
create table tb_car_ledger_frmbk_dtl
|
||||
(
|
||||
CAR_LEDGER_FRMBK_DTL_ID varchar(20) not null comment '자동차 등록 원부 갑 상세 ID'
|
||||
primary key,
|
||||
CAR_LEDGER_FRMBK_ID varchar(20) null comment '자동차 등록 원부 갑 ID',
|
||||
MAINCHK varchar(2) null comment '해제여부',
|
||||
CHANGE_JOB_SE_CODE varchar(2) null comment '변경 업무 구분 코드',
|
||||
MAINNO varchar(4) null comment '주번호',
|
||||
SUBNO varchar(4) null comment '부번호',
|
||||
DTLS varchar(2000) null comment '사항란',
|
||||
RQRCNO varchar(20) null comment '접수번호',
|
||||
VHMNO varchar(20) null comment '차량관리번호',
|
||||
LEDGER_GROUP_NO varchar(6) null comment '원부 그룹 번호',
|
||||
LEDGER_INDVDLZ_NO varchar(6) null comment '원부 개별 번호',
|
||||
GUBUN_NM varchar(75) null comment '변경 업무 구분명',
|
||||
CHANGE_DE varchar(8) null comment '변경 일자',
|
||||
DETAIL_SN varchar(6) null comment '상세 순번',
|
||||
FLAG varchar(3) null comment '표기여부',
|
||||
REG_DT datetime null comment '등록 일시',
|
||||
RGTR varchar(11) null comment '등록자'
|
||||
)
|
||||
comment '자동차 등록 원부 갑 상세';
|
||||
|
||||
@ -0,0 +1,28 @@
|
||||
package com.vmis.interfaceapp.mapper;
|
||||
|
||||
import com.vmis.interfaceapp.model.ledger.CarLedgerFrmbkDtlVO;
|
||||
import com.vmis.interfaceapp.model.ledger.CarLedgerFrmbkVO;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 자동차 등록 원부(갑) Mapper
|
||||
*/
|
||||
@Mapper
|
||||
public interface CarLedgerFrmbkMapper {
|
||||
|
||||
// ID 시퀀스
|
||||
String selectNextCarLedgerFrmbkId();
|
||||
String selectNextCarLedgerFrmbkDtlId();
|
||||
|
||||
// 마스터 INSERT/UPDATE/SELECT
|
||||
int insertCarLedgerFrmbk(CarLedgerFrmbkVO vo);
|
||||
int updateCarLedgerFrmbk(CarLedgerFrmbkVO vo);
|
||||
CarLedgerFrmbkVO selectCarLedgerFrmbkById(String carLedgerFrmbkId);
|
||||
|
||||
// 상세 INSERT (단건)
|
||||
int insertCarLedgerFrmbkDtl(CarLedgerFrmbkDtlVO vo);
|
||||
|
||||
// 편의: 상세 일괄 (MyBatis foreach를 XML에서 사용할 수도 있으나, 여기서는 단건 호출을 반복)
|
||||
}
|
||||
@ -0,0 +1,72 @@
|
||||
package com.vmis.interfaceapp.model.ledger;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 자동차 등록 원부(갑) 상세 엔티티 VO
|
||||
*
|
||||
* <p>tb_car_ledger_frmbk_dtl 테이블 매핑</p>
|
||||
*/
|
||||
@Data
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class CarLedgerFrmbkDtlVO {
|
||||
|
||||
// ==== Static factory/mapping methods (moved from Service) ====
|
||||
public static List<CarLedgerFrmbkDtlVO> listFromResponse(LedgerResponse res, String masterId) {
|
||||
List<CarLedgerFrmbkDtlVO> list = new ArrayList<>();
|
||||
if (res == null || res.getRecord() == null) return list;
|
||||
for (LedgerResponse.Record r : res.getRecord()) {
|
||||
CarLedgerFrmbkDtlVO vo = CarLedgerFrmbkDtlVO.builder()
|
||||
.carLedgerFrmbkId(masterId)
|
||||
.mainchk(r.getMainchk())
|
||||
.changeJobSeCode(r.getChangeJobSeCode())
|
||||
.mainno(r.getMainno())
|
||||
.subno(r.getSubno())
|
||||
.dtls(r.getDtls())
|
||||
.rqrcno(r.getRqrcno())
|
||||
.vhmno(r.getVhmno())
|
||||
.ledgerGroupNo(r.getLedgerGroupNo())
|
||||
.ledgerIndvdlzNo(r.getLedgerIndvdlzNo())
|
||||
.gubunNm(r.getGubunNm())
|
||||
.changeDe(r.getChangeDe())
|
||||
.detailSn(r.getDetailSn())
|
||||
.flag(r.getFlag())
|
||||
.rgtr("SYSTEM")
|
||||
.build();
|
||||
list.add(vo);
|
||||
}
|
||||
return list;
|
||||
}
|
||||
|
||||
// PK
|
||||
private String carLedgerFrmbkDtlId;
|
||||
|
||||
// FK
|
||||
private String carLedgerFrmbkId;
|
||||
|
||||
// 본문
|
||||
private String mainchk;
|
||||
private String changeJobSeCode;
|
||||
private String mainno;
|
||||
private String subno;
|
||||
private String dtls;
|
||||
private String rqrcno;
|
||||
private String vhmno;
|
||||
private String ledgerGroupNo;
|
||||
private String ledgerIndvdlzNo;
|
||||
private String gubunNm;
|
||||
private String changeDe;
|
||||
private String detailSn;
|
||||
private String flag;
|
||||
|
||||
// 감사
|
||||
private String rgtr;
|
||||
}
|
||||
@ -0,0 +1,192 @@
|
||||
package com.vmis.interfaceapp.model.ledger;
|
||||
|
||||
import com.vmis.interfaceapp.model.ledger.LedgerResponse.Record;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
/**
|
||||
* 자동차 등록 원부(갑) 마스터 엔티티 VO
|
||||
*
|
||||
* <p>tb_car_ledger_frmbk 테이블 매핑</p>
|
||||
*/
|
||||
@Data
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class CarLedgerFrmbkVO {
|
||||
|
||||
// ==== Static factory/mapping methods (moved from Service) ====
|
||||
public static CarLedgerFrmbkVO fromRequest(com.vmis.interfaceapp.model.ledger.LedgerRequest request) {
|
||||
return CarLedgerFrmbkVO.builder()
|
||||
.infoSysId(request.getInfoSysId())
|
||||
.infoSysIp(request.getInfoSysIp())
|
||||
.sigunguCode(request.getSigunguCode())
|
||||
.cntcInfoCode(request.getCntcInfoCode())
|
||||
.chargerId(request.getChargerId())
|
||||
.chargerIp(request.getChargerIp())
|
||||
.chargerNm(request.getChargerNm())
|
||||
.dmndVhrno(request.getVhrno())
|
||||
.rgtr("SYSTEM")
|
||||
.build();
|
||||
}
|
||||
|
||||
public static CarLedgerFrmbkVO fromResponseMaster(String id, com.vmis.interfaceapp.model.ledger.LedgerResponse res) {
|
||||
return CarLedgerFrmbkVO.builder()
|
||||
.carLedgerFrmbkId(id)
|
||||
.cntcResultCode(res.getCntcResultCode())
|
||||
.cntcResultDtls(res.getCntcResultDtls())
|
||||
.ledgerGroupNo(res.getLedgerGroupNo())
|
||||
.ledgerIndvdlzNo(res.getLedgerIndvdlzNo())
|
||||
.vhmno(res.getVhmno())
|
||||
.vhrno(res.getVhrno())
|
||||
.vin(res.getVin())
|
||||
.vhctyAsortCode(res.getVhctyAsortCode())
|
||||
.vhctyAsortNm(res.getVhctyAsortNm())
|
||||
.cnm(res.getCnm())
|
||||
.colorCode(res.getColorCode())
|
||||
.colorNm(res.getColorNm())
|
||||
.nmplStndrdCode(res.getNmplStndrdCode())
|
||||
.nmplStndrdNm(res.getNmplStndrdNm())
|
||||
.prposSeCode(res.getPrposSeCode())
|
||||
.prposSeNm(res.getPrposSeNm())
|
||||
.mtrsFomNm(res.getMtrsFomNm())
|
||||
.fomNm(res.getFomNm())
|
||||
.acqsAmount(res.getAcqsAmount())
|
||||
.registDetailCode(res.getRegistDetailCode())
|
||||
.registDetailNm(res.getRegistDetailNm())
|
||||
.frstRegistDe(res.getFrstRegistDe())
|
||||
.caagEndde(res.getCaagEndde())
|
||||
.prye(res.getPrye())
|
||||
.spmnno1(res.getSpmnno1())
|
||||
.spmnno2(res.getSpmnno2())
|
||||
.yblMd(res.getYblMd())
|
||||
.trvlDstnc(res.getTrvlDstnc())
|
||||
.insptValidPdBgnde(res.getInsptValidPdBgnde())
|
||||
.insptValidPdEndde(res.getInsptValidPdEndde())
|
||||
.chckValidPdBgnde(res.getChckValidPdBgnde())
|
||||
.chckValidPdEndde(res.getChckValidPdEndde())
|
||||
.registReqstSeNm(res.getRegistReqstSeNm())
|
||||
.frstRegistRqrcno(res.getFrstRegistRqrcno())
|
||||
.nmplCsdyRemnrDe(res.getNmplCsdyRemnrDe())
|
||||
.nmplCsdyAt(res.getNmplCsdyAt())
|
||||
.bssUsePd(res.getBssUsePd())
|
||||
.octhtErsrPrvntcNticeDe(res.getOcthtErsrPrvntcNticeDe())
|
||||
.ersrRegistDe(res.getErsrRegistDe())
|
||||
.ersrRegistSeCode(res.getErsrRegistSeCode())
|
||||
.ersrRegistSeNm(res.getErsrRegistSeNm())
|
||||
.mrtgcnt(res.getMrtgcnt())
|
||||
.vhclecnt(res.getVhclecnt())
|
||||
.stmdcnt(res.getStmdcnt())
|
||||
.adres1(res.getAdres1())
|
||||
.adresNm1(res.getAdresNm1())
|
||||
.adres(res.getAdres())
|
||||
.adresNm(res.getAdresNm())
|
||||
.indvdlBsnmAt(res.getIndvdlBsnmAt())
|
||||
.telno(res.getTelno())
|
||||
.mberNm(res.getMberNm())
|
||||
.mberSeCode(res.getMberSeCode())
|
||||
.mberSeNo(res.getMberSeNo())
|
||||
.taxxmptTrgterSeCode(res.getTaxxmptTrgterSeCode())
|
||||
.taxxmptTrgterSeCodeNm(res.getTaxxmptTrgterSeCodeNm())
|
||||
.cntMatter(res.getCntMatter())
|
||||
.emdNm(res.getEmdNm())
|
||||
.prvntccnt(res.getPrvntccnt())
|
||||
.xportFlflAtSttemntDe(res.getXportFlflAtSttemntDe())
|
||||
.partnRqrcno(res.getPartnRqrcno())
|
||||
.build();
|
||||
}
|
||||
|
||||
// PK
|
||||
private String carLedgerFrmbkId;
|
||||
|
||||
// 요청(헤더/본문) 정보
|
||||
private String infoSysId;
|
||||
private String infoSysIp;
|
||||
private String sigunguCode;
|
||||
private String cntcInfoCode;
|
||||
private String chargerId;
|
||||
private String chargerIp;
|
||||
private String chargerNm;
|
||||
|
||||
// 요청 본문
|
||||
private String dmndVhrno;
|
||||
private String dmndOnesInformationOpen;
|
||||
private String dmndCpttrNm;
|
||||
private String dmndCpttrIhidnum;
|
||||
private String dmndCpttrLegaldongCode;
|
||||
private String dmndRouteSeCode;
|
||||
private String dmndDetailExpression;
|
||||
private String dmndInqireSeCode;
|
||||
|
||||
// 응답 요약 정보
|
||||
private String cntcResultCode;
|
||||
private String cntcResultDtls;
|
||||
|
||||
// 응답 본문(마스터)
|
||||
private String ledgerGroupNo;
|
||||
private String ledgerIndvdlzNo;
|
||||
private String vhmno;
|
||||
private String vhrno;
|
||||
private String vin;
|
||||
private String vhctyAsortCode;
|
||||
private String vhctyAsortNm;
|
||||
private String cnm;
|
||||
private String colorCode;
|
||||
private String colorNm;
|
||||
private String nmplStndrdCode;
|
||||
private String nmplStndrdNm;
|
||||
private String prposSeCode;
|
||||
private String prposSeNm;
|
||||
private String mtrsFomNm;
|
||||
private String fomNm;
|
||||
private String acqsAmount;
|
||||
private String registDetailCode;
|
||||
private String registDetailNm;
|
||||
private String frstRegistDe;
|
||||
private String caagEndde;
|
||||
private String prye;
|
||||
private String spmnno1;
|
||||
private String spmnno2;
|
||||
private String yblMd;
|
||||
private String trvlDstnc;
|
||||
private String insptValidPdBgnde;
|
||||
private String insptValidPdEndde;
|
||||
private String chckValidPdBgnde;
|
||||
private String chckValidPdEndde;
|
||||
private String registReqstSeNm;
|
||||
private String frstRegistRqrcno;
|
||||
private String nmplCsdyRemnrDe;
|
||||
private String nmplCsdyAt;
|
||||
private String bssUsePd;
|
||||
private String octhtErsrPrvntcNticeDe;
|
||||
private String ersrRegistDe;
|
||||
private String ersrRegistSeCode;
|
||||
private String ersrRegistSeNm;
|
||||
private String mrtgcnt;
|
||||
private String vhclecnt;
|
||||
private String stmdcnt;
|
||||
private String adres1;
|
||||
private String adresNm1;
|
||||
private String adres;
|
||||
private String adresNm;
|
||||
private String indvdlBsnmAt;
|
||||
private String telno;
|
||||
private String mberNm;
|
||||
private String mberSeCode;
|
||||
private String mberSeNo;
|
||||
private String taxxmptTrgterSeCode;
|
||||
private String taxxmptTrgterSeCodeNm;
|
||||
private String cntMatter;
|
||||
private String emdNm;
|
||||
private String prvntccnt;
|
||||
private String xportFlflAtSttemntDe;
|
||||
private String partnRqrcno;
|
||||
private String frstTrnsfrDe;
|
||||
private String processImprtyResnCode;
|
||||
private String processImprtyResnDtls;
|
||||
|
||||
// 감사
|
||||
private String rgtr;
|
||||
}
|
||||
@ -0,0 +1,56 @@
|
||||
package com.vmis.interfaceapp.service;
|
||||
|
||||
import com.vmis.interfaceapp.mapper.CarBassMatterInqireMapper;
|
||||
import com.vmis.interfaceapp.model.basic.CarBassMatterInqireVO;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Propagation;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
/**
|
||||
* 자동차 기본사항 조회 로그 전용 서비스.
|
||||
*
|
||||
* <p>로그 적재만 별도 트랜잭션(REQUIRES_NEW)으로 처리하여,
|
||||
* 외부 호출 실패나 상위 트랜잭션 롤백 상황에서도 로그는 영속화되도록 보장한다.</p>
|
||||
*/
|
||||
@Slf4j
|
||||
@Service
|
||||
@RequiredArgsConstructor
|
||||
public class CarBassMatterInqireLogService {
|
||||
|
||||
private final CarBassMatterInqireMapper carBassMatterInqireMapper;
|
||||
|
||||
/**
|
||||
* 최초 API 요청 정보를 등록한다. (REQUIRES_NEW)
|
||||
* @param request 요청 정보
|
||||
* @return 생성된 ID
|
||||
*/
|
||||
@Transactional(propagation = Propagation.REQUIRES_NEW)
|
||||
public String createInitialRequestNewTx(CarBassMatterInqireVO request) {
|
||||
String generatedId = carBassMatterInqireMapper.selectNextCarBassMatterInqireId();
|
||||
request.setCarBassMatterInqire(generatedId);
|
||||
int result = carBassMatterInqireMapper.insertCarBassMatterInqire(request);
|
||||
if (result != 1) {
|
||||
throw new RuntimeException("자동차 기본 사항 조회 정보 등록 실패");
|
||||
}
|
||||
log.info("[BASIC-REQ-LOG] 요청 정보 저장 완료(별도TX) - ID: {}, 차량번호: {}", generatedId, request.getDmndVhrno());
|
||||
return generatedId;
|
||||
}
|
||||
|
||||
/**
|
||||
* 응답/에러 결과를 업데이트한다. (REQUIRES_NEW)
|
||||
* @param response 업데이트 내용
|
||||
*/
|
||||
@Transactional(propagation = Propagation.REQUIRES_NEW)
|
||||
public void updateResponseNewTx(CarBassMatterInqireVO response) {
|
||||
if (response.getCarBassMatterInqire() == null) {
|
||||
throw new IllegalArgumentException("자동차 기본 사항 조회 ID는 필수입니다.");
|
||||
}
|
||||
int result = carBassMatterInqireMapper.updateCarBassMatterInqire(response);
|
||||
if (result != 1) {
|
||||
throw new RuntimeException("자동차 기본 사항 조회 정보 업데이트 실패 - ID: " + response.getCarBassMatterInqire());
|
||||
}
|
||||
log.info("[BASIC-RES-LOG] 응답/에러 정보 저장 완료(별도TX) - ID: {}, 결과코드: {}", response.getCarBassMatterInqire(), response.getCntcResultCode());
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,61 @@
|
||||
package com.vmis.interfaceapp.service;
|
||||
|
||||
import com.vmis.interfaceapp.mapper.CarLedgerFrmbkMapper;
|
||||
import com.vmis.interfaceapp.model.ledger.CarLedgerFrmbkDtlVO;
|
||||
import com.vmis.interfaceapp.model.ledger.CarLedgerFrmbkVO;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Propagation;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 자동차 등록 원부(갑) 로그 전용 서비스.
|
||||
* - 모든 로깅(write)은 별도 트랜잭션(REQUIRES_NEW)으로 수행하여 상위 트랜잭션 롤백의 영향을 받지 않도록 한다.
|
||||
*/
|
||||
@Slf4j
|
||||
@Service
|
||||
@RequiredArgsConstructor
|
||||
public class CarLedgerFrmbkLogService {
|
||||
|
||||
private final CarLedgerFrmbkMapper mapper;
|
||||
|
||||
@Transactional(propagation = Propagation.REQUIRES_NEW)
|
||||
public String createInitialRequestNewTx(CarLedgerFrmbkVO request) {
|
||||
String id = mapper.selectNextCarLedgerFrmbkId();
|
||||
request.setCarLedgerFrmbkId(id);
|
||||
int result = mapper.insertCarLedgerFrmbk(request);
|
||||
if (result != 1) {
|
||||
throw new RuntimeException("자동차 등록 원부(갑) 최초요청 등록 실패");
|
||||
}
|
||||
log.info("[LEDGER-REQ-LOG] 최초 요청 저장(별도TX) - ID: {}, 차량번호: {}", id, request.getDmndVhrno());
|
||||
return id;
|
||||
}
|
||||
|
||||
@Transactional(propagation = Propagation.REQUIRES_NEW)
|
||||
public void updateResponseNewTx(CarLedgerFrmbkVO response) {
|
||||
if (response.getCarLedgerFrmbkId() == null) {
|
||||
throw new IllegalArgumentException("자동차 등록 원부(갑) ID는 필수입니다.");
|
||||
}
|
||||
int updated = mapper.updateCarLedgerFrmbk(response);
|
||||
if (updated != 1) {
|
||||
throw new RuntimeException("자동차 등록 원부(갑) 정보 업데이트 실패 - ID: " + response.getCarLedgerFrmbkId());
|
||||
}
|
||||
log.info("[LEDGER-RES-LOG] 마스터 응답 업데이트(별도TX) - ID: {}, 결과코드: {}",
|
||||
response.getCarLedgerFrmbkId(), response.getCntcResultCode());
|
||||
}
|
||||
|
||||
@Transactional(propagation = Propagation.REQUIRES_NEW)
|
||||
public void saveDetailsNewTx(String masterId, List<CarLedgerFrmbkDtlVO> details) {
|
||||
if (details == null || details.isEmpty()) return;
|
||||
for (CarLedgerFrmbkDtlVO dtl : details) {
|
||||
String dtlId = mapper.selectNextCarLedgerFrmbkDtlId();
|
||||
dtl.setCarLedgerFrmbkDtlId(dtlId);
|
||||
dtl.setCarLedgerFrmbkId(masterId);
|
||||
mapper.insertCarLedgerFrmbkDtl(dtl);
|
||||
}
|
||||
log.info("[LEDGER-RES-LOG] 상세 {}건 저장(별도TX) - ID: {}", details.size(), masterId);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,84 @@
|
||||
package com.vmis.interfaceapp.service;
|
||||
|
||||
import com.vmis.interfaceapp.client.GovernmentApi;
|
||||
import com.vmis.interfaceapp.model.common.Envelope;
|
||||
import com.vmis.interfaceapp.model.ledger.CarLedgerFrmbkDtlVO;
|
||||
import com.vmis.interfaceapp.model.ledger.CarLedgerFrmbkVO;
|
||||
import com.vmis.interfaceapp.model.ledger.LedgerRequest;
|
||||
import com.vmis.interfaceapp.model.ledger.LedgerResponse;
|
||||
import com.vmis.interfaceapp.util.ExceptionDetailUtil;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 자동차 등록 원부(갑) 서비스 (오케스트레이션)
|
||||
* - 요청 보강, 외부 API 호출, 로그 서비스 위임
|
||||
*/
|
||||
@Slf4j
|
||||
@Service
|
||||
@RequiredArgsConstructor
|
||||
public class CarLedgerFrmbkService {
|
||||
|
||||
private final GovernmentApi governmentApi;
|
||||
private final RequestEnricher enricher;
|
||||
private final CarLedgerFrmbkLogService logService;
|
||||
|
||||
/**
|
||||
* 자동차 등록원부(갑) 조회: 보강 -> 최초요청로그(별도TX) -> 외부호출 -> 응답로그(마스터/상세, 별도TX) -> 오류 시 에러로그(별도TX).
|
||||
*/
|
||||
@Transactional
|
||||
public ResponseEntity<Envelope<LedgerResponse>> ledger(Envelope<LedgerRequest> envelope) {
|
||||
// 1) 요청 보강
|
||||
enricher.enrichLedger(envelope);
|
||||
|
||||
String generatedId = null;
|
||||
try {
|
||||
// 2) 최초 요청 로그 저장 (첫 번째 데이터 기준)
|
||||
if (envelope.getData() != null && !envelope.getData().isEmpty()) {
|
||||
LedgerRequest req = envelope.getData().get(0);
|
||||
CarLedgerFrmbkVO init = CarLedgerFrmbkVO.fromRequest(req);
|
||||
generatedId = logService.createInitialRequestNewTx(init);
|
||||
}
|
||||
|
||||
// 3) 외부 API 호출
|
||||
ResponseEntity<Envelope<LedgerResponse>> response = governmentApi.callLedger(envelope);
|
||||
|
||||
// 4) 응답 로그 업데이트 (마스터 + 상세)
|
||||
if (generatedId != null && response.getBody() != null &&
|
||||
response.getBody().getData() != null && !response.getBody().getData().isEmpty()) {
|
||||
LedgerResponse body = response.getBody().getData().get(0);
|
||||
CarLedgerFrmbkVO masterUpdate = CarLedgerFrmbkVO.fromResponseMaster(generatedId, body);
|
||||
logService.updateResponseNewTx(masterUpdate);
|
||||
|
||||
List<CarLedgerFrmbkDtlVO> details = CarLedgerFrmbkDtlVO.listFromResponse(body, generatedId);
|
||||
if (details != null && !details.isEmpty()) {
|
||||
logService.saveDetailsNewTx(generatedId, details);
|
||||
}
|
||||
}
|
||||
|
||||
return response;
|
||||
} catch (Exception e) {
|
||||
// 5) 오류 로그 업데이트
|
||||
if (generatedId != null) {
|
||||
try {
|
||||
String detail = ExceptionDetailUtil.buildForLog(e);
|
||||
CarLedgerFrmbkVO errorLog = CarLedgerFrmbkVO.builder()
|
||||
.carLedgerFrmbkId(generatedId)
|
||||
.cntcResultCode("99")
|
||||
.cntcResultDtls(detail)
|
||||
.build();
|
||||
logService.updateResponseNewTx(errorLog);
|
||||
log.error("[LEDGER-ERR-LOG] API 호출 에러 정보 저장 완료(별도TX) - ID: {}, detail: {}", generatedId, detail, e);
|
||||
} catch (Exception ignore) {
|
||||
log.error("[LEDGER-ERR-LOG] 에러 로그 저장 실패 - ID: {}", generatedId, ignore);
|
||||
}
|
||||
}
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1,228 +0,0 @@
|
||||
package com.vmis.interfaceapp.service;
|
||||
|
||||
import com.fasterxml.jackson.core.type.TypeReference;
|
||||
import com.vmis.interfaceapp.client.GovernmentApi;
|
||||
import com.vmis.interfaceapp.model.basic.BasicRequest;
|
||||
import com.vmis.interfaceapp.model.basic.BasicResponse;
|
||||
import com.vmis.interfaceapp.model.basic.CarBassMatterInqireVO;
|
||||
import com.vmis.interfaceapp.model.common.Envelope;
|
||||
import com.vmis.interfaceapp.model.ledger.LedgerRequest;
|
||||
import com.vmis.interfaceapp.model.ledger.LedgerResponse;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
/**
|
||||
* 차량 연계 서비스: 컨트롤러-클라이언트 사이의 오케스트레이션 계층.
|
||||
* - 요청 보강(RequestEnricher)
|
||||
* - 요청/응답 DB 로깅(CarBassMatterInqire)
|
||||
* - 정부 API 클라이언트 위임(GovernmentApi)
|
||||
*/
|
||||
@Slf4j
|
||||
@Service
|
||||
@RequiredArgsConstructor
|
||||
public class VehicleInterfaceService {
|
||||
|
||||
private final GovernmentApi governmentApi;
|
||||
private final RequestEnricher enricher;
|
||||
private final CarBassMatterInqireService carBassMatterInqireService;
|
||||
|
||||
/**
|
||||
* 자동차 기본사항 조회: 보강 -> 최초요청로그 -> 외부호출 -> 응답로그.
|
||||
*/
|
||||
@Transactional
|
||||
public ResponseEntity<Envelope<BasicResponse>> basic(Envelope<BasicRequest> envelope) {
|
||||
// 1) 요청 보강
|
||||
enricher.enrichBasic(envelope);
|
||||
|
||||
String generatedId = null;
|
||||
try {
|
||||
// 2) 최초 요청 로그 저장 (첫 번째 데이터 기준)
|
||||
if (envelope.getData() != null && !envelope.getData().isEmpty()) {
|
||||
BasicRequest req = envelope.getData().get(0);
|
||||
CarBassMatterInqireVO logEntity = mapInitialLog(req);
|
||||
generatedId = carBassMatterInqireService.createInitialRequest(logEntity);
|
||||
log.info("[BASIC-REQ-LOG] 요청 정보 저장 완료 - ID: {}, 차량번호: {}", generatedId, req.getVhrno());
|
||||
}
|
||||
|
||||
// 3) 외부 API 호출
|
||||
ResponseEntity<Envelope<BasicResponse>> response = governmentApi.callBasic(envelope);
|
||||
|
||||
// 4) 응답 로그 업데이트
|
||||
// 원본 소스, 정상적인 호출, 리턴(에러 리턴포함) 일 경우에만 에러 로그 남김
|
||||
if (generatedId != null && response.getBody() != null) {
|
||||
CarBassMatterInqireVO update = mapResponseLog(generatedId, response.getBody());
|
||||
if (update != null) {
|
||||
carBassMatterInqireService.updateResponse(update);
|
||||
log.info("[BASIC-RES-LOG] 응답 정보 저장 완료 - ID: {}", generatedId);
|
||||
}
|
||||
}
|
||||
|
||||
return response;
|
||||
} catch (Exception e) {
|
||||
// 5) 오류 로그 업데이트
|
||||
if (generatedId != null) {
|
||||
try {
|
||||
String detail = buildExceptionDetail(e);
|
||||
CarBassMatterInqireVO errorLog = CarBassMatterInqireVO.builder()
|
||||
.carBassMatterInqire(generatedId)
|
||||
.cntcResultCode("99")
|
||||
.cntcResultDtls(detail)
|
||||
.build();
|
||||
carBassMatterInqireService.updateResponse(errorLog);
|
||||
log.error("[BASIC-ERR-LOG] API 호출 에러 정보 저장 완료 - ID: {}, detail: {}", generatedId, detail, e);
|
||||
} catch (Exception ignore) {
|
||||
log.error("[BASIC-ERR-LOG] 에러 로그 저장 실패 - ID: {}", generatedId, ignore);
|
||||
}
|
||||
}
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 자동차 등록원부(갑) 조회: 보강 -> 외부호출. (별도 로그 테이블 미정)
|
||||
*/
|
||||
public ResponseEntity<Envelope<LedgerResponse>> ledger(Envelope<LedgerRequest> envelope) {
|
||||
enricher.enrichLedger(envelope);
|
||||
return governmentApi.callLedger(envelope);
|
||||
}
|
||||
|
||||
private CarBassMatterInqireVO mapInitialLog(BasicRequest request) {
|
||||
return CarBassMatterInqireVO.builder()
|
||||
.infoSysId(request.getInfoSysId())
|
||||
.infoSysIp(request.getInfoSysIp())
|
||||
.sigunguCode(request.getSigunguCode())
|
||||
.cntcInfoCode(request.getCntcInfoCode())
|
||||
.chargerId(request.getChargerId())
|
||||
.chargerIp(request.getChargerIp())
|
||||
.chargerNm(request.getChargerNm())
|
||||
.dmndLevyStdde(request.getLevyStdde())
|
||||
.dmndInqireSeCode(request.getInqireSeCode())
|
||||
.dmndVhrno(request.getVhrno())
|
||||
.dmndVin(request.getVin())
|
||||
.rgtr("SYSTEM")
|
||||
.build();
|
||||
}
|
||||
|
||||
private CarBassMatterInqireVO mapResponseLog(String id, Envelope<BasicResponse> envelope) {
|
||||
if (envelope.getData() == null || envelope.getData().isEmpty()) return null;
|
||||
BasicResponse response = envelope.getData().get(0);
|
||||
CarBassMatterInqireVO.CarBassMatterInqireVOBuilder builder = CarBassMatterInqireVO.builder()
|
||||
.carBassMatterInqire(id)
|
||||
.cntcResultCode(response.getCntcResultCode())
|
||||
.cntcResultDtls(response.getCntcResultDtls());
|
||||
|
||||
if (response.getRecord() != null && !response.getRecord().isEmpty()) {
|
||||
BasicResponse.Record record = response.getRecord().get(0);
|
||||
mapRecordToEntity(builder, record);
|
||||
}
|
||||
return builder.build();
|
||||
}
|
||||
|
||||
private void mapRecordToEntity(CarBassMatterInqireVO.CarBassMatterInqireVOBuilder builder, BasicResponse.Record record) {
|
||||
builder
|
||||
.prye(record.getPrye())
|
||||
.registDe(record.getRegistDe())
|
||||
.ersrRegistSeCode(record.getErsrRegistSeCode())
|
||||
.ersrRegistSeNm(record.getErsrRegistSeNm())
|
||||
.ersrRegistDe(record.getErsrRegistDe())
|
||||
.registDetailCode(record.getRegistDetailCode())
|
||||
.dsplvl(record.getDsplvl())
|
||||
.useStrnghldLegaldongCode(record.getUseStrnghldLegaldongCode())
|
||||
.useStrnghldAdstrdCode(record.getUseStrnghldAdstrdCode())
|
||||
.useStrnghldMntn(record.getUseStrnghldMntn())
|
||||
.useStrnghldLnbr(record.getUseStrnghldLnbr())
|
||||
.useStrnghldHo(record.getUseStrnghldHo())
|
||||
.useStrnghldAdresNm(record.getUseStrnghldAdresNm())
|
||||
.useStrnghldRoadNmCode(record.getUseStrnghldRoadNmCode())
|
||||
.usgsrhldUndgrndBuldSeCode(record.getUsgsrhldUndgrndBuldSeCode())
|
||||
.useStrnghldBuldMainNo(record.getUseStrnghldBuldMainNo())
|
||||
.useStrnghldBuldSubNo(record.getUseStrnghldBuldSubNo())
|
||||
.usgsrhldAdresFull(record.getUsgsrhldAdresFull())
|
||||
.mberSeCode(record.getMberSeCode())
|
||||
.mberSeNo(record.getMberSeNo())
|
||||
.mberNm(record.getMberNm())
|
||||
.telno(record.getTelno())
|
||||
.ownerLegaldongCode(record.getOwnerLegaldongCode())
|
||||
.ownerAdstrdCode(record.getOwnerAdstrdCode())
|
||||
.ownerMntn(record.getOwnerMntn())
|
||||
.ownerLnbr(record.getOwnerLnbr())
|
||||
.ownerHo(record.getOwnerHo())
|
||||
.ownerAdresNm(record.getOwnerAdresNm())
|
||||
.ownerRoadNmCode(record.getOwnerRoadNmCode())
|
||||
.ownerUndgrndBuldSeCode(record.getOwnerUndgrndBuldSeCode())
|
||||
.ownerBuldMainNo(record.getOwnerBuldMainNo())
|
||||
.ownerBuldSubNo(record.getOwnerBuldSubNo())
|
||||
.ownrWholaddr(record.getOwnerAdresFull())
|
||||
.aftrVhrno(record.getAftrVhrno())
|
||||
.useFuelCode(record.getUseFuelCode())
|
||||
.prposSeCode(record.getPrposSeCode())
|
||||
.mtrsFomNm(record.getMtrsFomNm())
|
||||
.frntVhrno(record.getFrntVhrno())
|
||||
.vhclno(record.getVhrno())
|
||||
.vin(record.getVin())
|
||||
.cnm(record.getCnm())
|
||||
.vhcleTotWt(record.getVhcleTotWt())
|
||||
.caagEndde(record.getCaagEndde())
|
||||
.changeDe(record.getChangeDe())
|
||||
.vhctyAsortCode(record.getVhctyAsortCode())
|
||||
.vhctyTyCode(record.getVhctyTyCode())
|
||||
.vhctySeCode(record.getVhctySeCode())
|
||||
.mxmmLdg(record.getMxmmLdg())
|
||||
.vhctyAsortNm(record.getVhctyAsortNm())
|
||||
.vhctyTyNm(record.getVhctyTyNm())
|
||||
.vhctySeNm(record.getVhctySeNm())
|
||||
.frstRegistDe(record.getFrstRegistDe())
|
||||
.fomNm(record.getFomNm())
|
||||
.acqsDe(record.getAcqsDe())
|
||||
.acqsEndDe(record.getAcqsEndDe())
|
||||
.yblMd(record.getYblMd())
|
||||
.transrRegistDe(record.getTransrRegistDe())
|
||||
.spcfRegistSttusCode(record.getSpcfRegistSttusCode())
|
||||
.colorNm(record.getColorNm())
|
||||
.mrtgCo(record.getMrtgCo())
|
||||
.seizrCo(record.getSeizrCo())
|
||||
.stmdCo(record.getStmdCo())
|
||||
.nmplCsdyAt(record.getNmplCsdyAt())
|
||||
.nmplCsdyRemnrDe(record.getNmplCsdyRemnrDe())
|
||||
.originSeCode(record.getOriginSeCode())
|
||||
.nmplStndrdCode(record.getNmplStndrdCode())
|
||||
.acqsAmount(record.getAcqsAmount())
|
||||
.insptValidPdBgnde(record.getInsptValidPdBgnde())
|
||||
.insptValidPdEndde(record.getInsptValidPdEndde())
|
||||
.useStrnghldGrcCode(record.getUseStrnghldGrcCode())
|
||||
.tkcarPscapCo(record.getTkcarPscapCo())
|
||||
.spmnno(record.getSpmnno())
|
||||
.trvlDstnc(record.getTrvlDstnc())
|
||||
.frstRegistRqrcno(record.getFrstRegistRqrcno())
|
||||
.vlntErsrPrvntcNticeDe(record.getVlntErsrPrvntcNticeDe())
|
||||
.registInsttNm(record.getRegistInsttNm())
|
||||
.processImprtyResnCode(record.getProcessImprtyResnCode())
|
||||
.processImprtyResnDtls(record.getProcessImprtyResnDtls())
|
||||
.cbdLt(record.getCbdLt())
|
||||
.cbdBt(record.getCbdBt())
|
||||
.cbdHg(record.getCbdHg())
|
||||
.frstMxmmLdg(record.getFrstMxmmLdg())
|
||||
.fuelCnsmpRt(record.getFuelCnsmpRt())
|
||||
.elctyCmpndFuelCnsmpRt(record.getElctyCmpndFuelCnsmpRt());
|
||||
}
|
||||
|
||||
private String buildExceptionDetail(Throwable t) {
|
||||
if (t == null) return "오류: unknown";
|
||||
Throwable root = t;
|
||||
int guard = 0;
|
||||
while (root.getCause() != null && root.getCause() != root && guard++ < 20) {
|
||||
root = root.getCause();
|
||||
}
|
||||
String className = root.getClass().getName();
|
||||
String message = root.getMessage();
|
||||
String detail = (message != null && !message.isEmpty()) ? (className + ": " + message) : root.toString();
|
||||
// DB 컬럼(CNTC_RESULT_DTLS) 길이: 200
|
||||
if (detail.length() > 200) {
|
||||
detail = detail.substring(0, 200);
|
||||
}
|
||||
return detail;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,29 @@
|
||||
package com.vmis.interfaceapp.util;
|
||||
|
||||
/**
|
||||
* Common helper to extract root-cause message and truncate to DB column limit (default 4000 chars).
|
||||
*/
|
||||
public final class ExceptionDetailUtil {
|
||||
|
||||
private ExceptionDetailUtil() {}
|
||||
|
||||
public static String buildForLog(Throwable t) {
|
||||
return buildForLog(t, 4000);
|
||||
}
|
||||
|
||||
public static String buildForLog(Throwable t, int maxLen) {
|
||||
if (t == null) return "오류: unknown";
|
||||
Throwable root = t;
|
||||
int guard = 0;
|
||||
while (root.getCause() != null && root.getCause() != root && guard++ < 20) {
|
||||
root = root.getCause();
|
||||
}
|
||||
String className = root.getClass().getName();
|
||||
String message = root.getMessage();
|
||||
String detail = (message != null && !message.isEmpty()) ? (className + ": " + message) : root.toString();
|
||||
if (detail != null && detail.length() > maxLen) {
|
||||
detail = detail.substring(0, maxLen);
|
||||
}
|
||||
return detail;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,178 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
|
||||
<mapper namespace="com.vmis.interfaceapp.mapper.CarLedgerFrmbkMapper">
|
||||
|
||||
<!-- 시퀀스로 새로운 마스터/상세 ID 생성 -->
|
||||
<select id="selectNextCarLedgerFrmbkId" resultType="String">
|
||||
SELECT CONCAT('CLFB', LPAD(NEXTVAL(seq_car_ledger_frmbk), 16, '0')) AS id
|
||||
</select>
|
||||
|
||||
<select id="selectNextCarLedgerFrmbkDtlId" resultType="String">
|
||||
SELECT CONCAT('CLFD', LPAD(NEXTVAL(seq_car_ledger_frmbk_dtl), 16, '0')) AS id
|
||||
</select>
|
||||
|
||||
<!-- 최초 요청 정보 INSERT (마스터) -->
|
||||
<insert id="insertCarLedgerFrmbk" parameterType="CarLedgerFrmbkVO">
|
||||
INSERT INTO tb_car_ledger_frmbk (
|
||||
CAR_LEDGER_FRMBK_ID,
|
||||
INFO_SYS_ID,
|
||||
INFO_SYS_IP,
|
||||
SIGUNGU_CODE,
|
||||
CNTC_INFO_CODE,
|
||||
CHARGER_ID,
|
||||
CHARGER_IP,
|
||||
CHARGER_NM,
|
||||
DMND_VHRNO,
|
||||
DMND_ONES_INFORMATION_OPEN,
|
||||
DMND_CPTTR_NM,
|
||||
DMND_CPTTR_IHIDNUM,
|
||||
DMND_CPTTR_LEGALDONG_CODE,
|
||||
DMND_ROUTE_SE_CODE,
|
||||
DMND_DETAIL_EXPRESSION,
|
||||
DMND_INQIRE_SE_CODE,
|
||||
REG_DT,
|
||||
RGTR
|
||||
) VALUES (
|
||||
#{carLedgerFrmbkId},
|
||||
#{infoSysId},
|
||||
#{infoSysIp},
|
||||
#{sigunguCode},
|
||||
#{cntcInfoCode},
|
||||
#{chargerId},
|
||||
#{chargerIp},
|
||||
#{chargerNm},
|
||||
#{dmndVhrno},
|
||||
#{dmndOnesInformationOpen},
|
||||
#{dmndCpttrNm},
|
||||
#{dmndCpttrIhidnum},
|
||||
#{dmndCpttrLegaldongCode},
|
||||
#{dmndRouteSeCode},
|
||||
#{dmndDetailExpression},
|
||||
#{dmndInqireSeCode},
|
||||
NOW(),
|
||||
#{rgtr}
|
||||
)
|
||||
</insert>
|
||||
|
||||
<!-- 응답 결과 UPDATE (마스터) -->
|
||||
<update id="updateCarLedgerFrmbk" parameterType="CarLedgerFrmbkVO">
|
||||
UPDATE tb_car_ledger_frmbk
|
||||
<set>
|
||||
<if test="cntcResultCode != null">CNTC_RESULT_CODE = #{cntcResultCode},</if>
|
||||
<if test="cntcResultDtls != null">CNTC_RESULT_DTLS = #{cntcResultDtls},</if>
|
||||
<if test="ledgerGroupNo != null">LEDGER_GROUP_NO = #{ledgerGroupNo},</if>
|
||||
<if test="ledgerIndvdlzNo != null">LEDGER_INDVDLZ_NO = #{ledgerIndvdlzNo},</if>
|
||||
<if test="vhmno != null">VHMNO = #{vhmno},</if>
|
||||
<if test="vhrno != null">VHRNO = #{vhrno},</if>
|
||||
<if test="vin != null">VIN = #{vin},</if>
|
||||
<if test="vhctyAsortCode != null">VHCTY_ASORT_CODE = #{vhctyAsortCode},</if>
|
||||
<if test="vhctyAsortNm != null">VHCTY_ASORT_NM = #{vhctyAsortNm},</if>
|
||||
<if test="cnm != null">CNM = #{cnm},</if>
|
||||
<if test="colorCode != null">COLOR_CODE = #{colorCode},</if>
|
||||
<if test="colorNm != null">COLOR_NM = #{colorNm},</if>
|
||||
<if test="nmplStndrdCode != null">NMPL_STNDRD_CODE = #{nmplStndrdCode},</if>
|
||||
<if test="nmplStndrdNm != null">NMPL_STNDRD_NM = #{nmplStndrdNm},</if>
|
||||
<if test="prposSeCode != null">PRPOS_SE_CODE = #{prposSeCode},</if>
|
||||
<if test="prposSeNm != null">PRPOS_SE_NM = #{prposSeNm},</if>
|
||||
<if test="mtrsFomNm != null">MTRS_FOM_NM = #{mtrsFomNm},</if>
|
||||
<if test="fomNm != null">FOM_NM = #{fomNm},</if>
|
||||
<if test="acqsAmount != null">ACQS_AMOUNT = #{acqsAmount},</if>
|
||||
<if test="registDetailCode != null">REGIST_DETAIL_CODE = #{registDetailCode},</if>
|
||||
<if test="registDetailNm != null">REGIST_DETAIL_NM = #{registDetailNm},</if>
|
||||
<if test="frstRegistDe != null">FRST_REGIST_DE = #{frstRegistDe},</if>
|
||||
<if test="caagEndde != null">CAAG_ENDDE = #{caagEndde},</if>
|
||||
<if test="prye != null">PRYE = #{prye},</if>
|
||||
<if test="spmnno1 != null">SPMNNO1 = #{spmnno1},</if>
|
||||
<if test="spmnno2 != null">SPMNNO2 = #{spmnno2},</if>
|
||||
<if test="yblMd != null">YBL_MD = #{yblMd},</if>
|
||||
<if test="trvlDstnc != null">TRVL_DSTNC = #{trvlDstnc},</if>
|
||||
<if test="insptValidPdBgnde != null">INSPT_VALID_PD_BGNDE = #{insptValidPdBgnde},</if>
|
||||
<if test="insptValidPdEndde != null">INSPT_VALID_PD_ENDDE = #{insptValidPdEndde},</if>
|
||||
<if test="chckValidPdBgnde != null">CHCK_VALID_PD_BGNDE = #{chckValidPdBgnde},</if>
|
||||
<if test="chckValidPdEndde != null">CHCK_VALID_PD_ENDDE = #{chckValidPdEndde},</if>
|
||||
<if test="registReqstSeNm != null">REGIST_REQST_SE_NM = #{registReqstSeNm},</if>
|
||||
<if test="frstRegistRqrcno != null">FRST_REGIST_RQRCNO = #{frstRegistRqrcno},</if>
|
||||
<if test="nmplCsdyRemnrDe != null">NMPL_CSDY_REMNR_DE = #{nmplCsdyRemnrDe},</if>
|
||||
<if test="nmplCsdyAt != null">NMPL_CSDY_AT = #{nmplCsdyAt},</if>
|
||||
<if test="bssUsePd != null">BSS_USE_PD = #{bssUsePd},</if>
|
||||
<if test="octhtErsrPrvntcNticeDe != null">OCTHT_ERSR_PRVNTC_NTICE_DE = #{octhtErsrPrvntcNticeDe},</if>
|
||||
<if test="ersrRegistDe != null">ERSR_REGIST_DE = #{ersrRegistDe},</if>
|
||||
<if test="ersrRegistSeCode != null">ERSR_REGIST_SE_CODE = #{ersrRegistSeCode},</if>
|
||||
<if test="ersrRegistSeNm != null">ERSR_REGIST_SE_NM = #{ersrRegistSeNm},</if>
|
||||
<if test="mrtgcnt != null">MRTGCNT = #{mrtgcnt},</if>
|
||||
<if test="vhclecnt != null">VHCLECNT = #{vhclecnt},</if>
|
||||
<if test="stmdcnt != null">STMDCNT = #{stmdcnt},</if>
|
||||
<if test="adres1 != null">ADRES1 = #{adres1},</if>
|
||||
<if test="adresNm1 != null">ADRES_NM1 = #{adresNm1},</if>
|
||||
<if test="adres != null">ADRES = #{adres},</if>
|
||||
<if test="adresNm != null">ADRES_NM = #{adresNm},</if>
|
||||
<if test="indvdlBsnmAt != null">INDVDL_BSNM_AT = #{indvdlBsnmAt},</if>
|
||||
<if test="telno != null">TELNO = #{telno},</if>
|
||||
<if test="mberNm != null">MBER_NM = #{mberNm},</if>
|
||||
<if test="mberSeCode != null">MBER_SE_CODE = #{mberSeCode},</if>
|
||||
<if test="mberSeNo != null">MBER_SE_NO = #{mberSeNo},</if>
|
||||
<if test="taxxmptTrgterSeCode != null">TAXXMPT_TRGTER_SE_CODE = #{taxxmptTrgterSeCode},</if>
|
||||
<if test="taxxmptTrgterSeCodeNm != null">TAXXMPT_TRGTER_SE_CODE_NM = #{taxxmptTrgterSeCodeNm},</if>
|
||||
<if test="cntMatter != null">CNT_MATTER = #{cntMatter},</if>
|
||||
<if test="emdNm != null">EMD_NM = #{emdNm},</if>
|
||||
<if test="prvntccnt != null">PRVNTCCNT = #{prvntccnt},</if>
|
||||
<if test="xportFlflAtSttemntDe != null">XPORT_FLFL_AT_STTEMNT_DE = #{xportFlflAtSttemntDe},</if>
|
||||
<if test="partnRqrcno != null">PARTN_RQRCNO = #{partnRqrcno},</if>
|
||||
<if test="frstTrnsfrDe != null">FRST_TRNSFR_DE = #{frstTrnsfrDe},</if>
|
||||
<if test="processImprtyResnCode != null">PROCESS_IMPRTY_RESN_CODE = #{processImprtyResnCode},</if>
|
||||
<if test="processImprtyResnDtls != null">PROCESS_IMPRTY_RESN_DTLS = #{processImprtyResnDtls},</if>
|
||||
</set>
|
||||
WHERE CAR_LEDGER_FRMBK_ID = #{carLedgerFrmbkId}
|
||||
</update>
|
||||
|
||||
<!-- 상세 INSERT -->
|
||||
<insert id="insertCarLedgerFrmbkDtl" parameterType="CarLedgerFrmbkDtlVO">
|
||||
INSERT INTO tb_car_ledger_frmbk_dtl (
|
||||
CAR_LEDGER_FRMBK_DTL_ID,
|
||||
CAR_LEDGER_FRMBK_ID,
|
||||
MAINCHK,
|
||||
CHANGE_JOB_SE_CODE,
|
||||
MAINNO,
|
||||
SUBNO,
|
||||
DTLS,
|
||||
RQRCNO,
|
||||
VHMNO,
|
||||
LEDGER_GROUP_NO,
|
||||
LEDGER_INDVDLZ_NO,
|
||||
GUBUN_NM,
|
||||
CHANGE_DE,
|
||||
DETAIL_SN,
|
||||
FLAG,
|
||||
REG_DT,
|
||||
RGTR
|
||||
) VALUES (
|
||||
#{carLedgerFrmbkDtlId},
|
||||
#{carLedgerFrmbkId},
|
||||
#{mainchk},
|
||||
#{changeJobSeCode},
|
||||
#{mainno},
|
||||
#{subno},
|
||||
#{dtls},
|
||||
#{rqrcno},
|
||||
#{vhmno},
|
||||
#{ledgerGroupNo},
|
||||
#{ledgerIndvdlzNo},
|
||||
#{gubunNm},
|
||||
#{changeDe},
|
||||
#{detailSn},
|
||||
#{flag},
|
||||
NOW(),
|
||||
#{rgtr}
|
||||
)
|
||||
</insert>
|
||||
|
||||
<!-- ID로 조회 (선택) -->
|
||||
<select id="selectCarLedgerFrmbkById" parameterType="String" resultType="CarLedgerFrmbkVO">
|
||||
SELECT *
|
||||
FROM tb_car_ledger_frmbk
|
||||
WHERE CAR_LEDGER_FRMBK_ID = #{carLedgerFrmbkId}
|
||||
</select>
|
||||
|
||||
</mapper>
|
||||
Loading…
Reference in New Issue