Files
eapim-online/src/main/java/com/eactive/eai/custom/message/InterfaceMapperDJB.java
T
2026-06-17 13:53:46 +09:00

231 lines
9.1 KiB
Java

package com.eactive.eai.custom.message;
import org.apache.commons.lang3.StringUtils;
import com.eactive.eai.common.property.PropManager;
import com.eactive.eai.common.server.EAIServerManager;
import com.eactive.eai.message.StandardMessage;
import com.eactive.eai.message.service.DefaultInterfaceMapper;
import com.ext.eai.common.stdmessage.STDMessageKeys;
/**
* DJBank(제주은행) 차세대 표준전문 InterfaceMapper
*
* HEAD 영역이 평면 구조로 변경됨에 따라 필드 접근 경로 및 값 변환 로직을 재정의.
*
* 주요 변경사항:
* - GUID: 40자 (기존 36자)
* - GUID 진행번호: HEAD.guid_prgs_no 별도 필드 (기존 GUID 문자열 내 포함)
* - 처리결과구분코드: S(성공)/F(오류) (기존 NR/ER)
* - 시스템환경구분코드: D/T/P (기존 O/S/D)
*/
@SuppressWarnings("serial")
public class InterfaceMapperDJB extends DefaultInterfaceMapper {
private static final String PATH_MCI_NODE = "HEAD.mci_node_dvcd";
private static final String PATH_EAI_NODE = "HEAD.eai_node_dvcd";
private static final String PATH_MCI_SESN = "HEAD.mci_sesn_id";
// 처리결과구분코드 DJBank 값
private static final String PROCS_RSLT_SUCCESS = "S";
private static final String PROCS_RSLT_FAIL = "F";
private static String API_ID_PREFIX = StringUtils
.defaultString(PropManager.getInstance().getProperty("API_ID_PREFIX"));
@Override
public String getEaiSvcCode(StandardMessage standardMessage) {
if(StringUtils.isNotBlank(standardMessage.getEaiSvcCd()))
return standardMessage.getEaiSvcCd();
String eaiInterfaceId = getInterfaceId(standardMessage);
// String txId = getServiceId(standardMessage);
String sendRecvDvcd = getSendRecvDivision(standardMessage); // S | R
String inExDivision = getInExDivision(standardMessage); // 1 | 2
if(StringUtils.isEmpty(eaiInterfaceId))
throw new RuntimeException("not found if_id");
return API_ID_PREFIX + StringUtils.substring(eaiInterfaceId, 2) + sendRecvDvcd + StringUtils.defaultString(inExDivision);
}
// ----------------------------------------------------------------
// GUID (40자 고정)
// ----------------------------------------------------------------
@Override
public void setGuid(StandardMessage standardMessage, String guid) {
if (guid == null) throw new RuntimeException("guid is null");
if (guid.length() != GUIDGeneratorDJB.GUID_LENGTH) {
throw new RuntimeException("GUID length must be " + GUIDGeneratorDJB.GUID_LENGTH + ", actual=" + guid.length());
}
setItemValue(standardMessage, getPath(GUID), guid);
}
@Override
public String getGuid(StandardMessage standardMessage) {
return StringUtils.defaultString(getItemValue(standardMessage, getPath(GUID)));
}
// ----------------------------------------------------------------
// GUID 진행번호 — HEAD.guid_prgs_no 별도 필드
// ----------------------------------------------------------------
@Override
public String getGuidSeq(StandardMessage standardMessage) {
String val = getItemValue(standardMessage, getPath(GUID_SEQ));
if (StringUtils.isBlank(val)) return "001";
try {
// NUMBER 타입은 내부적으로 선행 0 제거 → 조회 시 3자리로 복원
return String.format("%03d", Integer.parseInt(val.trim()));
} catch (NumberFormatException e) {
return StringUtils.defaultString(val, "001");
}
}
@Override
public void setGuidSeq(StandardMessage standardMessage, String guidSeq) {
setItemValue(standardMessage, getPath(GUID_SEQ), guidSeq);
}
@Override
public String nextGuidSeq(StandardMessage standardMessage) {
String current = getGuidSeq(standardMessage);
int seq = 1;
try {
seq = Integer.parseInt(current.trim()) + 1;
} catch (NumberFormatException e) {
seq = 2;
}
String next = String.format("%03d", seq);
setGuidSeq(standardMessage, next);
return next;
}
// ----------------------------------------------------------------
// 원거래 GUID — HEAD.ortr_guid (40자 그대로)
// ----------------------------------------------------------------
@Override
public String getOrgGuid(StandardMessage standardMessage) {
return StringUtils.defaultString(getItemValue(standardMessage, getPath(GUID_ORG)));
}
@Override
public void setOrgGuid(StandardMessage standardMessage, String orgGuid) {
setItemValue(standardMessage, getPath(GUID_ORG), orgGuid);
}
// ----------------------------------------------------------------
// 처리결과구분코드: 엔진 내부(0=정상, 1=오류) ↔ DJBank(S/F)
// ----------------------------------------------------------------
@Override
public String getResponseType(StandardMessage standardMessage) {
String val = getItemValue(standardMessage, getPath(RESPONSE_TYPE));
if (PROCS_RSLT_SUCCESS.equals(val)) return STDMessageKeys.RESPONSE_TYPE_CODE_N;
if (PROCS_RSLT_FAIL.equals(val)) return STDMessageKeys.RESPONSE_TYPE_CODE_E;
return val;
}
@Override
public void setResponseType(StandardMessage standardMessage, String responseType) {
String siteVal;
if (STDMessageKeys.RESPONSE_TYPE_CODE_N.equals(responseType)) {
siteVal = PROCS_RSLT_SUCCESS;
} else if (STDMessageKeys.RESPONSE_TYPE_CODE_E.equals(responseType)) {
siteVal = PROCS_RSLT_FAIL;
} else {
siteVal = responseType;
}
setItemValue(standardMessage, getPath(RESPONSE_TYPE), siteVal);
}
// ----------------------------------------------------------------
// 원거래복원여부: Y/N 그대로 사용 (엔진 내부 1/0과 변환)
// ----------------------------------------------------------------
@Override
public String getRecoverYn(StandardMessage standardMessage) {
String val = getItemValue(standardMessage, getPath(RECOVER_YN));
return "Y".equals(val) ? "1" : "0";
}
@Override
public void setRecoverYn(StandardMessage standardMessage, String recoverYn) {
setItemValue(standardMessage, getPath(RECOVER_YN), "1".equals(recoverYn) ? "Y" : "N");
}
// ----------------------------------------------------------------
// 인터페이스ID (trim 처리)
// ----------------------------------------------------------------
@Override
public String getInterfaceId(StandardMessage standardMessage) {
String val = getItemValue(standardMessage, getPath(INTERFACE_ID));
return val == null ? "" : val.trim();
}
// ----------------------------------------------------------------
// 세션ID / 인스턴스코드 — MCI 여부에 따라 처리
// ----------------------------------------------------------------
@Override
public String getSessionId(StandardMessage standardMessage) {
EAIServerManager server = EAIServerManager.getInstance();
if (server != null && server.isMCI()) {
return StringUtils.defaultString(getItemValue(standardMessage, PATH_MCI_SESN));
}
return "";
}
@Override
public void setSessionId(StandardMessage standardMessage, String sessionId) {
EAIServerManager server = EAIServerManager.getInstance();
if (server != null && server.isMCI()) {
setItemValue(standardMessage, PATH_MCI_SESN, sessionId);
}
}
@Override
public String getInstCode(StandardMessage standardMessage) {
EAIServerManager server = EAIServerManager.getInstance();
if (server != null && server.isMCI()) {
return StringUtils.defaultString(getItemValue(standardMessage, PATH_MCI_NODE));
}
return StringUtils.defaultString(getItemValue(standardMessage, PATH_EAI_NODE));
}
@Override
public void setInstCode(StandardMessage standardMessage, String instCode) {
EAIServerManager server = EAIServerManager.getInstance();
if (server != null && server.isMCI()) {
setItemValue(standardMessage, PATH_MCI_NODE, instCode);
} else {
setItemValue(standardMessage, PATH_EAI_NODE, instCode);
}
}
// ----------------------------------------------------------------
// 요청시스템코드 — 채널유형코드(chnl_tycd)에서 추출
// ----------------------------------------------------------------
@Override
public String getReqSysCode(StandardMessage standardMessage) {
String chnlTycd = getItemValue(standardMessage, getPath(CHANNEL_TYPE_CD));
if (StringUtils.isNotBlank(chnlTycd)) {
return chnlTycd.trim();
}
// fallback: tx_id(서비스ID) 경로에서 추출
String txId = getItemValue(standardMessage, getPath(SERVICE_ID));
if (txId != null) {
String[] split = txId.split("/");
if (split.length > 1) {
String route = split[1].toUpperCase();
return route.length() > 3 ? route.substring(0, 3) : route;
}
}
return null;
}
}