품목 API 업데이트

This commit is contained in:
2026-02-09 15:59:27 +09:00
parent 859041d758
commit 1322b325c3
6 changed files with 706 additions and 17 deletions

View File

@@ -49,11 +49,16 @@ String connector = person.getUserId();
fn_deletePartMng();
});
$("#btnDeploy").click(function(){
fn_partMngDeploy();
});
//image src encoding
$("#btnDeploy").click(function(){
fn_partMngDeploy();
});
//ERP 전송
$("#btnSendErp").click(function(){
fn_sendErp();
});
//image src encoding
$("img").each(function(i) {
var imgSrc = $(this).attr("data-SRC");
$(this).attr("src", encodeURI(imgSrc));
@@ -473,6 +478,56 @@ String connector = person.getUserId();
});
}
// ERP 전송 함수
function fn_sendErp(){
if(confirm("전체 PART 정보를 ERP로 전송하시겠습니까?\n(시간이 다소 소요될 수 있습니다)")){
// 로딩 표시
Swal.fire({
title: '전송 중...',
text: 'PART 정보를 ERP로 전송하는 중입니다. 잠시만 기다려주세요.',
allowOutsideClick: false,
didOpen: () => {
Swal.showLoading();
}
});
$.ajax({
type : "POST",
url : "/admin/sendAllPartsToErp.do",
dataType:"json",
success:function(data){
Swal.close();
if(data.success){
var message = data.message;
if(data.errors){
message += "\n\n에러 상세:\n" + data.errors;
}
Swal.fire({
icon: 'success',
title: '전송 완료',
text: message,
width: '600px'
});
} else {
Swal.fire({
icon: 'error',
title: '전송 실패',
text: data.message
});
}
},
error: function(jqxhr, status, error){
Swal.close();
Swal.fire({
icon: 'error',
title: '오류 발생',
text: 'PART 전송 중 오류가 발생했습니다.'
});
}
});
}
}
</script>
</head>
<body class="backcolor">
@@ -498,6 +553,7 @@ String connector = person.getUserId();
<input type="button" value="도면 다중 업로드" class="plm_btns" id="btnDrawingUpload">
<input type="button" value="조회" class="plm_btns" id="btnSearch">
<input type="button" value="Excel Download" class="plm_btns excelIcon" id="btnExcel">
<input type="button" value="ERP 전송" class="plm_btns" id="btnSendErp" style="background-color:#4CAF50;color:white;">
<input type="file" id="drawingFiles" multiple style="display:none;" accept=".stp,.step,.dwg,.dxf,.pdf">
</div>
</div>

View File

@@ -286,18 +286,27 @@ ui-jqgrid tr.jqgrow td {
param.dataListJson = JSON.stringify(_tabulGrid.getSelectedData());
$.ajax({
url:"/partMng/partMngDeploy.do",
type:"POST",
data: param,
//data:{"OBJID":OBJID},
dataType:"json",
success:function(data){
Swal.fire(data.msg);
fn_search();
},
error: function(jqxhr, status, error){
}
});
url:"/partMng/partMngDeploy.do",
type:"POST",
data: param,
//data:{"OBJID":OBJID},
dataType:"json",
success:function(data){
Swal.fire(data.msg);
fn_search();
// 확정 성공 시 ERP로 전송
if(data.result == true || data.result == 'true'){
var selectedData = _tabulGrid.getSelectedData();
if(selectedData && selectedData.length > 0){
var partObjid = selectedData[0].OBJID;
fn_sendSinglePartToErp(partObjid);
}
}
},
error: function(jqxhr, status, error){
}
});
}
});
}
@@ -577,6 +586,26 @@ ui-jqgrid tr.jqgrow td {
window.open(url, target,"width=1520, height=860, menubars=no, scrollbars=yes, resizable=yes");
}
// 단일 PART ERP 전송
function fn_sendSinglePartToErp(partObjid){
$.ajax({
type : "POST",
url : "/admin/sendSinglePartToErp.do",
data : {partObjid: partObjid},
dataType:"json",
success:function(data){
if(data.success){
console.log("ERP 전송 성공: " + data.message);
} else {
console.log("ERP 전송 실패: " + data.message);
}
},
error: function(jqxhr, status, error){
console.log("ERP 전송 오류");
}
});
}
</script>
</head>
<body class="backcolor">

View File

@@ -0,0 +1,293 @@
package com.pms.api;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import java.security.cert.X509Certificate;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Base64;
import java.util.Random;
/**
* PART 정보 ERP 전송 API 클라이언트
* PLM의 PART 정보를 ERP로 전송합니다.
*/
public class PartErpApiClient {
private static final String API_URL = "~/apiproxy/api20A00I00701";
private static final String CALLER_NAME = "API_gcmsAmaranth40578";
private static final String ACCESS_TOKEN = "MN5KzKBWRAa92BPxDlRLl3GcsxeZXc";
private static final String HASH_KEY = "22519103205540290721741689643674301018832465";
private static final String GROUP_SEQ = "gcmsAmaranth40578";
/**
* PART 정보를 ERP로 전송합니다.
*
* @param baseUrl API 서버의 기본 URL
* @param coCd 회사코드 (4자리)
* @param itemCd 품번 (30자리)
* @param itemNm 품명 (100자리)
* @param acctFg 계정구분 (0:원재료,1:부재료,2:제품,4:반제품,5:상품,6:저장품,7:비용,8:수익)
* @param odrFg 조달구분 (0:구매,1:생산,8:Phantom)
* @param unitDc 단위 (기본값: "1")
* @param unitmangDc 단위관리 (기본값: "1")
* @param unitchngNb 단위변환 (기본값: 1)
* @param lotFg LOT구분 (기본값: "0")
* @param qcFg 검사구분 (기본값: "0")
* @param reqFg 청구구분 (기본값: "0")
* @param setitemFg 세트품목구분 (기본값: "0")
* @param useYn 사용여부 (기본값: "1")
* @return API 응답 결과 (JSON 문자열)
* @throws Exception API 호출 중 발생하는 예외
*/
public String sendPartToErp(String baseUrl, String coCd, String itemCd, String itemNm,
String acctFg, String odrFg, String unitDc, String unitmangDc,
int unitchngNb, String lotFg, String qcFg, String reqFg,
String setitemFg, String useYn) throws Exception {
if (coCd == null || coCd.trim().isEmpty()) {
throw new IllegalArgumentException("회사코드(coCd)는 필수입니다.");
}
if (itemCd == null || itemCd.trim().isEmpty()) {
throw new IllegalArgumentException("품번(itemCd)는 필수입니다.");
}
if (itemNm == null || itemNm.trim().isEmpty()) {
throw new IllegalArgumentException("품명(itemNm)는 필수입니다.");
}
if (acctFg == null || acctFg.trim().isEmpty()) {
throw new IllegalArgumentException("계정구분(acctFg)는 필수입니다.");
}
if (odrFg == null || odrFg.trim().isEmpty()) {
throw new IllegalArgumentException("조달구분(odrFg)는 필수입니다.");
}
// JDK 1.7에서 TLS 1.2 활성화
System.setProperty("https.protocols", "TLSv1.2");
// SSL 인증서 검증 우회
TrustManager[] trustAllCerts = new TrustManager[] {
new X509TrustManager() {
public X509Certificate[] getAcceptedIssuers() {
return null;
}
public void checkClientTrusted(X509Certificate[] certs, String authType) {
}
public void checkServerTrusted(X509Certificate[] certs, String authType) {
}
}
};
SSLContext sc = SSLContext.getInstance("TLS");
sc.init(null, trustAllCerts, new java.security.SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
HttpsURLConnection.setDefaultHostnameVerifier(new javax.net.ssl.HostnameVerifier() {
public boolean verify(String hostname, javax.net.ssl.SSLSession session) {
return true;
}
});
// API URL 구성
String urlPath = API_URL.replace("~", "");
String cleanBaseUrl = baseUrl.endsWith("/") ? baseUrl.substring(0, baseUrl.length() - 1) : baseUrl;
String fullUrl = cleanBaseUrl + urlPath;
URL url = new URL(fullUrl);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setConnectTimeout(30000);
connection.setReadTimeout(30000);
connection.setInstanceFollowRedirects(false);
try {
connection.setRequestMethod("POST");
connection.setRequestProperty("Content-Type", "application/json; charset=UTF-8");
connection.setRequestProperty("Accept", "application/json");
// 인증 헤더 설정
connection.setRequestProperty("callerName", CALLER_NAME);
connection.setRequestProperty("Authorization", "Bearer " + ACCESS_TOKEN);
String transactionId = generateTransactionId();
connection.setRequestProperty("transaction-id", transactionId);
String timestamp = String.valueOf(System.currentTimeMillis() / 1000);
connection.setRequestProperty("timestamp", timestamp);
connection.setRequestProperty("groupSeq", GROUP_SEQ);
String wehagoSign = generateWehagoSign(ACCESS_TOKEN, transactionId, timestamp, urlPath);
connection.setRequestProperty("wehago-sign", wehagoSign);
// 요청 본문 작성
String requestBody = buildRequestBody(coCd, itemCd, itemNm, acctFg, odrFg,
unitDc, unitmangDc, unitchngNb, lotFg, qcFg, reqFg, setitemFg, useYn);
connection.setDoOutput(true);
connection.setDoInput(true);
OutputStreamWriter writer = new OutputStreamWriter(
connection.getOutputStream(), StandardCharsets.UTF_8);
writer.write(requestBody);
writer.flush();
writer.close();
int responseCode = connection.getResponseCode();
// 리다이렉트 처리
if (responseCode == 301 || responseCode == 302 || responseCode == 303 ||
responseCode == 307 || responseCode == 308) {
String location = connection.getHeaderField("Location");
connection.disconnect();
if (location != null) {
URL redirectUrl = new URL(location);
connection = (HttpURLConnection) redirectUrl.openConnection();
connection.setConnectTimeout(30000);
connection.setReadTimeout(30000);
connection.setInstanceFollowRedirects(false);
connection.setRequestMethod("POST");
connection.setRequestProperty("Content-Type", "application/json; charset=UTF-8");
connection.setRequestProperty("Accept", "application/json");
connection.setRequestProperty("callerName", CALLER_NAME);
connection.setRequestProperty("Authorization", "Bearer " + ACCESS_TOKEN);
connection.setRequestProperty("transaction-id", transactionId);
connection.setRequestProperty("timestamp", timestamp);
connection.setRequestProperty("groupSeq", GROUP_SEQ);
connection.setRequestProperty("wehago-sign", wehagoSign);
connection.setDoOutput(true);
connection.setDoInput(true);
OutputStreamWriter redirectWriter = new OutputStreamWriter(
connection.getOutputStream(), StandardCharsets.UTF_8);
redirectWriter.write(requestBody);
redirectWriter.flush();
redirectWriter.close();
responseCode = connection.getResponseCode();
}
}
// 응답 읽기
BufferedReader reader = null;
StringBuilder response = new StringBuilder();
try {
if (responseCode >= 200 && responseCode < 300) {
reader = new BufferedReader(new InputStreamReader(
connection.getInputStream(), StandardCharsets.UTF_8));
} else {
java.io.InputStream errorStream = connection.getErrorStream();
if (errorStream != null) {
reader = new BufferedReader(new InputStreamReader(
errorStream, StandardCharsets.UTF_8));
} else {
throw new Exception("API 호출 실패: HTTP " + responseCode);
}
}
String line;
while ((line = reader.readLine()) != null) {
response.append(line);
}
} finally {
if (reader != null) {
reader.close();
}
}
if (responseCode >= 200 && responseCode < 300) {
return response.toString();
} else {
throw new Exception("API 호출 실패: HTTP " + responseCode + " - " + response.toString());
}
} finally {
connection.disconnect();
}
}
/**
* 요청 본문 JSON 생성
*/
private String buildRequestBody(String coCd, String itemCd, String itemNm,
String acctFg, String odrFg, String unitDc,
String unitmangDc, int unitchngNb, String lotFg,
String qcFg, String reqFg, String setitemFg, String useYn) {
StringBuilder json = new StringBuilder();
json.append("{");
json.append("\"coCd\":\"").append(escapeJson(coCd)).append("\"");
json.append(",\"itemCd\":\"").append(escapeJson(itemCd)).append("\"");
json.append(",\"itemNm\":\"").append(escapeJson(itemNm)).append("\"");
json.append(",\"acctFg\":\"").append(escapeJson(acctFg)).append("\"");
json.append(",\"odrFg\":\"").append(escapeJson(odrFg)).append("\"");
json.append(",\"unitDc\":\"").append(escapeJson(unitDc)).append("\"");
json.append(",\"unitmangDc\":\"").append(escapeJson(unitmangDc)).append("\"");
json.append(",\"unitchngNb\":").append(unitchngNb);
json.append(",\"lotFg\":\"").append(escapeJson(lotFg)).append("\"");
json.append(",\"qcFg\":\"").append(escapeJson(qcFg)).append("\"");
json.append(",\"reqFg\":\"").append(escapeJson(reqFg)).append("\"");
json.append(",\"setitemFg\":\"").append(escapeJson(setitemFg)).append("\"");
json.append(",\"useYn\":\"").append(escapeJson(useYn)).append("\"");
json.append("}");
return json.toString();
}
/**
* JSON 문자열 이스케이프 처리
*/
private String escapeJson(String value) {
if (value == null) {
return "";
}
return value.replace("\\", "\\\\")
.replace("\"", "\\\"")
.replace("\n", "\\n")
.replace("\r", "\\r")
.replace("\t", "\\t");
}
/**
* 32자리 랜덤 transaction-id 생성
*/
private String generateTransactionId() {
String chars = "0123456789abcdef";
Random random = new Random();
StringBuilder sb = new StringBuilder(32);
for (int i = 0; i < 32; i++) {
sb.append(chars.charAt(random.nextInt(chars.length())));
}
return sb.toString();
}
/**
* Wehago-sign 생성
*/
private String generateWehagoSign(String accessToken, String transactionId,
String timestamp, String urlPath) throws Exception {
try {
String value = accessToken + transactionId + timestamp + urlPath;
SecretKeySpec keySpec = new SecretKeySpec(
HASH_KEY.getBytes(StandardCharsets.UTF_8), "HmacSHA256");
Mac mac = Mac.getInstance("HmacSHA256");
mac.init(keySpec);
byte[] encrypted = mac.doFinal(value.getBytes(StandardCharsets.UTF_8));
String base64Binary = Base64.encodeBase64String(encrypted);
return base64Binary;
} catch (Exception e) {
System.err.println("Wehago-sign 생성 오류: " + e.getMessage());
e.printStackTrace();
throw e;
}
}
}

View File

@@ -5308,4 +5308,66 @@ public String clientImportFileProc(HttpServletRequest request, HttpSession sessi
return resultMap;
}
/**
* 전체 PART 정보 ERP 전송
* @param request
* @param paramMap
* @return
*/
@RequestMapping("/admin/sendAllPartsToErp.do")
@ResponseBody
public Map<String, Object> sendAllPartsToErp(HttpServletRequest request, @RequestParam Map<String, Object> paramMap) {
Map<String, Object> resultMap = new HashMap<String, Object>();
try {
System.out.println("====================================");
System.out.println("관리자 전체 PART ERP 전송 요청");
System.out.println("====================================");
resultMap = batchService.sendAllPartsToErp();
} catch (Exception e) {
e.printStackTrace();
resultMap.put("success", false);
resultMap.put("message", "PART 전송 중 오류가 발생했습니다: " + e.getMessage());
}
return resultMap;
}
/**
* 단일 PART 정보 ERP 전송
* @param request
* @param paramMap
* @return
*/
@RequestMapping("/admin/sendSinglePartToErp.do")
@ResponseBody
public Map<String, Object> sendSinglePartToErp(HttpServletRequest request, @RequestParam Map<String, Object> paramMap) {
Map<String, Object> resultMap = new HashMap<String, Object>();
try {
String partObjid = CommonUtils.checkNull(paramMap.get("partObjid"));
if (partObjid.isEmpty()) {
resultMap.put("success", false);
resultMap.put("message", "PART OBJID가 없습니다.");
return resultMap;
}
System.out.println("====================================");
System.out.println("단일 PART ERP 전송 요청: " + partObjid);
System.out.println("====================================");
resultMap = batchService.sendSinglePartToErp(partObjid);
} catch (Exception e) {
e.printStackTrace();
resultMap.put("success", false);
resultMap.put("message", "PART 전송 중 오류가 발생했습니다: " + e.getMessage());
}
return resultMap;
}
}

View File

@@ -3395,5 +3395,34 @@ ORDER BY PATH,
) T
</select>
<!-- ERP 전송을 위한 전체 PART 목록 조회 -->
<select id="selectAllPartListForErp" resultType="map">
SELECT
OBJID,
PART_NO,
PART_NAME,
SPEC,
acctfg,
odrfg
FROM PART_MNG
WHERE STATUS = 'release'
AND PART_NO IS NOT NULL
AND PART_NAME IS NOT NULL
ORDER BY PART_NO
</select>
<!-- OBJID로 단일 PART 조회 -->
<select id="selectPartByObjid" parameterType="map" resultType="map">
SELECT
OBJID,
PART_NO,
PART_NAME,
SPEC,
acctfg,
odrfg
FROM PART_MNG
WHERE OBJID = #{objid}::NUMERIC
</select>
</mapper>

View File

@@ -21,6 +21,7 @@ import com.pms.api.CustomerApiClient;
import com.pms.api.DepartmentApiClient;
import com.pms.api.EmployeeApiClient;
import com.pms.api.WarehouseApiClient;
import com.pms.api.PartErpApiClient;
import com.pms.common.Message;
import com.pms.common.SqlMapConfig;
import com.pms.common.bean.PersonBean;
@@ -980,6 +981,225 @@ public class BatchService extends BaseService {
return warehouse;
}
/**
* 전체 PART 정보를 ERP로 전송 (수동 실행)
* @return 성공 여부 Map
*/
public Map<String, Object> sendAllPartsToErp() {
Map<String, Object> result = new HashMap<String, Object>();
SqlSession sqlSession = SqlMapConfig.getInstance().getSqlSession(false);
System.out.println("====================================");
System.out.println("전체 PART 정보 ERP 전송 시작");
System.out.println("====================================");
try {
String baseUrl = "https://erp.rps-korea.com";
// DB에서 전체 PART 목록 조회
List<Map<String, Object>> partList = sqlSession.selectList("part.selectAllPartListForErp");
if (partList == null || partList.isEmpty()) {
result.put("success", false);
result.put("message", "전송할 PART 정보가 없습니다.");
return result;
}
PartErpApiClient partErpClient = new PartErpApiClient();
int successCount = 0;
int failCount = 0;
StringBuilder errorMessages = new StringBuilder();
System.out.println("" + partList.size() + "건의 PART를 ERP로 전송합니다...");
for (int i = 0; i < partList.size(); i++) {
Map<String, Object> part = partList.get(i);
try {
// 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 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"; // 사용여부
// 필수값 체크
if (itemCd.isEmpty() || itemNm.isEmpty()) {
failCount++;
continue;
}
// 진행 상황 로그 (100건마다)
if ((i + 1) % 100 == 0) {
System.out.println("진행 중... " + (i + 1) + "/" + partList.size() + " (성공: " + successCount + ", 실패: " + failCount + ")");
}
// ERP로 전송
String response = partErpClient.sendPartToErp(baseUrl, coCd, itemCd, itemNm,
acctFg, odrFg, unitDc, unitmangDc, unitchngNb, lotFg, qcFg, reqFg, setitemFg, useYn);
// 응답 확인
if (response.contains("\"resultCode\":0") || response.contains("\"resultCode\":\"0\"")) {
successCount++;
} else {
failCount++;
if (failCount <= 5) {
errorMessages.append(itemCd).append(": ").append(response).append("\n");
}
}
} catch (Exception e) {
failCount++;
if (failCount <= 5) {
errorMessages.append(CommonUtils.checkNull(part.get("part_no"))).append(": ")
.append(e.getMessage()).append("\n");
}
}
}
result.put("success", true);
result.put("message", "PART 전송 완료 - 성공: " + successCount + "건, 실패: " + failCount + "");
if (errorMessages.length() > 0) {
result.put("errors", errorMessages.toString());
}
System.out.println("====================================");
System.out.println("PART 전송 완료 - 성공: " + successCount + "건, 실패: " + failCount + "");
System.out.println("====================================");
} catch (Exception e) {
result.put("success", false);
result.put("message", "PART 전송 중 오류가 발생했습니다: " + e.getMessage());
System.err.println("PART 전송 오류: " + e.getMessage());
e.printStackTrace();
} finally {
sqlSession.close();
}
return result;
}
/**
* 단일 PART 정보를 ERP로 전송
* @param partObjid PART OBJID
* @return 성공 여부 Map
*/
public Map<String, Object> sendSinglePartToErp(String partObjid) {
Map<String, Object> result = new HashMap<String, Object>();
SqlSession sqlSession = SqlMapConfig.getInstance().getSqlSession(false);
try {
String baseUrl = "https://erp.rps-korea.com";
// DB에서 PART 정보 조회
Map<String, Object> paramMap = new HashMap<String, Object>();
paramMap.put("objid", partObjid);
Map<String, Object> part = sqlSession.selectOne("part.selectPartByObjid", paramMap);
if (part == null) {
result.put("success", false);
result.put("message", "PART 정보를 찾을 수 없습니다.");
return result;
}
// 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 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"; // 사용여부
// 필수값 체크
if (itemCd.isEmpty() || itemNm.isEmpty()) {
result.put("success", false);
result.put("message", "품번 또는 품명이 없습니다.");
return result;
}
// ERP로 전송
PartErpApiClient partErpClient = new PartErpApiClient();
String response = partErpClient.sendPartToErp(baseUrl, coCd, itemCd, itemNm,
acctFg, odrFg, unitDc, unitmangDc, unitchngNb, lotFg, qcFg, reqFg, setitemFg, useYn);
// 응답 확인
if (response.contains("\"resultCode\":0") || response.contains("\"resultCode\":\"0\"")) {
result.put("success", true);
result.put("message", "PART 정보가 ERP로 전송되었습니다.");
} else {
result.put("success", false);
result.put("message", "ERP 전송 실패: " + response);
}
} catch (Exception e) {
result.put("success", false);
result.put("message", "PART 전송 중 오류가 발생했습니다: " + e.getMessage());
System.err.println("PART 전송 오류: " + e.getMessage());
e.printStackTrace();
} finally {
sqlSession.close();
}
return result;
}
/**
* major_category를 acctFg로 변환
* 0:원재료,1:부재료,2:제품,4:반제품,5:상품,6:저장품,7:비용,8:수익
*/
private String convertAcctFg(String majorCategory) {
if (majorCategory == null || majorCategory.isEmpty()) {
return "7"; // 기본값: 비용
}
// major_category 값에 따라 매핑
if (majorCategory.contains("원재료")) return "0";
if (majorCategory.contains("부재료")) return "1";
if (majorCategory.contains("제품")) return "2";
if (majorCategory.contains("반제품")) return "4";
if (majorCategory.contains("상품")) return "5";
if (majorCategory.contains("저장품")) return "6";
if (majorCategory.contains("비용")) return "7";
if (majorCategory.contains("수익")) return "8";
return "7"; // 기본값: 비용
}
/**
* sub_category를 odrFg로 변환
* 0:구매,1:생산,8:Phantom
*/
private String convertOdrFg(String subCategory) {
if (subCategory == null || subCategory.isEmpty()) {
return "0"; // 기본값: 구매
}
// sub_category 값에 따라 매핑
if (subCategory.contains("구매")) return "0";
if (subCategory.contains("생산")) return "1";
if (subCategory.contains("Phantom") || subCategory.contains("phantom")) return "8";
return "0"; // 기본값: 구매
}
}