From 72a001f533f19efab40665828da98642c31009f8 Mon Sep 17 00:00:00 2001 From: chpark Date: Tue, 24 Feb 2026 16:42:53 +0900 Subject: [PATCH] =?UTF-8?q?=EC=95=84=EB=A7=88=EB=9E=80=EC=8A=A4=20?= =?UTF-8?q?=EA=B2=B0=EC=9E=AC=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pms/controller/ApprovalController.java | 55 ++++++++++++++++- src/com/pms/service/ApprovalService.java | 60 ++++++++++++------- 2 files changed, 92 insertions(+), 23 deletions(-) diff --git a/src/com/pms/controller/ApprovalController.java b/src/com/pms/controller/ApprovalController.java index 7450d66..c9b2506 100644 --- a/src/com/pms/controller/ApprovalController.java +++ b/src/com/pms/controller/ApprovalController.java @@ -1,6 +1,8 @@ package com.pms.controller; +import java.io.BufferedReader; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Map; @@ -10,6 +12,8 @@ import javax.servlet.http.HttpSession; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.ibatis.session.SqlSession; +import org.json.simple.JSONObject; +import org.json.simple.parser.JSONParser; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @@ -393,7 +397,8 @@ public class ApprovalController { @ResponseBody @RequestMapping(value="/approval/amaranthApprovalCallback.do", produces="application/json; charset=UTF-8") public String amaranthApprovalCallback(HttpServletRequest request, @RequestParam Map paramMap)throws Exception{ - return approvalService.handleAmaranthApprovalCallback(paramMap); + Map mergedParam = mergeRequestParams(request, paramMap); + return approvalService.handleAmaranthApprovalCallback(mergedParam); } /** @@ -403,7 +408,53 @@ public class ApprovalController { @ResponseBody @RequestMapping(value="/approval/amaranthApprovalContents.do", produces="application/json; charset=UTF-8") public String amaranthApprovalContents(HttpServletRequest request, @RequestParam Map paramMap)throws Exception{ - return approvalService.getAmaranthApprovalContents(paramMap); + Map mergedParam = mergeRequestParams(request, paramMap); + return approvalService.getAmaranthApprovalContents(mergedParam); + } + + /** + * Amaranth에서 form-data 또는 JSON body로 파라미터를 전달할 수 있으므로 + * @RequestParam(form/query)과 JSON body를 모두 처리 + */ + private Map mergeRequestParams(HttpServletRequest request, Map paramMap){ + Map merged = new HashMap<>(paramMap); + + // @RequestParam에 approkey가 이미 있으면 추가 파싱 불필요 + if(merged.containsKey("approkey") || merged.containsKey("approKey")){ + System.out.println("[Amaranth API] @RequestParam에서 파라미터 수신: " + merged.keySet()); + return merged; + } + + // JSON body 파싱 시도 + try { + String contentType = request.getContentType(); + System.out.println("[Amaranth API] ContentType: " + contentType + ", @RequestParam 키: " + merged.keySet()); + + BufferedReader reader = request.getReader(); + StringBuilder sb = new StringBuilder(); + String line; + while((line = reader.readLine()) != null){ + sb.append(line); + } + String body = sb.toString().trim(); + + if(!body.isEmpty()){ + System.out.println("[Amaranth API] Request Body: " + body); + JSONParser parser = new JSONParser(); + Object parsed = parser.parse(body); + if(parsed instanceof JSONObject){ + JSONObject json = (JSONObject) parsed; + for(Object key : json.keySet()){ + merged.put(String.valueOf(key), json.get(key)); + } + System.out.println("[Amaranth API] JSON body에서 파라미터 추출: " + merged.keySet()); + } + } + } catch(Exception e){ + System.err.println("[Amaranth API] JSON body 파싱 실패 (무시): " + e.getMessage()); + } + + return merged; } } diff --git a/src/com/pms/service/ApprovalService.java b/src/com/pms/service/ApprovalService.java index 5ec78f7..ef63e85 100644 --- a/src/com/pms/service/ApprovalService.java +++ b/src/com/pms/service/ApprovalService.java @@ -10,6 +10,7 @@ import javax.servlet.http.HttpSession; import org.apache.commons.lang3.StringUtils; import org.apache.ibatis.session.SqlSession; +import org.json.simple.JSONObject; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -2044,8 +2045,9 @@ public class ApprovalService { return "{\"resultCode\":\"SUCCESS\",\"resultMessage\":\"성공하였습니다.\"}"; } - String targetType = CommonUtils.checkNull(mappingInfo.get("target_type")); - String targetObjId = CommonUtils.checkNull(mappingInfo.get("target_objid")); + mappingInfo = CommonUtils.toUpperCaseMapKey(mappingInfo); + String targetType = CommonUtils.checkNull(mappingInfo.get("TARGET_TYPE")); + String targetObjId = CommonUtils.checkNull(mappingInfo.get("TARGET_OBJID")); System.out.println("매핑 정보 - targetType: " + targetType + ", targetObjId: " + targetObjId); @@ -2125,8 +2127,13 @@ public class ApprovalService { * @param paramMap approkey, formId, docId, userId, empSeq 등 * @return 제목/본문 JSON */ + @SuppressWarnings("unchecked") public String getAmaranthApprovalContents(Map paramMap){ + // Amaranth에서 approkey 또는 approKey 두 가지 형태로 전달될 수 있음 String approkey = CommonUtils.checkNull(paramMap.get("approkey")); + if(approkey.isEmpty()){ + approkey = CommonUtils.checkNull(paramMap.get("approKey")); + } String docId = CommonUtils.checkNull(paramMap.get("docId")); System.out.println("=== Amaranth 결재 본문 조회 ==="); @@ -2143,18 +2150,21 @@ public class ApprovalService { searchParam.put("approKey", approkey); Map mappingInfo = sqlSession.selectOne("approval.selectAmaranthApprovalByApproKey", searchParam); + System.out.println("매핑 조회 결과: " + (mappingInfo != null ? mappingInfo : "null (매핑 없음)")); + String title = "결재 문서"; String contentsHtml = "

연동 데이터를 찾을 수 없습니다.

"; if(mappingInfo != null){ - String targetType = CommonUtils.checkNull(mappingInfo.get("target_type")); - String targetObjId = CommonUtils.checkNull(mappingInfo.get("target_objid")); - title = CommonUtils.checkNull(mappingInfo.get("approval_title"), "결재 문서"); + // DB 조회 결과의 키 대소문자에 관계없이 처리 + mappingInfo = CommonUtils.toUpperCaseMapKey(mappingInfo); + String targetType = CommonUtils.checkNull(mappingInfo.get("TARGET_TYPE")); + String targetObjId = CommonUtils.checkNull(mappingInfo.get("TARGET_OBJID")); + title = CommonUtils.checkNull(mappingInfo.get("APPROVAL_TITLE"), "결재 문서"); System.out.println("매핑 정보 - targetType: " + targetType + ", targetObjId: " + targetObjId); if("PROPOSAL".equals(targetType) && !targetObjId.isEmpty()){ - // 품의서 데이터 조회 Map proposalParam = new HashMap(); proposalParam.put("PROPOSAL_OBJID", targetObjId); Map proposalInfo = sqlSession.selectOne("salesMng.getProposalInfo", proposalParam); @@ -2171,26 +2181,34 @@ public class ApprovalService { } } - // UTF-8 인코딩 처리 (contentsEnc=U 설정됨) - String encodedTitle = java.net.URLEncoder.encode(title, "UTF-8"); - String encodedContents = java.net.URLEncoder.encode(contentsHtml, "UTF-8"); + // JSONObject로 안전한 JSON 응답 생성 (이스케이프 자동 처리) + JSONObject resultData = new JSONObject(); + resultData.put("title", title); + resultData.put("contents", contentsHtml); - StringBuilder result = new StringBuilder(); - result.append("{\"resultCode\":0,\"resultMessage\":\"SUCCESS\",\"resultData\":{"); - result.append("\"title\":\"").append(escapeJsonValue(encodedTitle)).append("\","); - result.append("\"contents\":\"").append(escapeJsonValue(encodedContents)).append("\""); - result.append("}}"); - return result.toString(); + JSONObject response = new JSONObject(); + response.put("resultCode", 0); + response.put("resultMessage", "SUCCESS"); + response.put("resultData", resultData); + + String responseStr = response.toJSONString(); + System.out.println("Contents API 응답 길이: " + responseStr.length()); + return responseStr; } catch(Exception e){ System.err.println("결재 본문 조회 오류: " + e.getMessage()); e.printStackTrace(); - StringBuilder result = new StringBuilder(); - result.append("{\"resultCode\":0,\"resultMessage\":\"SUCCESS\",\"resultData\":{"); - result.append("\"title\":\"결재 문서\","); - result.append("\"contents\":\"

본문 조회 중 오류가 발생했습니다.

\""); - result.append("}}"); - return result.toString(); + + JSONObject resultData = new JSONObject(); + resultData.put("title", "결재 문서"); + resultData.put("contents", "

본문 조회 중 오류가 발생했습니다: " + (e.getMessage() != null ? e.getMessage() : "") + "

"); + + JSONObject response = new JSONObject(); + response.put("resultCode", 0); + response.put("resultMessage", "SUCCESS"); + response.put("resultData", resultData); + + return response.toJSONString(); } finally { if(sqlSession != null) sqlSession.close(); }