From a5f5c310d8ed7574eb893f5d8c9471541f1329ca Mon Sep 17 00:00:00 2001 From: hjjeong Date: Tue, 10 Mar 2026 15:15:59 +0900 Subject: [PATCH 1/4] =?UTF-8?q?=EC=9E=85=EA=B3=A0=EC=9D=BC=EB=B3=84=20?= =?UTF-8?q?=EC=9E=85=EA=B3=A0=EA=B4=80=EB=A6=AC=20=EB=A9=94=EB=89=B4=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20(=EB=A7=A4=EC=9E=85=EB=A7=88=EA=B0=90=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EC=97=AC=EA=B8=B0=EB=A1=9C=20=EC=98=AE?= =?UTF-8?q?=EA=B9=80)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../view/purchaseOrder/purchaseCloseList.jsp | 356 ++++++++++++++++++ .../controller/PurchaseOrderController.java | 45 ++- src/com/pms/mapper/purchaseOrder.xml | 210 ++++++++++- src/com/pms/service/PurchaseOrderService.java | 30 ++ 4 files changed, 637 insertions(+), 4 deletions(-) create mode 100644 WebContent/WEB-INF/view/purchaseOrder/purchaseCloseList.jsp diff --git a/WebContent/WEB-INF/view/purchaseOrder/purchaseCloseList.jsp b/WebContent/WEB-INF/view/purchaseOrder/purchaseCloseList.jsp new file mode 100644 index 0000000..1a955c9 --- /dev/null +++ b/WebContent/WEB-INF/view/purchaseOrder/purchaseCloseList.jsp @@ -0,0 +1,356 @@ +<%@ 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.*" %> +<%@include file= "/init.jsp" %> + + +<% +String menuObjId = request.getParameter("menuObjId"); +String menuName = CommonUtils.getMenuName(menuObjId, "매입마감 관리"); +%> + + + + + <%=Constants.SYSTEM_NAME%> + + + + + + +
+ + + + +
+
+ + +
+
+
+

+ <%=menuName%> +

+
+ + +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + +
+ ~ + + + + + + +
+
+ + <%@include file= "/WEB-INF/view/common/common_gridArea.jsp" %> +
+
+
+ + diff --git a/src/com/pms/controller/PurchaseOrderController.java b/src/com/pms/controller/PurchaseOrderController.java index 4a164e7..b8c2f6e 100644 --- a/src/com/pms/controller/PurchaseOrderController.java +++ b/src/com/pms/controller/PurchaseOrderController.java @@ -1354,7 +1354,7 @@ public class PurchaseOrderController { } /** - * 매입마감 처리 + * 매입마감 처리 (발주서 단위) * PURCHASE_ORDER_MASTER의 PURCHASE_CLOSE_DATE를 현재일자로 업데이트 */ @ResponseBody @@ -1363,6 +1363,17 @@ public class PurchaseOrderController { String objIds = (String) paramMap.get("objIds"); return purchaseOrderService.updatePurchaseCloseDate(objIds); } + + /** + * 매입마감 처리 (입고건 단위) + * ARRIVAL_PLAN의 PURCHASE_CLOSE_DATE를 현재일자로 업데이트 + */ + @ResponseBody + @RequestMapping("/purchaseOrder/purchaseCloseByArrival.do") + public Map purchaseCloseByArrival(HttpSession session, HttpServletRequest request, @RequestParam Map paramMap){ + String objIds = (String) paramMap.get("objIds"); + return purchaseOrderService.updateArrivalPlanCloseDate(objIds); + } /** * 품목별 입고 관리 화면 @@ -1410,7 +1421,37 @@ public class PurchaseOrderController { commonService.selectListPagingNew("purchaseOrder.deliveryMngPartList", request, paramMap); return paramMap; } - + + /** + * 매입마감 관리 화면 (입고일별 입고관리) + */ + @RequestMapping("/purchaseOrder/purchaseCloseList.do") + public String purchaseCloseList(HttpServletRequest request, @RequestParam Map paramMap){ + Map code_map = new HashMap(); + + try{ + code_map.put("customer_cd", commonService.bizMakeOptionList("", (String)paramMap.get("customer_cd"), "common.getsupplyselect")); + code_map.put("project_no", commonService.bizMakeOptionList("", (String)paramMap.get("project_no"), "common.getProjectNameList")); + code_map.put("partner_objid", commonService.bizMakeOptionList("", (String)paramMap.get("partner_objid"), "common.getAllSupplySelect")); + code_map.put("sales_mng_user_id", commonService.bizMakeOptionList("", (String)paramMap.get("sales_mng_user_id"), "common.getUserselect")); + }catch(Exception e){ + e.printStackTrace(); + } + + request.setAttribute("code_map", code_map); + return "/purchaseOrder/purchaseCloseList"; + } + + /** + * 매입마감 관리 그리드 조회 (입고일별 입고관리) + */ + @ResponseBody + @RequestMapping("/purchaseOrder/purchaseCloseGridList.do") + public Map purchaseCloseGridList(HttpSession session, HttpServletRequest request, @RequestParam Map paramMap){ + commonService.selectListPagingNew("purchaseOrder.purchaseCloseList", request, paramMap); + return paramMap; + } + /** * 입고 관리 */ diff --git a/src/com/pms/mapper/purchaseOrder.xml b/src/com/pms/mapper/purchaseOrder.xml index 5e0d43b..6fd3ff4 100644 --- a/src/com/pms/mapper/purchaseOrder.xml +++ b/src/com/pms/mapper/purchaseOrder.xml @@ -1142,12 +1142,19 @@ --> - + UPDATE PURCHASE_ORDER_MASTER SET PURCHASE_CLOSE_DATE = TO_CHAR(NOW(), 'YYYY-MM-DD') WHERE OBJID = #{OBJID} + + + + UPDATE ARRIVAL_PLAN + SET PURCHASE_CLOSE_DATE = TO_CHAR(NOW(), 'YYYY-MM-DD') + WHERE OBJID = #{OBJID} + UPDATE PURCHASE_ORDER_MASTER SET @@ -6406,5 +6413,204 @@ FROM( ORDER BY POM.REGDATE DESC, POP.OBJID - + + + + \ No newline at end of file diff --git a/src/com/pms/service/PurchaseOrderService.java b/src/com/pms/service/PurchaseOrderService.java index 5b1d6be..c676741 100644 --- a/src/com/pms/service/PurchaseOrderService.java +++ b/src/com/pms/service/PurchaseOrderService.java @@ -3276,6 +3276,36 @@ public class PurchaseOrderService { return resultMap; } + /** + * 매입마감 처리 (입고건 단위) + * ARRIVAL_PLAN의 PURCHASE_CLOSE_DATE를 현재일자로 업데이트 + */ + public Map updateArrivalPlanCloseDate(String objIds) { + Map resultMap = new HashMap(); + SqlSession sqlSession = SqlMapConfig.getInstance().getSqlSession(false); + + try { + if(objIds != null && !objIds.isEmpty()) { + String[] objIdArr = objIds.split(","); + for(String objId : objIdArr) { + Map updateParam = new HashMap(); + updateParam.put("OBJID", objId.trim()); + sqlSession.update("purchaseOrder.updateArrivalPlanCloseDate", updateParam); + } + } + sqlSession.commit(); + resultMap.put("result", "SUCCESS"); + } catch(Exception e) { + sqlSession.rollback(); + e.printStackTrace(); + resultMap.put("result", "FAIL"); + resultMap.put("message", e.getMessage()); + } finally { + sqlSession.close(); + } + return resultMap; + } + /** * 발주 취소 전 입고 여부 확인 * @param request -- 2.49.1 From ffb56aebe6c9e8d38440747f50a54b9b21045a1f Mon Sep 17 00:00:00 2001 From: hjjeong Date: Tue, 10 Mar 2026 16:28:53 +0900 Subject: [PATCH 2/4] =?UTF-8?q?=EC=86=8C=EC=88=98=EC=A0=90=20=EB=91=90?= =?UTF-8?q?=EB=B2=88=EC=A7=B8=EC=9E=90=EB=A6=AC=EA=B9=8C=EC=A7=80=20?= =?UTF-8?q?=ED=91=9C=EA=B8=B0,=20,=20=ED=91=9C=EA=B8=B0=20=EB=93=B1..=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/contractMgmt/estimateList_new.jsp | 10 +++--- .../purchaseOrderFormPopup_general.jsp | 34 ++++++++++++++----- .../purchaseOrderFormPopup_outsourcing.jsp | 30 ++++++++++++---- src/com/pms/salesmgmt/mapper/contractMgmt.xml | 9 ++++- 4 files changed, 60 insertions(+), 23 deletions(-) diff --git a/WebContent/WEB-INF/view/contractMgmt/estimateList_new.jsp b/WebContent/WEB-INF/view/contractMgmt/estimateList_new.jsp index 1dba40b..ef1a202 100644 --- a/WebContent/WEB-INF/view/contractMgmt/estimateList_new.jsp +++ b/WebContent/WEB-INF/view/contractMgmt/estimateList_new.jsp @@ -394,9 +394,8 @@ var columns = [ else if(currencyName.includes('유로') || currencyName === 'EUR') currencySymbol = '€'; else if(currencyName.includes('엔') || currencyName === 'JPY') currencySymbol = '¥'; else if(currencyName.includes('위안') || currencyName === 'CNY') currencySymbol = '¥'; - // 통화 기호 제거 후 콤마 추가 - var numericValue = String(value).replace(/[^0-9.]/g, ''); - return currencySymbol + addComma(numericValue); + var numericValue = String(value).replace(/[^0-9.\-]/g, ''); + return currencySymbol + Number(numericValue).toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2}); } }, // 10. 원화환산공급가액 @@ -404,9 +403,8 @@ var columns = [ formatter: function(cell, formatterParams, onRendered){ var value = fnc_checkNull(cell.getValue()); if(value === '' || value === '0') return ''; - // 통화 기호 제거 후 콤마 추가 - var numericValue = String(value).replace(/[^0-9.]/g, ''); - return '₩' + addComma(numericValue); + var numericValue = String(value).replace(/[^0-9.\-]/g, ''); + return '₩' + Number(numericValue).toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2}); } }, // 11. 견적현황 diff --git a/WebContent/WEB-INF/view/purchaseOrder/purchaseOrderFormPopup_general.jsp b/WebContent/WEB-INF/view/purchaseOrder/purchaseOrderFormPopup_general.jsp index adc4fc0..78a7fc8 100644 --- a/WebContent/WEB-INF/view/purchaseOrder/purchaseOrderFormPopup_general.jsp +++ b/WebContent/WEB-INF/view/purchaseOrder/purchaseOrderFormPopup_general.jsp @@ -270,14 +270,24 @@ $(document).ready(function(){ ,{name:"PARTNER_PRICE" , width:80, align:"right", sortable:false, editable:<%= isModify %> ,formatter:"number", formatoptions:{thousandsSeparator:",", decimalPlaces:2} ,editoptions:{ - dataInit: function(e){ e.style.textAlign = "right"; } - ,dataEvents: [{type:"change", fn:function(e){ gridFn.calcRowAll(e); }}] + dataInit: function(e){ + e.style.textAlign = "right"; + var val = parseFloat($(e).val().replace(/,/g, '')); + if(!isNaN(val)) $(e).val(numberWithCommasDecimal(val)); + } + ,dataEvents: [ + {type:"change", fn:function(e){ gridFn.calcRowAll(e); }} + ,{type:"blur", fn:function(e){ + var val = parseFloat($(e.target).val().replace(/,/g, '')); + if(!isNaN(val)) $(e.target).val(numberWithCommasDecimal(val)); + }} + ] } } ,{name:"SUPPLY_UNIT_PRICE", width:90, align:"right", sortable:false, editable:false ,formatter:"number", formatoptions:{thousandsSeparator:",", decimalPlaces:2} } - ,{name:"REMARK" , width:100, align:"left", sortable:false, editable:<%= isModify %>} + ,{name:"REMARK" , width:180, align:"left", sortable:false, editable:<%= isModify %>} ,{name:"DELIVERY_REQUEST_DATE", width:90, align:"center", sortable:false, editable:<%= isModify %>} ] ,rownumbers : false @@ -307,7 +317,13 @@ $(document).ready(function(){ gridFn.opennEdit(); gridFn.calcAllRows(); - + + // 창 크기 변경 시 그리드 리사이즈 + $(window).on('resize', function(){ + var newWidth = $("#grid1").closest(".ui-jqgrid").parent().width(); + $("#grid1").jqGrid('setGridWidth', newWidth, true); + }); + <% if(isModify){ %> // 수정 가능 상태 $("#PARTNER_OBJID,#DELIVERY_PLACE_CD,#PAYMENT_METHOD").prop("disabled",""); @@ -762,11 +778,11 @@ function fn_generateAndUploadPdf(callback) { - - + + - +
1. 발 주 번 호 :1. 발 주 번 호 : @@ -817,8 +833,8 @@ function fn_generateAndUploadPdf(callback) {
- - + + diff --git a/WebContent/WEB-INF/view/purchaseOrder/purchaseOrderFormPopup_outsourcing.jsp b/WebContent/WEB-INF/view/purchaseOrder/purchaseOrderFormPopup_outsourcing.jsp index 1b5e71d..4caf998 100644 --- a/WebContent/WEB-INF/view/purchaseOrder/purchaseOrderFormPopup_outsourcing.jsp +++ b/WebContent/WEB-INF/view/purchaseOrder/purchaseOrderFormPopup_outsourcing.jsp @@ -222,15 +222,25 @@ $(document).ready(function(){ ,dataEvents: [{type:"change", fn:function(e){ gridFn.calcRowAll(e); }}] } } - ,{name:"UNIT" , width:40, align:"center", sortable:false, editable:<%= isModify %> + ,{name:"UNIT" , width:50, align:"center", sortable:false, editable:<%= isModify %> ,edittype:"select", formatter:"select" ,editoptions:{ value: unit_cd } } ,{name:"PARTNER_PRICE" , width:80, align:"right", sortable:false, editable:<%= isModify %> ,formatter:"number", formatoptions:{thousandsSeparator:",", decimalPlaces:2} ,editoptions:{ - dataInit: function(e){ e.style.textAlign = "right"; } - ,dataEvents: [{type:"change", fn:function(e){ gridFn.calcRowAll(e); }}] + dataInit: function(e){ + e.style.textAlign = "right"; + var val = parseFloat($(e).val().replace(/,/g, '')); + if(!isNaN(val)) $(e).val(numberWithCommasDecimal(val)); + } + ,dataEvents: [ + {type:"change", fn:function(e){ gridFn.calcRowAll(e); }} + ,{type:"blur", fn:function(e){ + var val = parseFloat($(e.target).val().replace(/,/g, '')); + if(!isNaN(val)) $(e.target).val(numberWithCommasDecimal(val)); + }} + ] } } ,{name:"SUPPLY_UNIT_PRICE" , width:90, align:"right", sortable:false, editable:false @@ -258,7 +268,7 @@ $(document).ready(function(){ // 행번호 자동 부여 var ids = $(this).jqGrid('getDataIDs'); for(var i = 0; i < ids.length; i++){ - $(this).jqGrid('setCell', ids[i], 'ROW_NUM', i+2); // 2부터 시작 (PDF 양식 참고) + $(this).jqGrid('setCell', ids[i], 'ROW_NUM', i+1); } setTimeout(function(){ gridFn.calcAllRows(); }, 100); @@ -268,6 +278,12 @@ $(document).ready(function(){ gridFn.opennEdit(); gridFn.calcAllRows(); + // 창 크기 변경 시 그리드 리사이즈 + $(window).on('resize', function(){ + var newWidth = $("#grid1").closest(".ui-jqgrid").parent().width(); + $("#grid1").jqGrid('setGridWidth', newWidth, true); + }); + <% if(isModify){ %> // 수정 가능 상태 $("#PARTNER_OBJID").prop("disabled",""); @@ -316,7 +332,7 @@ function fn_addRow(rowData){ var newId = grid.getGridParam("reccount")+1; var addData = { "PART_OBJID" : rowData.map.PART_OBJID - ,"ROW_NUM" : newId + 1 + ,"ROW_NUM" : newId ,"PURCHASE_ORDER_NO" : "${info.PURCHASE_ORDER_NO}" ,"PARTNER_NAME" : $("#PARTNER_OBJID option:selected").text() ,"PRODUCT_NAME" : rowData.map.PART_NAME + " / " + rowData.map.SPEC @@ -393,7 +409,7 @@ var gridFn = { // 행번호 재정렬 var ids = grid.jqGrid('getDataIDs'); for(var i = 0; i < ids.length; i++){ - grid.jqGrid('setCell', ids[i], 'ROW_NUM', i+2); + grid.jqGrid('setCell', ids[i], 'ROW_NUM', i+1); } gridFn.footerSummary(); } @@ -445,7 +461,7 @@ var gridFn = { } }); - $("#TOTAL_SUPPLY_PRICE").val(numberWithCommas(totalSupplyPrice)); + $("#TOTAL_SUPPLY_PRICE").val(numberWithCommasDecimal(totalSupplyPrice)); $("#TOTAL_AMOUNT_DISPLAY").text(numberWithCommasDecimal(totalSupplyPrice) + " 원"); } } diff --git a/src/com/pms/salesmgmt/mapper/contractMgmt.xml b/src/com/pms/salesmgmt/mapper/contractMgmt.xml index 00538c3..ced9410 100644 --- a/src/com/pms/salesmgmt/mapper/contractMgmt.xml +++ b/src/com/pms/salesmgmt/mapper/contractMgmt.xml @@ -578,7 +578,14 @@ ,(SELECT objid FROM ESTIMATE_TEMPLATE WHERE CONTRACT_OBJID = T.OBJID order by regdate desc limit 1) AS EST_OBJID -- 최근 차수 견적서 합계 정보 ,(SELECT TOTAL_AMOUNT FROM ESTIMATE_TEMPLATE WHERE CONTRACT_OBJID = T.OBJID ORDER BY REGDATE DESC LIMIT 1) AS EST_TOTAL_AMOUNT - ,(SELECT TOTAL_AMOUNT_KRW FROM ESTIMATE_TEMPLATE WHERE CONTRACT_OBJID = T.OBJID ORDER BY REGDATE DESC LIMIT 1) AS EST_TOTAL_AMOUNT_KRW + ,CASE + WHEN T.EXCHANGE_RATE IS NOT NULL AND T.EXCHANGE_RATE != '' AND CAST(T.EXCHANGE_RATE AS NUMERIC) != 0 + THEN ROUND( + CAST(COALESCE((SELECT TOTAL_AMOUNT FROM ESTIMATE_TEMPLATE WHERE CONTRACT_OBJID = T.OBJID ORDER BY REGDATE DESC LIMIT 1), '0') AS NUMERIC) + * CAST(T.EXCHANGE_RATE AS NUMERIC), 2 + ) + ELSE CAST(COALESCE((SELECT TOTAL_AMOUNT_KRW FROM ESTIMATE_TEMPLATE WHERE CONTRACT_OBJID = T.OBJID ORDER BY REGDATE DESC LIMIT 1), '0') AS NUMERIC) + END AS EST_TOTAL_AMOUNT_KRW -- 견적수량 (ESTIMATE_TEMPLATE_ITEM의 수량 합계) ,(SELECT COALESCE(SUM(CAST(QUANTITY AS NUMERIC)), 0) FROM ESTIMATE_TEMPLATE_ITEM WHERE TEMPLATE_OBJID = (SELECT objid FROM ESTIMATE_TEMPLATE WHERE CONTRACT_OBJID = T.OBJID ORDER BY REGDATE DESC LIMIT 1)) AS ESTIMATE_QUANTITY -- 수주 합계 정보 (CONTRACT_MGMT 테이블에 저장된 값 사용) -- 2.49.1 From 2fbb9f66d2b6e9a170bd623f93d1c801fd84edf5 Mon Sep 17 00:00:00 2001 From: hjjeong Date: Tue, 10 Mar 2026 17:58:35 +0900 Subject: [PATCH 3/4] =?UTF-8?q?[=ED=96=89=EC=9C=84]=20ERP=20=EC=A0=84?= =?UTF-8?q?=EC=86=A1=20=EC=8B=9C=20=EC=9E=AC=EA=B3=A0=EB=8B=A8=EC=9C=84/?= =?UTF-8?q?=EA=B4=80=EB=A6=AC=EB=8B=A8=EC=9C=84=20code=5Fname=20=EB=B3=80?= =?UTF-8?q?=ED=99=98=20=EB=B0=8F=20=ED=95=98=EB=93=9C=EC=BD=94=EB=94=A9=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - partMng.xml: selectPartByObjid, selectAllPartListForErp에 COMM_CODE JOIN 추가하여 UNIT_DC_NM, UNITMANG_DC_NM 반환 - partMng.xml: partMngBaseSimple에 ODRFG_NM CASE WHEN 변환 추가 (구매/생산/Phantom), LOT_FG 등 NULL일 때 빈값 처리 - BatchService: sendAllPartsToErp, sendSinglePartToErp에서 unit_dc_nm, unitmang_dc_nm 사용 - BatchService: updatePartToErp, updateAllPartsToErp 하드코딩 제거 → DB 값 사용 + 필수값 검증 추가 - BatchService: deletePartFromErp 주석 해제 - BatchService: sendSinglePartToErp에 전송 데이터 및 응답 로그 추가 Made-with: Cursor --- src/com/pms/mapper/partMng.xml | 78 +++++++++++--------- src/com/pms/service/BatchService.java | 101 +++++++++++++++++--------- 2 files changed, 110 insertions(+), 69 deletions(-) diff --git a/src/com/pms/mapper/partMng.xml b/src/com/pms/mapper/partMng.xml index 3bf462b..c389df4 100644 --- a/src/com/pms/mapper/partMng.xml +++ b/src/com/pms/mapper/partMng.xml @@ -8368,46 +8368,54 @@ SELECT PM.OBJID \ No newline at end of file diff --git a/src/com/pms/service/BatchService.java b/src/com/pms/service/BatchService.java index 8c49553..778f20a 100644 --- a/src/com/pms/service/BatchService.java +++ b/src/com/pms/service/BatchService.java @@ -1508,9 +1508,9 @@ public class BatchService extends BaseService { // 회사코드 고정값 String coCd = "1000"; - // DB에서 가져온 ERP 연동 필드 - String unitDc = CommonUtils.checkNull(part.get("unit_dc")); - String unitmangDc = CommonUtils.checkNull(part.get("unitmang_dc")); + // DB에서 가져온 ERP 연동 필드 (code_name으로 변환된 값 사용) + String unitDc = CommonUtils.checkNull(part.get("unit_dc_nm")); + String unitmangDc = CommonUtils.checkNull(part.get("unitmang_dc_nm")); String unitchngNbStr = CommonUtils.checkNull(part.get("unitchng_nb")); int unitchngNb = 0; try { @@ -1540,7 +1540,7 @@ public class BatchService extends BaseService { } // ERP로 전송 - String response = partErpClient.sendPartToErp(baseUrl, coCd, itemCd, itemNm,itemDc, + String response = partErpClient.sendPartToErp(baseUrl, coCd, itemCd, itemNm, itemDc, acctFg, odrFg, unitDc, unitmangDc, unitchngNb, lotFg, qcFg, reqFg, setitemFg, useYn); // 응답 확인 @@ -1616,9 +1616,9 @@ public class BatchService extends BaseService { // 회사코드 고정값 String coCd = "1000"; - // DB에서 가져온 ERP 연동 필드 - String unitDc = CommonUtils.checkNull(part.get("unit_dc")); - String unitmangDc = CommonUtils.checkNull(part.get("unitmang_dc")); + // DB에서 가져온 ERP 연동 필드 (code_name으로 변환된 값 사용) + String unitDc = CommonUtils.checkNull(part.get("unit_dc_nm")); + String unitmangDc = CommonUtils.checkNull(part.get("unitmang_dc_nm")); String unitchngNbStr = CommonUtils.checkNull(part.get("unitchng_nb")); int unitchngNb = 0; try { @@ -1804,31 +1804,54 @@ public class BatchService extends BaseService { return result; } - // DB에서 가져온 값 + // DB에서 가져온 값 String itemCd = CommonUtils.checkNull(part.get("part_no")); String itemNm = CommonUtils.checkNull(part.get("part_name")); String acctFg = CommonUtils.checkNull(part.get("acctfg")); String odrFg = CommonUtils.checkNull(part.get("odrfg")); String itemDc = CommonUtils.checkNull(part.get("spec")); - - // 하드코딩 고정값 - String coCd = "1000"; // 회사코드 - String unitDc = "1"; // 단위 - String unitmangDc = "1"; // 단위관리 - int unitchngNb = 1; // 단위변환 - String lotFg = "0"; // LOT구분 - String qcFg = "0"; // 검사구분 - String reqFg = "0"; // 청구구분 - String setitemFg = "0"; // 세트품목구분 - String useYn = "1"; // 사용여부 - + + String coCd = "1000"; + // DB에서 가져온 ERP 연동 필드 (code_name으로 변환된 값 사용) + String unitDc = CommonUtils.checkNull(part.get("unit_dc_nm")); + String unitmangDc = CommonUtils.checkNull(part.get("unitmang_dc_nm")); + String unitchngNbStr = CommonUtils.checkNull(part.get("unitchng_nb")); + int unitchngNb = 0; + try { + if (!unitchngNbStr.isEmpty()) { + unitchngNb = (int) Double.parseDouble(unitchngNbStr); + } + } catch (Exception e) { + // 변환 실패 시 0 유지 + } + String lotFg = CommonUtils.checkNull(part.get("lot_fg")); + String qcFg = CommonUtils.checkNull(part.get("qc_fg")); + String reqFg = CommonUtils.checkNull(part.get("req_fg")); + String setitemFg = CommonUtils.checkNull(part.get("setitem_fg")); + String useYn = CommonUtils.checkNull(part.get("use_yn")); + // 필수값 체크 if (itemCd.isEmpty() || itemNm.isEmpty()) { result.put("success", false); result.put("message", "품번 또는 품명이 없습니다."); return result; } - + if (acctFg.isEmpty() || odrFg.isEmpty()) { + result.put("success", false); + result.put("message", "계정구분 또는 조달구분이 없습니다."); + return result; + } + if (unitDc.isEmpty() || unitmangDc.isEmpty() || unitchngNb == 0) { + result.put("success", false); + result.put("message", "재고단위, 관리단위, 환산수량이 없습니다."); + return result; + } + if (lotFg.isEmpty() || qcFg.isEmpty() || reqFg.isEmpty() || setitemFg.isEmpty() || useYn.isEmpty()) { + result.put("success", false); + result.put("message", "LOT구분, 검사여부, 의뢰여부, SET품여부, 사용여부가 없습니다."); + return result; + } + // ERP로 수정 전송 PartErpUpdateApiClient updateClient = new PartErpUpdateApiClient(); String response = updateClient.updatePartToErp(baseUrl, coCd, itemCd, itemNm, itemDc, @@ -1887,16 +1910,7 @@ public class BatchService extends BaseService { int failCount = 0; StringBuilder errorMessages = new StringBuilder(); - // 하드코딩 고정값 - String coCd = "1000"; - String unitDc = "1"; - String unitmangDc = "1"; - int unitchngNb = 1; - String lotFg = "0"; - String qcFg = "0"; - String reqFg = "0"; - String setitemFg = "0"; - String useYn = "1"; + String coCd = "1000"; PartErpUpdateApiClient updateClient = new PartErpUpdateApiClient(); @@ -1910,6 +1924,23 @@ public class BatchService extends BaseService { String acctFg = CommonUtils.checkNull(part.get("acctfg")); String odrFg = CommonUtils.checkNull(part.get("odrfg")); String itemDc = CommonUtils.checkNull(part.get("spec")); + // DB에서 가져온 ERP 연동 필드 (code_name으로 변환된 값 사용) + String unitDc = CommonUtils.checkNull(part.get("unit_dc_nm")); + String unitmangDc = CommonUtils.checkNull(part.get("unitmang_dc_nm")); + String unitchngNbStr = CommonUtils.checkNull(part.get("unitchng_nb")); + int unitchngNb = 0; + try { + if (!unitchngNbStr.isEmpty()) { + unitchngNb = (int) Double.parseDouble(unitchngNbStr); + } + } catch (Exception ex) { + // 변환 실패 시 0 유지 + } + String lotFg = CommonUtils.checkNull(part.get("lot_fg")); + String qcFg = CommonUtils.checkNull(part.get("qc_fg")); + String reqFg = CommonUtils.checkNull(part.get("req_fg")); + String setitemFg = CommonUtils.checkNull(part.get("setitem_fg")); + String useYn = CommonUtils.checkNull(part.get("use_yn")); // 100건마다 진행 상황 출력 if ((i + 1) % 100 == 0) { @@ -1917,14 +1948,16 @@ public class BatchService extends BaseService { } // 필수값 체크 - if (itemCd.isEmpty() || itemNm.isEmpty()) { + if (itemCd.isEmpty() || itemNm.isEmpty() || acctFg.isEmpty() || odrFg.isEmpty() || + unitDc.isEmpty() || unitmangDc.isEmpty() || unitchngNb == 0 || + lotFg.isEmpty() || qcFg.isEmpty() || reqFg.isEmpty() || setitemFg.isEmpty() || useYn.isEmpty()) { failCount++; if (failCount <= 5) { - errorMessages.append(itemCd).append(": 품번 또는 품명이 없습니다.\n"); + errorMessages.append(itemCd).append(": 필수값이 없습니다.\n"); } continue; } - + // ERP로 수정 전송 String response = updateClient.updatePartToErp(baseUrl, coCd, itemCd, itemNm, itemDc, acctFg, odrFg, unitDc, unitmangDc, unitchngNb, lotFg, qcFg, reqFg, setitemFg, useYn); -- 2.49.1 From 457bd85597cda51f2fd3e1ad83be354dc624c28a Mon Sep 17 00:00:00 2001 From: hjjeong Date: Tue, 10 Mar 2026 17:59:14 +0900 Subject: [PATCH 4/4] =?UTF-8?q?=ED=8C=8C=ED=8A=B8=20=EB=8B=A8=EC=9C=84=20?= =?UTF-8?q?=EC=BB=AC=EB=9F=BC=20=EB=B3=80=EA=B2=BD=20=EB=93=B1..?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../deliveryMngAcceptancePartList.jsp | 31 +++++++++++++++++++ src/com/pms/mapper/purchaseOrder.xml | 23 +++++++++++++- src/com/pms/mapper/salesMng.xml | 4 +-- 3 files changed, 55 insertions(+), 3 deletions(-) diff --git a/WebContent/WEB-INF/view/purchaseOrder/deliveryMngAcceptancePartList.jsp b/WebContent/WEB-INF/view/purchaseOrder/deliveryMngAcceptancePartList.jsp index 3542401..1234f82 100644 --- a/WebContent/WEB-INF/view/purchaseOrder/deliveryMngAcceptancePartList.jsp +++ b/WebContent/WEB-INF/view/purchaseOrder/deliveryMngAcceptancePartList.jsp @@ -50,6 +50,29 @@ $(document).ready(function(){ // 품번/품명 Select2 AJAX 초기화 initPartSelect2Ajax("#SEARCH_PART_NO", "#SEARCH_PART_NAME", "#SEARCH_PART_OBJID"); + // 부품품번 Select2 AJAX 초기화 (단독) + $("#SEARCH_COMPONENT_PART_NO").select2({ + placeholder: "부품품번 검색...", + allowClear: true, + width: '100%', + minimumInputLength: 1, + language: { inputTooShort: function(){ return "1글자 이상 입력하세요"; }, searching: function(){ return "검색 중..."; }, noResults: function(){ return "검색 결과가 없습니다"; } }, + ajax: { + url: '/contractMgmt/searchPartList.do', + dataType: 'json', type: 'POST', + contentType: 'application/x-www-form-urlencoded; charset=UTF-8', + delay: 250, + data: function(params){ return { searchTerm: params.term, searchType: 'partNo' }; }, + processResults: function(data){ + return { results: $.map(data, function(item){ + var partNo = item.PART_NO || item.part_no || ''; + return { id: partNo, text: partNo }; + })}; + }, + cache: true + } + }); + $("input").keyup(function(e){ if(e.keyCode == 13){ $("#page").val("1"); @@ -407,6 +430,14 @@ function fn_purchaseClose(){ + + + +
+ +
diff --git a/src/com/pms/mapper/purchaseOrder.xml b/src/com/pms/mapper/purchaseOrder.xml index 6fd3ff4..6abceba 100644 --- a/src/com/pms/mapper/purchaseOrder.xml +++ b/src/com/pms/mapper/purchaseOrder.xml @@ -887,7 +887,7 @@ PM.PART_NO, PM.PART_NAME, PM.SPEC, - COALESCE(NULLIF(SRP.UNIT, ''), PM.UNIT) AS UNIT, + COALESCE(NULLIF(SRP.UNIT, ''), PM.UNIT_DC) AS UNIT, PM.MAKER, (SELECT PJ.PART_NAME FROM PROJECT_MGMT PJ WHERE PJ.OBJID::VARCHAR = SRM.PROJECT_NO) AS PROJECT_PRODUCT_NAME, CASE WHEN COALESCE(SRP.MATERIAL_YN, 'N') = 'Y' AND SRM.MBOM_HEADER_OBJID IS NOT NULL THEN @@ -6411,6 +6411,27 @@ FROM( AND TRIM(UPPER(POP.SPEC)) LIKE '%'||TRIM(UPPER(#{SEARCH_PART_SPEC}))||'%' + + AND TRIM(UPPER( + COALESCE( + (SELECT + CASE WHEN COALESCE(SRP3.MATERIAL_YN, 'N') = 'Y' AND SRM3.MBOM_HEADER_OBJID IS NOT NULL THEN + (SELECT MIN(PM3.PART_NO) FROM MBOM_DETAIL MD3 + JOIN PART_MNG PM3 ON MD3.PART_OBJID::VARCHAR = PM3.OBJID::VARCHAR + WHERE MD3.RAW_MATERIAL_PART_NO = POP.PART_NO + AND MD3.MBOM_HEADER_OBJID::VARCHAR = SRM3.MBOM_HEADER_OBJID::VARCHAR) + ELSE POP.PART_NO + END + FROM SALES_REQUEST_PART SRP3 + JOIN SALES_REQUEST_MASTER SRM3 ON SRP3.SALES_REQUEST_MASTER_OBJID = SRM3.OBJID + WHERE SRM3.OBJID::VARCHAR = POM.SALES_REQUEST_OBJID + AND SRP3.PART_OBJID = POP.PART_OBJID + LIMIT 1 + ), + POP.PART_NO + ) + )) LIKE '%'||TRIM(UPPER(#{SEARCH_COMPONENT_PART_NO}))||'%' + ORDER BY POM.REGDATE DESC, POP.OBJID diff --git a/src/com/pms/mapper/salesMng.xml b/src/com/pms/mapper/salesMng.xml index 78605ab..df61bee 100644 --- a/src/com/pms/mapper/salesMng.xml +++ b/src/com/pms/mapper/salesMng.xml @@ -5007,10 +5007,10 @@ ORDER BY V.PATH2 PM.PART_NAME, PM.SPEC, PM.MATERIAL, - COALESCE(NULLIF(SRP.UNIT, ''), PM.UNIT) AS UNIT, + COALESCE(NULLIF(SRP.UNIT, ''), PM.UNIT_DC) AS UNIT, COALESCE( (SELECT CODE_NAME FROM COMM_CODE CC WHERE CC.CODE_ID = NULLIF(SRP.UNIT, '')), - (SELECT CODE_NAME FROM COMM_CODE CC WHERE CC.CODE_ID = PM.UNIT) + (SELECT CODE_NAME FROM COMM_CODE CC WHERE CC.CODE_ID = PM.UNIT_DC) ) AS UNIT_TITLE, SRP.QTY, COALESCE(SRP.UNIT_PRICE, 0) AS UNIT_PRICE, -- 2.49.1