From 37a5e6b1bf177ae94adc4e08bce5b35f5f1d9a3f Mon Sep 17 00:00:00 2001 From: chpark Date: Wed, 25 Feb 2026 14:52:21 +0900 Subject: [PATCH 1/3] =?UTF-8?q?=EA=B5=AC=EB=A7=A4=EA=B4=80=EB=A6=AC=20?= =?UTF-8?q?=ED=92=88=EC=9D=98=EC=84=9C=20=EA=B2=B0=EC=9E=AC=EC=83=81?= =?UTF-8?q?=EC=8B=A0=20=EC=95=84=EB=A7=88=EB=9E=80=EC=8A=A4=20=EC=97=B0?= =?UTF-8?q?=EB=8F=99=20+=20ECR=20OBJID=20=ED=83=80=EC=9E=85=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Cursor --- .../classes/com/pms/mapper/salesMng.xml | 16 +++-- .../WEB-INF/view/salesMng/proposalMngList.jsp | 64 ++++++++++++++----- src/com/pms/mapper/salesMng.xml | 16 +++-- .../controller/SalesMngController.java | 1 + src/com/pms/service/ApprovalService.java | 12 +--- 5 files changed, 76 insertions(+), 33 deletions(-) diff --git a/WebContent/WEB-INF/classes/com/pms/mapper/salesMng.xml b/WebContent/WEB-INF/classes/com/pms/mapper/salesMng.xml index 27b856e..23f88e6 100644 --- a/WebContent/WEB-INF/classes/com/pms/mapper/salesMng.xml +++ b/WebContent/WEB-INF/classes/com/pms/mapper/salesMng.xml @@ -4535,20 +4535,25 @@ ORDER BY V.PATH2 -- (SELECT CASE WHEN COUNT(*) > 0 THEN 'Y' ELSE 'N' END FROM PURCHASE_ORDER_MASTER WHERE SALES_REQUEST_OBJID = SRM.OBJID AND MAIL_SENT = 'Y') AS MAIL_SENT, -- 발주일 (일단 주석처리) -- (SELECT TO_CHAR(MAX(ORDER_DATE), 'YYYY-MM-DD') FROM PURCHASE_ORDER_MASTER WHERE SALES_REQUEST_OBJID = SRM.OBJID) AS ORDER_DATE, - -- 상태: 결재 테이블 상태 우선, 없으면 SRM.STATUS + -- 상태: 아마란스 결재 > 내부 결재 > SRM.STATUS 순서로 우선 CASE + WHEN AMR.STATUS = 'complete' THEN 'approvalComplete' + WHEN AMR.STATUS = 'inProcess' THEN 'inProcess' + WHEN AMR.STATUS = 'reject' THEN 'reject' WHEN A.ROUTE_STATUS = 'complete' THEN 'approvalComplete' WHEN A.ROUTE_STATUS = 'inProcess' THEN 'inProcess' WHEN A.ROUTE_STATUS = 'reject' THEN 'reject' ELSE SRM.STATUS END AS STATUS, CASE + WHEN AMR.STATUS = 'complete' THEN '결재완료' + WHEN AMR.STATUS = 'inProcess' THEN '결재 상신중' + WHEN AMR.STATUS = 'reject' THEN '반려' WHEN A.APPR_STATUS IS NOT NULL THEN A.APPR_STATUS - WHEN SRM.STATUS = 'create' THEN '작성중' - -- WHEN SRM.STATUS = 'approvalComplete' THEN '결재완료' - -- WHEN SRM.STATUS = 'reject' THEN '반려' + WHEN SRM.STATUS = 'create' THEN '등록중' ELSE '' END AS STATUS_TITLE, + COALESCE(AMR.STATUS, '') AS AMARANTH_STATUS, SRM.WRITER, (SELECT DEPT_NAME||' '||USER_NAME FROM USER_INFO WHERE USER_ID = SRM.WRITER) AS WRITER_NAME, SRM.REGDATE, @@ -4557,6 +4562,9 @@ ORDER BY V.PATH2 A.ROUTE_OBJID FROM SALES_REQUEST_MASTER SRM + LEFT OUTER JOIN AMARANTH_APPROVAL AMR + ON SRM.OBJID::VARCHAR = AMR.TARGET_OBJID + AND AMR.TARGET_TYPE = 'PROPOSAL' LEFT OUTER JOIN ( SELECT B.OBJID AS ROUTE_OBJID, diff --git a/WebContent/WEB-INF/view/salesMng/proposalMngList.jsp b/WebContent/WEB-INF/view/salesMng/proposalMngList.jsp index 403bdde..5be9443 100644 --- a/WebContent/WEB-INF/view/salesMng/proposalMngList.jsp +++ b/WebContent/WEB-INF/view/salesMng/proposalMngList.jsp @@ -82,7 +82,7 @@ $(document).ready(function(){ fn_search(); }); - // 결재상신 + // 결재상신 (Amaranth10 전자결재 SSO 방식) $("#btnApproval").click(function(){ var selectedData = _tabulGrid.getSelectedData(); if(selectedData.length<1){ @@ -92,19 +92,18 @@ $(document).ready(function(){ Swal.fire("한번에 한개의 결재만 가능합니다."); return false; }else{ - - var targetStatus = fnc_checkNull(selectedData[0].STATUS_TITLE); - var status = fnc_checkNull(selectedData[0].STATUS); + var amaranthStatus = fnc_checkNull(selectedData[0].AMARANTH_STATUS); - if(targetStatus == "결재완료" || targetStatus == "결재중" || status == "cancel"){ - Swal.fire("작성중/결재반려인 상태만 결재상신 가능합니다."); + if(amaranthStatus == "inProcess"){ + Swal.fire("결재 진행중인 건은 상신할 수 없습니다."); + return false; + }else if(amaranthStatus == "complete"){ + Swal.fire("결재 완료된 건은 상신할 수 없습니다."); return false; }else{ if(confirm("결재상신 하시겠습니까?")){ var objId = fnc_checkNull(selectedData[0].OBJID); - //var title = encodeURIComponent(fnc_checkNull(selectedData[0].CONTRACT_NO)); - var title = encodeURIComponent("품의서 결재"); - window.open("/approval/registApproval.do?targetType=PROPOSAL&targetObjId="+objId+"&approvalTitle="+title,"registApproval","width=700,height=700"); + fn_openAmaranthApproval(objId); } } } @@ -212,13 +211,14 @@ var columns = [ {headerHozAlign:'center', hozAlign:'center', title:"제품구분", field:"PRODUCT_NAME_TITLE", widthGrow:1.0}, {headerHozAlign:'center', hozAlign:'left', title:"품번", field:"PART_NO", widthGrow:1.5}, {headerHozAlign:'center', hozAlign:'left', title:"품명", field:"PART_NAME", widthGrow:1.8}, + {title:'AMARANTH_STATUS', field:'AMARANTH_STATUS', visible: false}, {headerHozAlign:'center', hozAlign:'center', title:"결재상태", field:"STATUS_TITLE", widthGrow:1.0, - formatter:fnc_createGridAnchorTag, - cellClick:function(e, cell){ - var statusTitle = fnc_checkNull(cell.getData().STATUS_TITLE); - if(statusTitle == "결재중" || statusTitle == "결재완료" || statusTitle == "반려"){ - fnc_approvalDetail(cell.getData().APPROVAL_OBJID, cell.getData().ROUTE_OBJID); - } + formatter:function(cell){ + var val = fnc_checkNull(cell.getValue()); + if(val == "결재 상신중") return "" + val + ""; + if(val == "결재완료") return "" + val + ""; + if(val == "반려") return "" + val + ""; + return val; } }, {headerHozAlign:'center', hozAlign:'center', title:"작성일", field:"REGDATE_TITLE", widthGrow:1.0}, @@ -243,6 +243,40 @@ function fn_search(){ _tabulGrid = fnc_tabul_search(_tabul_layout_fitColumns, _tabulGrid, "/salesMng/proposalMngGridList.do", columns, true); } +// Amaranth10 전자결재 SSO 팝업 열기 +function fn_openAmaranthApproval(objId){ + var selectedData = _tabulGrid.getSelectedData(); + var proposalNo = fnc_checkNull(selectedData[0].PROPOSAL_NO); + var title = "품의서 결재" + (proposalNo ? " - " + proposalNo : ""); + + $.ajax({ + url: "/approval/getAmaranthSsoUrl.do", + type: "POST", + data: { + "targetType": "PROPOSAL", + "targetObjId": objId, + "approvalTitle": title, + "outProcessCode": "${AMARANTH_OUT_PROCESS_CODE}", + "formId": "", + "compSeq": "1000", + "deptSeq": "" + }, + dataType: "json", + success: function(data){ + if(data.resultCode == 0 && data.resultData && data.resultData.fullUrl){ + var fullUrl = data.resultData.fullUrl; + window.open(fullUrl, "amaranthApproval", "width=1200,height=900,scrollbars=yes,resizable=yes"); + } else { + Swal.fire("결재 연동 오류: " + (data.resultMsg || "알 수 없는 오류")); + } + }, + error: function(xhr, status, error){ + console.error("Amaranth SSO URL 요청 오류:", error); + Swal.fire("결재 시스템 연동 중 오류가 발생했습니다."); + } + }); +} + // 품의서 상세 팝업 function fn_openProposalFormPopUp(objId){ var url = "/salesMng/proposalFormPopUp.do?PROPOSAL_OBJID=" + fnc_checkNull(objId); diff --git a/src/com/pms/mapper/salesMng.xml b/src/com/pms/mapper/salesMng.xml index 27b856e..23f88e6 100644 --- a/src/com/pms/mapper/salesMng.xml +++ b/src/com/pms/mapper/salesMng.xml @@ -4535,20 +4535,25 @@ ORDER BY V.PATH2 -- (SELECT CASE WHEN COUNT(*) > 0 THEN 'Y' ELSE 'N' END FROM PURCHASE_ORDER_MASTER WHERE SALES_REQUEST_OBJID = SRM.OBJID AND MAIL_SENT = 'Y') AS MAIL_SENT, -- 발주일 (일단 주석처리) -- (SELECT TO_CHAR(MAX(ORDER_DATE), 'YYYY-MM-DD') FROM PURCHASE_ORDER_MASTER WHERE SALES_REQUEST_OBJID = SRM.OBJID) AS ORDER_DATE, - -- 상태: 결재 테이블 상태 우선, 없으면 SRM.STATUS + -- 상태: 아마란스 결재 > 내부 결재 > SRM.STATUS 순서로 우선 CASE + WHEN AMR.STATUS = 'complete' THEN 'approvalComplete' + WHEN AMR.STATUS = 'inProcess' THEN 'inProcess' + WHEN AMR.STATUS = 'reject' THEN 'reject' WHEN A.ROUTE_STATUS = 'complete' THEN 'approvalComplete' WHEN A.ROUTE_STATUS = 'inProcess' THEN 'inProcess' WHEN A.ROUTE_STATUS = 'reject' THEN 'reject' ELSE SRM.STATUS END AS STATUS, CASE + WHEN AMR.STATUS = 'complete' THEN '결재완료' + WHEN AMR.STATUS = 'inProcess' THEN '결재 상신중' + WHEN AMR.STATUS = 'reject' THEN '반려' WHEN A.APPR_STATUS IS NOT NULL THEN A.APPR_STATUS - WHEN SRM.STATUS = 'create' THEN '작성중' - -- WHEN SRM.STATUS = 'approvalComplete' THEN '결재완료' - -- WHEN SRM.STATUS = 'reject' THEN '반려' + WHEN SRM.STATUS = 'create' THEN '등록중' ELSE '' END AS STATUS_TITLE, + COALESCE(AMR.STATUS, '') AS AMARANTH_STATUS, SRM.WRITER, (SELECT DEPT_NAME||' '||USER_NAME FROM USER_INFO WHERE USER_ID = SRM.WRITER) AS WRITER_NAME, SRM.REGDATE, @@ -4557,6 +4562,9 @@ ORDER BY V.PATH2 A.ROUTE_OBJID FROM SALES_REQUEST_MASTER SRM + LEFT OUTER JOIN AMARANTH_APPROVAL AMR + ON SRM.OBJID::VARCHAR = AMR.TARGET_OBJID + AND AMR.TARGET_TYPE = 'PROPOSAL' LEFT OUTER JOIN ( SELECT B.OBJID AS ROUTE_OBJID, diff --git a/src/com/pms/salesmgmt/controller/SalesMngController.java b/src/com/pms/salesmgmt/controller/SalesMngController.java index 9103273..4bdaf25 100644 --- a/src/com/pms/salesmgmt/controller/SalesMngController.java +++ b/src/com/pms/salesmgmt/controller/SalesMngController.java @@ -1336,6 +1336,7 @@ public class SalesMngController { } request.setAttribute("code_map", code_map); + request.setAttribute("AMARANTH_OUT_PROCESS_CODE", Constants.AMARANTH_OUT_PROCESS_CODE); return returnUrl; } diff --git a/src/com/pms/service/ApprovalService.java b/src/com/pms/service/ApprovalService.java index 348d86a..d850986 100644 --- a/src/com/pms/service/ApprovalService.java +++ b/src/com/pms/service/ApprovalService.java @@ -1947,11 +1947,7 @@ public class ApprovalService { } } else if("ECR".equals(targetType)){ Map ecrParam = new HashMap(); - try { - ecrParam.put("OBJID", Long.parseLong(targetObjId)); - } catch(NumberFormatException nfe){ - ecrParam.put("OBJID", targetObjId); - } + ecrParam.put("OBJID", targetObjId); Map ecrInfo = sqlSession.selectOne("quality.getEcrInfo", ecrParam); if(ecrInfo != null){ @@ -2562,11 +2558,7 @@ public class ApprovalService { } } else if("ECR".equals(targetType) && !targetObjId.isEmpty()){ Map ecrParam = new HashMap(); - try { - ecrParam.put("OBJID", Long.parseLong(targetObjId)); - } catch(NumberFormatException nfe){ - ecrParam.put("OBJID", targetObjId); - } + ecrParam.put("OBJID", targetObjId); System.out.println("ECR 본문 조회 - OBJID: " + targetObjId); Map ecrInfo = sqlSession.selectOne("quality.getEcrInfo", ecrParam); System.out.println("ECR 조회 결과: " + (ecrInfo != null ? "데이터 있음" : "null")); From b9ce3f2f35d92032b4a221f0b6d2af3fe38f6eb9 Mon Sep 17 00:00:00 2001 From: chpark Date: Wed, 25 Feb 2026 15:15:53 +0900 Subject: [PATCH 2/3] =?UTF-8?q?=EA=B2=B0=EC=9E=AC=20=EC=B6=94=EA=B0=80=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/com/pms/service/ApprovalService.java | 30 ------------------------ 1 file changed, 30 deletions(-) diff --git a/src/com/pms/service/ApprovalService.java b/src/com/pms/service/ApprovalService.java index ae26f9a..bb519b9 100644 --- a/src/com/pms/service/ApprovalService.java +++ b/src/com/pms/service/ApprovalService.java @@ -2696,8 +2696,6 @@ public class ApprovalService { String actionContent = CommonUtils.checkNull(ecrInfo.get("ACTION_CONTENT")); String completeDate = CommonUtils.checkNull(ecrInfo.get("COMPLETE_DATE")); String changeTypeName = CommonUtils.checkNull(ecrInfo.get("CHANGE_TYPE_NAME")); - String ecrDocSummary = CommonUtils.checkNull(ecrInfo.get("ECR_DOC_SUMMARY")); - String ecrDocReason = CommonUtils.checkNull(ecrInfo.get("ECR_DOC_REASON")); html.append("
"); html.append("

ECR (Engineering Change Request)

"); @@ -2751,20 +2749,6 @@ public class ApprovalService { } html.append(""); - if(!ecrDocSummary.isEmpty() || !ecrDocReason.isEmpty()){ - html.append("

설계변경요청서

"); - html.append(""); - if(!ecrDocSummary.isEmpty()){ - html.append(""); - html.append(""); - } - if(!ecrDocReason.isEmpty()){ - html.append(""); - html.append(""); - } - html.append("
요약").append(ecrDocSummary).append("
변경사유").append(ecrDocReason).append("
"); - } - html.append("
"); return html.toString(); } @@ -2791,9 +2775,6 @@ public class ApprovalService { String ecrRevNo = CommonUtils.checkNull(ecrInfo.get("ECR_REV_NO")); String ecrRevDate = CommonUtils.checkNull(ecrInfo.get("ECR_REV_DATE")); String ecrDocAuthor = CommonUtils.checkNull(ecrInfo.get("ECR_DOC_AUTHOR")); - String ecrDocSummary = CommonUtils.checkNull(ecrInfo.get("ECR_DOC_SUMMARY")); - String ecrDocReason = CommonUtils.checkNull(ecrInfo.get("ECR_DOC_REASON")); - html.append(""); html.append("ECR - ").append(ecrNo).append(""); html.append(""); @@ -2846,15 +2825,6 @@ public class ApprovalService { } html.append(""); - if(!ecrDocSummary.isEmpty()){ - html.append("
요약 (Summary)
"); - html.append("
").append(ecrDocSummary).append("
"); - } - if(!ecrDocReason.isEmpty()){ - html.append("
변경사항 설명 (이유 / 배경)
"); - html.append("
").append(ecrDocReason).append("
"); - } - html.append(""); html.append(""); html.append("