package com.pms.service; import java.io.File; import java.sql.Clob; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.UUID; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import org.apache.ibatis.session.SqlSession; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; import org.springframework.web.bind.annotation.RequestParam; 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.api.PartErpDeleteApiClient; import com.pms.api.PartErpUpdateApiClient; import com.pms.api.AmaranthUserApiClient; import com.pms.common.Message; import com.pms.common.SqlMapConfig; import com.pms.common.bean.PersonBean; import com.pms.common.service.BaseService; import com.pms.common.utils.CommonUtils; import com.pms.common.utils.Constants; import com.pms.common.utils.EncryptUtil; @Service public class BatchService extends BaseService { /** * 첨부파일 연결 대상이 되는 파트의 목록을 가져온다. * @param request * @param paramMap * @return * @throws Exception */ // 파트 도면 파일 자동 연결 배치 - 주석 처리 /* static List targetFileList = new ArrayList(); @Scheduled(cron="0 59 23 * * ?") public void partConnectDrawingFile1(){ partConnectDrawingFile(); } @Scheduled(cron="0 0 04 * * ?") public void partConnectDrawingFile2(){ partConnectDrawingFile(); } public void partConnectDrawingFile(){ SqlSession sqlSession = SqlMapConfig.getInstance().getSqlSession(false); List> partList = new ArrayList(); getFileList(Constants.PART_DRAWING_STORAGE); try{ //도면파일이 연결되지 않은 파트의 목록을 가져온다. partList = sqlSession.selectList("partMng.getBatchTargetPartList"); for(Map partMap:partList){ System.out.println("partMap:"+partMap); String partObjId = CommonUtils.checkNull(partMap.get("objid")); String partNo = CommonUtils.checkNull(partMap.get("part_no")); String revision = CommonUtils.checkNull(partMap.get("revision")); int cu1Cnt = Integer.parseInt(CommonUtils.checkNull(partMap.get("cu01_cnt"),"0")); int cu2Cnt = Integer.parseInt(CommonUtils.checkNull(partMap.get("cu02_cnt"),"0")); int cu3Cnt = Integer.parseInt(CommonUtils.checkNull(partMap.get("cu03_cnt"),"0")); String targetFileName = partNo+revision; int revNum = 0; String revName = ""; if(!"".equals(revision)){ revNum = Integer.parseInt(revision.toUpperCase().replaceAll("R", "")); revName = "R"+revNum; } String targetFileName2 = partNo+revName; for(File targetFile:targetFileList){ String realFileName = CommonUtils.checkNull(targetFile.getName()); String ext = realFileName.substring(realFileName.lastIndexOf(".") + 1); String fileName = realFileName.replaceAll("."+ext, ""); ext = ext.toUpperCase(); String fileSize = CommonUtils.checkNull(targetFile.length()); System.out.println("targetFileName:"+targetFileName2); System.out.println("fileName:"+fileName); if(targetFileName2.equals(fileName)){ String docType = ""; String docTypeName = ""; if(ext.equals("DWG") && 0 == cu2Cnt){ docType = "2D_DRAWING_CAD"; docTypeName = "2D(Drawing) CAD 첨부파일"; } if(ext.equals("PDF") && 0 == cu3Cnt){ docType = "2D_PDF_CAD"; docTypeName = "2D(PDF) CAD 첨부파일"; } if(ext.equals("IPT") && 0 == cu1Cnt){ docType = "3D_CAD"; docTypeName = "3D CAD 첨부파일"; } if(!"".equals(docType) && !"".equals(docTypeName)){ Map connectFileMap = new HashMap(); connectFileMap.put("objId", CommonUtils.createObjId()); connectFileMap.put("targetObjId", partObjId); connectFileMap.put("savedFileName", realFileName); connectFileMap.put("realFileName", realFileName); connectFileMap.put("docType", docType); connectFileMap.put("docTypeName", docTypeName); connectFileMap.put("fileSize", fileSize); connectFileMap.put("fileExt", ext); connectFileMap.put("filePath", targetFile.getParent()); connectFileMap.put("writer", "batch_plm_admin"); System.out.println("connectFileMap:"+connectFileMap); sqlSession.insert("common.insertUploadFileInfo", connectFileMap); } } } } sqlSession.commit(); }catch(Exception e){ sqlSession.rollback(); throw e; }finally{ sqlSession.close(); } } public static List getFileList(String dirPath){ File dir = new File(dirPath); File files[] = dir.listFiles(); for (int i = 0; i < files.length; i++) { File file = files[i]; if (file.isDirectory()) { getFileList(file.getPath()); } else { targetFileList.add(file); } } return targetFileList; } */ /** * ERP API 데이터 동기화 배치 (매일 새벽 00시 실행) * 거래처, 부서, 사원 정보를 ERP API로부터 가져와 DB에 저장 */ @Scheduled(cron="0 0 0 * * ?") public void syncErpData() { System.out.println("===================================="); System.out.println("ERP 데이터 동기화 배치 시작 (자동)"); System.out.println("===================================="); executeSyncErpData(); } /** * LoginId 업데이트 자동 배치 (매일 새벽 00시 10분 실행) * ERP 사원 동기화 이후 실행되어 Amaranth10 loginId를 user_info.user_id에 업데이트 */ @Scheduled(cron="0 10 0 * * ?") public void updateLoginIdAuto() { System.out.println("===================================="); System.out.println("LoginId 업데이트 배치 시작 (자동)"); System.out.println("===================================="); SqlSession sqlSession = SqlMapConfig.getInstance().getSqlSession(false); try { String baseUrl = "https://erp.rps-korea.com"; // Amaranth10 API로 전체 사용자 정보 조회 (empSeq, loginId) AmaranthUserApiClient apiClient = new AmaranthUserApiClient(); String jsonResponse = apiClient.getAllUserInfo(baseUrl); // JSON 파싱 List> amaranthUserList = parseAmaranthUserJson(jsonResponse); if (amaranthUserList == null || amaranthUserList.isEmpty()) { System.out.println("API 응답에서 사용자 정보를 찾을 수 없습니다."); return; } System.out.println("총 " + amaranthUserList.size() + "건의 사용자 정보 처리 시작"); int updateCount = 0; int skipCount = 0; // empseq 기준으로 user_id 업데이트 for (Map amaranthUser : amaranthUserList) { String empSeq = (String) amaranthUser.get("empSeq"); String loginId = (String) amaranthUser.get("loginId"); if (empSeq != null && !empSeq.isEmpty() && loginId != null && !loginId.isEmpty()) { Map updateParam = new HashMap(); updateParam.put("empseq", empSeq); updateParam.put("login_id", loginId); int updated = sqlSession.update("batch.updateLoginId", updateParam); if (updated > 0) { updateCount++; if (updateCount <= 10) { System.out.println("[업데이트 " + updateCount + "] empseq: " + empSeq + " → loginId: " + loginId); } } else { skipCount++; } } else { skipCount++; } } sqlSession.commit(); System.out.println("===================================="); System.out.println("LoginId 업데이트 완료 (자동)"); System.out.println("업데이트: " + updateCount + "건"); System.out.println("스킵: " + skipCount + "건"); System.out.println("===================================="); } catch (Exception e) { sqlSession.rollback(); System.err.println("LoginId 업데이트 오류 (자동): " + e.getMessage()); e.printStackTrace(); } finally { sqlSession.close(); } } /** * 사원 정보만 동기화 (수동 실행) * @return 성공 여부 Map */ public Map syncEmployeeDataManual() { Map result = new HashMap(); SqlSession sqlSession = SqlMapConfig.getInstance().getSqlSession(false); System.out.println("===================================="); System.out.println("ERP 사원 정보 동기화 시작 (수동)"); System.out.println("===================================="); try { String baseUrl = "https://erp.rps-korea.com"; String coCd = "1000"; syncEmployeeData(sqlSession, baseUrl, coCd); sqlSession.commit(); result.put("success", true); result.put("message", "사원 정보 동기화가 완료되었습니다."); System.out.println("ERP 사원 정보 동기화 완료"); } catch (Exception e) { sqlSession.rollback(); result.put("success", false); result.put("message", "사원 정보 동기화 중 오류가 발생했습니다: " + e.getMessage()); System.err.println("사원 정보 동기화 오류: " + e.getMessage()); e.printStackTrace(); } finally { sqlSession.close(); } return result; } /** * LoginId 업데이트 전용 배치 (수동 실행) * Amaranth10 API로 전체 사용자 정보를 조회하여 empseq 기준으로 user_id 업데이트 * @return 성공 여부 Map */ public Map updateLoginIdManual() { Map result = new HashMap(); SqlSession sqlSession = SqlMapConfig.getInstance().getSqlSession(false); System.out.println("===================================="); System.out.println("LoginId 업데이트 배치 시작 (수동)"); System.out.println("===================================="); try { String baseUrl = "https://erp.rps-korea.com"; // Amaranth10 API로 전체 사용자 정보 조회 (empSeq, loginId) // 파라미터 없이 전체 조회 AmaranthUserApiClient apiClient = new AmaranthUserApiClient(); String jsonResponse = apiClient.getAllUserInfo(baseUrl); // JSON 파싱 List> amaranthUserList = parseAmaranthUserJson(jsonResponse); if (amaranthUserList == null || amaranthUserList.isEmpty()) { result.put("success", false); result.put("message", "Amaranth10 API에서 사용자 정보를 가져올 수 없습니다."); System.out.println("API 응답에서 사용자 정보를 찾을 수 없습니다."); return result; } System.out.println("총 " + amaranthUserList.size() + "건의 사용자 정보 처리 시작"); int updateCount = 0; int skipCount = 0; // empseq 기준으로 user_id 업데이트 for (Map amaranthUser : amaranthUserList) { String empSeq = (String) amaranthUser.get("empSeq"); String loginId = (String) amaranthUser.get("loginId"); if (empSeq != null && !empSeq.isEmpty() && loginId != null && !loginId.isEmpty()) { Map updateParam = new HashMap(); updateParam.put("empseq", empSeq); updateParam.put("login_id", loginId); int updated = sqlSession.update("batch.updateLoginId", updateParam); if (updated > 0) { updateCount++; if (updateCount <= 10) { System.out.println("[업데이트 " + updateCount + "] empseq: " + empSeq + " → loginId: " + loginId); } } else { skipCount++; } } else { skipCount++; } } sqlSession.commit(); result.put("success", true); result.put("message", "LoginId 업데이트가 완료되었습니다. (업데이트: " + updateCount + "건, 스킵: " + skipCount + "건)"); System.out.println("===================================="); System.out.println("LoginId 업데이트 완료"); System.out.println("업데이트: " + updateCount + "건"); System.out.println("스킵: " + skipCount + "건"); System.out.println("===================================="); } catch (Exception e) { sqlSession.rollback(); result.put("success", false); result.put("message", "LoginId 업데이트 중 오류가 발생했습니다: " + e.getMessage()); System.err.println("LoginId 업데이트 오류: " + e.getMessage()); e.printStackTrace(); } finally { sqlSession.close(); } return result; } /** * Amaranth10 사용자 정보 JSON 파싱 * resultData 배열에서 직접 empSeq, loginId 추출 */ private List> parseAmaranthUserJson(String jsonResponse) { List> userList = new ArrayList>(); try { // resultData 배열 추출 int resultDataStart = jsonResponse.indexOf("\"resultData\""); if (resultDataStart == -1) { System.err.println("resultData를 찾을 수 없습니다."); return userList; } int arrayStart = jsonResponse.indexOf("[", resultDataStart); if (arrayStart == -1) { System.err.println("resultData 배열을 찾을 수 없습니다."); return userList; } // 매칭되는 닫는 괄호 찾기 int arrayEnd = findMatchingBracket(jsonResponse, arrayStart); if (arrayEnd == -1) { System.err.println("resultData 배열의 끝을 찾을 수 없습니다."); return userList; } String arrayContent = jsonResponse.substring(arrayStart + 1, arrayEnd); // resultData 배열의 각 사용자 객체 파싱 int braceCount = 0; int objStart = -1; for (int i = 0; i < arrayContent.length(); i++) { char c = arrayContent.charAt(i); if (c == '{') { if (braceCount == 0) { objStart = i; } braceCount++; } else if (c == '}') { braceCount--; if (braceCount == 0 && objStart != -1) { String objStr = arrayContent.substring(objStart, i + 1); Map user = parseAmaranthUserObject(objStr); if (user != null && user.get("empSeq") != null && user.get("loginId") != null) { userList.add(user); } objStart = -1; } } } System.out.println("파싱된 사용자 수: " + userList.size()); } catch (Exception e) { System.err.println("Amaranth 사용자 JSON 파싱 오류: " + e.getMessage()); e.printStackTrace(); } return userList; } /** * Amaranth10 사용자 객체 파싱 */ private Map parseAmaranthUserObject(String jsonObject) { Map user = new HashMap(); try { // empSeq 추출 String empSeq = extractJsonValue(jsonObject, "empSeq"); if (empSeq != null && !empSeq.isEmpty()) { user.put("empSeq", empSeq); } // loginId 추출 String loginId = extractJsonValue(jsonObject, "loginId"); if (loginId != null && !loginId.isEmpty()) { user.put("loginId", loginId); } } catch (Exception e) { System.err.println("Amaranth 사용자 객체 파싱 오류: " + e.getMessage()); return null; } return user; } /** * 매칭되는 괄호 찾기 */ private int findMatchingBracket(String str, int startIndex) { int count = 1; for (int i = startIndex + 1; i < str.length(); i++) { if (str.charAt(i) == '[') { count++; } else if (str.charAt(i) == ']') { count--; if (count == 0) { return i; } } } return -1; } /** * 부서 정보만 동기화 (수동 실행) * @return 성공 여부 Map */ public Map syncDepartmentDataManual() { Map result = new HashMap(); SqlSession sqlSession = SqlMapConfig.getInstance().getSqlSession(false); System.out.println("===================================="); System.out.println("ERP 부서 정보 동기화 시작 (수동)"); System.out.println("===================================="); try { String baseUrl = "https://erp.rps-korea.com"; String coCd = "1000"; syncDepartmentData(sqlSession, baseUrl, coCd); sqlSession.commit(); result.put("success", true); result.put("message", "부서 정보 동기화가 완료되었습니다."); System.out.println("ERP 부서 정보 동기화 완료"); } catch (Exception e) { sqlSession.rollback(); result.put("success", false); result.put("message", "부서 정보 동기화 중 오류가 발생했습니다: " + e.getMessage()); System.err.println("부서 정보 동기화 오류: " + e.getMessage()); e.printStackTrace(); } finally { sqlSession.close(); } return result; } /** * 거래처 정보만 동기화 (수동 실행) * @return 성공 여부 Map */ public Map syncCustomerDataManual() { Map result = new HashMap(); SqlSession sqlSession = SqlMapConfig.getInstance().getSqlSession(false); System.out.println("===================================="); System.out.println("ERP 거래처 정보 동기화 시작 (수동)"); System.out.println("===================================="); try { String baseUrl = "https://erp.rps-korea.com"; String coCd = "1000"; syncCustomerData(sqlSession, baseUrl, coCd); sqlSession.commit(); result.put("success", true); result.put("message", "거래처 정보 동기화가 완료되었습니다."); System.out.println("ERP 거래처 정보 동기화 완료"); } catch (Exception e) { sqlSession.rollback(); result.put("success", false); result.put("message", "거래처 정보 동기화 중 오류가 발생했습니다: " + e.getMessage()); System.err.println("거래처 정보 동기화 오류: " + e.getMessage()); e.printStackTrace(); } finally { sqlSession.close(); } return result; } /** * 창고 정보만 동기화 (수동 실행) * @return 성공 여부 Map */ public Map syncWarehouseDataManual() { Map result = new HashMap(); SqlSession sqlSession = SqlMapConfig.getInstance().getSqlSession(false); System.out.println("===================================="); System.out.println("ERP 창고 정보 동기화 시작 (수동)"); System.out.println("===================================="); try { String baseUrl = "https://erp.rps-korea.com"; String coCd = "1000"; syncWarehouseData(sqlSession, baseUrl, coCd); sqlSession.commit(); result.put("success", true); result.put("message", "창고 정보 동기화가 완료되었습니다."); System.out.println("ERP 창고 정보 동기화 완료"); } catch (Exception e) { sqlSession.rollback(); result.put("success", false); result.put("message", "창고 정보 동기화 중 오류가 발생했습니다: " + e.getMessage()); System.err.println("창고 정보 동기화 오류: " + e.getMessage()); e.printStackTrace(); } finally { sqlSession.close(); } return result; } /** * ERP 데이터 동기화 실제 실행 로직 */ private void executeSyncErpData() { SqlSession sqlSession = SqlMapConfig.getInstance().getSqlSession(false); try { // API 기본 URL 및 회사코드 설정 String baseUrl = "https://erp.rps-korea.com"; String coCd = "1000"; // 1. 거래처 정보 동기화 syncCustomerData(sqlSession, baseUrl, coCd); // 2. 부서 정보 동기화 syncDepartmentData(sqlSession, baseUrl, coCd); // 3. 사원 정보 동기화 syncEmployeeData(sqlSession, baseUrl, coCd); // 4. 창고 정보 동기화 syncWarehouseData(sqlSession, baseUrl, coCd); sqlSession.commit(); System.out.println("ERP 데이터 동기화 배치 완료"); } catch (Exception e) { sqlSession.rollback(); System.err.println("ERP 데이터 동기화 중 오류 발생: " + e.getMessage()); e.printStackTrace(); throw new RuntimeException(e); } finally { sqlSession.close(); } } /** * 거래처 정보 동기화 */ private void syncCustomerData(SqlSession sqlSession, String baseUrl, String coCd) { try { System.out.println("거래처 정보 동기화 시작..."); CustomerApiClient customerClient = new CustomerApiClient(); String jsonResponse = customerClient.getCustomerList(baseUrl, coCd); // JSON 파싱 및 DB 저장 List> customerList = parseCustomerJson(jsonResponse); int processCount = 0; // 처음 10건 로그 출력 System.out.println("===================================="); System.out.println("거래처 데이터 샘플 (최대 10건)"); System.out.println("===================================="); for (Map customer : customerList) { // 처음 10건만 로그 출력 if (processCount < 10) { System.out.println("[거래처 " + (processCount + 1) + "]"); System.out.println(" - CLIENT_CD: " + customer.get("client_cd")); System.out.println(" - CLIENT_NM: " + customer.get("client_nm")); System.out.println(" - CEO_NM: " + customer.get("ceo_nm")); System.out.println(" - TEL_NO: " + customer.get("tel_no")); System.out.println(" - EMAIL: " + customer.get("email")); System.out.println("---"); } // UPSERT 실행 sqlSession.insert("batch.upsertCustomer", customer); processCount++; } System.out.println("===================================="); System.out.println("거래처 정보 동기화 완료 - 처리: " + processCount + "건"); } catch (Exception e) { System.err.println("거래처 정보 동기화 실패: " + e.getMessage()); throw new RuntimeException(e); } } /** * 부서 정보 동기화 */ private void syncDepartmentData(SqlSession sqlSession, String baseUrl, String coCd) { try { System.out.println("부서 정보 동기화 시작..."); DepartmentApiClient deptClient = new DepartmentApiClient(); String jsonResponse = deptClient.getDepartmentList(baseUrl, coCd, null); // JSON 파싱 및 DB 저장 List> deptList = parseDepartmentJson(jsonResponse); int processCount = 0; // 처음 10건 로그 출력 System.out.println("===================================="); System.out.println("부서 데이터 샘플 (최대 10건)"); System.out.println("===================================="); for (Map dept : deptList) { // 처음 10건만 로그 출력 if (processCount < 10) { System.out.println("[부서 " + (processCount + 1) + "]"); System.out.println(" - DEPT_CODE: " + dept.get("dept_code")); System.out.println(" - DEPT_NAME: " + dept.get("dept_name")); System.out.println(" - PARENT_DEPT_CODE: " + dept.get("parent_dept_code")); System.out.println(" - STATUS: " + dept.get("status")); System.out.println("---"); } // UPSERT 실행 sqlSession.insert("batch.upsertDepartment", dept); processCount++; } System.out.println("===================================="); System.out.println("부서 정보 동기화 완료 - 처리: " + processCount + "건"); } catch (Exception e) { System.err.println("부서 정보 동기화 실패: " + e.getMessage()); throw new RuntimeException(e); } } /** * 사원 정보 동기화 */ private void syncEmployeeData(SqlSession sqlSession, String baseUrl, String coCd) { try { System.out.println("사원 정보 동기화 시작..."); EmployeeApiClient empClient = new EmployeeApiClient(); String jsonResponse = empClient.getEmployeeList(baseUrl, coCd); // JSON 파싱 및 DB 저장 List> empList = parseEmployeeJson(jsonResponse); int processCount = 0; // 처음 10건 로그 출력 System.out.println("===================================="); System.out.println("사원 데이터 샘플 (최대 10건)"); System.out.println("===================================="); for (Map emp : empList) { // 처음 10건만 로그 출력 if (processCount < 10) { System.out.println("[사원 " + (processCount + 1) + "]"); System.out.println(" - USER_ID: " + emp.get("user_id")); System.out.println(" - USER_NAME: " + emp.get("user_name")); System.out.println(" - USER_NAME_ENG: " + emp.get("user_name_eng")); System.out.println(" - DEPT_CODE: " + emp.get("dept_code")); System.out.println(" - DEPT_NAME: " + emp.get("dept_name")); System.out.println(" - EMAIL: " + emp.get("email")); System.out.println(" - CELL_PHONE: " + emp.get("cell_phone")); System.out.println(" - STATUS: " + emp.get("status")); System.out.println("---"); } // UPSERT 실행 sqlSession.insert("batch.upsertEmployee", emp); processCount++; } System.out.println("===================================="); System.out.println("사원 정보 동기화 완료 - 처리: " + processCount + "건"); } catch (Exception e) { System.err.println("사원 정보 동기화 실패: " + e.getMessage()); throw new RuntimeException(e); } } /** * 창고 정보 동기화 */ private void syncWarehouseData(SqlSession sqlSession, String baseUrl, String coCd) { try { System.out.println("창고 정보 동기화 시작..."); WarehouseApiClient warehouseClient = new WarehouseApiClient(); String jsonResponse = warehouseClient.getWarehouseList(baseUrl, coCd, "0"); // JSON 파싱 및 DB 저장 List> warehouseList = parseWarehouseJson(jsonResponse); int processCount = 0; // 처음 10건 로그 출력 System.out.println("===================================="); System.out.println("창고 데이터 샘플 (최대 10건)"); System.out.println("===================================="); for (Map warehouse : warehouseList) { // 처음 10건만 로그 출력 if (processCount < 10) { System.out.println("[창고 " + (processCount + 1) + "]"); System.out.println(" - LOCATION_CODE: " + warehouse.get("location_code")); System.out.println(" - LOCATION_NAME: " + warehouse.get("location_name")); System.out.println(" - OUT_CODE: " + warehouse.get("out_code")); System.out.println(" - USE_STATUS: " + warehouse.get("use_status")); System.out.println("---"); } // UPSERT 실행 sqlSession.insert("batch.upsertWarehouse", warehouse); processCount++; } System.out.println("===================================="); System.out.println("창고 정보 동기화 완료 - 처리: " + processCount + "건"); } catch (Exception e) { System.err.println("창고 정보 동기화 실패: " + e.getMessage()); throw new RuntimeException(e); } } /** * 거래처 JSON 파싱 */ private List> parseCustomerJson(String jsonResponse) { List> customerList = new ArrayList>(); try { // resultData 배열 찾기 int dataStart = jsonResponse.indexOf("\"resultData\":["); if (dataStart == -1) { return customerList; } String dataSection = jsonResponse.substring(dataStart + 14); int bracketCount = 0; int startIdx = -1; for (int i = 0; i < dataSection.length(); i++) { char c = dataSection.charAt(i); if (c == '{') { if (bracketCount == 0) { startIdx = i; } bracketCount++; } else if (c == '}') { bracketCount--; if (bracketCount == 0 && startIdx != -1) { String customerJson = dataSection.substring(startIdx, i + 1); Map customer = parseCustomerObject(customerJson); if (customer != null) { customerList.add(customer); } startIdx = -1; } } } } catch (Exception e) { System.err.println("거래처 JSON 파싱 오류: " + e.getMessage()); } return customerList; } /** * 거래처 객체 파싱 (실제 테이블 컬럼에 맞춤) */ private Map parseCustomerObject(String json) { Map customer = new HashMap(); // 기본 정보 customer.put("client_cd", extractJsonValue(json, "trCd")); // 거래처코드 customer.put("client_nm", extractJsonValue(json, "trNm")); // 거래처명 customer.put("tr_nmk", extractJsonValue(json, "trNm")); // 거래처명(한글) customer.put("client_nmk", extractJsonValue(json, "trNm")); // 거래처명(한글) customer.put("attr_nmk", extractJsonValue(json, "attrNm")); // 거래처약칭 customer.put("client_type", extractJsonValue(json, "trFg")); // 거래처분류 customer.put("bus_reg_no", extractJsonValue(json, "regNb")); // 사업자등록번호 customer.put("resident_no", extractJsonValue(json, "pplNb")); // 주민번호 customer.put("ceo_nm", extractJsonValue(json, "ceoNm")); // 대표자명 customer.put("ceo_nmk", extractJsonValue(json, "ceoNm")); // 대표자명(한글) customer.put("bus_type", extractJsonValue(json, "business")); // 업태 customer.put("bus_item", extractJsonValue(json, "jongmok")); // 종목 customer.put("post_no", extractJsonValue(json, "zip")); // 우편번호 customer.put("addr1", extractJsonValue(json, "divAddr1")); // 주소1 customer.put("addr2", extractJsonValue(json, "addr2")); // 주소2 customer.put("tel_no", extractJsonValue(json, "tel")); // 전화번호 customer.put("fax_no", extractJsonValue(json, "fax")); // 팩스번호 customer.put("homepage", extractJsonValue(json, "homepage")); // 홈페이지 customer.put("email", extractJsonValue(json, "email")); // 이메일 customer.put("liq_rs", extractJsonValue(json, "liqRs")); // 주류코드 customer.put("tr_fg", extractJsonValue(json, "trFg")); // 거래처분류 customer.put("country_nm", extractJsonValue(json, "nationNm")); // 국가명 customer.put("class_cd", extractJsonValue(json, "trgrpCd")); // 거래처분류코드 customer.put("class_nm", extractJsonValue(json, "trgrpNm")); // 거래처분류명 customer.put("grade_cd", extractJsonValue(json, "trratFg")); // 거래처등급코드 customer.put("grade_nm", extractJsonValue(json, "trratNm")); // 거래처등급명 customer.put("collect_client_cd", extractJsonValue(json, "clttrCd")); // 수금거래처코드 customer.put("collect_client_nm", extractJsonValue(json, "clttrNm")); // 수금거래처명 customer.put("region_cd", extractJsonValue(json, "localCd")); // 지역코드 customer.put("region_nm", extractJsonValue(json, "localNm")); // 지역명 customer.put("trade_start_dt", extractJsonValue(json, "frDt")); // 거래시작일 customer.put("trade_end_dt", extractJsonValue(json, "toDt")); // 거래종료일 customer.put("use_yn", extractJsonValue(json, "useYn")); // 사용여부 customer.put("contract_start_dt", extractJsonValue(json, "interDt")); // 계약시작일 customer.put("contract_end_dt", extractJsonValue(json, "dueDt")); // 계약종료일 customer.put("trade_type", extractJsonValue(json, "trsoFg")); // 거래형태 customer.put("discount_rate", extractJsonValue(json, "interRt")); // 할인율 customer.put("contract_amt", extractJsonValue(json, "limitAm")); // 계약금액 customer.put("monthly_fee", extractJsonValue(json, "interAm")); // 월용역비 customer.put("payment_term", extractJsonValue(json, "payconDc")); // 결제조건 customer.put("rcp_tp", extractJsonValue(json, "doudate1Fg")); // 예정일구분 customer.put("credit_limit", extractJsonValue(json, "creditAm")); // 여신한도액 customer.put("limit_return_day", extractJsonValue(json, "returnDt")); // 한도회귀일 // 매입 금융기관 정보 customer.put("pur_bank_cd", extractJsonValue(json, "jiroCd")); // 매입은행코드 customer.put("pur_bank_nm", extractJsonValue(json, "jiroNm")); // 매입은행명 customer.put("pur_branch_nm", extractJsonValue(json, "placeNm")); // 매입지점명 customer.put("pur_account_no", extractJsonValue(json, "baNb")); // 매입계좌번호 customer.put("pur_account_holder", extractJsonValue(json, "depositor")); // 매입예금주 customer.put("pur_pay_plan", extractJsonValue(json, "stOutSettlePay")); // 매입지급예정일 customer.put("pur_slip_type", extractJsonValue(json, "stOutAcct1Fg")); // 매입전표유형 customer.put("pur_tax_type", extractJsonValue(json, "stOutTax1Fg")); // 매입세무구분 // 매출 금융기관 정보 customer.put("sale_bank_cd", extractJsonValue(json, "btrCd")); // 매출은행코드 customer.put("sale_bank_nm", extractJsonValue(json, "btrCd")); // 매출은행명 customer.put("sale_branch_nm", extractJsonValue(json, "stInDummy2")); // 매출지점명 customer.put("sale_account_no", extractJsonValue(json, "stInBaNb")); // 매출계좌번호 customer.put("sale_collect_plan", extractJsonValue(json, "stInSettlePay")); // 매출수금예정일 customer.put("sale_slip_type", extractJsonValue(json, "stInAcct1Fg")); // 매출전표유형 customer.put("sale_tax_type", extractJsonValue(json, "stInTax1Fg")); // 매출세무구분 // 거래처 담당자 정보 customer.put("vendor_dept_nm", extractJsonValue(json, "stempgrpTrchargeDept")); // 거래처부서명 customer.put("vendor_position", extractJsonValue(json, "stempgrpTrchargeTitle")); // 거래처직급 customer.put("vendor_duty", extractJsonValue(json, "stempgrpTrchargeJop")); // 거래처담당업무 customer.put("vendor_manager_nm", extractJsonValue(json, "stempgrpTrchargeEmp")); // 거래처담당자명 customer.put("vendor_tel", extractJsonValue(json, "stempgrpTrchargeTel")); // 거래처전화번호 customer.put("vendor_ext", extractJsonValue(json, "stempgrpTrchargeExt")); // 거래처내선 customer.put("vendor_mobile", extractJsonValue(json, "stempgrpTrchargeHp")); // 거래처휴대폰 customer.put("vendor_email", extractJsonValue(json, "stempgrpTrchargeEmail")); // 거래처이메일 // 관리담당자 정보 customer.put("mgr_dept_cd", extractJsonValue(json, "stempDeptCd")); // 관리부서코드 customer.put("mgr_dept_nm", extractJsonValue(json, "stempDeptNm")); // 관리부서명 customer.put("mgr_position", extractJsonValue(json, "stempTitleDc")); // 관리직급 customer.put("mgr_duty", extractJsonValue(json, "stempJobDc")); // 관리담당업무 customer.put("mgr_emp_cd", extractJsonValue(json, "stempEmpCd")); // 관리사원코드 customer.put("mgr_emp_nm", extractJsonValue(json, "stempEmpNm")); // 관리사원명 customer.put("mgr_tel", extractJsonValue(json, "stempTel")); // 관리전화번호 customer.put("mgr_ext", extractJsonValue(json, "stempTelDc")); // 관리내선 customer.put("mgr_mobile", extractJsonValue(json, "stempHp")); // 관리휴대폰 customer.put("mgr_email", extractJsonValue(json, "stempEmail")); // 관리이메일 customer.put("mgr_remark", extractJsonValue(json, "stempRmkDc")); // 관리비고 // 수신처 정보 customer.put("rec_remark", extractJsonValue(json, "streceiveRmkDc")); // 수신처비고 customer.put("rec_post_no", extractJsonValue(json, "streceiveZip")); // 수신처우편번호 customer.put("rec_addr1", extractJsonValue(json, "streceiveAddr1")); // 수신처주소1 customer.put("rec_addr2", extractJsonValue(json, "streceiveAddr2")); // 수신처주소2 customer.put("rec_tel", extractJsonValue(json, "streceiveTel")); // 수신처전화번호 customer.put("rec_fax", extractJsonValue(json, "streceiveFax")); // 수신처팩스 // 프로젝트 정보 customer.put("project_cd", extractJsonValue(json, "pjtCd")); // 프로젝트코드 customer.put("project_nm", extractJsonValue(json, "pjtNm")); // 프로젝트명 customer.put("pjt_nmk", extractJsonValue(json, "pjtNm")); // 프로젝트명(한글) // 기타 정보 customer.put("ext_data_cd", extractJsonValue(json, "linkCd")); // 외부데이터코드 customer.put("e_tax_yn", extractJsonValue(json, "jeonjaYn")); // 전자세금계산서여부 customer.put("unit_report_client", extractJsonValue(json, "reptrCd")); // 단위신고거래처 customer.put("sub_bus_no", extractJsonValue(json, "apprNb")); // 종사업장번호 customer.put("procurement_yn", extractJsonValue(json, "ppsFg")); // 조달청다수공급자 customer.put("use_fg", extractJsonValue(json, "liqFg")); // 용도구분 customer.put("for_yn", extractJsonValue(json, "forYn")); // 내외국인여부 customer.put("plan_day_type", extractJsonValue(json, "doudate1Fg")); // 예정일구분 customer.put("plan_day", extractJsonValue(json, "doudate1Dd")); // 예정일 customer.put("purpose_type", extractJsonValue(json, "liqFg")); // 용도구분 // 등록/수정 정보 customer.put("insert_dt", extractJsonValue(json, "insertDt")); // 삽입일자 customer.put("modify_dt", extractJsonValue(json, "modifyDt")); // 수정일 customer.put("insert_id", "batch_system"); // 등록자 customer.put("modify_id", "batch_system"); // 수정자 return customer; } /** * 부서 JSON 파싱 */ private List> parseDepartmentJson(String jsonResponse) { List> deptList = new ArrayList>(); try { int dataStart = jsonResponse.indexOf("\"resultData\":["); if (dataStart == -1) { return deptList; } String dataSection = jsonResponse.substring(dataStart + 14); int bracketCount = 0; int startIdx = -1; for (int i = 0; i < dataSection.length(); i++) { char c = dataSection.charAt(i); if (c == '{') { if (bracketCount == 0) { startIdx = i; } bracketCount++; } else if (c == '}') { bracketCount--; if (bracketCount == 0 && startIdx != -1) { String deptJson = dataSection.substring(startIdx, i + 1); Map dept = parseDepartmentObject(deptJson); if (dept != null) { deptList.add(dept); } startIdx = -1; } } } } catch (Exception e) { System.err.println("부서 JSON 파싱 오류: " + e.getMessage()); } return deptList; } /** * 부서 객체 파싱 (실제 JSON 응답 기준으로 dept_info 테이블 매핑) */ private Map parseDepartmentObject(String json) { Map dept = new HashMap(); // JSON 필드 → dept_info 테이블 컬럼 매핑 dept.put("dept_code", extractJsonValue(json, "deptCd")); // 부서코드 (deptCd) dept.put("parent_dept_code", extractJsonValue(json, "parentDeptCd")); // 상위부서코드 (parentDeptCd) dept.put("dept_name", extractJsonValue(json, "deptNm")); // 부서명 (deptNm) dept.put("status", "active"); // 상태 (기본값 active) dept.put("data_type", "ERP"); // 데이터유형 return dept; } /** * 사원 JSON 파싱 */ private List> parseEmployeeJson(String jsonResponse) { List> empList = new ArrayList>(); try { int dataStart = jsonResponse.indexOf("\"resultData\":["); if (dataStart == -1) { return empList; } String dataSection = jsonResponse.substring(dataStart + 14); int bracketCount = 0; int startIdx = -1; for (int i = 0; i < dataSection.length(); i++) { char c = dataSection.charAt(i); if (c == '{') { if (bracketCount == 0) { startIdx = i; } bracketCount++; } else if (c == '}') { bracketCount--; if (bracketCount == 0 && startIdx != -1) { String empJson = dataSection.substring(startIdx, i + 1); Map emp = parseEmployeeObject(empJson); if (emp != null) { empList.add(emp); } startIdx = -1; } } } } catch (Exception e) { System.err.println("사원 JSON 파싱 오류: " + e.getMessage()); } return empList; } /** * 사원 객체 파싱 (실제 JSON 응답 기준으로 user_info 테이블 매핑) */ private Map parseEmployeeObject(String json) { Map emp = new HashMap(); // JSON 필드 → user_info 테이블 컬럼 매핑 emp.put("sabun", extractJsonValue(json, "empCd")); // 사번 (empCd) emp.put("empseq", extractJsonValue(json, "empSeq")); // 사원 시퀀스 (empSeq) - Amaranth10 전자결재용 // user_id는 별도 LoginId 업데이트 배치에서 처리 (Amaranth10 API 사용) emp.put("user_password", "5715e7d798fd421c7100c435e7547e82"); // 기본 비밀번호 (MD5 해시) emp.put("user_name", extractJsonValue(json, "korNm")); // 사용자명 (korNm) emp.put("user_name_eng", extractJsonValue(json, "enlsNm")); // 영문명 (enlsNm) emp.put("dept_code", extractJsonValue(json, "deptCd")); // 부서코드 (deptCd) emp.put("dept_name", extractJsonValue(json, "deptNm")); // 부서명 (deptNm) emp.put("position_code", extractJsonValue(json, "hclsCd")); // 직급코드 (hclsCd) emp.put("position_name", extractJsonValue(json, "hclsNm")); // 직급명 (hclsNm) emp.put("rank", extractJsonValue(json, "hrspNm")); // 직책명 (hrspNm - 사원, 대리 등) emp.put("email", extractJsonValue(json, "emalAdd")); // 이메일 (emalAdd) emp.put("cell_phone", extractJsonValue(json, "emgcTel")); // 휴대폰 (emgcTel) emp.put("user_type", extractJsonValue(json, "enrlFg")); // 사용자유형 (enrlFg - J01:재직) emp.put("user_type_name", extractJsonValue(json, "enrlNm")); // 사용자유형명 (enrlNm) // 재직구분에 따른 상태 설정 (J01:재직=active, 그 외=inActive) String enrlFg = extractJsonValue(json, "enrlFg"); emp.put("status", "J01".equals(enrlFg) ? "active" : "inActive"); // 상태 // 퇴직일자 (rtrDt) emp.put("end_date", extractJsonValue(json, "rtrDt")); // 종료일 (퇴직일) emp.put("data_type", "ERP"); // 데이터유형 return emp; } /** * JSON에서 특정 필드 값 추출 */ private String extractJsonValue(String json, String fieldName) { String searchKey = "\"" + fieldName + "\":"; int startIdx = json.indexOf(searchKey); if (startIdx == -1) { return ""; } startIdx += searchKey.length(); // 공백 제거 while (startIdx < json.length() && Character.isWhitespace(json.charAt(startIdx))) { startIdx++; } if (startIdx >= json.length()) { return ""; } char firstChar = json.charAt(startIdx); // 문자열 값인 경우 if (firstChar == '"') { int endIdx = json.indexOf('"', startIdx + 1); if (endIdx == -1) return ""; return json.substring(startIdx + 1, endIdx); } // 숫자나 null인 경우 else { int endIdx = startIdx; while (endIdx < json.length() && (Character.isDigit(json.charAt(endIdx)) || json.charAt(endIdx) == '.' || json.charAt(endIdx) == '-' || json.charAt(endIdx) == 'n' || json.charAt(endIdx) == 'u' || json.charAt(endIdx) == 'l')) { endIdx++; } String value = json.substring(startIdx, endIdx).trim(); if (value.startsWith("null")) { return ""; } return value; } } /** * 창고 JSON 파싱 */ private List> parseWarehouseJson(String jsonResponse) { List> warehouseList = new ArrayList>(); try { // resultData 배열 찾기 int dataStart = jsonResponse.indexOf("\"resultData\":["); if (dataStart == -1) { return warehouseList; } String dataSection = jsonResponse.substring(dataStart + 14); int bracketCount = 0; int startIdx = -1; for (int i = 0; i < dataSection.length(); i++) { char c = dataSection.charAt(i); if (c == '{') { if (bracketCount == 0) { startIdx = i; } bracketCount++; } else if (c == '}') { bracketCount--; if (bracketCount == 0 && startIdx != -1) { String warehouseJson = dataSection.substring(startIdx, i + 1); Map warehouse = parseWarehouseObject(warehouseJson); if (warehouse != null) { warehouseList.add(warehouse); } startIdx = -1; } } } } catch (Exception e) { System.err.println("창고 JSON 파싱 오류: " + e.getMessage()); } return warehouseList; } /** * 창고 객체 파싱 */ private Map parseWarehouseObject(String json) { Map warehouse = new HashMap(); // location_code를 objid에도 동일하게 저장 String locationCode = extractJsonValue(json, "baselocCd"); warehouse.put("objid", locationCode); warehouse.put("location_code", locationCode); // 기본 정보 warehouse.put("location_name", extractJsonValue(json, "baselocNm")); warehouse.put("location_description", extractJsonValue(json, "baselocDc")); warehouse.put("out_code", extractJsonValue(json, "outlocCd")); warehouse.put("out_co_name", extractJsonValue(json, "outlocNm")); // 상태 정보 String baselocFg = extractJsonValue(json, "baselocFg"); warehouse.put("fit_status", baselocFg); String useYn = extractJsonValue(json, "useYn"); warehouse.put("available_status", useYn); warehouse.put("use_status", "1".equals(useYn) ? "Y" : "N"); // 추가 정보 warehouse.put("base_loc_cd", extractJsonValue(json, "baselocCd")); warehouse.put("co_cd", extractJsonValue(json, "coCd")); warehouse.put("loc_nmk", extractJsonValue(json, "baselocNm")); warehouse.put("attr_nmk", extractJsonValue(json, "inlocNm")); // 시스템 정보 warehouse.put("insert_id", "batch_system"); warehouse.put("writer", "batch_system"); warehouse.put("status", "active"); return warehouse; } /** * 전체 PART 정보를 ERP로 전송 (수동 실행) * @return 성공 여부 Map */ public Map sendAllPartsToErp() { Map result = new HashMap(); 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> partList = sqlSession.selectList("partMng.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 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 itemDc = CommonUtils.checkNull(part.get("spec")); // 회사코드 고정값 String coCd = "1000"; // DB에서 가져온 ERP 연동 필드 String unitDc = CommonUtils.checkNull(part.get("unit_dc")); String unitmangDc = CommonUtils.checkNull(part.get("unitmang_dc")); 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")); // 필수값 체크 - 모든 필수 필드가 있어야 ERP 전송 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++; 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,itemDc, 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 sendSinglePartToErp(String partObjid) { Map result = new HashMap(); SqlSession sqlSession = SqlMapConfig.getInstance().getSqlSession(false); try { String baseUrl = "https://erp.rps-korea.com"; // DB에서 PART 정보 조회 Map paramMap = new HashMap(); paramMap.put("objid", partObjid); Map part = sqlSession.selectOne("partMng.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 itemDc = CommonUtils.checkNull(part.get("spec")); // 회사코드 고정값 String coCd = "1000"; // DB에서 가져온 ERP 연동 필드 String unitDc = CommonUtils.checkNull(part.get("unit_dc")); String unitmangDc = CommonUtils.checkNull(part.get("unitmang_dc")); 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")); // 필수값 체크 - 모든 필수 필드가 있어야 ERP 전송 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로 전송 - 전송 데이터 로그 출력 System.out.println("====== ERP 전송 데이터 ======"); System.out.println("coCd: " + coCd); System.out.println("itemCd(품번): " + itemCd); System.out.println("itemNm(품명): " + itemNm); System.out.println("itemDc(규격): " + itemDc); System.out.println("acctFg(계정구분): " + acctFg); System.out.println("odrFg(조달구분): " + odrFg); System.out.println("unitDc(재고단위): " + unitDc); System.out.println("unitmangDc(관리단위): " + unitmangDc); System.out.println("unitchngNb(환산수량): " + unitchngNb); System.out.println("lotFg(LOT구분): " + lotFg); System.out.println("qcFg(검사여부): " + qcFg); System.out.println("reqFg(의뢰여부): " + reqFg); System.out.println("setitemFg(SET품여부): " + setitemFg); System.out.println("useYn(사용여부): " + useYn); System.out.println("============================="); PartErpApiClient partErpClient = new PartErpApiClient(); String response = partErpClient.sendPartToErp(baseUrl, coCd, itemCd, itemNm, itemDc, acctFg, odrFg, unitDc, unitmangDc, unitchngNb, lotFg, qcFg, reqFg, setitemFg, useYn); System.out.println("ERP 응답: " + response); // 응답 확인 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"; // 기본값: 구매 } /* // ERP에서 PART 정보 삭제 (주석처리: ERP 전송된 데이터는 삭제하면 안됨) public Map deletePartFromErp(String partNo) { Map result = new HashMap(); try { String baseUrl = "https://erp.rps-korea.com"; String coCd = "1000"; if (partNo == null || partNo.trim().isEmpty()) { result.put("success", false); result.put("message", "품번이 없습니다."); return result; } // ERP에서 삭제 PartErpDeleteApiClient deleteClient = new PartErpDeleteApiClient(); String response = deleteClient.deletePartFromErp(baseUrl, coCd, partNo); // 응답 확인 if (response.contains("\"resultCode\":0") || response.contains("\"resultCode\":\"0\"")) { result.put("success", true); result.put("message", "PART 정보가 ERP에서 삭제되었습니다."); System.out.println("ERP PART 삭제 성공: " + partNo); } else { result.put("success", false); result.put("message", "ERP 삭제 실패: " + response); System.err.println("ERP PART 삭제 실패: " + partNo + " - " + response); } } catch (Exception e) { result.put("success", false); result.put("message", "PART 삭제 중 오류가 발생했습니다: " + e.getMessage()); System.err.println("PART 삭제 오류: " + e.getMessage()); e.printStackTrace(); } return result; } */ /** * ERP에 PART 단건 수정 * @param partObjid PART OBJID * @return 성공 여부 Map */ public Map updatePartToErp(String partObjid) { Map result = new HashMap(); SqlSession sqlSession = SqlMapConfig.getInstance().getSqlSession(false); try { String baseUrl = "https://erp.rps-korea.com"; // DB에서 PART 정보 조회 Map paramMap = new HashMap(); paramMap.put("objid", partObjid); Map part = sqlSession.selectOne("partMng.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 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"; // 사용여부 // 필수값 체크 if (itemCd.isEmpty() || itemNm.isEmpty()) { result.put("success", false); result.put("message", "품번 또는 품명이 없습니다."); return result; } // ERP로 수정 전송 PartErpUpdateApiClient updateClient = new PartErpUpdateApiClient(); String response = updateClient.updatePartToErp(baseUrl, coCd, itemCd, itemNm, itemDc, 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에서 수정되었습니다."); System.out.println("ERP PART 단건 수정 성공: " + itemCd); } else { result.put("success", false); result.put("message", "ERP 수정 실패: " + response); System.err.println("ERP PART 단건 수정 실패: " + itemCd + " - " + 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; } /** * ERP에 모든 PART 전체 수정 (DB의 모든 release 상태 PART) * @return 성공 여부 Map */ public Map updateAllPartsToErp() { Map result = new HashMap(); SqlSession sqlSession = SqlMapConfig.getInstance().getSqlSession(false); try { String baseUrl = "https://erp.rps-korea.com"; System.out.println("===================================="); System.out.println("전체 PART 정보 ERP 수정 시작"); System.out.println("===================================="); // DB에서 모든 release 상태 PART 조회 List> partList = sqlSession.selectList("partMng.selectAllPartListForErp"); if (partList == null || partList.isEmpty()) { result.put("success", false); result.put("message", "수정할 PART가 없습니다."); return result; } System.out.println("총 " + partList.size() + "건의 PART를 ERP에 수정 전송합니다."); int successCount = 0; 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"; PartErpUpdateApiClient updateClient = new PartErpUpdateApiClient(); for (int i = 0; i < partList.size(); i++) { Map 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 itemDc = CommonUtils.checkNull(part.get("spec")); // 100건마다 진행 상황 출력 if ((i + 1) % 100 == 0) { System.out.println("진행 중: " + (i + 1) + "/" + partList.size() + " (성공: " + successCount + ", 실패: " + failCount + ")"); } // 필수값 체크 if (itemCd.isEmpty() || itemNm.isEmpty()) { failCount++; if (failCount <= 5) { 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); // 응답 확인 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; } }