diff --git a/src/com/pms/api/AmaranthApprovalApiClient.java b/src/com/pms/api/AmaranthApprovalApiClient.java index ad4cbf1..fec6d2e 100644 --- a/src/com/pms/api/AmaranthApprovalApiClient.java +++ b/src/com/pms/api/AmaranthApprovalApiClient.java @@ -1004,26 +1004,28 @@ public class AmaranthApprovalApiClient { } /** - * AES128 CBC PKCS5Padding 암호화 (loginId 또는 empSeq) - * 문서: 현재날짜(YYYYMMDDHHmmss)▦값 → AES 암호화 → Base64 - * Key = API상품연동설정 메뉴에서 확인 가능 (정확히 16바이트) + * AES128 CBC PKCS5Padding 암호화 (empSeq) + * 평문: 현재날짜(YYYYMMDDHHmmss)▦값 → AES 암호화 → Base64 + * Key = groupSeq 앞 16바이트, IV = Key와 동일 + * 타임스탬프는 반드시 한국시간(KST) 사용 */ private String encryptValue(String value) throws Exception { - // 현재 날짜시간 (YYYYMMDDHHmmss) - String currentDateTime = new java.text.SimpleDateFormat("yyyyMMddHHmmss").format(new java.util.Date()); + // 한국시간(KST) 기준 타임스탬프 생성 (Docker 서버가 UTC일 경우 대비) + java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyyMMddHHmmss"); + sdf.setTimeZone(java.util.TimeZone.getTimeZone("Asia/Seoul")); + String currentDateTime = sdf.format(new java.util.Date()); - // 암호화할 평문: 현재날짜시간▦값 (반드시 특수문자 ▦ 사용) String plainText = currentDateTime + "\u25A6" + value; System.out.println("[AES] plainText: " + plainText); + System.out.println("[AES] timestamp(KST): " + currentDateTime); System.out.println("[AES] AES_KEY: " + AES_KEY + " (길이: " + AES_KEY.length() + ")"); - // 문서 샘플코드: Key.getBytes()를 직접 사용 (Key, IV 동일) byte[] keyData = AES_KEY.getBytes("UTF-8"); - // AES128은 16바이트 키 필요 - 키가 16바이트가 아니면 조정 - if(keyData.length != 16){ - System.out.println("[AES] 키 길이가 16바이트가 아님: " + keyData.length + "바이트 → 16바이트로 조정"); + // AES-128: 16바이트 키 (groupSeq 앞 16바이트) + if(keyData.length != 16) { + System.out.println("[AES] 키 길이 조정: " + keyData.length + "바이트 → 16바이트"); byte[] key16 = new byte[16]; System.arraycopy(keyData, 0, key16, 0, Math.min(keyData.length, 16)); keyData = key16; diff --git a/src/com/pms/mapper/partMng.xml b/src/com/pms/mapper/partMng.xml index 50f0d6d..0ed105e 100644 --- a/src/com/pms/mapper/partMng.xml +++ b/src/com/pms/mapper/partMng.xml @@ -3975,17 +3975,17 @@ SELECT T1.LEV, T1.BOM_REPORT_OBJID, T1.ROOT_PART_NO, T1.PATH, T1.LEAF, T2.* ) VALUES ( - #{BOM_REPORT_OBJID}, - #{OBJID}, - #{PARENT_OBJID}, - #{CHILD_OBJID}, - #{PARENT_PART_NO}, - #{PART_NO}, - - #{QTY}, - #{ITEM_QTY}, - #{QTY_TEMP}, + #{BOM_REPORT_OBJID}, + #{OBJID}, + #{PARENT_OBJID}, + #{CHILD_OBJID}, + #{PARENT_PART_NO}, + #{PART_NO}, + + COALESCE(NULLIF(#{QTY}, ''), '0')::NUMERIC, + COALESCE(NULLIF(#{ITEM_QTY}, ''), '0')::NUMERIC, + COALESCE(NULLIF(#{QTY_TEMP}, ''), '0')::NUMERIC, NOW(), #{WRITER}, nextval('seq_bom_qty'), @@ -7545,46 +7545,46 @@ SELECT T1.LEV, T1.BOM_REPORT_OBJID, T1.ROOT_PART_NO, T1.PATH, T1.LEAF, T2.* ,UNIT_LENGTH ,UNIT_QTY ) VALUES ( - #{PART_OBJID}::NUMERIC - ,#{PART_NO} - ,#{PART_NAME} - ,#{UNIT} - ,#{QTY} - ,#{SPEC} - ,#{MATERIAL} - ,#{THICKNESS} - ,#{WIDTH} - ,#{HEIGHT} - ,#{OUT_DIAMETER} - ,#{IN_DIAMETER} - ,#{LENGTH} - ,#{REMARK} - ,'create' - ,now() - ,#{CONNECTUSERID} - ,'1' - ,#{PART_TYPE} - ,#{PRODUCT_MGMT_OBJID} - ,#{SUPPLY_CODE} - ,#{MAKER} - ,#{CONTRACT_OBJID} - ,#{POST_PROCESSING} - ,#{HEAT_TREATMENT_HARDNESS} - ,#{HEAT_TREATMENT_METHOD} - ,#{SURFACE_TREATMENT} - ,#{ACCTFG} - ,#{ODRFG} - ,#{UNIT_DC} - ,#{UNITMANG_DC} - ,#{UNITCHNG_NB}::NUMERIC - ,COALESCE(#{LOT_FG}, '0') - ,COALESCE(#{USE_YN}, '1') - ,COALESCE(#{QC_FG}, '0') - ,COALESCE(#{SETITEM_FG}, '0') - ,COALESCE(#{REQ_FG}, '0') - ,#{UNIT_LENGTH} - ,#{UNIT_QTY} - ) + #{PART_OBJID}::NUMERIC + ,#{PART_NO} + ,#{PART_NAME} + ,#{UNIT} + ,COALESCE(NULLIF(#{QTY}, ''), '0')::NUMERIC + ,#{SPEC} + ,#{MATERIAL} + ,NULLIF(#{THICKNESS}, '') + ,NULLIF(#{WIDTH}, '') + ,NULLIF(#{HEIGHT}, '') + ,NULLIF(#{OUT_DIAMETER}, '') + ,NULLIF(#{IN_DIAMETER}, '') + ,NULLIF(#{LENGTH}, '') + ,#{REMARK} + ,'create' + ,now() + ,#{CONNECTUSERID} + ,'1' + ,#{PART_TYPE} + ,#{PRODUCT_MGMT_OBJID} + ,#{SUPPLY_CODE} + ,#{MAKER} + ,#{CONTRACT_OBJID} + ,#{POST_PROCESSING} + ,#{HEAT_TREATMENT_HARDNESS} + ,#{HEAT_TREATMENT_METHOD} + ,#{SURFACE_TREATMENT} + ,#{ACCTFG} + ,#{ODRFG} + ,#{UNIT_DC} + ,#{UNITMANG_DC} + ,COALESCE(NULLIF(#{UNITCHNG_NB}, ''), '0')::NUMERIC + ,COALESCE(#{LOT_FG}, '0') + ,COALESCE(#{USE_YN}, '1') + ,COALESCE(#{QC_FG}, '0') + ,COALESCE(#{SETITEM_FG}, '0') + ,COALESCE(#{REQ_FG}, '0') + ,NULLIF(#{UNIT_LENGTH}, '') + ,NULLIF(#{UNIT_QTY}, '') + ) diff --git a/src/com/pms/service/ApprovalService.java b/src/com/pms/service/ApprovalService.java index 62b88a5..072dc20 100644 --- a/src/com/pms/service/ApprovalService.java +++ b/src/com/pms/service/ApprovalService.java @@ -1787,8 +1787,13 @@ public class ApprovalService { } String empSeq = CommonUtils.checkNull(person.getEmpseq()); + System.out.println("=== Amaranth SSO - 사용자 정보 ==="); + System.out.println("userId: " + person.getUserId()); + System.out.println("userName: " + person.getUserName()); + System.out.println("empSeq: [" + empSeq + "]"); + if(empSeq.isEmpty()){ - return "{\"resultCode\":-1,\"resultMsg\":\"empSeq 정보가 없습니다. 관리자에게 문의하세요.\"}"; + return "{\"resultCode\":-1,\"resultMsg\":\"empSeq 정보가 없습니다. (userId: " + person.getUserId() + ") 관리자에게 문의하세요.\"}"; } // 파라미터 추출 diff --git a/src/com/pms/service/PartMngService.java b/src/com/pms/service/PartMngService.java index 6ea7a97..def76be 100644 --- a/src/com/pms/service/PartMngService.java +++ b/src/com/pms/service/PartMngService.java @@ -5023,16 +5023,25 @@ public class PartMngService extends BaseService { insertMap.put("PARENT_PART_NO", PARENT_PART_NO); insertMap.put("PART_NO", PART_NO); insertMap.put("PART_NAME", CommonUtils.checkNull((String)insertMap.get("PART_NAME"))); - insertMap.put("QTY", CommonUtils.checkNull((String)insertMap.get("QTY"))); - insertMap.put("UNIT", CommonUtils.checkNull((String)insertMap.get("UNIT"))); - insertMap.put("SPEC", CommonUtils.checkNull((String)insertMap.get("SPEC"))); - insertMap.put("MATERIAL", CommonUtils.checkNull((String)insertMap.get("MATERIAL"))); - insertMap.put("THICKNESS", CommonUtils.checkNull((String)insertMap.get("THICKNESS"))); - insertMap.put("WIDTH", CommonUtils.checkNull((String)insertMap.get("WIDTH"))); - insertMap.put("HEIGHT", CommonUtils.checkNull((String)insertMap.get("HEIGHT"))); - insertMap.put("OUT_DIAMETER", CommonUtils.checkNull((String)insertMap.get("OUT_DIAMETER"))); - insertMap.put("IN_DIAMETER", CommonUtils.checkNull((String)insertMap.get("IN_DIAMETER"))); - insertMap.put("LENGTH", CommonUtils.checkNull((String)insertMap.get("LENGTH"))); + String qtyVal = CommonUtils.checkNull((String)insertMap.get("QTY")); + insertMap.put("QTY", StringUtils.isBlank(qtyVal) ? "0" : qtyVal); + insertMap.put("ITEM_QTY", StringUtils.isBlank(qtyVal) ? "0" : qtyVal); + insertMap.put("QTY_TEMP", StringUtils.isBlank(qtyVal) ? "0" : qtyVal); + insertMap.put("UNIT", CommonUtils.checkNull((String)insertMap.get("UNIT"))); + insertMap.put("SPEC", CommonUtils.checkNull((String)insertMap.get("SPEC"))); + insertMap.put("MATERIAL", CommonUtils.checkNull((String)insertMap.get("MATERIAL"))); + String thicknessVal = CommonUtils.checkNull((String)insertMap.get("THICKNESS")); + insertMap.put("THICKNESS", StringUtils.isBlank(thicknessVal) ? null : thicknessVal); + String widthVal = CommonUtils.checkNull((String)insertMap.get("WIDTH")); + insertMap.put("WIDTH", StringUtils.isBlank(widthVal) ? null : widthVal); + String heightVal = CommonUtils.checkNull((String)insertMap.get("HEIGHT")); + insertMap.put("HEIGHT", StringUtils.isBlank(heightVal) ? null : heightVal); + String outDiameterVal = CommonUtils.checkNull((String)insertMap.get("OUT_DIAMETER")); + insertMap.put("OUT_DIAMETER", StringUtils.isBlank(outDiameterVal) ? null : outDiameterVal); + String inDiameterVal = CommonUtils.checkNull((String)insertMap.get("IN_DIAMETER")); + insertMap.put("IN_DIAMETER", StringUtils.isBlank(inDiameterVal) ? null : inDiameterVal); + String lengthVal = CommonUtils.checkNull((String)insertMap.get("LENGTH")); + insertMap.put("LENGTH", StringUtils.isBlank(lengthVal) ? null : lengthVal); insertMap.put("PART_TYPE", CommonUtils.checkNull((String)insertMap.get("PART_TYPE"))); insertMap.put("REMARK", CommonUtils.checkNull((String)insertMap.get("REMARK"))); insertMap.put("SUPPLY_CODE", CommonUtils.checkNull((String)insertMap.get("SUPPLY_CODE"))); @@ -5047,7 +5056,8 @@ public class PartMngService extends BaseService { // ERP 연동 필드 insertMap.put("UNIT_DC", CommonUtils.checkNull((String)insertMap.get("UNIT_DC"))); insertMap.put("UNITMANG_DC", CommonUtils.checkNull((String)insertMap.get("UNITMANG_DC"))); - insertMap.put("UNITCHNG_NB", CommonUtils.checkNull((String)insertMap.get("UNITCHNG_NB"))); + String unitchngNbVal = CommonUtils.checkNull((String)insertMap.get("UNITCHNG_NB")); + insertMap.put("UNITCHNG_NB", StringUtils.isBlank(unitchngNbVal) ? "0" : unitchngNbVal); String lotFgVal = CommonUtils.checkNull((String)insertMap.get("LOT_FG")); insertMap.put("LOT_FG", StringUtils.isBlank(lotFgVal) ? "0" : lotFgVal); String useYnVal = CommonUtils.checkNull((String)insertMap.get("USE_YN")); @@ -5058,9 +5068,11 @@ public class PartMngService extends BaseService { insertMap.put("SETITEM_FG", StringUtils.isBlank(setitemFgVal) ? "0" : setitemFgVal); String reqFgVal = CommonUtils.checkNull((String)insertMap.get("REQ_FG")); insertMap.put("REQ_FG", StringUtils.isBlank(reqFgVal) ? "0" : reqFgVal); - // 개당길이, 개당소요량 - insertMap.put("UNIT_LENGTH", CommonUtils.checkNull((String)insertMap.get("UNIT_LENGTH"))); - insertMap.put("UNIT_QTY", CommonUtils.checkNull((String)insertMap.get("UNIT_QTY"))); + // 개당길이, 개당소요량 + String unitLengthVal = CommonUtils.checkNull((String)insertMap.get("UNIT_LENGTH")); + insertMap.put("UNIT_LENGTH", StringUtils.isBlank(unitLengthVal) ? null : unitLengthVal); + String unitQtyVal = CommonUtils.checkNull((String)insertMap.get("UNIT_QTY")); + insertMap.put("UNIT_QTY", StringUtils.isBlank(unitQtyVal) ? null : unitQtyVal); insertMap.put("STATUS", "deploy"); // 엑셀 업로드 시 deploy 상태로 저장 insertMap.put("WRITER", CommonUtils.checkNull((String)paramMap.get("CONNECTUSERID")));