From 47cfa6bbf91394b719bd8b9eed9f755f3eb47b6b Mon Sep 17 00:00:00 2001 From: leeheejin Date: Wed, 26 Nov 2025 11:12:42 +0900 Subject: [PATCH] =?UTF-8?q?=EC=A4=91=EA=B0=84=EC=BB=A4=EB=B0=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../classes/com/pms/mapper/salesMng.xml | 178 +++- .../clientMng/clientExcelImportPopUp.jsp | 32 +- .../clientMng/clientMngListFormPopUp.jsp | 2 +- .../warehouseList/warehouseListFormPopUp.jsp | 82 +- .../view/salesMng/purchaseListFormPopUp.jsp | 935 +++++++++++------- .../view/salesMng/salesRequestFormPopUp.jsp | 135 ++- .../view/salesMng/salesRequestMngRegList.jsp | 39 +- database/add_minimal_purchase_columns.sql | 17 + src/com/pms/mapper/salesMng.xml | 178 +++- .../controller/SalesMngController.java | 75 +- .../salesmgmt/service/SalesMngService.java | 49 + 11 files changed, 1254 insertions(+), 468 deletions(-) create mode 100644 database/add_minimal_purchase_columns.sql diff --git a/WebContent/WEB-INF/classes/com/pms/mapper/salesMng.xml b/WebContent/WEB-INF/classes/com/pms/mapper/salesMng.xml index c74dadc..1287ea3 100644 --- a/WebContent/WEB-INF/classes/com/pms/mapper/salesMng.xml +++ b/WebContent/WEB-INF/classes/com/pms/mapper/salesMng.xml @@ -663,6 +663,15 @@ VALUES SRM.PROJECT_NO, PM.PROJECT_NO AS PROJECT_NUMBER, PM.PROJECT_NAME, + COALESCE( + PM.OBJID, + (SELECT OBJID FROM PROJECT_MGMT WHERE PROJECT_NO = SRM.PROJECT_NO LIMIT 1) + ) AS PROJECT_MGMT_OBJID, + -- M-BOM 조회용 BOM_REPORT_OBJID 추가 + COALESCE( + PM.BOM_REPORT_OBJID, + (SELECT BOM_REPORT_OBJID FROM PROJECT_MGMT WHERE PROJECT_NO = SRM.PROJECT_NO LIMIT 1) + ) AS BOM_REPORT_OBJID, PM.SETUP, SM.SUPPLY_NAME AS CUSTOMER_NAME, SM.OBJID::VARCHAR AS CUSTOMER_OBJID, -- 고객사 OBJID (드롭다운 선택용) @@ -705,7 +714,7 @@ VALUES FROM SALES_REQUEST_MASTER SRM - LEFT JOIN PROJECT_MGMT PM ON SRM.PROJECT_NO = PM.OBJID::VARCHAR + LEFT JOIN PROJECT_MGMT PM ON (SRM.PROJECT_NO = PM.OBJID::VARCHAR OR SRM.PROJECT_NO = PM.PROJECT_NO) LEFT JOIN CONTRACT_MGMT CM ON PM.CONTRACT_OBJID = CM.OBJID::VARCHAR LEFT JOIN SUPPLY_MNG SM ON CM.CUSTOMER_OBJID::VARCHAR = SM.OBJID::VARCHAR LEFT JOIN PURCHASE_ORDER_MASTER POM ON SRM.OBJID = POM.SALES_REQUEST_OBJID @@ -1242,31 +1251,51 @@ VALUES AND PM.OBJID = #{PROJECT_NO} + + + @@ -2775,18 +2804,19 @@ UPDATE SET + + + SELECT + SRP.OBJID, + SRP.SALES_REQUEST_MASTER_OBJID, + SRP.PART_OBJID, + COALESCE(PMG.PART_NO, '') AS PART_NO, + COALESCE(PMG.PART_NAME, '') AS PART_NAME, + SRP.QTY, + 0 AS ITEM_QTY, + -- 파일 개수 (PART_MNG.OBJID 기준으로 조회) + COALESCE((SELECT COUNT(1) FROM ATTACH_FILE_INFO WHERE TARGET_OBJID = PMG.OBJID AND DOC_TYPE IN ('3D_CAD') AND UPPER(STATUS) = 'ACTIVE'), 0) AS CU01_CNT, + COALESCE((SELECT COUNT(1) FROM ATTACH_FILE_INFO WHERE TARGET_OBJID = PMG.OBJID AND DOC_TYPE IN ('2D_DRAWING_CAD') AND UPPER(STATUS) = 'ACTIVE'), 0) AS CU02_CNT, + COALESCE((SELECT COUNT(1) FROM ATTACH_FILE_INFO WHERE TARGET_OBJID = PMG.OBJID AND DOC_TYPE IN ('2D_PDF_CAD') AND UPPER(STATUS) = 'ACTIVE'), 0) AS CU03_CNT, + COALESCE(PMG.MATERIAL, '') AS MATERIAL, + COALESCE(PMG.HEAT_TREATMENT_HARDNESS, '') AS HEAT_TREATMENT_HARDNESS, + COALESCE(PMG.HEAT_TREATMENT_METHOD, '') AS HEAT_TREATMENT_METHOD, + COALESCE(PMG.SURFACE_TREATMENT, '') AS SURFACE_TREATMENT, + COALESCE(PMG.MAKER, '') AS VENDOR, + COALESCE(PMG.PART_TYPE, '') AS PART_TYPE_TITLE, + '' AS SUPPLY_TYPE, + '' AS RAW_MATERIAL, + '' AS SIZE, + '' AS RAW_MATERIAL_NO, + 0 AS REQUIRED_QTY, + 0 AS ORDER_QTY, + 0 AS ITEM_QTY2, + 0 AS PRODUCTION_QTY, + '' AS PROCESSING_VENDOR, + NULL AS PROCESSING_DEADLINE, + NULL AS GRINDING_DEADLINE, + 'Y' AS USE_YN, + 0 AS NET_QTY, + 0 AS PO_QTY, + SRP.PARTNER_OBJID AS VENDOR_PM, + COALESCE(NULLIF(SRP.PARTNER_PRICE, '')::numeric, 0) AS UNIT_PRICE, + COALESCE( + COALESCE(NULLIF(SRP.PARTNER_PRICE, '')::numeric, 0) * COALESCE(SRP.QTY::numeric, 0), + 0 + ) AS TOTAL_PRICE, + NULL AS PROPOSAL_DATE + FROM + SALES_REQUEST_PART SRP + LEFT JOIN PART_MNG PMG ON SRP.PART_OBJID = PMG.OBJID::VARCHAR AND PMG.IS_LAST = '1' + WHERE + SRP.SALES_REQUEST_MASTER_OBJID = #{SALES_REQUEST_MASTER_OBJID} + ORDER BY + SRP.REGDATE + + + + \ No newline at end of file diff --git a/WebContent/WEB-INF/view/admin/clientMng/clientExcelImportPopUp.jsp b/WebContent/WEB-INF/view/admin/clientMng/clientExcelImportPopUp.jsp index 7743831..2feb4f2 100644 --- a/WebContent/WEB-INF/view/admin/clientMng/clientExcelImportPopUp.jsp +++ b/WebContent/WEB-INF/view/admin/clientMng/clientExcelImportPopUp.jsp @@ -152,14 +152,14 @@ $(document).ready(function(){ ,{name:"CLIENT_TYPE",index:"CLIENT_TYPE", width: 100, align:"center", hidden: false, sortable:false, editable:true ,edittype:"select" ,formatter:"select" - ,editoptions:{ + ,editoptions:{ value: client_type - ,dataInit : function(e){ - e.style.width = "92%"; - e.style.fontSize = 13; - } - } - } + ,dataInit : function(e){ + e.style.width = "92%"; + e.style.fontSize = 13; + } + } + } ,{name:"BUS_REG_NO",index:"BUS_REG_NO", width: 150, align:"center", hidden: false, sortable:false, editable:true ,editoptions:{dataInit : function(e){e.style.fontSize = 13;}} } @@ -513,23 +513,23 @@ function fn_count(){ var clientCd = gridData[i].CLIENT_CD; if(clientCd && clientCd.trim() !== ""){ // AJAX로 중복 체크 - $.ajax({ + $.ajax({ url:"/admin/checkDuplicateClientMngList.do", - type:"POST", + type:"POST", data:{"CLIENT_CD": clientCd}, - dataType:"json", - async: false, - success:function(data){ + dataType:"json", + async: false, + success:function(data){ if(data.result == "true"){ dupCnt++; // 중복 } else { nowCnt++; // 신규 } - }, - error: function(jqxhr, status, error){ + }, + error: function(jqxhr, status, error){ nowCnt++; // 에러 시 신규로 간주 - } - }); + } + }); } } diff --git a/WebContent/WEB-INF/view/admin/clientMng/clientMngListFormPopUp.jsp b/WebContent/WEB-INF/view/admin/clientMng/clientMngListFormPopUp.jsp index 981b04e..35f1f19 100644 --- a/WebContent/WEB-INF/view/admin/clientMng/clientMngListFormPopUp.jsp +++ b/WebContent/WEB-INF/view/admin/clientMng/clientMngListFormPopUp.jsp @@ -20,7 +20,7 @@ function saveClient(){ alert(result.MESSAGE || result.message); if(result.RESULTFLAG == "true" || result.resultFlag == "true"){ if(opener && opener.fn_search){ - opener.fn_search(); + opener.fn_search(); } self.close(); } diff --git a/WebContent/WEB-INF/view/admin/warehouseList/warehouseListFormPopUp.jsp b/WebContent/WEB-INF/view/admin/warehouseList/warehouseListFormPopUp.jsp index 4deadb9..70a1aac 100644 --- a/WebContent/WEB-INF/view/admin/warehouseList/warehouseListFormPopUp.jsp +++ b/WebContent/WEB-INF/view/admin/warehouseList/warehouseListFormPopUp.jsp @@ -21,20 +21,20 @@ function saveWarehouse(){ form.modify_dt.value = convertToDBFormat(modifyDt); } - $.ajax({ + $.ajax({ type: "POST", url: "/admin/saveWarehouseListInfo.do", data: $(form).serialize(), dataType: "json", - success: function(result){ + success: function(result){ alert(result.message); if(result.resultFlag == "true"){ opener.fn_search(); self.close(); - } - } - }); - } + } + } + }); + } } function convertToDBFormat(dateStr) { @@ -70,10 +70,10 @@ function convertToDBFormat(dateStr) { -
-
+
+

창고 등록/수정

-
+
@@ -87,94 +87,94 @@ function convertToDBFormat(dateStr) { 위치명
-
+
+
-
-
+ + \ No newline at end of file diff --git a/WebContent/WEB-INF/view/salesMng/purchaseListFormPopUp.jsp b/WebContent/WEB-INF/view/salesMng/purchaseListFormPopUp.jsp index e1d6857..1bb0e75 100644 --- a/WebContent/WEB-INF/view/salesMng/purchaseListFormPopUp.jsp +++ b/WebContent/WEB-INF/view/salesMng/purchaseListFormPopUp.jsp @@ -1,240 +1,644 @@ -<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> -<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> -<%@ page import="com.pms.common.utils.*"%> -<%@ page import="java.util.*" %> +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> +<%@ page import="com.pms.common.utils.*"%> +<%@ page import="java.util.*"%> <%@include file="/init.jsp"%> - - - - - - + + + + + + <%=Constants.SYSTEM_NAME%> + + + + +
+
+ + +
+ +
+
+
+ + +
+ - - - -
- - -
-
-

- 구매리스트 작성 -

-
- -
-
- - - - -
-
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NO품번품명수량항목수량3D2DPDF재료열처리경도열처리방법표면처리공급업체범주이름지급/사급소재사이즈소재품번소재소요량소재발주수량항목수량제작수량가공업체가공납기연삭납기사용여부정미수량발주수량공급업체단가총단가품의서작성일
-
-
-
- + - diff --git a/WebContent/WEB-INF/view/salesMng/salesRequestFormPopUp.jsp b/WebContent/WEB-INF/view/salesMng/salesRequestFormPopUp.jsp index b22ff50..92349f3 100644 --- a/WebContent/WEB-INF/view/salesMng/salesRequestFormPopUp.jsp +++ b/WebContent/WEB-INF/view/salesMng/salesRequestFormPopUp.jsp @@ -178,6 +178,8 @@ $("#REQUEST_CD,#PROJECT_NO,#CUSTOMER_NAME,#PRODUCT_NAME,#MECHANICAL_TYPE,#PROJEC } } + // ★★★ M-BOM 품목 자동 로드 ★★★ + fn_loadMbomParts($(this).val()); } }); @@ -296,14 +298,35 @@ function fn_getSalesRequestTargetPartList(masterObjId,bomObjId){ }); $("#partListArea").append(appendText); + // 프로젝트번호가 설정되어 있는지 확인하고, 없으면 품번 드롭다운을 채울 수 없음 + var projectNo = $("#PROJECT_NO").val(); + if(!projectNo || projectNo == "") { + console.warn("프로젝트번호가 선택되지 않아 품번 목록을 불러올 수 없습니다."); + } + $.each(resultData, function(i){ var rowObjId = fnc_checkNull(resultData[i].OBJID); var PART_OBJID = fnc_checkNull(resultData[i].PART_OBJID); + var PART_NO = fnc_checkNull(resultData[i].PART_NO); + var PART_NAME = fnc_checkNull(resultData[i].PART_NAME); + // 공급업체 제거로 주석처리 // var PARTNER_OBJID = fnc_checkNull(resultData[i].PARTNER_OBJID); // fnc_getAdminSupCdListAppend("", "PARTNER_OBJID_"+rowObjId, PARTNER_OBJID); // $("#PARTNER_OBJID_"+rowObjId).val(PARTNER_OBJID); + fn_addBomPart("PART_OBJID_"+rowObjId, PART_OBJID, "PART_NAME_"+rowObjId,""); + + // M-BOM에 없는 품번이면 수동으로 추가 + if(PART_OBJID != "" && PART_NO != "") { + var selectBox = $("#PART_OBJID_"+rowObjId); + // 이미 옵션이 있는지 확인 + if(selectBox.find("option[value='"+PART_OBJID+"']").length == 0) { + selectBox.append(""); + } + selectBox.val(PART_OBJID); + $("#PART_NAME_"+rowObjId).val(PART_NAME); + } }); $(".select2").select2(); }, @@ -469,44 +492,122 @@ function fn_Supply_save(){ } } +// ★★★ 프로젝트 선택 시 M-BOM 품목 자동 로드 ★★★ +function fn_loadMbomParts(projectObjId){ + if(fnc_checkNull(projectObjId) == "") return; + + console.log("M-BOM 품목 로드 시작, PROJECT_OBJID:", projectObjId); + + // M-BOM 품목 조회 + var paramData = {"sqlId":"salesMng.SalesBomPartListByProjectUnit", "PROJECT_OBJID":projectObjId}; + var resultList = fnc_getJsonAllDataListBySqlId(paramData); + + console.log("M-BOM 품목 조회 결과:", resultList); + + if(resultList && resultList.length > 0){ + // 기존 품목 초기화 + $("#partListArea").empty(); + + // M-BOM 품목을 행으로 추가 + $.each(resultList, function(i, item){ + var rowObjId = fnc_createObjId(); + var PART_OBJID = fnc_checkNull(item.PART_OBJID); + var PART_NO = fnc_checkNull(item.PART_NO); + var PART_NAME = fnc_checkNull(item.PART_FULL_NAME) || fnc_checkNull(item.PART_NAME); + var QTY = fnc_checkNull(item.ORDER_QTY) || 1; + + var appendText = ""; + appendText += ""; + appendText += " "; + appendText += " "; + appendText += " "; + appendText += " "; + appendText += " "; + appendText += " "; + appendText += " "; + appendText += " "; + appendText += " "; + appendText += " "; + appendText += " "; + appendText += " "; + appendText += " "; + appendText += ""; + + $("#partListArea").append(appendText); + + // 품번 드롭다운에 M-BOM 전체 품목 옵션 추가 + fn_addBomPart("PART_OBJID_"+rowObjId, PART_OBJID, "PART_NAME_"+rowObjId, ""); + }); + + $(".select2").select2(); + console.log("M-BOM 품목 " + resultList.length + "건 로드 완료"); + } else { + console.log("M-BOM 품목이 없습니다."); + } +} + //계약제품, 업체명으로 BOM에 등록된 부품정보를 자동 추가 function fn_addBomPart(selectboxId,selectedVal,sql_id,sql_supply){ $("#BOM_REPORT_OBJID").val(""); - //var type = $("#TYPE").val(); //발주부품 var project_objid = $("#PROJECT_NO").val(); //프로젝트명 var unit_code = $("#UNIT_NAME").val(); //유닛명 - //var partner_objid = $("#PARTNER_OBJID").val(); //공급업체 - //console.log('type:'+type + ' contract_mgmt_objid:'+contract_mgmt_objid + ' unit_code:'+unit_code + ' partner_objid:'+partner_objid); + $("#"+selectboxId).empty(); + $("#"+selectboxId).append(""); - //프로젝트번호만 있으면 품번 조회 가능 (유닛명은 선택사항) + var resultList = []; + + // 1. 프로젝트가 선택되어 있으면 M-BOM 품목 먼저 조회 if(fnc_checkNull(project_objid)!=""){ - $("#"+selectboxId).empty(); - $("#"+selectboxId).append(""); - //구매BOM 조회해서 부품정보를 가져온다 var paramData = {"sqlId":"salesMng.SalesBomPartListByProjectUnit", "PROJECT_OBJID":project_objid}; - // 유닛명이 있으면 추가 if(fnc_checkNull(unit_code)!=""){ paramData.UNIT_CODE = unit_code; } - var resultList = fnc_getJsonAllDataListBySqlId(paramData); + resultList = fnc_getJsonAllDataListBySqlId(paramData); + console.log("M-BOM 품목 조회 결과:", resultList.length, "건"); + } + + // 2. M-BOM 품목이 없으면 전체 PART_MNG에서 조회 + if(resultList.length == 0){ + console.log("M-BOM 품목이 없어 전체 품목에서 조회합니다."); + var allPartData = {"sqlId":"salesMng.getAllPartMngList"}; + resultList = fnc_getJsonAllDataListBySqlId(allPartData); + console.log("전체 품목 조회 결과:", resultList.length, "건"); + + // 전체 품목 조회 결과 처리 if(0 < resultList.length){ for (var i = 0; i < resultList.length; i++) { - var commonCodeId = resultList[i].PART_OBJID; + var commonCodeId = resultList[i].OBJID; var commonCodeName = resultList[i].PART_NO; var partName = resultList[i].PART_NAME; - var supplyObjid = resultList[i].SUPPLY_OBJID; - $("#"+selectboxId).append(""); + $("#"+selectboxId).append(""); } - $("#"+selectboxId).val(selectedVal); - $("#"+selectboxId).change(function(){ - $("#"+sql_id).val($(this).find("option:selected").attr("data-part_name")); - $("#"+sql_supply).val($(this).find("option:selected").attr("data-supplyObjid")); - }); + } + } else { + // M-BOM 품목 처리 + for (var i = 0; i < resultList.length; i++) { + var commonCodeId = resultList[i].PART_OBJID; + var commonCodeName = resultList[i].PART_NO; + var partName = resultList[i].PART_NAME || resultList[i].PART_FULL_NAME; + var supplyObjid = resultList[i].SUPPLY_OBJID; + $("#"+selectboxId).append(""); } } + // 선택값 설정 및 change 이벤트 바인딩 + if(fnc_checkNull(selectedVal) != ""){ + $("#"+selectboxId).val(selectedVal); + } + $("#"+selectboxId).off("change").on("change", function(){ + $("#"+sql_id).val($(this).find("option:selected").attr("data-part_name")); + if(sql_supply){ + $("#"+sql_supply).val($(this).find("option:selected").attr("data-supplyObjid")); + } + }); + $("#"+selectboxId).trigger("change"); } diff --git a/WebContent/WEB-INF/view/salesMng/salesRequestMngRegList.jsp b/WebContent/WEB-INF/view/salesMng/salesRequestMngRegList.jsp index 2cbd8cb..8b232ea 100644 --- a/WebContent/WEB-INF/view/salesMng/salesRequestMngRegList.jsp +++ b/WebContent/WEB-INF/view/salesMng/salesRequestMngRegList.jsp @@ -100,7 +100,7 @@ $(document).ready(function(){ //구매요청서 작성 $("#btnOrderReg").click(function(){ - fn_openSalesRequestPopUp(""); + fn_openSalesRequestFormPopUp(""); }); //품의서 생성 (TODO: 품의서 생성 기능 구현 필요 - 기존 발주서 작성 기능과 다름) @@ -221,16 +221,16 @@ var columns = [ ,{headerHozAlign : 'center', hozAlign : 'center', title : "유/무상", field :"PAID_TYPE_NAME" , widthGrow:0.9 } ,{headerHozAlign : 'center', hozAlign : 'left', title : "품번", field :"PART_NO" , widthGrow:1.4} ,{headerHozAlign : 'center', hozAlign : 'left' , title : "품명", field :"PART_NAME" , widthGrow:1.8 } - ,{headerHozAlign : 'center', hozAlign : 'center', title : "구매요청서", field :"REQUEST_MNG_NO" , widthGrow:1.1, - formatter: function(cell, formatterParams, onRendered){ - var objid = fnc_checkNull(cell.getData().OBJID); - var iconClass = (objid != '' && objid != null) ? 'file_icon' : 'file_empty_icon'; - return ''; - }, - cellClick : function(e, cell) { - fn_openSalesRequestPopUp(cell.getData().OBJID); + ,{headerHozAlign : 'center', hozAlign : 'center', title : "구매요청서", field :"REQUEST_MNG_NO" , widthGrow:1.1, + formatter: function(cell, formatterParams, onRendered){ + var objid = fnc_checkNull(cell.getData().OBJID); + var iconClass = (objid != '' && objid != null) ? 'file_icon' : 'file_empty_icon'; + return ''; + }, + cellClick : function(e, cell) { + fn_openSalesRequestFormPopUp(cell.getData().OBJID); } - } + } ,{headerHozAlign : 'center', hozAlign : 'center', title : "요청인", field :"REQUEST_USER_NAME" , widthGrow:1.1 } ,{headerHozAlign : 'center', hozAlign : 'center', title : "입고요청일", field :"DELIVERY_REQUEST_DATE" , widthGrow:1.1 } ,{headerHozAlign : 'center', hozAlign : 'center', title : "작성일", field :"REGDATE_TITLE" , widthGrow:1.1 } @@ -281,17 +281,16 @@ function fn_salesRequestTargetBOMListPopUp(){ window.open(url,"salesRequestTargetBOMListPopUp","width=1300,height=550"); } -//구매의뢰 요청 팝업 +//구매의뢰 요청 팝업 (요청번호 클릭 시 - 구매리스트 화면) function fn_openSalesRequestPopUp(objId){ - var url = ""; - - if("" == objId){ - url = "/salesMng/salesRequestFormPopUp.do?SALES_REQUEST_MASTER_OBJID="+objId; - }else{ - //url = "/salesMng/salesRequestDetailPopUp.do?SALES_REQUEST_MASTER_OBJID="+objId; - url = "/salesMng/salesRequestFormPopUp.do?SALES_REQUEST_MASTER_OBJID="+objId; - } - window.open(url,"salesRequestPopUp","width=1100,height=630"); + var url = "/salesMng/purchaseListFormPopUp.do?SALES_REQUEST_MASTER_OBJID="+objId; + window.open(url,"purchaseListPopUp","width=1400,height=800,scrollbars=yes,resizable=yes"); +} + +//구매요청서 작성 팝업 (구매요청서 파일 아이콘 클릭 시) +function fn_openSalesRequestFormPopUp(objId){ + var url = "/salesMng/salesRequestFormPopUp.do?SALES_REQUEST_MASTER_OBJID="+objId; + window.open(url,"salesRequestFormPopUp","width=1100,height=630"); } function fn_releaseSalesRequest(){ diff --git a/database/add_minimal_purchase_columns.sql b/database/add_minimal_purchase_columns.sql new file mode 100644 index 0000000..d373960 --- /dev/null +++ b/database/add_minimal_purchase_columns.sql @@ -0,0 +1,17 @@ +-- SALES_REQUEST_PART 테이블에 구매리스트 필수 컬럼만 추가 +-- 기존: OBJID, PART_OBJID, SALES_REQUEST_MASTER_OBJID, QTY, PARTNER_OBJID, PARTNER_PRICE, WRITER, REGDATE 등 + +ALTER TABLE SALES_REQUEST_PART +ADD COLUMN IF NOT EXISTS PART_NO VARCHAR(100), -- 품번 (직접 입력용) +ADD COLUMN IF NOT EXISTS PART_NAME VARCHAR(200), -- 품명 (직접 입력용) +ADD COLUMN IF NOT EXISTS UNIT_PRICE VARCHAR(50), -- 단가 +ADD COLUMN IF NOT EXISTS TOTAL_PRICE VARCHAR(50), -- 총단가 +ADD COLUMN IF NOT EXISTS PROPOSAL_DATE DATE; -- 품의서작성일 + +-- 컬럼 설명 +COMMENT ON COLUMN SALES_REQUEST_PART.PART_NO IS '품번'; +COMMENT ON COLUMN SALES_REQUEST_PART.PART_NAME IS '품명'; +COMMENT ON COLUMN SALES_REQUEST_PART.UNIT_PRICE IS '단가'; +COMMENT ON COLUMN SALES_REQUEST_PART.TOTAL_PRICE IS '총단가'; +COMMENT ON COLUMN SALES_REQUEST_PART.PROPOSAL_DATE IS '품의서작성일'; + diff --git a/src/com/pms/mapper/salesMng.xml b/src/com/pms/mapper/salesMng.xml index c74dadc..1287ea3 100644 --- a/src/com/pms/mapper/salesMng.xml +++ b/src/com/pms/mapper/salesMng.xml @@ -663,6 +663,15 @@ VALUES SRM.PROJECT_NO, PM.PROJECT_NO AS PROJECT_NUMBER, PM.PROJECT_NAME, + COALESCE( + PM.OBJID, + (SELECT OBJID FROM PROJECT_MGMT WHERE PROJECT_NO = SRM.PROJECT_NO LIMIT 1) + ) AS PROJECT_MGMT_OBJID, + -- M-BOM 조회용 BOM_REPORT_OBJID 추가 + COALESCE( + PM.BOM_REPORT_OBJID, + (SELECT BOM_REPORT_OBJID FROM PROJECT_MGMT WHERE PROJECT_NO = SRM.PROJECT_NO LIMIT 1) + ) AS BOM_REPORT_OBJID, PM.SETUP, SM.SUPPLY_NAME AS CUSTOMER_NAME, SM.OBJID::VARCHAR AS CUSTOMER_OBJID, -- 고객사 OBJID (드롭다운 선택용) @@ -705,7 +714,7 @@ VALUES FROM SALES_REQUEST_MASTER SRM - LEFT JOIN PROJECT_MGMT PM ON SRM.PROJECT_NO = PM.OBJID::VARCHAR + LEFT JOIN PROJECT_MGMT PM ON (SRM.PROJECT_NO = PM.OBJID::VARCHAR OR SRM.PROJECT_NO = PM.PROJECT_NO) LEFT JOIN CONTRACT_MGMT CM ON PM.CONTRACT_OBJID = CM.OBJID::VARCHAR LEFT JOIN SUPPLY_MNG SM ON CM.CUSTOMER_OBJID::VARCHAR = SM.OBJID::VARCHAR LEFT JOIN PURCHASE_ORDER_MASTER POM ON SRM.OBJID = POM.SALES_REQUEST_OBJID @@ -1242,31 +1251,51 @@ VALUES AND PM.OBJID = #{PROJECT_NO} + + + @@ -2775,18 +2804,19 @@ UPDATE SET + + + SELECT + SRP.OBJID, + SRP.SALES_REQUEST_MASTER_OBJID, + SRP.PART_OBJID, + COALESCE(PMG.PART_NO, '') AS PART_NO, + COALESCE(PMG.PART_NAME, '') AS PART_NAME, + SRP.QTY, + 0 AS ITEM_QTY, + -- 파일 개수 (PART_MNG.OBJID 기준으로 조회) + COALESCE((SELECT COUNT(1) FROM ATTACH_FILE_INFO WHERE TARGET_OBJID = PMG.OBJID AND DOC_TYPE IN ('3D_CAD') AND UPPER(STATUS) = 'ACTIVE'), 0) AS CU01_CNT, + COALESCE((SELECT COUNT(1) FROM ATTACH_FILE_INFO WHERE TARGET_OBJID = PMG.OBJID AND DOC_TYPE IN ('2D_DRAWING_CAD') AND UPPER(STATUS) = 'ACTIVE'), 0) AS CU02_CNT, + COALESCE((SELECT COUNT(1) FROM ATTACH_FILE_INFO WHERE TARGET_OBJID = PMG.OBJID AND DOC_TYPE IN ('2D_PDF_CAD') AND UPPER(STATUS) = 'ACTIVE'), 0) AS CU03_CNT, + COALESCE(PMG.MATERIAL, '') AS MATERIAL, + COALESCE(PMG.HEAT_TREATMENT_HARDNESS, '') AS HEAT_TREATMENT_HARDNESS, + COALESCE(PMG.HEAT_TREATMENT_METHOD, '') AS HEAT_TREATMENT_METHOD, + COALESCE(PMG.SURFACE_TREATMENT, '') AS SURFACE_TREATMENT, + COALESCE(PMG.MAKER, '') AS VENDOR, + COALESCE(PMG.PART_TYPE, '') AS PART_TYPE_TITLE, + '' AS SUPPLY_TYPE, + '' AS RAW_MATERIAL, + '' AS SIZE, + '' AS RAW_MATERIAL_NO, + 0 AS REQUIRED_QTY, + 0 AS ORDER_QTY, + 0 AS ITEM_QTY2, + 0 AS PRODUCTION_QTY, + '' AS PROCESSING_VENDOR, + NULL AS PROCESSING_DEADLINE, + NULL AS GRINDING_DEADLINE, + 'Y' AS USE_YN, + 0 AS NET_QTY, + 0 AS PO_QTY, + SRP.PARTNER_OBJID AS VENDOR_PM, + COALESCE(NULLIF(SRP.PARTNER_PRICE, '')::numeric, 0) AS UNIT_PRICE, + COALESCE( + COALESCE(NULLIF(SRP.PARTNER_PRICE, '')::numeric, 0) * COALESCE(SRP.QTY::numeric, 0), + 0 + ) AS TOTAL_PRICE, + NULL AS PROPOSAL_DATE + FROM + SALES_REQUEST_PART SRP + LEFT JOIN PART_MNG PMG ON SRP.PART_OBJID = PMG.OBJID::VARCHAR AND PMG.IS_LAST = '1' + WHERE + SRP.SALES_REQUEST_MASTER_OBJID = #{SALES_REQUEST_MASTER_OBJID} + ORDER BY + SRP.REGDATE + + + + \ No newline at end of file diff --git a/src/com/pms/salesmgmt/controller/SalesMngController.java b/src/com/pms/salesmgmt/controller/SalesMngController.java index 30de9b2..61ee6fa 100644 --- a/src/com/pms/salesmgmt/controller/SalesMngController.java +++ b/src/com/pms/salesmgmt/controller/SalesMngController.java @@ -1095,23 +1095,90 @@ public class SalesMngController { */ @RequestMapping("/salesMng/purchaseListFormPopUp.do") public String purchaseListFormPopUp(HttpServletRequest request, @RequestParam Map paramMap){ + Map resultMap = new HashMap(); + try{ + String salesRequestMasterObjId = CommonUtils.checkNull(paramMap.get("SALES_REQUEST_MASTER_OBJID")); + String projectMgmtObjId = CommonUtils.checkNull(paramMap.get("PROJECT_MGMT_OBJID")); + + if(!"".equals(salesRequestMasterObjId)){ + // 기존 구매리스트 조회 + resultMap = salesMngService.getSalesRequestMasterInfo(request, paramMap); + }else if(!"".equals(projectMgmtObjId)){ + // M-BOM에서 새로 생성 + resultMap.put("OBJID", CommonUtils.createObjId()); + resultMap.put("STATUS", "create"); + }else{ + resultMap.put("OBJID", CommonUtils.createObjId()); + resultMap.put("STATUS", "create"); + } + }catch(Exception e){ + e.printStackTrace(); + } + + request.setAttribute("resultMap", resultMap); return "/salesMng/purchaseListFormPopUp"; } /** - * 구매리스트 데이터 조회 + * 구매리스트 상세 조회 (기존 구매리스트) * @param request * @param paramMap * @return */ @ResponseBody - @RequestMapping("/salesMng/getPurchaseListData.do") - public Map getPurchaseListData(HttpServletRequest request, @RequestParam Map paramMap){ + @RequestMapping("/salesMng/getPurchaseListDetail.do") + public Map getPurchaseListDetail(HttpServletRequest request, @RequestParam Map paramMap){ Map resultMap = new HashMap(); try{ - resultMap = salesMngService.getPurchaseListData(request, paramMap); + List list = salesMngService.getPurchaseListDetail(request, paramMap); + resultMap.put("list", list); }catch(Exception e){ e.printStackTrace(); + resultMap.put("list", new ArrayList()); + } + return resultMap; + } + + /** + * M-BOM에서 구매리스트 생성 + * @param request + * @param paramMap + * @return + */ + @ResponseBody + @RequestMapping("/salesMng/getMBomForPurchaseList.do") + public Map getMBomForPurchaseList(HttpServletRequest request, @RequestParam Map paramMap){ + Map resultMap = new HashMap(); + try{ + System.out.println("========== getMBomForPurchaseList 호출 =========="); + System.out.println("paramMap: " + paramMap); + System.out.println("PROJECT_MGMT_OBJID: " + paramMap.get("PROJECT_MGMT_OBJID")); + System.out.println("bomReportObjId: " + paramMap.get("bomReportObjId")); + + List list = salesMngService.getMBomForPurchaseList(request, paramMap); + + // 키를 대문자로 변환 + List> upperList = new ArrayList>(); + if(list != null) { + for(Map item : list) { + Map upperItem = new HashMap(); + for(Object key : item.keySet()) { + upperItem.put(key.toString().toUpperCase(), item.get(key)); + } + upperList.add(upperItem); + } + } + + System.out.println("결과 리스트 크기: " + upperList.size()); + if(!upperList.isEmpty()) { + System.out.println("첫번째 항목: " + upperList.get(0)); + } + + resultMap.put("list", upperList); + }catch(Exception e){ + System.out.println("getMBomForPurchaseList 오류 발생!"); + e.printStackTrace(); + resultMap.put("list", new ArrayList()); } return resultMap; } diff --git a/src/com/pms/salesmgmt/service/SalesMngService.java b/src/com/pms/salesmgmt/service/SalesMngService.java index 1a20022..1d58c9d 100644 --- a/src/com/pms/salesmgmt/service/SalesMngService.java +++ b/src/com/pms/salesmgmt/service/SalesMngService.java @@ -1785,4 +1785,53 @@ public class SalesMngService { return resultMap; } + + /** + * 구매리스트 상세 조회 (기존 저장된 데이터) + * @param request + * @param paramMap + * @return + * @throws Exception + */ + public List getPurchaseListDetail(HttpServletRequest request, Map paramMap) throws Exception { + SqlSession sqlSession = null; + List resultList = new ArrayList(); + + try { + sqlSession = SqlMapConfig.getInstance().getSqlSession(false); + resultList = sqlSession.selectList("salesMng.getPurchaseListDetail", paramMap); + } catch(Exception e) { + e.printStackTrace(); + throw e; + } finally { + if(sqlSession != null) sqlSession.close(); + } + + return resultList; + } + + /** + * M-BOM에서 구매리스트 데이터 가져오기 + * @param request + * @param paramMap + * @return + * @throws Exception + */ + public List getMBomForPurchaseList(HttpServletRequest request, Map paramMap) throws Exception { + SqlSession sqlSession = null; + List resultList = new ArrayList(); + + try { + sqlSession = SqlMapConfig.getInstance().getSqlSession(false); + // M-BOM 데이터 조회 (레벨 구조 없이 평평하게) + resultList = sqlSession.selectList("salesMng.getMBomForPurchaseList", paramMap); + } catch(Exception e) { + e.printStackTrace(); + throw e; + } finally { + if(sqlSession != null) sqlSession.close(); + } + + return resultList; + } }