[행위] ERP 전송 시 재고단위/관리단위 code_name 변환 및 하드코딩 제거

- partMng.xml: selectPartByObjid, selectAllPartListForErp에 COMM_CODE JOIN 추가하여 UNIT_DC_NM, UNITMANG_DC_NM 반환
- partMng.xml: partMngBaseSimple에 ODRFG_NM CASE WHEN 변환 추가 (구매/생산/Phantom), LOT_FG 등 NULL일 때 빈값 처리
- BatchService: sendAllPartsToErp, sendSinglePartToErp에서 unit_dc_nm, unitmang_dc_nm 사용
- BatchService: updatePartToErp, updateAllPartsToErp 하드코딩 제거 → DB 값 사용 + 필수값 검증 추가
- BatchService: deletePartFromErp 주석 해제
- BatchService: sendSinglePartToErp에 전송 데이터 및 응답 로그 추가

Made-with: Cursor
This commit is contained in:
2026-03-10 17:58:35 +09:00
parent ffb56aebe6
commit 2fbb9f66d2
2 changed files with 110 additions and 69 deletions

View File

@@ -8368,46 +8368,54 @@ SELECT PM.OBJID
<!-- ERP 전송을 위한 전체 PART 목록 조회 -->
<select id="selectAllPartListForErp" resultType="map">
SELECT
OBJID,
PART_NO,
PART_NAME,
SPEC,
acctfg,
odrfg,
UNIT_DC,
UNITMANG_DC,
UNITCHNG_NB,
LOT_FG,
USE_YN,
QC_FG,
SETITEM_FG,
REQ_FG
FROM PART_MNG
WHERE STATUS = 'release'
AND PART_NO IS NOT NULL
AND PART_NAME IS NOT NULL
ORDER BY PART_NO
P.OBJID,
P.PART_NO,
P.PART_NAME,
P.SPEC,
P.acctfg,
P.odrfg,
P.UNIT_DC,
COALESCE(CC_UNIT.CODE_NAME, P.UNIT_DC) AS UNIT_DC_NM,
P.UNITMANG_DC,
COALESCE(CC_UNITMANG.CODE_NAME, P.UNITMANG_DC) AS UNITMANG_DC_NM,
P.UNITCHNG_NB,
P.LOT_FG,
P.USE_YN,
P.QC_FG,
P.SETITEM_FG,
P.REQ_FG
FROM PART_MNG P
LEFT JOIN COMM_CODE CC_UNIT ON CC_UNIT.CODE_ID = P.UNIT_DC
LEFT JOIN COMM_CODE CC_UNITMANG ON CC_UNITMANG.CODE_ID = P.UNITMANG_DC
WHERE P.STATUS = 'release'
AND P.PART_NO IS NOT NULL
AND P.PART_NAME IS NOT NULL
ORDER BY P.PART_NO
</select>
<!-- OBJID로 단일 PART 조회 -->
<select id="selectPartByObjid" parameterType="map" resultType="map">
SELECT
OBJID,
PART_NO,
PART_NAME,
SPEC,
acctfg,
odrfg,
UNIT_DC,
UNITMANG_DC,
UNITCHNG_NB,
LOT_FG,
USE_YN,
QC_FG,
SETITEM_FG,
REQ_FG
FROM PART_MNG
WHERE OBJID = #{objid}
P.OBJID,
P.PART_NO,
P.PART_NAME,
P.SPEC,
P.acctfg,
P.odrfg,
P.UNIT_DC,
COALESCE(CC_UNIT.CODE_NAME, P.UNIT_DC) AS UNIT_DC_NM,
P.UNITMANG_DC,
COALESCE(CC_UNITMANG.CODE_NAME, P.UNITMANG_DC) AS UNITMANG_DC_NM,
P.UNITCHNG_NB,
P.LOT_FG,
P.USE_YN,
P.QC_FG,
P.SETITEM_FG,
P.REQ_FG
FROM PART_MNG P
LEFT JOIN COMM_CODE CC_UNIT ON CC_UNIT.CODE_ID = P.UNIT_DC
LEFT JOIN COMM_CODE CC_UNITMANG ON CC_UNITMANG.CODE_ID = P.UNITMANG_DC
WHERE P.OBJID = #{objid}
</select>
</mapper>

View File

@@ -1508,9 +1508,9 @@ public class BatchService extends BaseService {
// 회사코드 고정값
String coCd = "1000";
// DB에서 가져온 ERP 연동 필드
String unitDc = CommonUtils.checkNull(part.get("unit_dc"));
String unitmangDc = CommonUtils.checkNull(part.get("unitmang_dc"));
// DB에서 가져온 ERP 연동 필드 (code_name으로 변환된 값 사용)
String unitDc = CommonUtils.checkNull(part.get("unit_dc_nm"));
String unitmangDc = CommonUtils.checkNull(part.get("unitmang_dc_nm"));
String unitchngNbStr = CommonUtils.checkNull(part.get("unitchng_nb"));
int unitchngNb = 0;
try {
@@ -1540,7 +1540,7 @@ public class BatchService extends BaseService {
}
// ERP로 전송
String response = partErpClient.sendPartToErp(baseUrl, coCd, itemCd, itemNm,itemDc,
String response = partErpClient.sendPartToErp(baseUrl, coCd, itemCd, itemNm, itemDc,
acctFg, odrFg, unitDc, unitmangDc, unitchngNb, lotFg, qcFg, reqFg, setitemFg, useYn);
// 응답 확인
@@ -1616,9 +1616,9 @@ public class BatchService extends BaseService {
// 회사코드 고정값
String coCd = "1000";
// DB에서 가져온 ERP 연동 필드
String unitDc = CommonUtils.checkNull(part.get("unit_dc"));
String unitmangDc = CommonUtils.checkNull(part.get("unitmang_dc"));
// DB에서 가져온 ERP 연동 필드 (code_name으로 변환된 값 사용)
String unitDc = CommonUtils.checkNull(part.get("unit_dc_nm"));
String unitmangDc = CommonUtils.checkNull(part.get("unitmang_dc_nm"));
String unitchngNbStr = CommonUtils.checkNull(part.get("unitchng_nb"));
int unitchngNb = 0;
try {
@@ -1804,31 +1804,54 @@ public class BatchService extends BaseService {
return result;
}
// DB에서 가져온 값
// DB에서 가져온 값
String itemCd = CommonUtils.checkNull(part.get("part_no"));
String itemNm = CommonUtils.checkNull(part.get("part_name"));
String acctFg = CommonUtils.checkNull(part.get("acctfg"));
String odrFg = CommonUtils.checkNull(part.get("odrfg"));
String itemDc = CommonUtils.checkNull(part.get("spec"));
// 하드코딩 고정값
String coCd = "1000"; // 회사코드
String unitDc = "1"; // 단위
String unitmangDc = "1"; // 단위관리
int unitchngNb = 1; // 단위변환
String lotFg = "0"; // LOT구분
String qcFg = "0"; // 검사구분
String reqFg = "0"; // 청구구분
String setitemFg = "0"; // 세트품목구분
String useYn = "1"; // 사용여부
String coCd = "1000";
// DB에서 가져온 ERP 연동 필드 (code_name으로 변환된 값 사용)
String unitDc = CommonUtils.checkNull(part.get("unit_dc_nm"));
String unitmangDc = CommonUtils.checkNull(part.get("unitmang_dc_nm"));
String unitchngNbStr = CommonUtils.checkNull(part.get("unitchng_nb"));
int unitchngNb = 0;
try {
if (!unitchngNbStr.isEmpty()) {
unitchngNb = (int) Double.parseDouble(unitchngNbStr);
}
} catch (Exception e) {
// 변환 실패 시 0 유지
}
String lotFg = CommonUtils.checkNull(part.get("lot_fg"));
String qcFg = CommonUtils.checkNull(part.get("qc_fg"));
String reqFg = CommonUtils.checkNull(part.get("req_fg"));
String setitemFg = CommonUtils.checkNull(part.get("setitem_fg"));
String useYn = CommonUtils.checkNull(part.get("use_yn"));
// 필수값 체크
if (itemCd.isEmpty() || itemNm.isEmpty()) {
result.put("success", false);
result.put("message", "품번 또는 품명이 없습니다.");
return result;
}
if (acctFg.isEmpty() || odrFg.isEmpty()) {
result.put("success", false);
result.put("message", "계정구분 또는 조달구분이 없습니다.");
return result;
}
if (unitDc.isEmpty() || unitmangDc.isEmpty() || unitchngNb == 0) {
result.put("success", false);
result.put("message", "재고단위, 관리단위, 환산수량이 없습니다.");
return result;
}
if (lotFg.isEmpty() || qcFg.isEmpty() || reqFg.isEmpty() || setitemFg.isEmpty() || useYn.isEmpty()) {
result.put("success", false);
result.put("message", "LOT구분, 검사여부, 의뢰여부, SET품여부, 사용여부가 없습니다.");
return result;
}
// ERP로 수정 전송
PartErpUpdateApiClient updateClient = new PartErpUpdateApiClient();
String response = updateClient.updatePartToErp(baseUrl, coCd, itemCd, itemNm, itemDc,
@@ -1887,16 +1910,7 @@ public class BatchService extends BaseService {
int failCount = 0;
StringBuilder errorMessages = new StringBuilder();
// 하드코딩 고정값
String coCd = "1000";
String unitDc = "1";
String unitmangDc = "1";
int unitchngNb = 1;
String lotFg = "0";
String qcFg = "0";
String reqFg = "0";
String setitemFg = "0";
String useYn = "1";
String coCd = "1000";
PartErpUpdateApiClient updateClient = new PartErpUpdateApiClient();
@@ -1910,6 +1924,23 @@ public class BatchService extends BaseService {
String acctFg = CommonUtils.checkNull(part.get("acctfg"));
String odrFg = CommonUtils.checkNull(part.get("odrfg"));
String itemDc = CommonUtils.checkNull(part.get("spec"));
// DB에서 가져온 ERP 연동 필드 (code_name으로 변환된 값 사용)
String unitDc = CommonUtils.checkNull(part.get("unit_dc_nm"));
String unitmangDc = CommonUtils.checkNull(part.get("unitmang_dc_nm"));
String unitchngNbStr = CommonUtils.checkNull(part.get("unitchng_nb"));
int unitchngNb = 0;
try {
if (!unitchngNbStr.isEmpty()) {
unitchngNb = (int) Double.parseDouble(unitchngNbStr);
}
} catch (Exception ex) {
// 변환 실패 시 0 유지
}
String lotFg = CommonUtils.checkNull(part.get("lot_fg"));
String qcFg = CommonUtils.checkNull(part.get("qc_fg"));
String reqFg = CommonUtils.checkNull(part.get("req_fg"));
String setitemFg = CommonUtils.checkNull(part.get("setitem_fg"));
String useYn = CommonUtils.checkNull(part.get("use_yn"));
// 100건마다 진행 상황 출력
if ((i + 1) % 100 == 0) {
@@ -1917,14 +1948,16 @@ public class BatchService extends BaseService {
}
// 필수값 체크
if (itemCd.isEmpty() || itemNm.isEmpty()) {
if (itemCd.isEmpty() || itemNm.isEmpty() || acctFg.isEmpty() || odrFg.isEmpty() ||
unitDc.isEmpty() || unitmangDc.isEmpty() || unitchngNb == 0 ||
lotFg.isEmpty() || qcFg.isEmpty() || reqFg.isEmpty() || setitemFg.isEmpty() || useYn.isEmpty()) {
failCount++;
if (failCount <= 5) {
errorMessages.append(itemCd).append(": 품번 또는 품명이 없습니다.\n");
errorMessages.append(itemCd).append(": 필수값이 없습니다.\n");
}
continue;
}
// ERP로 수정 전송
String response = updateClient.updatePartToErp(baseUrl, coCd, itemCd, itemNm, itemDc,
acctFg, odrFg, unitDc, unitmangDc, unitchngNb, lotFg, qcFg, reqFg, setitemFg, useYn);