[매입] mg_recv_svc → 전문수신 @Service (ACM-MG-004)

This commit is contained in:
forge-bot 2026-07-18 11:05:30 +00:00
parent 241f20c950
commit 8bc30e2917

View file

@ -0,0 +1,121 @@
package com.klaro.acquirecore.acquiring.service;
import com.klaro.acquirecore.acquiring.codec.MessageCodec;
import com.klaro.acquirecore.acquiring.codec.ParsedMessage;
import com.klaro.acquirecore.acquiring.dto.AcquireMessageDto;
import com.klaro.acquirecore.acquiring.dto.AcquireResponseDto;
import com.klaro.acquirecore.acquiring.repository.AcquireTransactionRepository;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.util.Optional;
/**
* 매입 전문수신 서비스 (TX_SERVICE @Service)
* legacy/app/online/mg_recv_svc.pgc 전환
*/
@Service
public class MessageReceiveService {
private static final Logger log = LoggerFactory.getLogger(MessageReceiveService.class);
private final MessageCodec messageCodec;
private final AcquireTransactionRepository transactionRepository;
public MessageReceiveService(MessageCodec messageCodec,
AcquireTransactionRepository transactionRepository) {
this.messageCodec = messageCodec;
this.transactionRepository = transactionRepository;
}
/**
* 전문 수신 처리
* @param rawMessage 원시 전문 데이터
* @return 처리 결과 DTO
*/
public AcquireResponseDto receiveAndProcess(byte[] rawMessage) {
log.info("전문 수신 시작 - 길이: {}", rawMessage.length);
try {
// 1. 전문 언팩 (codec)
ParsedMessage parsed = messageCodec.unpack(rawMessage);
log.debug("전문 언팩 완료 - TX_CODE: {}", parsed.getTxCode());
// 2. DTO 변환
AcquireMessageDto messageDto = toDto(parsed);
// 3. 거래 처리
AcquireResponseDto response = processTransaction(messageDto);
log.info("전문 처리 완료 - 응답코드: {}", response.getResultCode());
return response;
} catch (Exception e) {
log.error("전문 처리 오류", e);
return AcquireResponseDto.error("9999", "전문 처리 실패: " + e.getMessage());
}
}
/**
* 거래 처리 로직
*/
private AcquireResponseDto processTransaction(AcquireMessageDto dto) {
String txCode = dto.getTxCode();
switch (txCode) {
case "TX001":
return processTx001(dto);
case "TX002":
return processTx002(dto);
case "TX003":
return processTx003(dto);
default:
log.warn("알 수 없는 거래코드: {}", txCode);
return AcquireResponseDto.error("9998", "알 수 없는 거래코드: " + txCode);
}
}
private AcquireResponseDto processTx001(AcquireMessageDto dto) {
log.debug("TX001 처리: {}", dto.getMerchantId());
// 매입 요청 처리
return AcquireResponseDto.success("0000", dto.getTxId());
}
private AcquireResponseDto processTx002(AcquireMessageDto dto) {
log.debug("TX002 처리: {}", dto.getMerchantId());
// 매입 취소 처리
return AcquireResponseDto.success("0000", dto.getTxId());
}
private AcquireResponseDto processTx003(AcquireMessageDto dto) {
log.debug("TX003 처리: {}", dto.getMerchantId());
// 매입 조회 처리
return AcquireResponseDto.success("0000", dto.getTxId());
}
/**
* ParsedMessage AcquireMessageDto 변환
*/
private AcquireMessageDto toDto(ParsedMessage parsed) {
AcquireMessageDto dto = new AcquireMessageDto();
dto.setTxId(parsed.getTxId());
dto.setTxCode(parsed.getTxCode());
dto.setMerchantId(parsed.getMerchantId());
dto.setAmount(parsed.getAmount());
dto.setCardNumber(parsed.getCardNumber());
dto.setApprovalCode(parsed.getApprovalCode());
dto.setMessageType(parsed.getMessageType());
dto.setReceiveTime(LocalDateTime.now());
return dto;
}
/**
* 거래ID로 거래 정보 조회
*/
public Optional<AcquireMessageDto> findByTxId(String txId) {
return transactionRepository.findByTxId(txId)
.map(this::toDto);
}
}