diff --git a/WebContent/WEB-INF/classes/com/pms/mapper/salesMng.xml b/WebContent/WEB-INF/classes/com/pms/mapper/salesMng.xml index 3061ba6..3fb4ebc 100644 --- a/WebContent/WEB-INF/classes/com/pms/mapper/salesMng.xml +++ b/WebContent/WEB-INF/classes/com/pms/mapper/salesMng.xml @@ -4455,20 +4455,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, @@ -4477,6 +4482,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 4684dde..e7df7f5 100644 --- a/src/com/pms/service/ApprovalService.java +++ b/src/com/pms/service/ApprovalService.java @@ -1949,11 +1949,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){ @@ -3005,11 +3001,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")); @@ -3082,9 +3074,21 @@ public class ApprovalService { 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")); + String ecrDocFormNo = CommonUtils.checkNull(ecrInfo.get("ECR_DOC_FORM_NO")); + 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")); html.append("
"); - html.append("

ECR (Engineering Change Request)

"); + html.append(""); + html.append(""); + html.append("

ECR (Engineering Change Request)

"); + html.append(""); + html.append(""); + html.append(""); + html.append(""); + html.append(""); + html.append("
Form no.").append(ecrDocFormNo).append("
Rev.no").append(ecrRevNo).append("
Rev. date").append(ecrRevDate).append("
Author").append(ecrDocAuthor).append("
"); html.append(""); html.append(""); @@ -3177,7 +3181,6 @@ public class ApprovalService { 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("