diff --git a/WebContent/WEB-INF/view/contractMgmt/estimateList_new.jsp b/WebContent/WEB-INF/view/contractMgmt/estimateList_new.jsp index 8911cf4..ee7854f 100644 --- a/WebContent/WEB-INF/view/contractMgmt/estimateList_new.jsp +++ b/WebContent/WEB-INF/view/contractMgmt/estimateList_new.jsp @@ -63,11 +63,26 @@ $(document).ready(function(){ //영업활동 등록 팝업 $(".btnRegist").click(function(){ + var selectedData = _tabulGrid.getSelectedData(); var popup_width = 1400; - var popup_height = 560; - var params = "?actionType=regist" - var url = "/contractMgmt/estimateRegistFormPopup.do"+params; - //window.open("/ordermgmt/ordermgmtUpdateFormPopup.do"+params, "", "width=650, height=750","menubars=no, scrollbars=yes, resizable=yes"); + var popup_height = 560; + var url = ""; + + // 선택된 행이 없으면 신규 등록 + if(selectedData.length === 0){ + url = "/contractMgmt/estimateRegistFormPopup.do?actionType=regist"; + } + // 한 줄 선택된 경우 상세 팝업 (영업번호 클릭과 동일) + else if(selectedData.length === 1){ + var objid = fnc_checkNull(selectedData[0].OBJID); + url = "/contractMgmt/estimateRegistFormPopup.do?objId=" + objid; + } + // 여러 줄 선택된 경우 경고 + else { + Swal.fire("한 개의 행만 선택해주세요."); + return false; + } + fn_centerPopup(popup_width, popup_height, url); }); @@ -502,11 +517,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/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/WebContent/WEB-INF/view/contractMgmt/supplyMngList.jsp b/WebContent/WEB-INF/view/contractMgmt/supplyMngList.jsp index 7140621..7c37387 100644 --- a/WebContent/WEB-INF/view/contractMgmt/supplyMngList.jsp +++ b/WebContent/WEB-INF/view/contractMgmt/supplyMngList.jsp @@ -150,7 +150,7 @@ function fn_excel() { } function openOEMPopUp(objid){ var popup_width = 900; - var popup_height = 700; + var popup_height = 750; var target = "openOEMPopUp"; fn_centerPopup(popup_width, popup_height, url, target); diff --git a/WebContent/WEB-INF/view/partMng/partMngDetailPopUp.jsp b/WebContent/WEB-INF/view/partMng/partMngDetailPopUp.jsp index 76e613b..e5bb79e 100644 --- a/WebContent/WEB-INF/view/partMng/partMngDetailPopUp.jsp +++ b/WebContent/WEB-INF/view/partMng/partMngDetailPopUp.jsp @@ -2,7 +2,7 @@ <%@ page import="com.pms.common.utils.*"%> <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> <%@ page import="java.util.*" %> -<%@include file= "/init.jsp" %> +<%@include file= "/init_new.jsp" %> <% PersonBean person = (PersonBean)session.getAttribute(Constants.PERSON_BEAN); String userId = CommonUtils.checkNull(person.getUserId()); @@ -412,7 +412,7 @@ function fn_edit(){
-

+

품목 상세

diff --git a/WebContent/WEB-INF/view/partMng/partMngFormPopUp.jsp b/WebContent/WEB-INF/view/partMng/partMngFormPopUp.jsp index aec7e23..1afb9a7 100644 --- a/WebContent/WEB-INF/view/partMng/partMngFormPopUp.jsp +++ b/WebContent/WEB-INF/view/partMng/partMngFormPopUp.jsp @@ -2,7 +2,7 @@ <%@ page import="com.pms.common.utils.*"%> <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> <%@ page import="java.util.*" %> -<%@include file= "/init.jsp" %> +<%@include file= "/init_new.jsp" %> <% PersonBean person = (PersonBean)session.getAttribute(Constants.PERSON_BEAN); String userId = CommonUtils.checkNull(person.getUserId()); @@ -286,7 +286,7 @@ function fn_overlapPartMng(){
-

+

품목 등록 diff --git a/WebContent/WEB-INF/view/partMng/structureAscendingList.jsp b/WebContent/WEB-INF/view/partMng/structureAscendingList.jsp index 78ecd16..d220980 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){ - + - + + + + + + + - - - - + + @@ -877,11 +977,11 @@ function fn_excelExport(pGridObj,pFileName){ 열처리경도 열처리방법 표면처리 - 공급업체 + 메이커 범주 이름 - Revision + 비고 @@ -915,9 +1015,9 @@ function fn_excelExport(pGridObj,pFileName){ - - - + @@ -931,22 +1031,17 @@ function fn_excelExport(pGridObj,pFileName){ - - - - + + + + - - - - - - - - + + + - + + @@ -971,9 +1066,9 @@ function fn_excelExport(pGridObj,pFileName){ ${item.SURFACE_TREATMENT} ${item.MAKER} ${item.PART_TYPE_TITLE} - ${item.REVISION} - ${item.EO_NO} - ${item.EO_DATE} + ${item.REMARK} 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 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/controller/ContractMgmtController.java b/src/com/pms/salesmgmt/controller/ContractMgmtController.java index 4172e01..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용) */ @@ -2571,4 +2605,43 @@ public class ContractMgmtController { return resultMap; } + + /** + * 프로젝트 존재 여부 확인 (AJAX) + * @param request + * @param paramMap - contractObjId + * @return + */ + @ResponseBody + @RequestMapping(value="/contractMgmt/checkProjectExists.do", method=RequestMethod.POST) + public Map checkProjectExists(HttpServletRequest request, @RequestParam Map paramMap){ + Map resultMap = new HashMap(); + + try { + String contractObjId = CommonUtils.checkNull(paramMap.get("contractObjId")); + + if(StringUtils.isBlank(contractObjId)) { + System.out.println("contractObjId가 비어있음 - exists: false"); + resultMap.put("exists", false); + return resultMap; + } + + paramMap.put("objId", contractObjId); + Map projectInfo = contractMgmtService.checkProjectExists(paramMap); + + if(projectInfo != null) { + resultMap.put("exists", true); + resultMap.put("projectInfo", projectInfo); + } else { + resultMap.put("exists", false); + } + + } catch (Exception e) { + e.printStackTrace(); + resultMap.put("exists", false); + resultMap.put("error", e.getMessage()); + } + + return resultMap; + } } diff --git a/src/com/pms/salesmgmt/mapper/contractMgmt.xml b/src/com/pms/salesmgmt/mapper/contractMgmt.xml index 0e5b92a..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 @@ -3511,7 +3516,9 @@ ORDER BY ASM.SUPPLY_NAME