From 333d05d19f0055a532f1e21155d530a8a90e4814 Mon Sep 17 00:00:00 2001 From: hjjeong Date: Thu, 13 Nov 2025 12:24:33 +0900 Subject: [PATCH 1/6] =?UTF-8?q?E-bom=20=EC=A1=B0=ED=9A=8C=20=EB=A0=88?= =?UTF-8?q?=EB=B2=A8=20=EA=B2=80=EC=83=89=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../view/partMng/structureAscendingList.jsp | 149 ++++++++++++++---- src/com/pms/mapper/partMng.xml | 17 +- 2 files changed, 135 insertions(+), 31 deletions(-) diff --git a/WebContent/WEB-INF/view/partMng/structureAscendingList.jsp b/WebContent/WEB-INF/view/partMng/structureAscendingList.jsp index 78ecd16..9005caa 100644 --- a/WebContent/WEB-INF/view/partMng/structureAscendingList.jsp +++ b/WebContent/WEB-INF/view/partMng/structureAscendingList.jsp @@ -26,6 +26,48 @@ $(document).ready(function(){ debug: false // 디버깅 모드 비활성화 }); + // Select2 선택 시 텍스트 저장 + $('#search_partNo').on('select2:select', function (e) { + var data = e.params.data; + $('#search_partNo_text').val(data.text); + }); + + $('#search_partName').on('select2:select', function (e) { + var data = e.params.data; + $('#search_partName_text').val(data.text); + }); + + // 이전 검색 조건 복원 + setTimeout(function(){ + var prevPartNoText = '${param.search_partNo_text}'; + var prevPartNameText = '${param.search_partName_text}'; + var prevPartNo = '${param.search_partNo}'; + var prevPartName = '${param.search_partName}'; + var prevPartObjId = '${param.search_partObjId}'; + + console.log("=== 검색 조건 복원 ==="); + console.log("prevPartNoText:", prevPartNoText); + console.log("prevPartNameText:", prevPartNameText); + console.log("prevPartNo:", prevPartNo); + console.log("prevPartName:", prevPartName); + console.log("prevPartObjId:", prevPartObjId); + + // 품번과 품명은 같은 OBJID를 사용하므로, 둘 중 하나만 복원 + if(prevPartNoText && prevPartNo){ + // 품번이 선택되어 있었던 경우 + console.log("품번 복원:", prevPartNoText, prevPartNo); + var newOption = new Option(prevPartNoText, prevPartNo, true, true); + $('#search_partNo').append(newOption).trigger('change'); + $('#search_partObjId').val(prevPartNo); + } else if(prevPartNameText && prevPartName){ + // 품명이 선택되어 있었던 경우 + console.log("품명 복원:", prevPartNameText, prevPartName); + var newOption = new Option(prevPartNameText, prevPartName, true, true); + $('#search_partName').append(newOption).trigger('change'); + $('#search_partObjId').val(prevPartName); + } + }, 500); + $("#mainGrid").jqGrid({ height : 630, colNames : headerNames, @@ -82,12 +124,30 @@ $(document).ready(function(){ //정전개 조회 $("#btnSearchAscending").click(function(){ + // 품번 또는 품명 필수 체크 + var partNo = $.trim($("#search_partNo").val()); + var partName = $.trim($("#search_partName").val()); + + if(!partNo && !partName){ + Swal.fire('품번 또는 품명을 선택해 주세요'); + return; + } + $("#searchType").val("ascending"); fn_search(); }); //역전개 조회 $("#btnSearchDescending").click(function(){ + // 품번 또는 품명 필수 체크 + var partNo = $.trim($("#search_partNo").val()); + var partName = $.trim($("#search_partName").val()); + + if(!partNo && !partName){ + Swal.fire('품번 또는 품명을 선택해 주세요'); + return; + } + $("#searchType").val("descending"); fn_search(); }); @@ -100,18 +160,43 @@ $(document).ready(function(){ fn_excelExport($("#mainGrid"),"BOM_REPORT_정전개"); }); - var search_level = '${param.search_level}'; - $(".dataTr").each(function(i){ - var lev = $(this).attr("data-LEVEL"); - //if(lev == 1){ //1level만 활성화 - if(!fnc_isEmpty(search_level)){ //검색조건 LEVEL까지만 활성화 - if(Number(lev) <= Number(search_level)){ //검색조건 LEVEL까지만 활성화 - $(this).show(); + // 초기 로딩 시 레벨에 따라 표시 (검색 결과 기준) + setTimeout(function(){ + var searchLevel = '${param.search_level}'; // 검색 조건의 레벨 + + // 최소 레벨 찾기 + var minLevel = 999; + $(".dataTr").each(function(){ + var lev = parseInt($(this).attr("data-LEVEL")); + if(lev < minLevel){ + minLevel = lev; } - }else{ - $(this).show(); //전체 펼치기 + }); + + // 표시할 최대 레벨 결정 + var maxDisplayLevel = minLevel; // 기본값: 최소 레벨만 + if(searchLevel && searchLevel != ''){ + maxDisplayLevel = parseInt(searchLevel); } - }); + + console.log("최소 레벨:", minLevel, "표시할 최대 레벨:", maxDisplayLevel); + + // 지정된 레벨까지 표시 + $(".dataTr").each(function(){ + var lev = parseInt($(this).attr("data-LEVEL")); + if(lev <= maxDisplayLevel){ + $(this).show(); + + // 표시된 항목 중 하위가 있고 아직 펼쳐지지 않은 항목은 Minus 아이콘으로 변경 + if(lev < maxDisplayLevel){ + var $img = $(this).find(".btnToggle"); + if($img.length > 0 && $img.attr("src").indexOf("Plus") > -1){ + $img.attr("src", "/images/btnMinus.png"); + } + } + } + }); + }, 100); // DOM 로딩 대기 /* //클릭시 하위정보를 토글한다. $(".dataTr").click(function(){ @@ -707,6 +792,8 @@ function fn_excelExport(pGridObj,pFileName){ + +
@@ -766,16 +853,29 @@ function fn_excelExport(pGridObj,pFileName){ - + - + + + + + + + + - - - - - - - - + + + - + + diff --git a/src/com/pms/mapper/partMng.xml b/src/com/pms/mapper/partMng.xml index 01b0b45..8b962e5 100644 --- a/src/com/pms/mapper/partMng.xml +++ b/src/com/pms/mapper/partMng.xml @@ -6038,7 +6038,7 @@ SELECT T1.LEV, T1.BOM_REPORT_OBJID, T1.ROOT_PART_NO, T1.PATH, T1.LEAF, T2.* BT.ITEM_QTY, BT.QTY AS QTY_TEMP, BT.SEQ, - BT.LEAF, + -- BT.LEAF, -- 재귀 CTE의 LEAF는 항상 0이므로 제거 (아래에서 재계산) -- PART 정보 PM.OBJID AS PART_OBJID, PM.PART_NO, @@ -6424,12 +6424,21 @@ SELECT T1.LEV, T1.BOM_REPORT_OBJID, T1.ROOT_PART_NO, T1.PATH, T1.LEAF, T2.* ) SELECT BT.BOM_REPORT_OBJID, - BT.LEV, - BT.LEV AS LEVEL, + -- 역전개는 레벨을 거꾸로 표시 (최상위가 1레벨) + (ML.MAX_LEVEL - BT.LEV + 1) AS LEV, + (ML.MAX_LEVEL - BT.LEV + 1) AS LEVEL, BT.QTY, BT.ITEM_QTY, BT.QTY AS P_QTY, BT.SEQ, + -- LEAF 계산 (역전개: 하위 항목이 있는지 체크 - 정전개와 동일) + ( + SELECT CASE WHEN COUNT(*) > 0 THEN 0 ELSE 1 END + FROM BOM_PART_QTY BPQ2 + WHERE BPQ2.PARENT_OBJID = BT.CHILD_OBJID + AND BPQ2.BOM_REPORT_OBJID = BT.BOM_REPORT_OBJID + AND COALESCE(BPQ2.STATUS, '') NOT IN ('deleting', 'deleted') + ) AS LEAF, -- PART 정보 PM.OBJID AS PART_OBJID, PM.PART_NO, @@ -6472,7 +6481,7 @@ SELECT T1.LEV, T1.BOM_REPORT_OBJID, T1.ROOT_PART_NO, T1.PATH, T1.LEAF, T2.* ORDER BY PBR.REGDATE DESC, - BT.LEV, + (ML.MAX_LEVEL - BT.LEV + 1), -- 역전개: 레벨 역순 BT.PATH -- 2.49.1 From bf0e08d90bfdd158de187be77cecd7827c257b60 Mon Sep 17 00:00:00 2001 From: hjjeong Date: Thu, 13 Nov 2025 12:24:54 +0900 Subject: [PATCH 2/6] =?UTF-8?q?=ED=99=94=EB=A9=B4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../contractMgmt/estimateMailFormPopup.jsp | 79 ++++++++++--------- .../view/contractMgmt/supplyMngList.jsp | 2 +- .../view/partMng/partMngDetailPopUp.jsp | 4 +- .../WEB-INF/view/partMng/partMngFormPopUp.jsp | 4 +- 4 files changed, 47 insertions(+), 42 deletions(-) diff --git a/WebContent/WEB-INF/view/contractMgmt/estimateMailFormPopup.jsp b/WebContent/WEB-INF/view/contractMgmt/estimateMailFormPopup.jsp index ba83123..2941d8d 100644 --- a/WebContent/WEB-INF/view/contractMgmt/estimateMailFormPopup.jsp +++ b/WebContent/WEB-INF/view/contractMgmt/estimateMailFormPopup.jsp @@ -15,34 +15,35 @@ String contractObjId = request.getParameter("contractObjId"); 견적서 메일 발송 + + + + + + + diff --git a/WebContent/WEB-INF/view/contractMgmt/orderMgmtList.jsp b/WebContent/WEB-INF/view/contractMgmt/orderMgmtList.jsp index 611b9ce..737cd77 100644 --- a/WebContent/WEB-INF/view/contractMgmt/orderMgmtList.jsp +++ b/WebContent/WEB-INF/view/contractMgmt/orderMgmtList.jsp @@ -317,11 +317,11 @@ function fn_FileRegist(objId, docType, docTypeName){ fn_centerPopup(popup_width, popup_height, url); } -//영업활동등록 상세 +//영업활동등록 상세 (뷰 전용 팝업) function fn_projectConceptDetail(objId){ - var popup_width = 1400; - var popup_height = 560; - var url = "/contractMgmt/estimateRegistFormPopup.do?objId="+objId; + var popup_width = 900; + var popup_height = 700; + var url = "/contractMgmt/estimateViewPopup.do?objId="+objId; fn_centerPopup(popup_width, popup_height, url); } diff --git a/src/com/pms/salesmgmt/controller/ContractMgmtController.java b/src/com/pms/salesmgmt/controller/ContractMgmtController.java index b41b717..c349951 100644 --- a/src/com/pms/salesmgmt/controller/ContractMgmtController.java +++ b/src/com/pms/salesmgmt/controller/ContractMgmtController.java @@ -1813,6 +1813,40 @@ public class ContractMgmtController { return "/contractMgmt/estimateRegistFormPopup"; } + /** + * 견적요청 조회 전용 팝업 (View Only) + * @param request + * @param paramMap + * @return + */ + @SuppressWarnings({ "rawtypes", "unchecked" }) + @RequestMapping("/contractMgmt/estimateViewPopup.do") + public String estimateViewPopup(HttpSession session, HttpServletRequest request, @RequestParam Map paramMap){ + String objId = CommonUtils.checkNull(paramMap.get("objId")); + + try{ + Map info = null; + List> itemList = new ArrayList>(); + + if(paramMap.get("objId")!=null){ + paramMap.put("objId",objId); + info = CommonUtils.keyChangeUpperMap(contractMgmtService.getContractMgmtInfo(paramMap)); + + // 품목 목록 조회 + itemList = contractMgmtService.getContractItemList(objId); + } + + request.setAttribute("info", info); + request.setAttribute("objId", objId); + request.setAttribute("itemList", itemList); + + }catch(Exception e){ + e.printStackTrace(); + } + + return "/contractMgmt/estimateViewPopup"; + } + /** * 품번 검색 (AJAX용) */ diff --git a/src/com/pms/salesmgmt/mapper/contractMgmt.xml b/src/com/pms/salesmgmt/mapper/contractMgmt.xml index 69c1f69..d76311a 100644 --- a/src/com/pms/salesmgmt/mapper/contractMgmt.xml +++ b/src/com/pms/salesmgmt/mapper/contractMgmt.xml @@ -1411,8 +1411,11 @@ SELECT A.OBJID ,A.CATEGORY_CD + ,CODE_NAME(A.CATEGORY_CD) AS CATEGORY_NAME ,A.CUSTOMER_OBJID + ,(SELECT SUPPLY_NAME FROM SUPPLY_MNG AS O WHERE O.OBJID = A.CUSTOMER_OBJID::NUMERIC) AS CUSTOMER_NAME ,A.PRODUCT + ,CODE_NAME(A.PRODUCT) AS PRODUCT_NAME ,A.CUSTOMER_PROJECT_NAME ,A.STATUS_CD ,A.DUE_DATE @@ -1455,12 +1458,14 @@ ,A.EST_COMP_DATE ,A.EST_RESULT_CD ,A.AREA_CD + ,CODE_NAME(A.AREA_CD) AS AREA_NAME ,A.TARGET_PROJECT_NO ,A.TARGET_PROJECT_NO_DIRECT ,A.CUSTOMER_PRODUCTION_NO ,A.MECHANICAL_TYPE ,A.OVERHAUL_ORDER ,A.PAID_TYPE + ,(case when A.PAID_TYPE = 'paid' then '유상' when A.PAID_TYPE = 'free' then '무상' else A.PAID_TYPE end) AS PAID_TYPE_NAME ,A.RECEIPT_DATE ,A.PART_NO ,A.PART_NAME -- 2.49.1 From 86bd16ff7781dd347e1f7b2b8ac3ad11c7d3d16a Mon Sep 17 00:00:00 2001 From: hjjeong Date: Thu, 13 Nov 2025 17:44:22 +0900 Subject: [PATCH 6/6] =?UTF-8?q?=EC=98=81=EC=97=85=EC=A0=95=EB=B3=B4=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=EC=8B=9C=20=ED=94=84=EB=A1=9C=EC=A0=9D?= =?UTF-8?q?=ED=8A=B8=20=EC=A0=95=EB=B3=B4=20=EC=97=85=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=ED=8A=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/com/pms/mapper/project.xml | 82 +++++++++++++------ .../service/ContractMgmtService.java | 29 +++++++ 2 files changed, 88 insertions(+), 23 deletions(-) diff --git a/src/com/pms/mapper/project.xml b/src/com/pms/mapper/project.xml index f8d6dc3..78f3f2f 100644 --- a/src/com/pms/mapper/project.xml +++ b/src/com/pms/mapper/project.xml @@ -7627,29 +7627,65 @@ SELECT UPDATE PROJECT_MGMT - SET - DUE_DATE = #{due_date} - ,CUSTOMER_PROJECT_NAME = #{customer_project_name} - ,LOCATION = #{location} - ,SETUP = #{setup} - ,FACILITY = #{facility} - ,FACILITY_TYPE = #{facility_type} - ,FACILITY_DEPTH = #{facility_depth} - ,CONTRACT_DATE = #{contract_date} - ,PO_NO = #{po_no} - ,PM_USER_ID = #{pm_user_id} - ,CONTRACT_CURRENCY = #{contract_currency} - ,CONTRACT_PRICE_CURRENCY = #{contract_price_currency} - ,CONTRACT_PRICE = #{contract_price} - ,PROJECT_NAME = #{project_name} - ,CONTRACT_DEL_DATE = #{contract_del_date} - ,REQ_DEL_DATE = #{req_del_date} - ,CONTRACT_COMPANY = #{contract_company} - ,MANUFACTURE_PLANT = #{manufacture_plant} - ,PART_OBJID = #{part_objid} - ,PART_NO = #{part_no} - ,PART_NAME = #{part_name} - ,QUANTITY = #{quantity} + + + DUE_DATE = #{due_date}, + + + CUSTOMER_PROJECT_NAME = #{customer_project_name}, + + + LOCATION = #{location}, + + + SETUP = #{setup}, + + + FACILITY = #{facility}, + + + FACILITY_TYPE = #{facility_type}, + + + FACILITY_DEPTH = #{facility_depth}, + + + CONTRACT_DATE = #{contract_date}, + + + PO_NO = #{po_no}, + + + PM_USER_ID = #{pm_user_id}, + + + CONTRACT_CURRENCY = #{contract_currency}, + + + CONTRACT_PRICE_CURRENCY = #{contract_price_currency}, + + + CONTRACT_PRICE = #{contract_price}, + + + PROJECT_NAME = #{project_name}, + + + CONTRACT_DEL_DATE = #{contract_del_date}, + + + REQ_DEL_DATE = #{req_del_date}, + + + CONTRACT_COMPANY = #{contract_company}, + + + MANUFACTURE_PLANT = #{manufacture_plant}, + + + QUANTITY = #{quantity} + + WHERE CONTRACT_OBJID = #{objId} AND PART_OBJID = #{part_objid} diff --git a/src/com/pms/salesmgmt/service/ContractMgmtService.java b/src/com/pms/salesmgmt/service/ContractMgmtService.java index 645850a..e99bcec 100644 --- a/src/com/pms/salesmgmt/service/ContractMgmtService.java +++ b/src/com/pms/salesmgmt/service/ContractMgmtService.java @@ -512,6 +512,35 @@ public class ContractMgmtService { paramMap.put("writer", person.getUserId()); int cnt = sqlSession.update("contractMgmt.saveContractMgmtInfo", paramMap); + // 프로젝트가 존재하는 경우 프로젝트 정보도 업데이트 (수량 제외) + String contract_objid = CommonUtils.checkNull(paramMap.get("objId")); + if(!"".equals(contract_objid)) { + // CONTRACT_OBJID로 프로젝트 존재 여부 확인 + resultList = sqlSession.selectOne("contractMgmt.getProjectListBycontractObjid", paramMap); + + if(resultList != null) { + System.out.println("=== 견적요청 수정 시 프로젝트 업데이트 (수량 제외) ==="); + System.out.println("CONTRACT_OBJID: " + contract_objid); + + // 품목별로 프로젝트 업데이트 (수량은 제외) + List contractItems = getContractItems(paramMap); + + if(contractItems != null && !contractItems.isEmpty()) { + for(Map item : contractItems) { + Map updateParam = new HashMap(); + updateParam.putAll(paramMap); + updateParam.put("part_objid", item.get("PART_OBJID")); + updateParam.put("due_date", item.get("DUE_DATE")); + // quantity는 paramMap에서 제거하여 업데이트되지 않도록 함 + updateParam.remove("quantity"); + + System.out.println("프로젝트 업데이트 - PART_OBJID: " + item.get("PART_OBJID") + ", 납기일: " + updateParam.get("due_date")); + sqlSession.update("project.ModifyProjectByContract", updateParam); + } + } + } + } + resultMap.put("result", true); resultMap.put("msg", Message.SAVE_SUCCESS); sqlSession.commit(); -- 2.49.1