비교로직 및 보완, 로그, 트래잭션 등 수정

main
박성영 3 weeks ago
parent cdc37293f2
commit 05874175d5

@ -51,4 +51,13 @@ public interface VmisCarBassMatterInqireMapper {
* @return
*/
CarBassMatterInqireVO selectCarBassMatterInqireById(String carBassMatterInqire);
/**
* txId CAR_FFNLG_TRGT_ID .
*
* @param txId ID
* @param carFfnlgTrgtId ID
* @return
*/
int updateCarFfnlgTrgtIdByTxId(String txId, String carFfnlgTrgtId);
}

@ -23,4 +23,13 @@ public interface VmisCarLedgerFrmbkMapper {
int insertCarLedgerFrmbkDtl(CarLedgerFrmbkDtlVO vo);
// 편의: 상세 일괄 (MyBatis foreach를 XML에서 사용할 수도 있으나, 여기서는 단건 호출을 반복)
/**
* txId CAR_FFNLG_TRGT_ID .
*
* @param txId ID
* @param carFfnlgTrgtId ID
* @return
*/
int updateCarFfnlgTrgtIdByTxId(String txId, String carFfnlgTrgtId);
}

@ -24,6 +24,9 @@ import java.util.List;
@Setter
public class NewBasicResponse { // 총 3개 필드 (외부 클래스 3개, 중첩 Record 클래스 84개)
/** 트랜잭션 ID (내부 처리용) */
private String txId;
/** 연계결과코드 (성공/실패 코드) */
@JsonProperty("LINK_RSLT_CD")
private String linkRsltCd;

@ -16,6 +16,9 @@ import java.util.List;
@Setter
public class NewLedgerResponse { // 총 64개 필드 (외부 클래스 66개, 중첩 Record 클래스 16개)
/** 트랜잭션 ID (내부 처리용) */
private String txId;
@JsonProperty("LINK_RSLT_CD")
private String linkRsltCd;

@ -1,6 +1,7 @@
package go.kr.project.api.service;
import go.kr.project.api.model.CarBassMatterInqireVO;
import go.kr.project.api.model.response.NewBasicResponse;
/**
*
@ -22,4 +23,11 @@ public interface VmisCarBassMatterInqireLogService {
* @param response
*/
void updateResponseNewTx(CarBassMatterInqireVO response);
/**
* txId CAR_FFNLG_TRGT_ID . (REQUIRES_NEW)
* @param response API
* @param carFfnlgTrgtId ID
*/
void updateCarFfnlgTrgtIdByTxIdNewTx(NewBasicResponse response, String carFfnlgTrgtId);
}

@ -2,6 +2,7 @@ package go.kr.project.api.service;
import go.kr.project.api.model.CarLedgerFrmbkDtlVO;
import go.kr.project.api.model.CarLedgerFrmbkVO;
import go.kr.project.api.model.response.NewLedgerResponse;
import java.util.List;
@ -30,4 +31,11 @@ public interface VmisCarLedgerFrmbkLogService {
* @param details
*/
void saveDetailsNewTx(String masterId, List<CarLedgerFrmbkDtlVO> details);
/**
* txId CAR_FFNLG_TRGT_ID . (REQUIRES_NEW)
* @param response API
* @param carFfnlgTrgtId ID
*/
void updateCarFfnlgTrgtIdByTxIdNewTx(NewLedgerResponse response, String carFfnlgTrgtId);
}

@ -104,10 +104,13 @@ public class ExternalVehicleApiServiceImpl extends EgovAbstractServiceImpl imple
// 응답 정보 업데이트 (txId 포함)
CarBassMatterInqireVO responseUpdate = CarBassMatterInqireVO.fromOldExchange(generatedId, env);
bassMatterLogService.updateResponseNewTx(responseUpdate);
log.debug("[OLD-BASIC] txId: {}", env.getTxId());
// OldBasicResponse를 NewBasicResponse로 변환하여 반환
return convertToNewBasicResponse(oldBody);
NewBasicResponse newResponse = convertToNewBasicResponse(oldBody);
// txId를 response에 설정
newResponse.setTxId(env.getTxId());
return newResponse;
}
}
@ -163,7 +166,10 @@ public class ExternalVehicleApiServiceImpl extends EgovAbstractServiceImpl imple
// 응답 정보 업데이트 (txId 포함)
CarBassMatterInqireVO responseUpdate = CarBassMatterInqireVO.fromNewExchange(generatedId, env);
bassMatterLogService.updateResponseNewTx(responseUpdate);
// txId를 response에 설정
body.setTxId(env.getTxId());
log.debug("[NEW-BASIC] txId: {}", env.getTxId());
return body;
}
@ -226,6 +232,10 @@ public class ExternalVehicleApiServiceImpl extends EgovAbstractServiceImpl imple
if (details != null && !details.isEmpty()) {
ledgerLogService.saveDetailsNewTx(generatedId, details);
}
// txId를 response에 설정
body.setTxId(env.getTxId());
log.debug("[NEW-LEDGER] txId: {}", env.getTxId());
return body;
}

@ -1,8 +1,10 @@
package go.kr.project.api.service.impl;
import egovframework.exception.MessageException;
import egovframework.util.SessionUtil;
import go.kr.project.api.mapper.VmisCarBassMatterInqireMapper;
import go.kr.project.api.model.CarBassMatterInqireVO;
import go.kr.project.api.model.response.NewBasicResponse;
import go.kr.project.api.service.VmisCarBassMatterInqireLogService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@ -39,7 +41,7 @@ public class VmisCarBassMatterInqireLogServiceImpl extends EgovAbstractServiceIm
}
int result = carBassMatterInqireMapper.insertCarBassMatterInqire(request);
if (result != 1) {
throw new RuntimeException("자동차 기본 사항 조회 정보 등록 실패");
throw new MessageException("자동차 기본 사항 조회 정보 등록 실패");
}
log.info("[BASIC-REQ-LOG] 요청 정보 저장 완료(별도TX) - ID: {}, 차량번호: {}", generatedId, request.getDmndVhrno());
return generatedId;
@ -57,8 +59,27 @@ public class VmisCarBassMatterInqireLogServiceImpl extends EgovAbstractServiceIm
}
int result = carBassMatterInqireMapper.updateCarBassMatterInqire(response);
if (result != 1) {
throw new RuntimeException("자동차 기본 사항 조회 정보 업데이트 실패 - ID: " + response.getCarBassMatterInqireId());
throw new MessageException("자동차 기본 사항 조회 정보 업데이트 실패 - ID: " + response.getCarBassMatterInqireId());
}
log.info("[BASIC-RES-LOG] 응답/에러 정보 저장 완료(별도TX) - ID: {}, 결과코드: {}", response.getCarBassMatterInqireId(), response.getLinkRsltCd());
}
/**
* txId CAR_FFNLG_TRGT_ID . (REQUIRES_NEW)
* @param response API
* @param carFfnlgTrgtId ID
*/
@Override
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void updateCarFfnlgTrgtIdByTxIdNewTx(NewBasicResponse response, String carFfnlgTrgtId) {
try {
if (response != null && response.getTxId() != null) {
carBassMatterInqireMapper.updateCarFfnlgTrgtIdByTxId(response.getTxId(), carFfnlgTrgtId);
log.info("[BASIC-FFNLG-LOG] CAR_FFNLG_TRGT_ID 업데이트 완료(별도TX) - txId: {}, CAR_FFNLG_TRGT_ID: {}", response.getTxId(), carFfnlgTrgtId);
}
} catch (Exception e) {
log.error("[BASIC-FFNLG-LOG] CAR_FFNLG_TRGT_ID 업데이트 중 오류 발생 - txId: {}", response != null ? response.getTxId() : null, e);
// 저장 실패해도 비교 로직은 계속 진행
}
}
}

@ -1,9 +1,11 @@
package go.kr.project.api.service.impl;
import egovframework.exception.MessageException;
import egovframework.util.SessionUtil;
import go.kr.project.api.mapper.VmisCarLedgerFrmbkMapper;
import go.kr.project.api.model.CarLedgerFrmbkDtlVO;
import go.kr.project.api.model.CarLedgerFrmbkVO;
import go.kr.project.api.model.response.NewLedgerResponse;
import go.kr.project.api.service.VmisCarLedgerFrmbkLogService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@ -35,7 +37,7 @@ public class VmisCarLedgerFrmbkLogServiceImpl extends EgovAbstractServiceImpl im
}
int result = mapper.insertCarLedgerFrmbk(request);
if (result != 1) {
throw new RuntimeException("자동차 등록 원부(갑) 최초요청 등록 실패");
throw new MessageException("자동차 등록 원부(갑) 최초요청 등록 실패");
}
log.info("[LEDGER-REQ-LOG] 최초 요청 저장(별도TX) - ID: {}, 차량번호: {}", id, request.getDmndVhrno());
return id;
@ -49,7 +51,7 @@ public class VmisCarLedgerFrmbkLogServiceImpl extends EgovAbstractServiceImpl im
}
int updated = mapper.updateCarLedgerFrmbk(response);
if (updated != 1) {
throw new RuntimeException("자동차 등록 원부(갑) 정보 업데이트 실패 - ID: " + response.getCarLedgerFrmbkId());
throw new MessageException("자동차 등록 원부(갑) 정보 업데이트 실패 - ID: " + response.getCarLedgerFrmbkId());
}
log.info("[LEDGER-RES-LOG] 마스터 응답 업데이트(별도TX) - ID: {}, 결과코드: {}",
response.getCarLedgerFrmbkId(), response.getLinkRsltCd());
@ -67,4 +69,23 @@ public class VmisCarLedgerFrmbkLogServiceImpl extends EgovAbstractServiceImpl im
}
log.info("[LEDGER-RES-LOG] 상세 {}건 저장(별도TX) - ID: {}", details.size(), masterId);
}
/**
* txId CAR_FFNLG_TRGT_ID . (REQUIRES_NEW)
* @param response API
* @param carFfnlgTrgtId ID
*/
@Override
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void updateCarFfnlgTrgtIdByTxIdNewTx(NewLedgerResponse response, String carFfnlgTrgtId) {
try {
if (response != null && response.getTxId() != null) {
mapper.updateCarFfnlgTrgtIdByTxId(response.getTxId(), carFfnlgTrgtId);
log.info("[LEDGER-FFNLG-LOG] CAR_FFNLG_TRGT_ID 업데이트 완료(별도TX) - txId: {}, CAR_FFNLG_TRGT_ID: {}", response.getTxId(), carFfnlgTrgtId);
}
} catch (Exception e) {
log.error("[LEDGER-FFNLG-LOG] CAR_FFNLG_TRGT_ID 업데이트 중 오류 발생 - txId: {}", response != null ? response.getTxId() : null, e);
// 저장 실패해도 비교 로직은 계속 진행
}
}
}

@ -8,6 +8,8 @@ import go.kr.project.api.model.request.NewLedgerRequest;
import go.kr.project.api.model.response.NewBasicResponse;
import go.kr.project.api.model.response.NewLedgerResponse;
import go.kr.project.api.service.ExternalVehicleApiService;
import go.kr.project.api.service.VmisCarBassMatterInqireLogService;
import go.kr.project.api.service.VmisCarLedgerFrmbkLogService;
import go.kr.project.carInspectionPenalty.registration.mapper.CarFfnlgTrgtMapper;
import go.kr.project.carInspectionPenalty.registration.model.CarFfnlgTrgtVO;
import go.kr.project.carInspectionPenalty.registration.service.ComparisonService;
@ -16,6 +18,8 @@ import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.egovframe.rte.fdl.cmmn.EgovAbstractServiceImpl;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
@ -34,6 +38,8 @@ public class ComparisonServiceImpl extends EgovAbstractServiceImpl implements Co
private final CarFfnlgTrgtMapper carFfnlgTrgtMapper;
private final ExternalVehicleApiService apiService;
private final VmisCarBassMatterInqireLogService bassMatterLogService;
private final VmisCarLedgerFrmbkLogService ledgerLogService;
private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyyMMdd");
@ -102,6 +108,9 @@ public class ComparisonServiceImpl extends EgovAbstractServiceImpl implements Co
NewBasicRequest step1Request = createBasicRequest(vhclno, null, inspYmd);
NewBasicResponse step1Response = apiService.getBasicInfo(step1Request);
// API 응답에 CAR_FFNLG_TRGT_ID 업데이트
bassMatterLogService.updateCarFfnlgTrgtIdByTxIdNewTx(step1Response, existingData.getCarFfnlgTrgtId());
if (step1Response == null || step1Response.getRecord() == null || step1Response.getRecord().isEmpty()) {
log.warn("[상품용] Step 1 응답 없음 - 차량번호: {}", vhclno);
return null;
@ -129,6 +138,9 @@ public class ComparisonServiceImpl extends EgovAbstractServiceImpl implements Co
NewBasicRequest step2Request = createBasicRequest(null, vin, today);
NewBasicResponse step2Response = apiService.getBasicInfo(step2Request);
// API 응답에 CAR_FFNLG_TRGT_ID 업데이트
bassMatterLogService.updateCarFfnlgTrgtIdByTxIdNewTx(step2Response, existingData.getCarFfnlgTrgtId());
if (step2Response == null || step2Response.getRecord() == null || step2Response.getRecord().isEmpty()) {
log.warn("[상품용] Step 2 응답 없음 - 차대번호: {}", vin);
return null;
@ -150,6 +162,9 @@ public class ComparisonServiceImpl extends EgovAbstractServiceImpl implements Co
NewLedgerRequest step3Request = createLedgerRequest(currentVhclno, currentOwnerName, currentIdecno, currentLegalDongCode);
NewLedgerResponse step3Response = apiService.getLedgerInfo(step3Request);
// API 응답에 CAR_FFNLG_TRGT_ID 업데이트
ledgerLogService.updateCarFfnlgTrgtIdByTxIdNewTx(step3Response, existingData.getCarFfnlgTrgtId());
if (step3Response == null) {
log.warn("[상품용] Step 3 응답 없음 - 차량번호: {}", currentVhclno);
return null;
@ -188,6 +203,10 @@ public class ComparisonServiceImpl extends EgovAbstractServiceImpl implements Co
// DB 업데이트
existingData.setTaskPrcsSttsCd(TaskPrcsSttsConstants.TASK_PRCS_STTS_CD_02_PRODUCT_USE);
existingData.setTaskPrcsYmd(LocalDate.now().format(DATE_FORMATTER));
existingData.setCarRegFrmbkChgTaskSeCd(record.getChgTaskSeCd());
existingData.setCarRegFrmbkChgTaskSeNm(record.getChgTaskSeNm());
existingData.setCarRegFrmbkChgYmd(record.getChgYmd());
existingData.setCarRegFrmbkDtl(buildLedgerRecordDetail(record));
existingData.setRmrk(rmrk);
int updateCount = carFfnlgTrgtMapper.update(existingData);
@ -262,6 +281,9 @@ public class ComparisonServiceImpl extends EgovAbstractServiceImpl implements Co
NewBasicRequest request = createBasicRequest(vhclno, null, levyCrtrYmd);
NewBasicResponse response = apiService.getBasicInfo(request);
// API 응답에 CAR_FFNLG_TRGT_ID 업데이트
bassMatterLogService.updateCarFfnlgTrgtIdByTxIdNewTx(response, existingData.getCarFfnlgTrgtId());
if (response == null || response.getRecord() == null || response.getRecord().isEmpty()) {
log.warn("[{}] 응답 없음 - 차량번호: {}", transferType, vhclno);
return null;
@ -513,4 +535,50 @@ public class ComparisonServiceImpl extends EgovAbstractServiceImpl implements Co
}
return date.substring(0, 4) + "-" + date.substring(4, 6) + "-" + date.substring(6, 8);
}
/**
*
*/
private String buildLedgerRecordDetail(NewLedgerResponse.Record record) {
if (record == null) {
return "";
}
StringBuilder detail = new StringBuilder();
// 변경 정보
appendIfNotEmpty(detail, "변경업무구분코드", record.getChgTaskSeCd());
appendIfNotEmpty(detail, "변경업무구분명", record.getChgTaskSeNm());
appendIfNotEmpty(detail, "변경일자", formatDateWithHyphen(record.getChgYmd()));
// 주요 정보
appendIfNotEmpty(detail, "주요번호", record.getMainNo());
appendIfNotEmpty(detail, "일련번호", record.getSno());
appendIfNotEmpty(detail, "특별사항", record.getSpcablMttr());
// 명의자 정보
appendIfNotEmpty(detail, "명의자명", record.getHshldrNm());
appendIfNotEmpty(detail, "명의자식별번호", maskIdecno(record.getHshldrIdecno()));
// 기타
appendIfNotEmpty(detail, "신청접수번호", record.getAplyRcptNo());
appendIfNotEmpty(detail, "차량관리번호", record.getVhmno());
appendIfNotEmpty(detail, "원부그룹번호", record.getLedgerGroupNo());
appendIfNotEmpty(detail, "원부개별번호", record.getLedgerIndivNo());
appendIfNotEmpty(detail, "상세일련번호", record.getDtlSn());
return detail.toString();
}
/**
* ( )
*/
private void appendIfNotEmpty(StringBuilder sb, String label, String value) {
if (value != null && !value.isEmpty()) {
if (sb.length() > 0) {
sb.append(", ");
}
sb.append(label).append(": ").append(value);
}
}
}

@ -149,4 +149,11 @@
WHERE CAR_BASS_MATTER_INQIRE_ID = #{carBassMatterInqireId}
</select>
<!-- txId로 CAR_FFNLG_TRGT_ID 업데이트 -->
<update id="updateCarFfnlgTrgtIdByTxId">
UPDATE tb_car_bass_matter_inqire
SET CAR_FFNLG_TRGT_ID = #{param2}
WHERE TX_ID = #{param1}
</update>
</mapper>

@ -184,4 +184,11 @@
WHERE CAR_LEDGER_FRMBK_ID = #{carLedgerFrmbkId}
</select>
<!-- txId로 CAR_FFNLG_TRGT_ID 업데이트 -->
<update id="updateCarFfnlgTrgtIdByTxId">
UPDATE tb_car_ledger_frmbk
SET CAR_FFNLG_TRGT_ID = #{param2}
WHERE TX_ID = #{param1}
</update>
</mapper>

@ -295,7 +295,7 @@
return e.value ? moment(e.value, 'YYYYMMDD').format('YYYY-MM-DD') : '';
}
},
{ header: '과태료대상구분코드', name: 'ffnlgTrgtSeCd', align: 'center', width: 120 },
{ header: '과태료대상구분코드', name: 'ffnlgTrgtSeCd', align: 'center', width: 120, hidden: true },
{ header: '검사소코드', name: 'inspstnCd', align: 'center', width: 100 },
{ header: '검사일자', name: 'inspYmd', align: 'center', width: 100,
formatter: function(e) {
@ -339,7 +339,14 @@
}
},
{ header: '비고', name: 'rmrk', align: 'left', width: 200 },
{
{ header: '기본사항조회성명', name: 'carBscMttrInqFlnm', align: 'center', width: 100 },
{ header: '기본사항조회시군구코드', name: 'carBscMttrInqSggCd', align: 'center', width: 100, hidden: true },
{ header: '기본사항조회시군구명', name: 'carBscMttrInqSggNm', align: 'center', width: 120 },
{ header: '등록원부변경업무코드', name: 'carRegFrmbkChgTaskSeCd', align: 'center', width: 100, hidden: true },
{ header: '등록원부변경업무명', name: 'carRegFrmbkChgTaskSeNm', align: 'center', width: 120 },
{ header: '등록원부변경일자', name: 'carRegFrmbkChgYmd', align: 'center', width: 120 },
{ header: '등록원부상세', name: 'carRegFrmbkDtl', align: 'left', width: 250 },
/*{
header: '차량기본사항조회ID',
name: 'carBassMatterInqireId',
align: 'center',
@ -362,7 +369,8 @@
}
return '';
}
},
},*/
{ header: '등록일시', name: 'regDt', align: 'center', width: 150 },
{ header: '등록자ID', name: 'rgtr', align: 'center', width: 100, hidden: true },
{ header: '등록자', name: 'rgtrNm', align: 'center', width: 100 },

Loading…
Cancel
Save