From dd7b810e348f8ba45def3b1a90aca9f62f7e95b2 Mon Sep 17 00:00:00 2001 From: hjjeong Date: Wed, 25 Mar 2026 11:30:17 +0900 Subject: [PATCH 1/2] =?UTF-8?q?=EC=98=81=EC=97=85=5F=EC=A3=BC=EB=AC=B8?= =?UTF-8?q?=EC=84=9C=EA=B4=80=EB=A6=AC=20=EC=88=98=EC=A3=BC=ED=99=95?= =?UTF-8?q?=EC=A0=95=20=EA=B8=B0=EB=8A=A5=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../estimateAndOrderRegistFormPopup.jsp | 11 +- .../view/contractMgmt/orderMgmtList.jsp | 87 ++- .../contractMgmt/orderRegistFormPopup.jsp | 26 +- src/com/pms/salesmgmt/mapper/contractMgmt.xml | 24 +- .../service/ContractMgmtService.java | 499 ++++++------------ 5 files changed, 271 insertions(+), 376 deletions(-) diff --git a/WebContent/WEB-INF/view/contractMgmt/estimateAndOrderRegistFormPopup.jsp b/WebContent/WEB-INF/view/contractMgmt/estimateAndOrderRegistFormPopup.jsp index c2f7eb3..2fdfb32 100644 --- a/WebContent/WEB-INF/view/contractMgmt/estimateAndOrderRegistFormPopup.jsp +++ b/WebContent/WEB-INF/view/contractMgmt/estimateAndOrderRegistFormPopup.jsp @@ -1418,22 +1418,17 @@ - - - - - + + + diff --git a/WebContent/WEB-INF/view/contractMgmt/orderMgmtList.jsp b/WebContent/WEB-INF/view/contractMgmt/orderMgmtList.jsp index 5ab2aa4..ee85be9 100644 --- a/WebContent/WEB-INF/view/contractMgmt/orderMgmtList.jsp +++ b/WebContent/WEB-INF/view/contractMgmt/orderMgmtList.jsp @@ -151,6 +151,23 @@ $(document).ready(function(){ document.form1.submit(); }); + // 수주확정 + $("#btnOrderConfirm").click(function(){ + var selectedData = _tabulGrid.getSelectedData(); + if(selectedData.length < 1){ + Swal.fire("수주확정할 행을 선택해주십시오."); + return false; + } else if(selectedData.length > 1){ + Swal.fire("한번에 한개의 수주만 확정 가능합니다."); + return false; + } + + var contractObjId = fnc_checkNull(selectedData[0].OBJID); + var currentStatus = fnc_checkNull(selectedData[0].CONTRACT_RESULT_NAME); + + fn_openOrderConfirmPopup(contractObjId, currentStatus); + }); + // 수주취소 $("#btnOrderCancel").click(function(){ var selectedData = _tabulGrid.getSelectedData(); @@ -710,6 +727,73 @@ function fn_displaySerialNoList(serialNumbers){ }); } +// 수주확정 팝업 - 수주상태 선택하여 저장 +function fn_openOrderConfirmPopup(contractObjId, currentStatus){ + // 검색 필터의 수주상태 select에서 옵션 목록을 가져와서 SweetAlert에서 사용 + var optionsHtml = ''; + $("#contract_result option").each(function(){ + var val = $(this).val(); + var text = $(this).text(); + if(val !== ''){ + optionsHtml += ''; + } + }); + + Swal.fire({ + title: '수주확정', + html: '
' + + '
현재 수주상태: ' + (currentStatus || '-') + '
' + + '
' + + '' + + '
', + width: 400, + showCancelButton: true, + confirmButtonColor: '#3085d6', + cancelButtonColor: '#d33', + confirmButtonText: '확정', + cancelButtonText: '취소', + preConfirm: function() { + var selectedVal = document.getElementById('swal_contract_result').value; + if(!selectedVal) { + Swal.showValidationMessage('수주상태를 선택해주세요.'); + return false; + } + return selectedVal; + } + }).then(function(result) { + if(result.isConfirmed) { + $.ajax({ + url: "/contractMgmt/updateOrderStatus.do", + type: "POST", + data: { + objId: contractObjId, + contract_result: result.value + }, + dataType: "json", + success: function(data){ + if(data.result === "SUCCESS"){ + Swal.fire({ + title: '수주확정 완료', + text: '수주상태가 변경되었습니다.', + icon: 'success' + }).then(function(){ + fn_search(); + }); + } else { + Swal.fire("수주확정 저장 중 오류가 발생했습니다."); + } + }, + error: function(){ + Swal.fire("서버 통신 오류가 발생했습니다."); + } + }); + } + }); +} + // 수주취소 팝업 - 품목별 취소 수량 입력 function fn_openOrderCancelPopup(contractObjId){ $.ajax({ @@ -971,7 +1055,8 @@ function openProjectFormPopUp(objId){
- + +
diff --git a/WebContent/WEB-INF/view/contractMgmt/orderRegistFormPopup.jsp b/WebContent/WEB-INF/view/contractMgmt/orderRegistFormPopup.jsp index 79535ce..5065589 100644 --- a/WebContent/WEB-INF/view/contractMgmt/orderRegistFormPopup.jsp +++ b/WebContent/WEB-INF/view/contractMgmt/orderRegistFormPopup.jsp @@ -444,27 +444,21 @@ - + - + - + - - - - - - - + + + + - - - - - + diff --git a/src/com/pms/salesmgmt/mapper/contractMgmt.xml b/src/com/pms/salesmgmt/mapper/contractMgmt.xml index 0621672..d680e10 100644 --- a/src/com/pms/salesmgmt/mapper/contractMgmt.xml +++ b/src/com/pms/salesmgmt/mapper/contractMgmt.xml @@ -1560,10 +1560,12 @@ ,CONTRACT_DEL_DATE = #{contract_del_date} ,CONTRACT_COMPANY = #{contract_company} ,CONTRACT_DATE = #{contract_date} - ,PO_NO = #{po_no} - ,MANUFACTURE_PLANT = #{manufacture_plant} - ,CONTRACT_RESULT = #{contract_result} - ,PROJECT_NAME = #{project_name} + ,PO_NO = #{po_no} + ,MANUFACTURE_PLANT = #{manufacture_plant} + + ,CONTRACT_RESULT = #{contract_result} + + ,PROJECT_NAME = #{project_name} ,SPEC_USER_ID = #{spec_user_id} ,SPEC_PLAN_DATE = #{spec_plan_date} ,SPEC_COMP_DATE = #{spec_comp_date} @@ -1730,10 +1732,12 @@ ,CONTRACT_DEL_DATE = #{contract_del_date} ,CONTRACT_COMPANY = #{contract_company} ,CONTRACT_DATE = #{contract_date} - ,PO_NO = #{po_no} - ,MANUFACTURE_PLANT = #{manufacture_plant} - ,CONTRACT_RESULT = #{contract_result} - ,PROJECT_NAME = #{project_name} + ,PO_NO = #{po_no} + ,MANUFACTURE_PLANT = #{manufacture_plant} + + ,CONTRACT_RESULT = #{contract_result} + + ,PROJECT_NAME = #{project_name} ,AREA_CD = #{area_cd} --> @@ -4991,7 +4995,9 @@ WHERE UPDATE CONTRACT_MGMT SET + CONTRACT_RESULT = #{contract_result}, + PO_NO = #{po_no}, ORDER_DATE = #{order_date}, CONTRACT_CURRENCY = #{contract_currency}, @@ -5083,7 +5089,9 @@ WHERE PAID_TYPE = #{paid_type}, RECEIPT_DATE = #{receipt_date}, REQ_DEL_DATE = #{req_del_date}, + CONTRACT_RESULT = #{contract_result}, + PO_NO = #{po_no}, ORDER_DATE = #{order_date}, CONTRACT_CURRENCY = #{contract_currency}, diff --git a/src/com/pms/salesmgmt/service/ContractMgmtService.java b/src/com/pms/salesmgmt/service/ContractMgmtService.java index 8bb9f01..72288d3 100644 --- a/src/com/pms/salesmgmt/service/ContractMgmtService.java +++ b/src/com/pms/salesmgmt/service/ContractMgmtService.java @@ -603,75 +603,17 @@ public class ContractMgmtService { PersonBean person = (PersonBean)request.getSession().getAttribute(Constants.PERSON_BEAN); paramMap.put("writer", person.getUserId()); int cnt = sqlSession.update("contractMgmt.saveContractMgmtInfo", paramMap); - - //영업 수주 완료시 자동 프로젝트 등록 로직 - String result_cd= CommonUtils.checkNull(paramMap.get("contract_result")); - String contract_objid= CommonUtils.checkNull(paramMap.get("objId")); - String category_cd= CommonUtils.checkNull(paramMap.get("category_cd")); - String target_project_no= CommonUtils.checkNull(paramMap.get("target_project_no_direct")); - int overhaul_order = Integer.parseInt(CommonUtils.checkNull(paramMap.get("overhaul_order"),"1")); - int project_cnt= Integer.parseInt(CommonUtils.checkNull(paramMap.get("facility_qty"), "1")); - double contract_price_currency= Double.parseDouble(CommonUtils.checkNull(paramMap.get("contract_price_currency"), "0").replace(",", "")); - double contract_price= Double.parseDouble(CommonUtils.checkNull(paramMap.get("contract_price"), "0").replace(",", "")); - - //수주가와 금액은 대수로 나누어서 등록 - paramMap.put("contract_price_currency", String.valueOf(contract_price_currency/project_cnt)); - paramMap.put("contract_price", String.valueOf(contract_price/project_cnt)); - - if("0000964".equals(result_cd)){ - resultList = sqlSession.selectOne("contractMgmt.getProjectListBycontractObjid", paramMap); - System.out.println("resultList:::"+resultList); - //resultList = sqlSession.selectOne("contractMgmt.getProjectCnt", paramMap); - if(null==resultList){ - for (int i=0; i projectInfo = (Map)sqlSession.selectOne("project.getProjectMngInfo", paramMap); - - paramMap.put("contract_objid", paramMap.get("objId")); - paramMap.put("customer_product", paramMap.get("mechanical_type")); - List> taskUnitList = (ArrayList)sqlSession.selectList("project.getWbsTaskListByProject", paramMap); - if(CommonUtils.isNotEmpty(taskUnitList) && !taskUnitList.isEmpty()){ - String projectNo = (String)projectInfo.get("project_no"); - String filepath = Constants.FILE_STORAGE+"\\PART_DATA\\"; - for (Map map : taskUnitList) { - File file = new File(filepath+File.separator+projectNo+File.separator+CommonUtils.checkNull((String)map.get("unit_no"))+"-"+CommonUtils.checkNull((String)map.get("task_name"))); - if(!file.exists()){ - file.mkdirs(); - } - } - } - } - }else{ - sqlSession.update("project.ModifyProjectByContract", paramMap); - } + // 프로젝트 생성은 수주확정(updateOrderStatus)에서 처리 + // 프로젝트가 이미 존재하는 경우에는 수량/납기 등 업데이트 반영 + resultList = sqlSession.selectOne("contractMgmt.getProjectListBycontractObjid", paramMap); + if(resultList != null) { + sqlSession.update("project.ModifyProjectByContract", paramMap); } + if(cnt > 0){ - //계약완료 일시 메일 - if("0000964".equals(CommonUtils.checkNull(paramMap.get("contract_result")))){ - commonService.SendMail(paramMap,"CONTRACT_COMP",CommonUtils.checkNull(paramMap.get("pm_user_id"))); - //그냥 등록일때 메일 - }else{ - if("regist".equals(CommonUtils.checkNull(paramMap.get("actionType")))){ + if("regist".equals(CommonUtils.checkNull(paramMap.get("actionType")))){ commonService.SendMail(paramMap,"CONTRACT_REG",CommonUtils.checkNull(paramMap.get(""))); - } } } resultMap.put("result", true); @@ -2792,39 +2734,23 @@ private String encodeImageToBase64(String imagePath) { // 합계만 별도 업데이트 (기본 정보는 이미 saveEstimateAndOrderInfo에서 저장됨) sqlSession.update("contractMgmt.updateOrderTotalAmounts", paramMap); - - // 4. 프로젝트 생성 로직 (수주 또는 수주(FCST)인 경우) - String result_cd = CommonUtils.checkNull(paramMap.get("contract_result")); - String category_cd = CommonUtils.checkNull(paramMap.get("category_cd")); - String target_project_no = CommonUtils.checkNull(paramMap.get("target_project_no_direct")); - - // 수주(0000964) 또는 수주(FCST)(0000968)인 경우 프로젝트 생성 - if("0000964".equals(result_cd) || "0000968".equals(result_cd)){ - // CONTRACT_OBJID로 프로젝트 존재 여부 확인 - Map resultList = sqlSession.selectOne("contractMgmt.getProjectListBycontractObjid", paramMap); - boolean hasProject = (resultList != null); - - // 제품구분 확인 (DB에서 조회) + + // 프로젝트 생성은 수주확정(updateOrderStatus)에서 처리 + // 프로젝트가 이미 존재하는 경우에는 수량/납기 등 업데이트 반영 + String contract_objid_for_project = CommonUtils.checkNull(paramMap.get("objId")); + Map projectCheckResult = sqlSession.selectOne("contractMgmt.getProjectListBycontractObjid", paramMap); + if(projectCheckResult != null) { Map contractInfo = (Map) sqlSession.selectOne("contractMgmt.getContractBasicInfo", paramMap); contractInfo = CommonUtils.toUpperCaseMapKey(contractInfo); - String product_cd = contractInfo != null ? CommonUtils.checkNull(contractInfo.get("PRODUCT")) : ""; boolean isMachine = "0000928".equals(product_cd); - - if(isMachine) { - System.out.println("제품구분: Machine(0000928) - 품목별 수량만큼 프로젝트 생성"); - } - - // 품목별로 프로젝트 생성 또는 업데이트 (같은 트랜잭션의 sqlSession 사용) - paramMap.put("contractObjId", contract_objid); - List contractItemsRaw = sqlSession.selectList("contractMgmt.getContractItems", paramMap); - List> contractItems = CommonUtils.toUpperCaseMapKey(contractItemsRaw); - + + paramMap.put("contractObjId", contract_objid_for_project); + List contractItemsRaw = sqlSession.selectList("contractMgmt.getContractItems", paramMap); + List> contractItems = CommonUtils.toUpperCaseMapKey(contractItemsRaw); + if(contractItems != null && !contractItems.isEmpty()) { - System.out.println("품목 개수: " + contractItems.size() + "개 - 프로젝트 " + (hasProject ? "업데이트" : "생성") + " 시작" + (isMachine ? " (Machine - 수량별 생성)" : "")); - for(Map item : contractItems) { - // 수량 가져오기 (소수점 형태 "2.00"도 처리) Object quantityObj = item.get("ORDER_QUANTITY") != null ? item.get("ORDER_QUANTITY") : item.get("QUANTITY"); int itemQuantity = 1; try { @@ -2832,109 +2758,22 @@ private String encodeImageToBase64(String imagePath) { } catch (Exception e) { itemQuantity = 1; } - - // Machine인 경우 수량만큼 반복, 아니면 1번만 실행 - int loopCount = (isMachine && !hasProject) ? itemQuantity : 1; - - for(int q = 0; q < loopCount; q++) { - if(!hasProject) { - // 프로젝트가 없으면 모든 품목에 대해 생성 - Map projectParam = new HashMap(); - projectParam.putAll(paramMap); // 기본 정보 복사 - - // 품목별 정보 설정 - projectParam.put("OBJID", CommonUtils.createObjId()); - projectParam.put("is_temp", '1'); - projectParam.put("part_objid", item.get("PART_OBJID")); - projectParam.put("contract_item_objid", String.valueOf(item.get("OBJID"))); - projectParam.put("part_no", item.get("PART_NO")); - projectParam.put("part_name", item.get("PART_NAME")); - // Machine인 경우 각 프로젝트의 수량은 1, 아니면 원래 수량 - projectParam.put("quantity", isMachine ? "1" : String.valueOf(itemQuantity)); - projectParam.put("due_date", item.get("DUE_DATE")); - - if("0000170".equals(category_cd) || "0000171".equals(category_cd)){ - projectParam.put("overhaul_project_no", target_project_no); - } - - if(isMachine) { - System.out.println("프로젝트 생성 [" + (q+1) + "/" + loopCount + "] - PART_OBJID: " + item.get("PART_OBJID") + ", 품번: " + item.get("PART_NO") + ", 품명: " + item.get("PART_NAME") + ", 수량: 1"); - } else { - System.out.println("프로젝트 생성 - PART_OBJID: " + item.get("PART_OBJID") + ", 품번: " + item.get("PART_NO") + ", 품명: " + item.get("PART_NAME") + ", 수량: " + itemQuantity); - } - - // 프로젝트 등록 - cnt = sqlSession.update("project.createProject", projectParam); - // WBS 자동생성 주석처리 - // // 프로젝트 TASK 등록 - // cnt = sqlSession.insert("contractMgmt.insertProjectTask", projectParam); - // // 프로젝트 SETUP_TASK 등록 - // cnt = sqlSession.insert("contractMgmt.insertProjectSetupTask", projectParam); - - // 동일 품번 M-BOM 자동 복사 제거 - 수주 시점에는 총생산수량 미확정이므로 - // M-BOM관리에서 생산계획 입력 후 수동 복사하도록 변경 - // if(!isMachine) { - // copyMbomIfSamePartNoExists(sqlSession, - // (String)projectParam.get("OBJID"), - // CommonUtils.checkNull(item.get("PART_NO")), - // CommonUtils.checkNull(item.get("PART_NAME")), - // person.getUserId(), - // itemQuantity); - // } - - // WBS 폴더 생성 주석처리 - // // project_no - unit 폴더 생성 - // Map projectInfo = (Map)sqlSession.selectOne("project.getProjectMngInfo", projectParam); - // - // projectParam.put("contract_objid", contract_objid); - // projectParam.put("customer_product", projectParam.get("mechanical_type")); - // List> taskUnitList = (ArrayList)sqlSession.selectList("project.getWbsTaskListByProject", projectParam); - // if(CommonUtils.isNotEmpty(taskUnitList) && !taskUnitList.isEmpty()){ - // String projectNo = (String)projectInfo.get("project_no"); - // String filepath = Constants.FILE_STORAGE+"\\PART_DATA\\"; - // for (Map map : taskUnitList) { - // File file = new File(filepath+File.separator+projectNo+File.separator+CommonUtils.checkNull((String)map.get("unit_no"))+"-"+CommonUtils.checkNull((String)map.get("task_name"))); - // if(!file.exists()){ - // file.mkdirs(); - // } - // } - // } - } else { - // 프로젝트가 있으면 모든 품목 업데이트 (수량, 금액 등만) - Map updateParam = new HashMap(); - updateParam.putAll(paramMap); - updateParam.put("part_objid", item.get("PART_OBJID")); - // Machine인 경우 수량은 변경하지 않음 (프로젝트별 1로 유지) - if(isMachine) { - updateParam.remove("quantity"); - } else { - updateParam.put("quantity", String.valueOf(itemQuantity)); - } - updateParam.put("due_date", item.get("DUE_DATE")); - - System.out.println("프로젝트 업데이트 - PART_OBJID: " + item.get("PART_OBJID") + (isMachine ? ", 수량: 변경안함(Machine)" : ", 수량: " + itemQuantity)); - sqlSession.update("project.ModifyProjectByContract", updateParam); - } + Map updateParam = new HashMap(); + updateParam.putAll(paramMap); + updateParam.put("part_objid", item.get("PART_OBJID")); + if(isMachine) { + updateParam.remove("quantity"); + } else { + updateParam.put("quantity", String.valueOf(itemQuantity)); } + updateParam.put("due_date", item.get("DUE_DATE")); + sqlSession.update("project.ModifyProjectByContract", updateParam); } } else { - System.out.println("품목이 없습니다 - 기존 방식으로 프로젝트 생성"); - // 품목이 없는 경우 기존 방식대로 처리 - if(!hasProject){ - paramMap.put("OBJID", CommonUtils.createObjId()); - paramMap.put("is_temp", '1'); - if("0000170".equals(category_cd) || "0000171".equals(category_cd)){ - paramMap.put("overhaul_project_no", target_project_no); - } - cnt = sqlSession.update("project.createProject", paramMap); - cnt = sqlSession.insert("contractMgmt.insertProjectTask", paramMap); - cnt = sqlSession.insert("contractMgmt.insertProjectSetupTask", paramMap); - }else{ - sqlSession.update("project.ModifyProjectByContract", paramMap); - } + sqlSession.update("project.ModifyProjectByContract", paramMap); } } - + sqlSession.commit(); resultMap.put("result", "true"); resultMap.put("msg", "저장되었습니다."); @@ -3018,48 +2857,23 @@ private String encodeImageToBase64(String imagePath) { // 기본 수주 정보 및 합계 업데이트 int cnt = sqlSession.update("contractMgmt.updateOrderInfo", paramMap); - - //영업 수주 완료시 자동 프로젝트 등록 로직 - String result_cd= CommonUtils.checkNull(paramMap.get("contract_result")); - - String category_cd= CommonUtils.checkNull(paramMap.get("category_cd")); - String target_project_no= CommonUtils.checkNull(paramMap.get("target_project_no_direct")); - //int overhaul_order = Integer.parseInt(CommonUtils.checkNull(paramMap.get("overhaul_order"),"1")); - //int project_cnt= Integer.parseInt(CommonUtils.checkNull(paramMap.get("facility_qty"), "1")); - //long contract_price_currency= Long.parseLong(CommonUtils.checkNull(paramMap.get("contract_price_currency"), "0")); - //long contract_price= Long.parseLong(CommonUtils.checkNull(paramMap.get("contract_price"), "0")); - - //수주가와 금액은 대수로 나누어서 등록 - //paramMap.put("contract_price_currency", contract_price_currency/project_cnt + ""); - //paramMap.put("contract_price", contract_price/project_cnt + ""); - - if("0000964".equals(result_cd) || "0000968".equals(result_cd)){ - // CONTRACT_OBJID로 프로젝트 존재 여부 확인 (한 번만 체크) - resultList = sqlSession.selectOne("contractMgmt.getProjectListBycontractObjid", paramMap); - boolean hasProject = (resultList != null); - - // 제품구분 확인 (DB에서 조회) + + // 프로젝트 생성은 수주확정(updateOrderStatus)에서 처리 + // 프로젝트가 이미 존재하는 경우에는 수량/납기 등 업데이트 반영 + resultList = sqlSession.selectOne("contractMgmt.getProjectListBycontractObjid", paramMap); + if(resultList != null) { + // 제품구분 확인 Map contractInfo = (Map) sqlSession.selectOne("contractMgmt.getContractBasicInfo", paramMap); - // MyBatis resultType="map"은 소문자로 반환되므로 대문자로 변환 contractInfo = CommonUtils.toUpperCaseMapKey(contractInfo); - String product_cd = contractInfo != null ? CommonUtils.checkNull(contractInfo.get("PRODUCT")) : ""; boolean isMachine = "0000928".equals(product_cd); - - if(isMachine) { - System.out.println("제품구분: Machine(0000928) - 품목별 수량만큼 프로젝트 생성"); - } - - // 품목별로 프로젝트 생성 또는 업데이트 (같은 트랜잭션의 sqlSession 사용) + paramMap.put("contractObjId", contract_objid); List contractItemsRaw2 = sqlSession.selectList("contractMgmt.getContractItems", paramMap); List> contractItems = CommonUtils.toUpperCaseMapKey(contractItemsRaw2); - + if(contractItems != null && !contractItems.isEmpty()) { - System.out.println("품목 개수: " + contractItems.size() + "개 - 프로젝트 " + (hasProject ? "업데이트" : "생성") + " 시작" + (isMachine ? " (Machine - 수량별 생성)" : "")); - for(Map item : contractItems) { - // 수량 가져오기 (소수점 형태 "2.00"도 처리) Object quantityObj = item.get("ORDER_QUANTITY") != null ? item.get("ORDER_QUANTITY") : item.get("QUANTITY"); int itemQuantity = 1; try { @@ -3067,120 +2881,22 @@ private String encodeImageToBase64(String imagePath) { } catch (Exception e) { itemQuantity = 1; } - - // Machine인 경우 수량만큼 반복, 아니면 1번만 실행 - int loopCount = (isMachine && !hasProject) ? itemQuantity : 1; - - for(int q = 0; q < loopCount; q++) { - if(!hasProject) { - // 프로젝트가 없으면 모든 품목에 대해 생성 - Map projectParam = new HashMap(); - projectParam.putAll(paramMap); // 기본 정보 복사 - - // 품목별 정보 설정 - projectParam.put("OBJID", CommonUtils.createObjId()); - projectParam.put("is_temp", '1'); - projectParam.put("contract_item_objid", String.valueOf(item.get("OBJID"))); - System.out.println("CONTRACT_ITEM_OBJID 매핑: " + item.get("OBJID") + " (type: " + (item.get("OBJID") != null ? item.get("OBJID").getClass().getName() : "null") + ")"); - projectParam.put("part_objid", item.get("PART_OBJID")); - projectParam.put("part_no", item.get("PART_NO")); - projectParam.put("part_name", item.get("PART_NAME")); - // Machine인 경우 각 프로젝트의 수량은 1, 아니면 원래 수량 - projectParam.put("quantity", isMachine ? "1" : String.valueOf(itemQuantity)); - projectParam.put("due_date", item.get("DUE_DATE")); - - if("0000170".equals(category_cd) || "0000171".equals(category_cd)){ - projectParam.put("overhaul_project_no", target_project_no); - } - - if(isMachine) { - System.out.println("프로젝트 생성 [" + (q+1) + "/" + loopCount + "] - PART_OBJID: " + item.get("PART_OBJID") + ", 품번: " + item.get("PART_NO") + ", 품명: " + item.get("PART_NAME") + ", 수량: 1"); - } else { - System.out.println("프로젝트 생성 - PART_OBJID: " + item.get("PART_OBJID") + ", 품번: " + item.get("PART_NO") + ", 품명: " + item.get("PART_NAME") + ", 수량: " + itemQuantity); - } - - // 프로젝트 등록 - cnt = sqlSession.update("project.createProject", projectParam); - // WBS 자동생성 주석처리 - // // 프로젝트 TASK 등록 - // cnt = sqlSession.insert("contractMgmt.insertProjectTask", projectParam); - // // 프로젝트 SETUP_TASK 등록 - // cnt = sqlSession.insert("contractMgmt.insertProjectSetupTask", projectParam); - - // 동일 품번 M-BOM 자동 복사 제거 - 수주 시점에는 총생산수량 미확정이므로 - // M-BOM관리에서 생산계획 입력 후 수동 복사하도록 변경 - // if(!isMachine) { - // copyMbomIfSamePartNoExists(sqlSession, - // (String)projectParam.get("OBJID"), - // CommonUtils.checkNull(item.get("PART_NO")), - // CommonUtils.checkNull(item.get("PART_NAME")), - // person.getUserId(), - // itemQuantity); - // } - - // WBS 폴더 생성 주석처리 - // // project_no - unit 폴더 생성 - // Map projectInfo = (Map)sqlSession.selectOne("project.getProjectMngInfo", projectParam); - // - // projectParam.put("contract_objid", contract_objid); - // projectParam.put("customer_product", projectParam.get("mechanical_type")); - // List> taskUnitList = (ArrayList)sqlSession.selectList("project.getWbsTaskListByProject", projectParam); - // if(CommonUtils.isNotEmpty(taskUnitList) && !taskUnitList.isEmpty()){ - // String projectNo = (String)projectInfo.get("project_no"); - // String filepath = Constants.FILE_STORAGE+"\\PART_DATA\\"; - // for (Map map : taskUnitList) { - // File file = new File(filepath+File.separator+projectNo+File.separator+CommonUtils.checkNull((String)map.get("unit_no"))+"-"+CommonUtils.checkNull((String)map.get("task_name"))); - // if(!file.exists()){ - // file.mkdirs(); - // } - // } - // } - } else { - // 프로젝트가 있으면 모든 품목 업데이트 (수량, 금액 등만) - Map updateParam = new HashMap(); - updateParam.putAll(paramMap); - updateParam.put("part_objid", item.get("PART_OBJID")); - // Machine인 경우 수량은 변경하지 않음 (프로젝트별 1로 유지) - if(isMachine) { - updateParam.remove("quantity"); - } else { - updateParam.put("quantity", String.valueOf(itemQuantity)); - } - updateParam.put("due_date", item.get("DUE_DATE")); - - System.out.println("프로젝트 업데이트 - PART_OBJID: " + item.get("PART_OBJID") + (isMachine ? ", 수량: 변경안함(Machine)" : ", 수량: " + itemQuantity)); - sqlSession.update("project.ModifyProjectByContract", updateParam); - } + Map updateParam = new HashMap(); + updateParam.putAll(paramMap); + updateParam.put("part_objid", item.get("PART_OBJID")); + if(isMachine) { + updateParam.remove("quantity"); + } else { + updateParam.put("quantity", String.valueOf(itemQuantity)); } + updateParam.put("due_date", item.get("DUE_DATE")); + sqlSession.update("project.ModifyProjectByContract", updateParam); } - } else { - System.out.println("품목이 없습니다 - 기존 방식으로 프로젝트 생성"); - // 품목이 없는 경우 기존 방식대로 처리 - if(!hasProject){ - paramMap.put("OBJID", CommonUtils.createObjId()); - paramMap.put("is_temp", '1'); - if("0000170".equals(category_cd) || "0000171".equals(category_cd)){ - paramMap.put("overhaul_project_no", target_project_no); - } - cnt = sqlSession.update("project.createProject", paramMap); - cnt = sqlSession.insert("contractMgmt.insertProjectTask", paramMap); - cnt = sqlSession.insert("contractMgmt.insertProjectSetupTask", paramMap); - }else{ + } else { sqlSession.update("project.ModifyProjectByContract", paramMap); } } - } -// if(cnt > 0){ - //계약완료 일시 메일 -// if("0000964".equals(CommonUtils.checkNull(paramMap.get("contract_result")))){ -// commonService.SendMail(paramMap,"CONTRACT_COMP",CommonUtils.checkNull(paramMap.get("pm_user_id"))); - //그냥 등록일때 메일 -// }else{ -// if("regist".equals(CommonUtils.checkNull(paramMap.get("actionType")))){ -// commonService.SendMail(paramMap,"CONTRACT_REG",CommonUtils.checkNull(paramMap.get(""))); -// } -// } -// } + resultMap.put("result", true); resultMap.put("msg", Message.SAVE_SUCCESS); sqlSession.commit(); @@ -3205,21 +2921,122 @@ private String encodeImageToBase64(String imagePath) { SqlSession sqlSession = null; try { sqlSession = SqlMapConfig.getInstance().getSqlSession(); - + // 수주상태 업데이트 sqlSession.update("contractMgmt.updateOrderStatusOnly", paramMap); - - // 수주(0000964) 또는 수주(FCST)(0000968)인 경우 프로젝트 생성 로직 실행 + String contract_result = CommonUtils.checkNull(paramMap.get("contract_result")); - if("0000964".equals(contract_result)) { - // 프로젝트가 없으면 생성 + String objId = CommonUtils.checkNull(paramMap.get("objId")); + + // 수주(0000964) 또는 수주(FCST)(0000968)인 경우 프로젝트 생성 로직 실행 + if("0000964".equals(contract_result) || "0000968".equals(contract_result)){ + + // CONTRACT_OBJID로 프로젝트 존재 여부 확인 Map resultList = sqlSession.selectOne("contractMgmt.getProjectListBycontractObjid", paramMap); - if(resultList == null) { - // 프로젝트 생성 로직은 기존 saveOrderInfo와 동일하게 처리 - System.out.println("수주 확정으로 변경 - 프로젝트 생성 필요시 saveOrderInfo 호출 권장"); + boolean hasProject = (resultList != null); + + // 계약 기본 정보 조회 (제품구분, 주문유형 등) + Map contractInfo = (Map) sqlSession.selectOne("contractMgmt.getContractBasicInfo", paramMap); + contractInfo = CommonUtils.toUpperCaseMapKey(contractInfo); + + String product_cd = contractInfo != null ? CommonUtils.checkNull(contractInfo.get("PRODUCT")) : ""; + String category_cd = contractInfo != null ? CommonUtils.checkNull(contractInfo.get("CATEGORY_CD")) : ""; + boolean isMachine = "0000928".equals(product_cd); + + if(isMachine) { + System.out.println("[수주확정] 제품구분: Machine(0000928) - 품목별 수량만큼 프로젝트 생성"); + } + + // 품목별로 프로젝트 생성 또는 업데이트 + paramMap.put("contractObjId", objId); + List contractItemsRaw = sqlSession.selectList("contractMgmt.getContractItems", paramMap); + List> contractItems = CommonUtils.toUpperCaseMapKey(contractItemsRaw); + + if(contractItems != null && !contractItems.isEmpty()) { + System.out.println("[수주확정] 품목 개수: " + contractItems.size() + "개 - 프로젝트 " + (hasProject ? "업데이트" : "생성") + " 시작" + (isMachine ? " (Machine - 수량별 생성)" : "")); + + for(Map item : contractItems) { + // 수량 가져오기 (소수점 형태 "2.00"도 처리) + Object quantityObj = item.get("ORDER_QUANTITY") != null ? item.get("ORDER_QUANTITY") : item.get("QUANTITY"); + int itemQuantity = 1; + try { + itemQuantity = (int) Double.parseDouble(String.valueOf(quantityObj).replaceAll("[^0-9.]", "")); + } catch (Exception e) { + itemQuantity = 1; + } + + // Machine인 경우 수량만큼 반복, 아니면 1번만 실행 + int loopCount = (isMachine && !hasProject) ? itemQuantity : 1; + + for(int q = 0; q < loopCount; q++) { + if(!hasProject) { + // 프로젝트가 없으면 모든 품목에 대해 생성 + Map projectParam = new HashMap(); + projectParam.putAll(paramMap); + + // 품목별 정보 설정 + projectParam.put("OBJID", CommonUtils.createObjId()); + projectParam.put("is_temp", '1'); + projectParam.put("contract_item_objid", String.valueOf(item.get("OBJID"))); + projectParam.put("part_objid", item.get("PART_OBJID")); + projectParam.put("part_no", item.get("PART_NO")); + projectParam.put("part_name", item.get("PART_NAME")); + // Machine인 경우 각 프로젝트의 수량은 1, 아니면 원래 수량 + projectParam.put("quantity", isMachine ? "1" : String.valueOf(itemQuantity)); + projectParam.put("due_date", item.get("DUE_DATE")); + + // 오버홀/개조인 경우 + String target_project_no = CommonUtils.checkNull(paramMap.get("target_project_no_direct")); + if("0000170".equals(category_cd) || "0000171".equals(category_cd)){ + projectParam.put("overhaul_project_no", target_project_no); + } + + if(isMachine) { + System.out.println("[수주확정] 프로젝트 생성 [" + (q+1) + "/" + loopCount + "] - PART_OBJID: " + item.get("PART_OBJID") + ", 품번: " + item.get("PART_NO") + ", 품명: " + item.get("PART_NAME") + ", 수량: 1"); + } else { + System.out.println("[수주확정] 프로젝트 생성 - PART_OBJID: " + item.get("PART_OBJID") + ", 품번: " + item.get("PART_NO") + ", 품명: " + item.get("PART_NAME") + ", 수량: " + itemQuantity); + } + + // 프로젝트 등록 + sqlSession.update("project.createProject", projectParam); + + } else { + // 프로젝트가 있으면 모든 품목 업데이트 (수량, 금액 등만) + Map updateParam = new HashMap(); + updateParam.putAll(paramMap); + updateParam.put("part_objid", item.get("PART_OBJID")); + // Machine인 경우 수량은 변경하지 않음 (프로젝트별 1로 유지) + if(isMachine) { + updateParam.remove("quantity"); + } else { + updateParam.put("quantity", String.valueOf(itemQuantity)); + } + updateParam.put("due_date", item.get("DUE_DATE")); + + System.out.println("[수주확정] 프로젝트 업데이트 - PART_OBJID: " + item.get("PART_OBJID") + (isMachine ? ", 수량: 변경안함(Machine)" : ", 수량: " + itemQuantity)); + sqlSession.update("project.ModifyProjectByContract", updateParam); + } + } + } + } else { + System.out.println("[수주확정] 품목이 없습니다 - 기존 방식으로 프로젝트 생성"); + // 품목이 없는 경우 기존 방식대로 처리 + if(!hasProject){ + paramMap.put("OBJID", CommonUtils.createObjId()); + paramMap.put("is_temp", '1'); + String target_project_no = CommonUtils.checkNull(paramMap.get("target_project_no_direct")); + if("0000170".equals(category_cd) || "0000171".equals(category_cd)){ + paramMap.put("overhaul_project_no", target_project_no); + } + sqlSession.update("project.createProject", paramMap); + sqlSession.insert("contractMgmt.insertProjectTask", paramMap); + sqlSession.insert("contractMgmt.insertProjectSetupTask", paramMap); + } else { + sqlSession.update("project.ModifyProjectByContract", paramMap); + } } } - + sqlSession.commit(); } catch(Exception e) { if(sqlSession != null) sqlSession.rollback(); From 2d9c732516ec6fedbef4f34299f4f3e58ce2b4a0 Mon Sep 17 00:00:00 2001 From: hjjeong Date: Wed, 25 Mar 2026 11:53:32 +0900 Subject: [PATCH 2/2] =?UTF-8?q?=EA=B2=80=EC=83=89=EC=98=81=EC=97=AD=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../view/purchaseOrder/projectPurchaseDeliveryStatus.jsp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/WebContent/WEB-INF/view/purchaseOrder/projectPurchaseDeliveryStatus.jsp b/WebContent/WEB-INF/view/purchaseOrder/projectPurchaseDeliveryStatus.jsp index 545dbc1..08ad2c2 100644 --- a/WebContent/WEB-INF/view/purchaseOrder/projectPurchaseDeliveryStatus.jsp +++ b/WebContent/WEB-INF/view/purchaseOrder/projectPurchaseDeliveryStatus.jsp @@ -187,8 +187,8 @@ function _fnc_datepick(){ ${code_map.project_no} - - + +