This commit is contained in:
2026-02-10 15:26:40 +09:00
11 changed files with 317 additions and 23 deletions

View File

@@ -423,6 +423,7 @@ public class Constants {
public static final String UNIT_CODE = "0000059"; //UNIT
public static final String UPG_COMMON_CODE = "0000042"; //UPG
public static final String PART_TYPE_CODE = "0000062"; //PART_TYPE
public static final String ACCTFG_CODE = "0900213"; //계정구분
public static final String PART_CHANGE_TYPE_CODE = "0001054"; //CHANGE_TYPE_
public static final String PART_CHANGE_OPTION_CODE = "0000318"; //CHANGE_OPTION

View File

@@ -667,6 +667,16 @@ public class PartMngController {
try{
objid = CommonUtils.createObjId();
// 범주이름(PART_TYPE) 공통코드 조회 - jqGrid selectBox용 JSON
Map partTypeParam = new HashMap();
partTypeParam.put("codeId", Constants.PART_TYPE_CODE);
code_map.put("part_type", commonService.getJqGridSelectBoxJsonData("common.getCodeList", partTypeParam, "선택"));
// 계정구분(ACCTFG) 공통코드 조회 - jqGrid selectBox용 JSON
Map acctfgParam = new HashMap();
acctfgParam.put("codeId", Constants.ACCTFG_CODE);
code_map.put("acctfg_code", commonService.getJqGridSelectBoxJsonData("common.getCodeList", acctfgParam, "선택"));
/*
code_map.put("customer_cd",commonService.bizMakeOptionList("", (String)paramMap.get("customer_cd"),"common.getsupplyselect"));
code_map.put("project_name",commonService.bizMakeOptionList("", (String)paramMap.get("project_name"),"common.getProjectNameList"));
@@ -1856,6 +1866,11 @@ public class PartMngController {
//제품구분
code_map.put("product_cd", commonService.bizMakeOptionList("0000001", CommonUtils.nullToEmpty((String)paramMap.get("product_cd")),"common.getCodeselect")); //제품구분
// 계정구분(ACCTFG) 공통코드 조회 - jqGrid selectBox용 JSON
Map acctfgParam = new HashMap();
acctfgParam.put("codeId", Constants.ACCTFG_CODE);
code_map.put("acctfg_code", commonService.getJqGridSelectBoxJsonData("common.getCodeList", acctfgParam, "선택"));
sqlSession = SqlMapConfig.getInstance().getSqlSession();

View File

@@ -157,6 +157,8 @@
P.HEAT_TREATMENT_HARDNESS,
P.HEAT_TREATMENT_METHOD,
P.SURFACE_TREATMENT,
P.ACCTFG,
P.ODRFG,
COALESCE(FILE_CNT.CU01_CNT, 0) CU01_CNT,
COALESCE(FILE_CNT.CU02_CNT, 0) CU02_CNT,
COALESCE(FILE_CNT.CU03_CNT, 0) CU03_CNT,
@@ -655,7 +657,9 @@
SUB_CATEGORY,
HEAT_TREATMENT_HARDNESS,
HEAT_TREATMENT_METHOD,
SURFACE_TREATMENT
SURFACE_TREATMENT,
ACCTFG,
ODRFG
) VALUES (
#{OBJID}::NUMERIC,
#{PRODUCT_MGMT_OBJID},
@@ -701,7 +705,9 @@
#{SUB_CATEGORY},
#{HEAT_TREATMENT_HARDNESS},
#{HEAT_TREATMENT_METHOD},
#{SURFACE_TREATMENT}
#{SURFACE_TREATMENT},
#{ACCTFG},
#{ODRFG}
) ON
CONFLICT (OBJID) DO
UPDATE
@@ -745,7 +751,9 @@
SUB_CATEGORY = #{SUB_CATEGORY},
HEAT_TREATMENT_HARDNESS = #{HEAT_TREATMENT_HARDNESS},
HEAT_TREATMENT_METHOD = #{HEAT_TREATMENT_METHOD},
SURFACE_TREATMENT = #{SURFACE_TREATMENT}
SURFACE_TREATMENT = #{SURFACE_TREATMENT},
ACCTFG = #{ACCTFG},
ODRFG = #{ODRFG}
</update>
@@ -802,7 +810,9 @@
HEAT_TREATMENT_HARDNESS,
HEAT_TREATMENT_METHOD,
SURFACE_TREATMENT,
SUPPLY_CODE
SUPPLY_CODE,
ACCTFG,
ODRFG
) VALUES (
#{OBJID}::NUMERIC,
#{PRODUCT_MGMT_OBJID},
@@ -860,7 +870,9 @@
#{HEAT_TREATMENT_HARDNESS},
#{HEAT_TREATMENT_METHOD},
#{SURFACE_TREATMENT},
#{SUPPLY_CODE}
#{SUPPLY_CODE},
#{ACCTFG},
#{ODRFG}
) ON
CONFLICT (OBJID) DO
UPDATE
@@ -911,7 +923,9 @@
HEAT_TREATMENT_HARDNESS = #{HEAT_TREATMENT_HARDNESS},
HEAT_TREATMENT_METHOD = #{HEAT_TREATMENT_METHOD},
SURFACE_TREATMENT = #{SURFACE_TREATMENT},
SUPPLY_CODE = #{SUPPLY_CODE}
SUPPLY_CODE = #{SUPPLY_CODE},
ACCTFG = #{ACCTFG},
ODRFG = #{ODRFG}
</update>
<update id="mergePartMngHistory" parameterType="map">
INSERT INTO PART_MNG_HISTORY
@@ -2653,6 +2667,8 @@ SELECT T1.LEV, T1.BOM_REPORT_OBJID, T1.ROOT_PART_NO, T1.PATH, T1.LEAF, T2.*
SURFACE_TREATMENT = #{SURFACE_TREATMENT},
MAKER = #{MAKER},
PART_TYPE = #{PART_TYPE},
ACCTFG = #{ACCTFG},
ODRFG = #{ODRFG},
REMARK = #{REMARK},
EDIT_DATE = NOW()
WHERE OBJID = #{OBJID}
@@ -6680,6 +6696,16 @@ SELECT T1.LEV, T1.BOM_REPORT_OBJID, T1.ROOT_PART_NO, T1.PATH, T1.LEAF, T2.*
AND status='create'
</update>
<!-- BOM에 연결된 create 상태 파트 OBJID 목록 조회 (ERP 전송용) -->
<select id="getCreatePartObjidsByBomObjid" parameterType="map" resultType="string">
SELECT CAST(p.OBJID AS VARCHAR) AS PART_OBJID
FROM part_mng p
WHERE p.OBJID IN (
SELECT part_no FROM bom_part_qty AS t
WHERE t.bom_report_objid = #{checkArr}
)
AND p.status = 'create'
</select>
<!-- 선택된 구조등록 연결PART를 삭제한다.. -->
<delete id="deleteBomQtyPart" parameterType="map">
@@ -7448,6 +7474,8 @@ SELECT T1.LEV, T1.BOM_REPORT_OBJID, T1.ROOT_PART_NO, T1.PATH, T1.LEAF, T2.*
,HEAT_TREATMENT_HARDNESS
,HEAT_TREATMENT_METHOD
,SURFACE_TREATMENT
,ACCTFG
,ODRFG
) VALUES (
#{PART_OBJID}::NUMERIC
,#{PART_NO}
@@ -7476,6 +7504,8 @@ SELECT T1.LEV, T1.BOM_REPORT_OBJID, T1.ROOT_PART_NO, T1.PATH, T1.LEAF, T2.*
,#{HEAT_TREATMENT_HARDNESS}
,#{HEAT_TREATMENT_METHOD}
,#{SURFACE_TREATMENT}
,#{ACCTFG}
,#{ODRFG}
)
</insert>
@@ -7699,6 +7729,15 @@ SELECT PM.OBJID
AND PARENT_CODE_ID='0000062'
</select>
<!-- 계정구분 코드 조회 (한글명 → ERP 코드값) -->
<select id="getAcctfgCode" parameterType="map" resultType="map">
SELECT
CODE_ID
FROM COMM_CODE
WHERE CODE_NAME = #{CODE_NAME}
AND PARENT_CODE_ID = '0900213'
</select>
<!-- 공급업체명으로 OBJID 조회 -->
<select id="getSupplyCodeByName" parameterType="map" resultType="map">
SELECT

View File

@@ -673,17 +673,26 @@ public class PartMngService extends BaseService {
if(result > 0){
sqlSession.commit();
// ERP로 수정된 PART 정보 전송
// ERP로 수정된 PART 정보 전송 (release 상태일 때만)
String partObjid = CommonUtils.checkNull(paramMap.get("OBJID"));
if (!partObjid.isEmpty()) {
try {
System.out.println("====================================");
System.out.println("PART 상세 수정 후 ERP 전송: " + partObjid);
System.out.println("====================================");
// 파트 상태 확인
Map<String, Object> partInfo = sqlSession.selectOne("partMng.partMngInfo", paramMap);
String partStatus = partInfo != null ? CommonUtils.checkNull(partInfo.get("status")) : "";
batchService.updatePartToErp(partObjid);
System.out.println("ERP 전송 완료 (PART 상세 수정)");
// release 상태일 때만 ERP Update 전송
if("release".equals(partStatus)) {
System.out.println("====================================");
System.out.println("PART 상세 수정 후 ERP 전송: " + partObjid);
System.out.println("====================================");
batchService.updatePartToErp(partObjid);
System.out.println("ERP 전송 완료 (PART 상세 수정)");
} else {
System.out.println("PART 상태가 release가 아니므로 ERP 전송 생략: " + partStatus);
}
} catch (Exception erpEx) {
// ERP 전송 실패해도 DB 저장은 성공으로 처리
System.err.println("ERP 전송 실패 (PART 상세 수정): " + erpEx.getMessage());
@@ -1095,6 +1104,9 @@ public class PartMngService extends BaseService {
String userId = person.getUserId();
paramMap.put("EDITER", userId);
// ERP 전송할 파트 OBJID 목록 (DB 트랜잭션 외부에서 사용)
List<String> partObjidsForErp = new ArrayList<String>();
try{
// BOM 상태 업데이트
int cnt = sqlSession.update("partMng.updateStructureStatus", paramMap);
@@ -1106,6 +1118,9 @@ public class PartMngService extends BaseService {
Map deployParam = new HashMap();
deployParam.put("checkArr", objId);
// ERP 전송할 파트 OBJID 목록 조회 (상태 변경 전에 조회)
partObjidsForErp = sqlSession.selectList("partMng.getCreatePartObjidsByBomObjid", deployParam);
// BOM에 연결된 파트들의 상태를 create -> release로 변경
sqlSession.update("partMng.deployPartInfo", deployParam);
}
@@ -1119,6 +1134,33 @@ public class PartMngService extends BaseService {
sqlSession.close();
}
// DB 트랜잭션 성공 후 ERP 전송 (ERP 실패해도 DB 저장은 유지)
if(result && !partObjidsForErp.isEmpty()){
System.out.println("====================================");
System.out.println("E-BOM 상태변경 후 ERP 전송 시작");
System.out.println("전송 대상 파트 수: " + partObjidsForErp.size());
System.out.println("====================================");
for(String partObjid : partObjidsForErp){
try{
Map<String, Object> erpResult = batchService.sendSinglePartToErp(partObjid);
if(erpResult != null && Boolean.TRUE.equals(erpResult.get("success"))){
System.out.println("ERP 전송 성공 (PART OBJID: " + partObjid + ")");
}else{
System.err.println("ERP 전송 실패 (PART OBJID: " + partObjid + ")");
}
}catch(Exception erpEx){
// ERP 전송 실패해도 다음 파트 진행
System.err.println("ERP 전송 에러 (PART OBJID: " + partObjid + "): " + erpEx.getMessage());
erpEx.printStackTrace();
}
}
System.out.println("====================================");
System.out.println("E-BOM 상태변경 후 ERP 전송 완료");
System.out.println("====================================");
}
return result;
}
@@ -2842,6 +2884,13 @@ public class PartMngService extends BaseService {
} else if (fileName.endsWith(".xlsx") || fileName.endsWith(".XLSX")) {
workBook = new XSSFWorkbook(fis);
}
// workBook null 체크
if(workBook == null) {
System.err.println("지원하지 않는 파일 형식입니다: " + fileName);
fis.close();
return resultList;
}
Sheet sheet = workBook.getSheetAt(0);
// 데이터 포멧터
@@ -3017,12 +3066,44 @@ public class PartMngService extends BaseService {
}
}
//비고(REMARK)
partMap.put("REMARK", getCellValue(row, columnIndex++, formatter, emptyColCnt));
// 계정구분(ACCTFG) - 한글명 입력 시 코드값으로 변환
String acctfgValue = getCellValue(row, columnIndex++, formatter, emptyColCnt);
if(!CommonUtils.isBlank(acctfgValue)){
// 숫자면 그대로 사용, 한글이면 코드 조회
if(acctfgValue.matches("\\d+")) {
partMap.put("ACCTFG", acctfgValue);
} else {
Map acctfgParam = new HashMap();
acctfgParam.put("CODE_NAME", acctfgValue.trim());
Map acctfgResult = sqlSession.selectOne("partMng.getAcctfgCode", acctfgParam);
if(acctfgResult != null && !StringUtils.isBlank((String)acctfgResult.get("code_id"))){
partMap.put("ACCTFG", acctfgResult.get("code_id"));
} else {
partMap.put("ACCTFG", acctfgValue); // 변환 실패 시 원본 유지
}
}
} else {
partMap.put("ACCTFG", "");
}
// 조달구분(ODRFG) - 한글명 입력 시 코드값으로 변환
String odrfgValue = getCellValue(row, columnIndex++, formatter, emptyColCnt);
if(!CommonUtils.isBlank(odrfgValue)){
if("구매".equals(odrfgValue.trim())){
partMap.put("ODRFG", "0");
} else if("생산".equals(odrfgValue.trim())){
partMap.put("ODRFG", "1");
} else {
partMap.put("ODRFG", odrfgValue); // 숫자면 그대로
}
} else {
partMap.put("ODRFG", "");
}
//비고(REMARK)
partMap.put("REMARK", getCellValue(row, columnIndex++, formatter, emptyColCnt));
if(logging) logger.info("partMap:"+partMap);
if(emptyColCnt.intValue() < 8) { //모두 공백 아니면 담기
if(logging) logger.info("partMap:"+partMap);
if(emptyColCnt.intValue() < 8) { //모두 공백 아니면 담기
resultList.add(partMap);
}else {
emptyRowCnt++;
@@ -3352,6 +3433,9 @@ public class PartMngService extends BaseService {
String surfaceTreatment = getCsvValue(values, colIndex++, emptyColCnt); // 8: 표면처리
String supplier = getCsvValue(values, colIndex++, emptyColCnt); // 9: 공급업체
String partType = getCsvValue(values, colIndex++, emptyColCnt); // 10: 범주이름
// 계정구분/조달구분은 CSV에 있을 수도 없을 수도 있음
String acctfg = colIndex < values.length ? getCsvValue(values, colIndex++, emptyColCnt) : ""; // 11: 계정구분
String odrfg = colIndex < values.length ? getCsvValue(values, colIndex++, emptyColCnt) : ""; // 12: 조달구분
// 수준으로부터 부모 품번 찾기
String parentPartNo = "";
@@ -3456,6 +3540,35 @@ public class PartMngService extends BaseService {
partMap.put("SURFACE_TREATMENT", surfaceTreatment);
partMap.put("MAKER", makerValue); // MAKER에 저장
partMap.put("PART_TYPE", partTypeCode);
// 계정구분(ACCTFG) - 한글명 입력 시 코드값으로 변환
if(!StringUtils.isBlank(acctfg)){
if(acctfg.matches("\\d+")) {
partMap.put("ACCTFG", acctfg);
} else {
Map acctfgParam = new HashMap();
acctfgParam.put("CODE_NAME", acctfg.trim());
Map acctfgResult = sqlSession.selectOne("partMng.getAcctfgCode", acctfgParam);
if(acctfgResult != null && !StringUtils.isBlank((String)acctfgResult.get("code_id"))){
partMap.put("ACCTFG", acctfgResult.get("code_id"));
} else {
partMap.put("ACCTFG", acctfg);
}
}
} else {
partMap.put("ACCTFG", "");
}
// 조달구분(ODRFG) - 한글명 입력 시 코드값으로 변환
if(!CommonUtils.isBlank(odrfg)){
if("구매".equals(odrfg.trim())){
partMap.put("ODRFG", "0");
} else if("생산".equals(odrfg.trim())){
partMap.put("ODRFG", "1");
} else {
partMap.put("ODRFG", odrfg); // 숫자면 그대로
}
} else {
partMap.put("ODRFG", "");
}
partMap.put("NOTE", noteMsg);
if(!StringUtils.isBlank(noteMsg) || emptyColCnt.intValue() < 9) {
@@ -3707,7 +3820,7 @@ public class PartMngService extends BaseService {
// 1: 모품번(PARENT_PART_NO), 2: 품번(PART_NO), 3: 품명(PART_NAME)
// 4: 수량(QTY), 5: 항목수량(ITEM_QTY), 6: 재료(MATERIAL)
// 7: 열처리경도(HEAT_TREATMENT_HARDNESS), 8: 열처리방법(HEAT_TREATMENT_METHOD), 9: 표면처리(SURFACE_TREATMENT)
// 10: 공급업체(SUPPLIER), 11: 범주이름(PART_TYPE)
// 10: 공급업체(SUPPLIER), 11: 범주이름(PART_TYPE), 12: 계정구분(ACCTFG), 13: 조달구분(ODRFG)
String parentPartNo = getCellValue(row, columnIndex++, formatter, emptyColCnt).trim(); // 모품번
String partNo = getCellValue(row, columnIndex++, formatter, emptyColCnt).trim(); // 품번
@@ -3720,6 +3833,8 @@ public class PartMngService extends BaseService {
String surfaceTreatment = getCellValue(row, columnIndex++, formatter, emptyColCnt).trim(); // 표면처리
String supplier = getCellValue(row, columnIndex++, formatter, emptyColCnt).trim(); // 공급업체
String partType = getCellValue(row, columnIndex++, formatter, emptyColCnt).trim(); // 범주이름
String acctfg = getCellValue(row, columnIndex++, formatter, emptyColCnt).trim(); // 계정구분
String odrfg = getCellValue(row, columnIndex++, formatter, emptyColCnt).trim(); // 조달구분
// 빈 행 체크
if(StringUtils.isBlank(partNo) && StringUtils.isBlank(partName)){
@@ -3837,6 +3952,35 @@ public class PartMngService extends BaseService {
partMap.put("SURFACE_TREATMENT", surfaceTreatment);
partMap.put("MAKER", makerValue); // MAKER에 저장
partMap.put("PART_TYPE", partTypeCode);
// 계정구분(ACCTFG) - 한글명 입력 시 코드값으로 변환
if(!StringUtils.isBlank(acctfg)){
if(acctfg.matches("\\d+")) {
partMap.put("ACCTFG", acctfg);
} else {
Map acctfgParam = new HashMap();
acctfgParam.put("CODE_NAME", acctfg.trim());
Map acctfgResult = sqlSession.selectOne("partMng.getAcctfgCode", acctfgParam);
if(acctfgResult != null && !StringUtils.isBlank((String)acctfgResult.get("code_id"))){
partMap.put("ACCTFG", acctfgResult.get("code_id"));
} else {
partMap.put("ACCTFG", acctfg);
}
}
} else {
partMap.put("ACCTFG", "");
}
// 조달구분(ODRFG) - 한글명 입력 시 코드값으로 변환
if(!CommonUtils.isBlank(odrfg)){
if("구매".equals(odrfg.trim())){
partMap.put("ODRFG", "0");
} else if("생산".equals(odrfg.trim())){
partMap.put("ODRFG", "1");
} else {
partMap.put("ODRFG", odrfg); // 숫자면 그대로
}
} else {
partMap.put("ODRFG", "");
}
partMap.put("NOTE", noteMsg);
if(logging) logger.info("partMap:"+partMap);
@@ -4628,6 +4772,9 @@ public class PartMngService extends BaseService {
insertMap.put("HEAT_TREATMENT_HARDNESS", CommonUtils.checkNull((String)insertMap.get("HEAT_TREATMENT_HARDNESS")));
insertMap.put("HEAT_TREATMENT_METHOD", CommonUtils.checkNull((String)insertMap.get("HEAT_TREATMENT_METHOD")));
insertMap.put("SURFACE_TREATMENT", CommonUtils.checkNull((String)insertMap.get("SURFACE_TREATMENT")));
// 계정구분, 조달구분
insertMap.put("ACCTFG", CommonUtils.checkNull((String)insertMap.get("ACCTFG")));
insertMap.put("ODRFG", CommonUtils.checkNull((String)insertMap.get("ODRFG")));
insertMap.put("STATUS", "deploy"); // 엑셀 업로드 시 deploy 상태로 저장
insertMap.put("WRITER", CommonUtils.checkNull((String)paramMap.get("CONNECTUSERID")));