Merge remote-tracking branch 'origin/main' into V20260210

This commit is contained in:
2026-02-25 15:51:42 +09:00
5 changed files with 89 additions and 35 deletions

View File

@@ -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,

View File

@@ -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 "<span style='color:#e67e22; font-weight:bold;'>" + val + "</span>";
if(val == "결재완료") return "<span style='color:#27ae60; font-weight:bold;'>" + val + "</span>";
if(val == "반려") return "<span style='color:#e74c3c; font-weight:bold;'>" + val + "</span>";
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);

View File

@@ -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,

View File

@@ -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;
}

View File

@@ -1949,11 +1949,7 @@ public class ApprovalService {
}
} else if("ECR".equals(targetType)){
Map<String, Object> ecrParam = new HashMap<String, Object>();
try {
ecrParam.put("OBJID", Long.parseLong(targetObjId));
} catch(NumberFormatException nfe){
ecrParam.put("OBJID", targetObjId);
}
ecrParam.put("OBJID", targetObjId);
Map<String, Object> ecrInfo = sqlSession.selectOne("quality.getEcrInfo", ecrParam);
if(ecrInfo != null){
@@ -3005,11 +3001,7 @@ public class ApprovalService {
}
} else if("ECR".equals(targetType) && !targetObjId.isEmpty()){
Map<String, Object> 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<String, Object> 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("<div style='font-family:맑은 고딕,Malgun Gothic,sans-serif; padding:10px;'>");
html.append("<h2 style='text-align:center; margin-bottom:15px;'>ECR (Engineering Change Request)</h2>");
html.append("<table style='width:100%; margin-bottom:5px;'><tr>");
html.append("<td style='text-align:center; vertical-align:middle;'><h2 style='margin:0;'>ECR (Engineering Change Request)</h2></td>");
html.append("<td style='width:180px; vertical-align:top;'>");
html.append("<table style='width:100%; border-collapse:collapse; border:1px solid #333;'>");
html.append("<tr><td style='border:1px solid #333; padding:4px 8px; background:#f0f0f0; font-weight:bold; width:80px;'>Form no.</td><td style='border:1px solid #333; padding:4px 8px;'>").append(ecrDocFormNo).append("</td></tr>");
html.append("<tr><td style='border:1px solid #333; padding:4px 8px; background:#f0f0f0; font-weight:bold;'>Rev.no</td><td style='border:1px solid #333; padding:4px 8px;'>").append(ecrRevNo).append("</td></tr>");
html.append("<tr><td style='border:1px solid #333; padding:4px 8px; background:#f0f0f0; font-weight:bold;'>Rev. date</td><td style='border:1px solid #333; padding:4px 8px;'>").append(ecrRevDate).append("</td></tr>");
html.append("<tr><td style='border:1px solid #333; padding:4px 8px; background:#f0f0f0; font-weight:bold;'>Author</td><td style='border:1px solid #333; padding:4px 8px;'>").append(ecrDocAuthor).append("</td></tr>");
html.append("</table></td></tr></table>");
html.append("<table style='width:100%; border-collapse:collapse; border:1px solid #333; margin-bottom:15px;'>");
html.append("<tr>");
@@ -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("<!DOCTYPE html><html><head><meta charset='UTF-8'>");
html.append("<title>ECR - ").append(ecrNo).append("</title>");
html.append("<style>");