From 8d9b1e94abdd53079a9d636a82b6c2bb33eb3c0d Mon Sep 17 00:00:00 2001 From: hjjeong Date: Mon, 9 Mar 2026 18:17:19 +0900 Subject: [PATCH 1/5] =?UTF-8?q?=ED=8C=90=EB=A7=A4=EA=B4=80=EB=A6=AC=20?= =?UTF-8?q?=EA=B1=B0=EB=9E=98=EB=AA=85=EC=84=B8=EC=84=9C=EC=83=9D=EC=84=B1?= =?UTF-8?q?=20=EA=B8=B0=EB=8A=A5=20=EB=A7=A4=EC=B6=9C=EA=B4=80=EB=A6=AC?= =?UTF-8?q?=EB=A1=9C=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../salesmgmt/salesMgmt/revenueMgmtList.jsp | 99 +++++++++++++++++++ .../salesmgmt/salesMgmt/salesMgmtList.jsp | 3 +- .../salesmgmt/mapper/salesNcollectMgmt.xml | 6 +- 3 files changed, 106 insertions(+), 2 deletions(-) diff --git a/WebContent/WEB-INF/view/salesmgmt/salesMgmt/revenueMgmtList.jsp b/WebContent/WEB-INF/view/salesmgmt/salesMgmt/revenueMgmtList.jsp index a291ed1..57441a3 100644 --- a/WebContent/WEB-INF/view/salesmgmt/salesMgmt/revenueMgmtList.jsp +++ b/WebContent/WEB-INF/view/salesmgmt/salesMgmt/revenueMgmtList.jsp @@ -322,8 +322,83 @@ }); }); + // 거래명세서 생성 버튼 + $("#btnTransactionStatement").click(function(){ + fn_printTransactionStatement(); + }); + fn_search(); }); + +// 거래명세서 생성 함수 +function fn_printTransactionStatement() { + var selectedData = _tabulGrid.getSelectedData(); + + if(selectedData.length === 0) { + alert("거래명세서를 출력할 항목을 선택해주세요."); + return; + } + + // 같은 거래처인지 확인 + var firstCustomer = selectedData[0].CUSTOMER; + for(var i = 1; i < selectedData.length; i++) { + if(selectedData[i].CUSTOMER !== firstCustomer) { + alert("같은 거래처만 선택 가능합니다.\n선택한 거래처: " + firstCustomer + ", " + selectedData[i].CUSTOMER); + return; + } + } + + // 이미 거래명세서가 생성된 항목이 있는지 확인 + var alreadyCreated = selectedData.filter(function(row) { + return row.HAS_TRANSACTION_STATEMENT === 'Y'; + }); + if(alreadyCreated.length > 0) { + var projectNames = alreadyCreated.map(function(row) { return row.PROJECT_NO; }).join(', '); + alert("이미 거래명세서가 생성된 항목이 있습니다.\n(" + projectNames + ")\n파란 폴더 아이콘을 클릭하여 확인해주세요."); + return; + } + + localStorage.setItem('loadSavedStatement', 'false'); + localStorage.setItem('transactionStatementData', JSON.stringify(selectedData)); + + var projectNos = selectedData.map(function(row) { return row.PROJECT_NO; }).join(','); + var projectObjids = selectedData.map(function(row) { return row.OBJID; }).join(','); + + var popup_width = 1000; + var popup_height = 800; + var url = "/salesMgmt/transactionStatementForm.do?projectNos=" + encodeURIComponent(projectNos) + + "&projectObjids=" + encodeURIComponent(projectObjids); + fn_centerPopup(popup_width, popup_height, url); +} + +// 거래명세서 팝업 열기 (단일 프로젝트 - 아이콘 클릭) +function fn_openTransactionStatementPopup(projectNo, projectObjid, hasStatement) { + if(!projectNo) { alert("프로젝트 번호가 없습니다."); return; } + if(!hasStatement) { return; } + + var allData = _tabulGrid.getData(); + var projectData = allData.filter(function(row) { return row.PROJECT_NO === projectNo; }); + if(projectData.length === 0) { alert("프로젝트 데이터를 찾을 수 없습니다."); return; } + + localStorage.setItem('transactionStatementData', JSON.stringify(projectData)); + localStorage.setItem('loadSavedStatement', 'true'); + + var url = "/salesMgmt/transactionStatementForm.do?projectNos=" + encodeURIComponent(projectNo) + + "&projectObjids=" + encodeURIComponent(projectObjid); + var popup_width = 900; + var popup_height = 800; + var left = (screen.width - popup_width) / 2; + var top = (screen.height - popup_height) / 2; + + var popup = window.open(url, "transactionStatement", "width=" + popup_width + ",height=" + popup_height + ",left=" + left + ",top=" + top + ",scrollbars=yes,resizable=yes"); + var checkPopup = setInterval(function() { + if(popup.closed) { + clearInterval(checkPopup); + fn_search(); + } + }, 500); +} + - - + + - 등록된 품목이 없습니다. + 등록된 품목이 없습니다. @@ -864,6 +865,9 @@ function fn_save(){       +   +   +   @@ -872,14 +876,14 @@ function fn_save(){ -
+
diff --git a/src/com/pms/mapper/salesMng.xml b/src/com/pms/mapper/salesMng.xml index 45bf26c..78605ab 100644 --- a/src/com/pms/mapper/salesMng.xml +++ b/src/com/pms/mapper/salesMng.xml @@ -5007,9 +5007,9 @@ ORDER BY V.PATH2 PM.PART_NAME, PM.SPEC, PM.MATERIAL, - COALESCE(SRP.UNIT, PM.UNIT) AS UNIT, + COALESCE(NULLIF(SRP.UNIT, ''), PM.UNIT) AS UNIT, COALESCE( - (SELECT CODE_NAME FROM COMM_CODE CC WHERE CC.CODE_ID = SRP.UNIT), + (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) ) AS UNIT_TITLE, SRP.QTY, @@ -5021,11 +5021,57 @@ ORDER BY V.PATH2 SRP.VENDOR_PM, (SELECT CLIENT_NM FROM CLIENT_MNG WHERE OBJID::VARCHAR = SRP.VENDOR_PM) AS VENDOR_NAME, SRP.REMARK, - SRP.DELIVERY_REQUEST_DATE, - SRP.DELIVERY_REQUEST_DATE AS DELIVERY_REQUEST_DATE_TITLE + /* 입고요청일: SRP에 값 있으면 우선, 없으면 MBOM_DETAIL에서 조회 */ + COALESCE(SRP.DELIVERY_REQUEST_DATE, + CASE WHEN SRM.MBOM_HEADER_OBJID IS NOT NULL THEN + CASE WHEN COALESCE(SRP.MATERIAL_YN, 'N') = 'Y' THEN + (SELECT MIN(MD3.DELIVERY_REQUEST_DATE) FROM MBOM_DETAIL MD3 + WHERE MD3.RAW_MATERIAL_PART_NO = PM.PART_NO + AND MD3.MBOM_HEADER_OBJID::VARCHAR = SRM.MBOM_HEADER_OBJID::VARCHAR) + ELSE + (SELECT MIN(MD3.DELIVERY_REQUEST_DATE) FROM MBOM_DETAIL MD3 + WHERE MD3.PART_OBJID::VARCHAR = SRP.PART_OBJID::VARCHAR + AND MD3.MBOM_HEADER_OBJID::VARCHAR = SRM.MBOM_HEADER_OBJID::VARCHAR) + END + ELSE NULL + END + ) AS DELIVERY_REQUEST_DATE, + COALESCE(SRP.DELIVERY_REQUEST_DATE, + CASE WHEN SRM.MBOM_HEADER_OBJID IS NOT NULL THEN + CASE WHEN COALESCE(SRP.MATERIAL_YN, 'N') = 'Y' THEN + (SELECT MIN(MD3.DELIVERY_REQUEST_DATE) FROM MBOM_DETAIL MD3 + WHERE MD3.RAW_MATERIAL_PART_NO = PM.PART_NO + AND MD3.MBOM_HEADER_OBJID::VARCHAR = SRM.MBOM_HEADER_OBJID::VARCHAR) + ELSE + (SELECT MIN(MD3.DELIVERY_REQUEST_DATE) FROM MBOM_DETAIL MD3 + WHERE MD3.PART_OBJID::VARCHAR = SRP.PART_OBJID::VARCHAR + AND MD3.MBOM_HEADER_OBJID::VARCHAR = SRM.MBOM_HEADER_OBJID::VARCHAR) + END + ELSE NULL + END + ) AS DELIVERY_REQUEST_DATE_TITLE, + COALESCE(SRP.MATERIAL_YN, 'N') AS MATERIAL_YN, + /* 제품명: 프로젝트 품명 */ + (SELECT PJ.PART_NAME FROM PROJECT_MGMT PJ WHERE PJ.OBJID::VARCHAR = SRM.PROJECT_NO) AS PROJECT_PRODUCT_NAME, + /* 부품명: 소재이면 MBOM에서 원래 부품명 조회, 아니면 PM.PART_NAME */ + CASE WHEN COALESCE(SRP.MATERIAL_YN, 'N') = 'Y' AND SRM.MBOM_HEADER_OBJID IS NOT NULL THEN + COALESCE( + (SELECT MIN(PM2.PART_NAME) FROM MBOM_DETAIL MD2 + JOIN PART_MNG PM2 ON MD2.PART_OBJID::VARCHAR = PM2.OBJID::VARCHAR + WHERE MD2.RAW_MATERIAL_PART_NO = PM.PART_NO + AND MD2.MBOM_HEADER_OBJID::VARCHAR = SRM.MBOM_HEADER_OBJID::VARCHAR), + PM.PART_NAME + ) + ELSE PM.PART_NAME + END AS COMPONENT_PART_NAME, + /* 품명: 소재있으면 소재품명(현재 PM), 없으면 부품명(현재 PM) */ + PM.PART_NAME AS DISPLAY_PART_NAME, + /* 규격: 품명의 규격 */ + PM.SPEC AS DISPLAY_SPEC FROM SALES_REQUEST_PART SRP LEFT JOIN PART_MNG PM ON SRP.PART_OBJID::VARCHAR = PM.OBJID::VARCHAR + LEFT JOIN SALES_REQUEST_MASTER SRM ON SRP.SALES_REQUEST_MASTER_OBJID = SRM.OBJID WHERE SRP.SALES_REQUEST_MASTER_OBJID = #{PROPOSAL_OBJID} ORDER BY SRP.REGDATE @@ -5036,7 +5082,12 @@ ORDER BY V.PATH2 UPDATE SALES_REQUEST_MASTER SET RECIPIENT_REF = #{RECIPIENT_REF}, EXECUTOR = #{EXECUTOR}, - EXECUTION_DATE = CASE WHEN #{EXECUTION_DATE} IS NOT NULL AND #{EXECUTION_DATE} != '' THEN #{EXECUTION_DATE}::DATE ELSE NULL END, + + EXECUTION_DATE = #{EXECUTION_DATE}::DATE, + + + EXECUTION_DATE = NULL, + TITLE = #{TITLE} WHERE OBJID = #{PROPOSAL_OBJID} From 98864c6079000eef56efc58e16fc9d5cc203ccd7 Mon Sep 17 00:00:00 2001 From: hjjeong Date: Tue, 10 Mar 2026 11:46:19 +0900 Subject: [PATCH 3/5] =?UTF-8?q?=EC=99=B8=EC=A3=BC=EA=B0=80=EA=B3=B5?= =?UTF-8?q?=EB=B0=9C=EC=A3=BC=EC=84=9C=20=EC=96=91=EC=8B=9D=EB=B3=80?= =?UTF-8?q?=EA=B2=BD=20=EB=B0=8F=20=ED=92=88=EC=9D=98=EC=84=9C=20=EC=A0=95?= =?UTF-8?q?=EB=B3=B4=20=EA=B0=80=EC=A0=B8=EC=98=A4=EB=8F=84=EB=A1=9D=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 --- .../purchaseOrderFormPopup_outsourcing.jsp | 101 ++++-------------- .../controller/PurchaseOrderController.java | 4 + src/com/pms/mapper/purchaseOrder.xml | 20 +++- src/com/pms/service/PurchaseOrderService.java | 3 + 4 files changed, 47 insertions(+), 81 deletions(-) diff --git a/WebContent/WEB-INF/view/purchaseOrder/purchaseOrderFormPopup_outsourcing.jsp b/WebContent/WEB-INF/view/purchaseOrder/purchaseOrderFormPopup_outsourcing.jsp index 39b8a06..1b5e71d 100644 --- a/WebContent/WEB-INF/view/purchaseOrder/purchaseOrderFormPopup_outsourcing.jsp +++ b/WebContent/WEB-INF/view/purchaseOrder/purchaseOrderFormPopup_outsourcing.jsp @@ -65,23 +65,6 @@ font-size: 28px; font-weight: bold; } -.approval-box { - border: 1px solid #333; - width: 200px; -} -.approval-box table { - width: 100%; - border-collapse: collapse; -} -.approval-box th, .approval-box td { - border: 1px solid #333; - text-align: center; - padding: 5px; - font-size: 12px; -} -.approval-box th { - background-color: #f0f0f0; -} .po-info-table { width: 100%; border-collapse: collapse; @@ -95,7 +78,8 @@ .po-info-table .label { /* background-color: #f5f5f5; */ font-weight: bold; - width: 20%; + width: 35%; + white-space: nowrap; } .po-manager-box { border: 1px solid #333; @@ -215,9 +199,6 @@ $(document).ready(function(){ $("#display_email2").text(email); }); - // 결재라인 가져오기 - fn_getApprLine(); - var unit_cd = $.parseJSON($("#unit_cd").val()); // 그리드 초기화 - 외주가공 발주서용 컬럼 @@ -225,15 +206,15 @@ $(document).ready(function(){ url: "" ,datatype: "local" ,data: $.parseJSON($("#gridDetailList").val()) - ,colNames: ["OBJID","PART_OBJID","No","발주번호","업체명","제품명","부품명","수량","단위","단가","합계","작업지시번호","부품품번","납기요청"] + ,colNames: ["OBJID","PART_OBJID","No","업체명","제품명","부품명","수량","단위","단가","합계","작업지시번호","부품품번","입고요청일"] ,colModel: [ {name:"OBJID" , hidden: true, sortable:false, editable:false} ,{name:"PART_OBJID" , hidden: true, sortable:false, editable:false} ,{name:"ROW_NUM" , width:35, align:"center", sortable:false, editable:false} - ,{name:"PURCHASE_ORDER_NO" , width:110, align:"center", sortable:false, editable:false} - ,{name:"PARTNER_NAME" , width:80, align:"center", sortable:false, editable:false} + //,{name:"PURCHASE_ORDER_NO" , width:110, align:"center", sortable:false, editable:false} + ,{name:"PARTNER_NAME" , width:130, align:"left", sortable:false, editable:false} ,{name:"PRODUCT_NAME" , width:160, align:"left", sortable:false, editable:<%= isModify %>} - ,{name:"PART_NAME" , width:80, align:"center", sortable:false, editable:false} + ,{name:"PART_NAME" , width:140, align:"left", sortable:false, editable:false} ,{name:"ORDER_QTY" , width:50, align:"right", sortable:false, editable:<%= isModify %> ,formatter:"integer", formatoptions:{thousandsSeparator:","} ,editoptions:{ @@ -246,14 +227,14 @@ $(document).ready(function(){ ,editoptions:{ value: unit_cd } } ,{name:"PARTNER_PRICE" , width:80, align:"right", sortable:false, editable:<%= isModify %> - ,formatter:"integer", formatoptions:{thousandsSeparator:","} + ,formatter:"number", formatoptions:{thousandsSeparator:",", decimalPlaces:2} ,editoptions:{ dataInit: function(e){ e.style.textAlign = "right"; } ,dataEvents: [{type:"change", fn:function(e){ gridFn.calcRowAll(e); }}] } } ,{name:"SUPPLY_UNIT_PRICE" , width:90, align:"right", sortable:false, editable:false - ,formatter:"integer", formatoptions:{thousandsSeparator:","} + ,formatter:"number", formatoptions:{thousandsSeparator:",", decimalPlaces:2} } ,{name:"WORK_ORDER_NO" , width:100, align:"center", sortable:false, editable:<%= isModify %>} ,{name:"PART_NO" , width:90, align:"center", sortable:false, editable:false} @@ -306,17 +287,6 @@ $(document).ready(function(){ $("#btnAdd").click(function(){ fn_openPartMngListPopUp(); }); $("#btnDel").click(function(){ gridFn.delRow(); }); $("#btnSave").click(function(){ fn_save(); }); - $("#btnAppr").click(function(){ - if(fnc_valitate("form1")){ - var objId = "${objId}"; - if(""==grid.getRowData()){ - Swal.fire('저장할 품목이 존재 하지 않습니다'); - return; - } - var title = encodeURIComponent("외주가공 발주서"); - window.open("/approval/registApproval.do?targetType=PURCHASE_ORDER_OUTSOURCING&targetObjId="+objId+"&approvalTitle="+title,"registApproval","width=700,height=700"); - } - }); <% }else{ %> $("#btnDown").click(function(){ document.form1.action = "/purchaseOrder/purchaseOrderFormPopup_outsourcing.do?actType=DOWN&PURCHASE_ORDER_MASTER_OBJID=${objId}"; @@ -331,29 +301,6 @@ $(document).ready(function(){ gridFn.footerSummary(); }); -// 결재라인 가져오기 -function fn_getApprLine(){ - if('${objId}'!=''){ - $.ajax({ - url:"/common/getApprovalLine.do", - type:"POST", - data:{"objId":"${objId}"}, - dataType:"json", - async:false, - success:function(data){ - $.each(data.RESULT, function(i,o){ - if(i==0){ - $("#appr_writer").html(o.WRITER); - } - if(i < 3){ - $("#appr"+(i+1)).html(o.TARGET_USER_NAME +"
"+ (o.PROC_DATE!=undefined?o.PROC_DATE:"")); - } - }); - } - }); - } -} - // 행추가 팝업 function fn_openPartMngListPopUp(){ var url = "/partMng/partMngListPopUp.do?callbackFnc=fn_addRow&callType=purchaseOrder"; @@ -499,9 +446,15 @@ var gridFn = { }); $("#TOTAL_SUPPLY_PRICE").val(numberWithCommas(totalSupplyPrice)); + $("#TOTAL_AMOUNT_DISPLAY").text(numberWithCommasDecimal(totalSupplyPrice) + " 원"); } } +function numberWithCommasDecimal(num) { + var n = Number(num); + return n.toFixed(2).replace(/\B(?=(\d{3})+(?!\d))/g, ","); +} + // 라이브러리 로드 완료 후 dataLoaded 플래그 설정 $(window).on('load', function() { setTimeout(function() { @@ -718,20 +671,6 @@ function fn_generateAndUploadPdf(callback) {
㈜ 알피에스
외주가공 발주서
-
- - - - - - - - - - - -
담당자부사장대표이사
${info.MANAGER_NAME}전 결
-
@@ -757,6 +696,10 @@ function fn_generateAndUploadPdf(callback) { + + 4. 합계금액(VAT별도) : + + @@ -767,7 +710,7 @@ function fn_generateAndUploadPdf(callback) { 담 당 자 <% if(isModify){ %> - <% for(int u=0; u <% if(isModify){ %> - <% for(int u=0; u -
[아래 상세내역 리스트 확인]
+
@@ -867,7 +810,7 @@ function fn_generateAndUploadPdf(callback) {
- +
총 공 급 가 액총 공 급 가 액 (VAT별도)
diff --git a/src/com/pms/controller/PurchaseOrderController.java b/src/com/pms/controller/PurchaseOrderController.java index ed7cf1c..4692ba8 100644 --- a/src/com/pms/controller/PurchaseOrderController.java +++ b/src/com/pms/controller/PurchaseOrderController.java @@ -911,6 +911,10 @@ public class PurchaseOrderController { if("".equals(vendorName)) vendorName = CommonUtils.checkNull(partRow.get("vendor_name")); detailRow.put("VENDOR_NAME", vendorName); + String productName = CommonUtils.checkNull(partRow.get("PROJECT_PRODUCT_NAME")); + if("".equals(productName)) productName = CommonUtils.checkNull(partRow.get("project_product_name")); + detailRow.put("PRODUCT_NAME", productName); + String partName = CommonUtils.checkNull(partRow.get("PART_NAME")); if("".equals(partName)) partName = CommonUtils.checkNull(partRow.get("part_name")); detailRow.put("PART_NAME", partName); diff --git a/src/com/pms/mapper/purchaseOrder.xml b/src/com/pms/mapper/purchaseOrder.xml index 4575f32..5b89b49 100644 --- a/src/com/pms/mapper/purchaseOrder.xml +++ b/src/com/pms/mapper/purchaseOrder.xml @@ -887,11 +887,27 @@ PM.PART_NO, PM.PART_NAME, PM.SPEC, - PM.UNIT, - PM.MAKER + COALESCE(NULLIF(SRP.UNIT, ''), PM.UNIT) AS UNIT, + PM.MAKER, + (SELECT PJ.PART_NAME FROM PROJECT_MGMT PJ WHERE PJ.OBJID::VARCHAR = SRM.PROJECT_NO) AS PROJECT_PRODUCT_NAME, + COALESCE(SRP.DELIVERY_REQUEST_DATE, + CASE WHEN SRM.MBOM_HEADER_OBJID IS NOT NULL THEN + CASE WHEN COALESCE(SRP.MATERIAL_YN, 'N') = 'Y' THEN + (SELECT MIN(MD3.DELIVERY_REQUEST_DATE) FROM MBOM_DETAIL MD3 + WHERE MD3.RAW_MATERIAL_PART_NO = PM.PART_NO + AND MD3.MBOM_HEADER_OBJID::VARCHAR = SRM.MBOM_HEADER_OBJID::VARCHAR) + ELSE + (SELECT MIN(MD3.DELIVERY_REQUEST_DATE) FROM MBOM_DETAIL MD3 + WHERE MD3.PART_OBJID::VARCHAR = SRP.PART_OBJID::VARCHAR + AND MD3.MBOM_HEADER_OBJID::VARCHAR = SRM.MBOM_HEADER_OBJID::VARCHAR) + END + ELSE NULL + END + ) AS DELIVERY_REQUEST_DATE FROM SALES_REQUEST_PART SRP LEFT JOIN PART_MNG PM ON PM.OBJID::VARCHAR = SRP.PART_OBJID + LEFT JOIN SALES_REQUEST_MASTER SRM ON SRP.SALES_REQUEST_MASTER_OBJID = SRM.OBJID WHERE SRP.SALES_REQUEST_MASTER_OBJID = #{SALES_REQUEST_OBJID} AND SRP.VENDOR_PM = #{PARTNER_OBJID} diff --git a/src/com/pms/service/PurchaseOrderService.java b/src/com/pms/service/PurchaseOrderService.java index 1cf8743..99a1fd4 100644 --- a/src/com/pms/service/PurchaseOrderService.java +++ b/src/com/pms/service/PurchaseOrderService.java @@ -1941,6 +1941,9 @@ public class PurchaseOrderService { partParam.put("SPEC", CommonUtils.checkNull((String) partMap.get("spec"))); partParam.put("UNIT", CommonUtils.checkNull((String) partMap.get("unit"))); partParam.put("MAKER", CommonUtils.checkNull((String) partMap.get("maker"))); + partParam.put("PRODUCT_NAME", CommonUtils.checkNull(partMap.get("project_product_name"))); + Object deliveryDateObj = partMap.get("delivery_request_date"); + partParam.put("DELIVERY_REQUEST_DATE", deliveryDateObj != null ? String.valueOf(deliveryDateObj).trim() : ""); partParam.put("WRITER", writer); partParam.put("STATUS", "create"); From 4eee03ebc4df115f72e2644a251dc098419a7d9b Mon Sep 17 00:00:00 2001 From: hjjeong Date: Tue, 10 Mar 2026 13:52:05 +0900 Subject: [PATCH 4/5] =?UTF-8?q?=EC=9D=BC=EB=B0=98=EB=B0=9C=EC=A3=BC?= =?UTF-8?q?=EC=84=9C=20=EC=96=91=EC=8B=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../purchaseOrderFormPopup_general.jsp | 283 +++++++++--------- .../controller/PurchaseOrderController.java | 27 +- src/com/pms/mapper/purchaseOrder.xml | 10 + src/com/pms/service/PurchaseOrderService.java | 14 + 4 files changed, 179 insertions(+), 155 deletions(-) diff --git a/WebContent/WEB-INF/view/purchaseOrder/purchaseOrderFormPopup_general.jsp b/WebContent/WEB-INF/view/purchaseOrder/purchaseOrderFormPopup_general.jsp index 5d6c727..adc4fc0 100644 --- a/WebContent/WEB-INF/view/purchaseOrder/purchaseOrderFormPopup_general.jsp +++ b/WebContent/WEB-INF/view/purchaseOrder/purchaseOrderFormPopup_general.jsp @@ -84,25 +84,7 @@ input.date_icon { letter-spacing: 20px; border: none !important; } -/* 결재란 */ -.approval-table { - border-collapse: collapse; - float: right; -} -.approval-table th, .approval-table td { - border: 1px solid #000; - text-align: center; - padding: 3px 10px; - font-size: 11px; - width: 55px; -} -.approval-table th { - background-color: #d9d9d9; - font-weight: normal; -} -.approval-table td { - height: 35px; -} + /* 기본정보 라벨 */ .info-label { font-weight: bold; @@ -163,34 +145,6 @@ input.date_icon { overflow-y: scroll !important; max-height: 350px !important; } -/* 합계 테이블 */ -.total-table { - width: 100%; - border-collapse: collapse; - margin-top: 10px; -} -.total-table td { - border: 1px solid #000; - padding: 8px; - font-size: 12px; -} -.total-table .label { - text-align: center; - font-weight: bold; - width: 60%; - letter-spacing: 5px; - -} -.total-table .currency { - width: 30px; - text-align: center; - font-weight: bold; - border-right: none !important; -} -.total-table .amount { - text-align: right; - font-weight: bold; -} /* 버튼 영역 */ .btn-area { text-align: left; @@ -199,6 +153,54 @@ input.date_icon { .graycolor { background-color: #d9d9d9; } +.total-section { + border: 1px solid #333; + width: 50%; +} +.total-section table { + width: 100%; + border-collapse: collapse; +} +.total-section td { + padding: 10px; + border: 1px solid #333; + font-size: 14px; +} +.total-section .label { + background-color: #e2efda; + font-weight: bold; + text-align: center; + width: 40%; + white-space: nowrap; +} +.total-section .amount { + text-align: right; + font-weight: bold; +} +.confidential-notice { + padding: 10px; + font-size: 12px; + text-align: right; + color: #cb3333; +} +/* jqGrid 내 Select2 스타일 */ +.ui-jqgrid .select2-container { + z-index: 9999; +} +.ui-jqgrid .select2-container--default .select2-selection--single { + height: 24px; + min-height: 24px; + border: none; + background: transparent; +} +.ui-jqgrid .select2-container--default .select2-selection--single .select2-selection__rendered { + line-height: 24px; + padding-left: 4px; + font-size: 12px; +} +.ui-jqgrid .select2-container--default .select2-selection--single .select2-selection__arrow { + height: 24px; +} @@ -218,25 +220,23 @@ $(document).ready(function(){ $(this).val(fnc_addComma($(this).val().replace(/[^0-9]/g,""))); }); - // 결재라인 가져오기 - fn_getApprLine(); - var unit_cd = $.parseJSON($("#unit_cd").val()); + var delivery_place_grid = $.parseJSON($("#delivery_place_grid").val()); // 그리드 초기화 grid = $("#grid1").jqGrid({ url: "" ,datatype: "local" ,data: $.parseJSON($("#gridDetailList").val()) - ,colNames: ["OBJID","PART_OBJID","PART_NO","No","품명","규격","수량","단위","배송지","단가","공급가액","비고"] + ,colNames: ["OBJID","PART_OBJID","PART_NO","No","품명","규격","수량","단위","배송지","단가","공급가액","비고","입고요청일"] ,colModel: [ {name:"OBJID" , hidden: true, sortable:false, editable:false} ,{name:"PART_OBJID" , hidden: true, sortable:false, editable:false} ,{name:"PART_NO" , hidden: true, sortable:false, editable:false} ,{name:"ROW_NUM" , width:40, align:"center", sortable:false, editable:false} - ,{name:"PART_NAME" , width:170, align:"left", sortable:false, editable:false} - ,{name:"SPEC" , width:180, align:"left", sortable:false, editable:<%= isModify %>} - ,{name:"ORDER_QTY" , width:60, align:"right", sortable:false, editable:<%= isModify %> + ,{name:"PART_NAME" , width:160, align:"left", sortable:false, editable:false} + ,{name:"SPEC" , width:120, align:"left", sortable:false, editable:false} + ,{name:"ORDER_QTY" , width:50, align:"right", sortable:false, editable:<%= isModify %> ,formatter:"integer", formatoptions:{thousandsSeparator:","} ,editoptions:{ dataInit: function(e){ e.style.textAlign = "right"; } @@ -247,18 +247,38 @@ $(document).ready(function(){ ,edittype:"select", formatter:"select" ,editoptions:{ value: unit_cd } } - ,{name:"PART_DELIVERY_PLACE" , width:80, align:"center", sortable:false, editable:<%= isModify %>} - ,{name:"PARTNER_PRICE" , width:90, align:"right", sortable:false, editable:<%= isModify %> - ,formatter:"integer", formatoptions:{thousandsSeparator:","} + ,{name:"PART_DELIVERY_PLACE", width:130, align:"center", sortable:false, editable:<%= isModify %> + ,edittype:"select", formatter:"select" + ,editoptions:{ + value: delivery_place_grid + ,defaultValue: "RPS" + ,dataInit: function(elem) { + var $el = $(elem); + if(!$el.val() || $el.val() === '') { + $el.val('RPS'); + } + setTimeout(function(){ + $el.select2({ + width: '100%' + ,dropdownAutoWidth: true + ,dropdownParent: $el.closest('.ui-jqgrid') + }); + }, 50); + } + } + } + ,{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); }}] } } - ,{name:"SUPPLY_UNIT_PRICE", width:100, align:"right", sortable:false, editable:false - ,formatter:"integer", formatoptions:{thousandsSeparator:","} + ,{name:"SUPPLY_UNIT_PRICE", width:90, align:"right", sortable:false, editable:false + ,formatter:"number", formatoptions:{thousandsSeparator:",", decimalPlaces:2} } - ,{name:"REMARK" , width:120, align:"left", sortable:false, editable:<%= isModify %>} + ,{name:"REMARK" , width:100, align:"left", sortable:false, editable:<%= isModify %>} + ,{name:"DELIVERY_REQUEST_DATE", width:90, align:"center", sortable:false, editable:<%= isModify %>} ] ,rownumbers : false ,viewrecords : true @@ -346,17 +366,7 @@ $(document).ready(function(){ $("#btnAdd").click(function(){ fn_openPartMngListPopUp(); }); $("#btnDel").click(function(){ gridFn.delRow(); }); $("#btnSave").click(function(){ fn_save(); }); - $("#btnAppr").click(function(){ - if(fnc_valitate("form1")){ - var objId = "${objId}"; - if(""==grid.getRowData()){ - Swal.fire('저장할 품목이 존재 하지 않습니다'); - return; - } - var title = encodeURIComponent($("#TITLE").val()); - window.open("/approval/registApproval.do?targetType=PURCHASE_ORDER_GENERAL&targetObjId="+objId+"&approvalTitle="+title,"registApproval","width=700,height=700"); - } - }); + <% }else{ %> $("#btnDown").click(function(){ document.form1.action = "/purchaseOrder/purchaseOrderFormPopup_general.do?actType=DOWN&PURCHASE_ORDER_MASTER_OBJID=${objId}"; @@ -371,28 +381,6 @@ $(document).ready(function(){ gridFn.calcAllRows(); }); -// 결재라인 가져오기 -function fn_getApprLine(){ - if('${objId}'!=''){ - $.ajax({ - url:"/common/getApprovalLine.do", - type:"POST", - data:{"objId":"${objId}"}, - dataType:"json", - async:false, - success:function(data){ - $.each(data.RESULT, function(i,o){ - if(i==0){ - $("#appr_writer").html(o.WRITER); - } - if(i < 3){ - $("#appr"+(i+1)).html(o.TARGET_USER_NAME +"
"+ (o.PROC_DATE!=undefined?o.PROC_DATE:"")); - } - }); - } - }); - } -} // 행추가 팝업 function fn_openPartMngListPopUp(){ @@ -418,6 +406,7 @@ function fn_addRow(rowData){ ,"PARTNER_PRICE" : v2 ,"SUPPLY_UNIT_PRICE": _rowSum ,"REMARK" : "" + ,"DELIVERY_REQUEST_DATE" : "" }; grid.addRowData(newId, addData); @@ -538,12 +527,18 @@ var gridFn = { var vat = Math.floor(totalSupplyPrice * 0.1); var totalWithVat = totalSupplyPrice + vat; - $("#TOTAL_SUPPLY_PRICE").val(numberWithCommas(totalSupplyPrice)); - $("#TOTAL_VAT").val(numberWithCommas(vat)); - $("#TOTAL_PRICE_ALL").val(numberWithCommas(totalWithVat)); + $("#TOTAL_SUPPLY_PRICE").val(numberWithCommasDecimal(totalSupplyPrice)); + $("#TOTAL_VAT").val(numberWithCommasDecimal(vat)); + $("#TOTAL_PRICE_ALL").val(numberWithCommasDecimal(totalWithVat)); + $("#TOTAL_AMOUNT_DISPLAY").text(numberWithCommasDecimal(totalSupplyPrice) + " 원"); } } +function numberWithCommasDecimal(num) { + var n = Number(num); + return n.toFixed(2).replace(/\B(?=(\d{3})+(?!\d))/g, ","); +} + // 라이브러리 로드 완료 후 dataLoaded 플래그 설정 $(window).on('load', function() { setTimeout(function() { @@ -762,18 +757,6 @@ function fn_generateAndUploadPdf(callback) { 발 주 서 - - - - - - - - - - - -
담당자부사장대표이사
전결전결
@@ -783,7 +766,7 @@ function fn_generateAndUploadPdf(callback) { - + - + + + + - + - - - - - +
1. 발 주 번 호 :1. 발 주 번 호 : @@ -804,7 +787,7 @@ function fn_generateAndUploadPdf(callback) {
4. 합 계 금 액(VAT별도) :
6. 결 제 방 식 :5. 결 제 방 식 :
7. 합 계 금 액 :
@@ -842,7 +825,7 @@ function fn_generateAndUploadPdf(callback) { 담 당 자 <% if(isModify){ %> - <% for(int u=0; u - (${info.MANAGER_PHONE} / ${info.MANAGER_EMAIL}) + (${info.MANAGER_PHONE} / ${info.MANAGER_EMAIL}) 직인 @@ -882,7 +865,7 @@ function fn_generateAndUploadPdf(callback) { <% if(isModify){ %> - <% for(int u=0; u - (${info.MANAGER_PHONE2} / ${info.MANAGER_EMAIL2}) + (${info.MANAGER_PHONE2} / ${info.MANAGER_EMAIL2}) - ㈜알피에스 대표이사 이 동 헌 + ㈜알피에스 대표이사 이 동 헌 - 대전광역시 유성구 국제과학10로8(둔곡동 402-4번지) + 대전광역시 유성구 국제과학10로8(둔곡동 402-4번지) + -
+ - -
-
- -
- - - - - - - - - - - - - - - - - - -
공 급 가 액
부 가 세
총 결 제 금 액 (VAT포함)
-
<% if(isModify){ %> @@ -969,8 +930,32 @@ function fn_generateAndUploadPdf(callback) { <% } %>
+ + +
+
+ +
+ + +
+ + + + + +
총 공 급 가 액 (VAT별도)
+
+ + + + +
+ ※ 보안문서(CONFIDENTIAL) : ㈜알피에스의 승인(APPROVAL) 없이 외부로 반출하거나 공유 할수 없습니다. +
+ diff --git a/src/com/pms/controller/PurchaseOrderController.java b/src/com/pms/controller/PurchaseOrderController.java index 4692ba8..4a164e7 100644 --- a/src/com/pms/controller/PurchaseOrderController.java +++ b/src/com/pms/controller/PurchaseOrderController.java @@ -757,24 +757,36 @@ public class PurchaseOrderController { detailRow.put("UNIT", "".equals(unit) ? "0001400" : unit); // 배송지 - detailRow.put("DELIVERY_PLACE", "RPS"); + detailRow.put("PART_DELIVERY_PLACE", "RPS"); // 단가 (대소문자 모두 체크) Object priceObj = partRow.get("UNIT_PRICE"); if(priceObj == null) priceObj = partRow.get("unit_price"); String priceStr = CommonUtils.checkNull(priceObj, "0").toString().replaceAll(",", ""); - int unitPrice = 0; - try { unitPrice = (int)Double.parseDouble(priceStr.equals("") ? "0" : priceStr); } catch(Exception e) { unitPrice = 0; } + double unitPrice = 0; + try { unitPrice = Double.parseDouble(priceStr.equals("") ? "0" : priceStr); } catch(Exception e) { unitPrice = 0; } detailRow.put("PARTNER_PRICE", unitPrice); // 공급가액 = 수량 * 단가 detailRow.put("SUPPLY_UNIT_PRICE", qty * unitPrice); - // 비고 (대소문자 모두 체크) - String remark = CommonUtils.checkNull(partRow.get("REMARK")); - if("".equals(remark)) remark = CommonUtils.checkNull(partRow.get("remark")); + // 비고: 제품명 / 부품명 형태 + String projectProductName = CommonUtils.checkNull(partRow.get("PROJECT_PRODUCT_NAME")); + String componentPartName = CommonUtils.checkNull(partRow.get("COMPONENT_PART_NAME")); + String remark = ""; + if(!"".equals(projectProductName) && !"".equals(componentPartName)) { + remark = projectProductName + " / " + componentPartName; + } else if(!"".equals(projectProductName)) { + remark = projectProductName; + } else if(!"".equals(componentPartName)) { + remark = componentPartName; + } detailRow.put("REMARK", remark); + // 입고요청일 + Object deliveryDateObj = partRow.get("DELIVERY_REQUEST_DATE"); + detailRow.put("DELIVERY_REQUEST_DATE", deliveryDateObj != null ? String.valueOf(deliveryDateObj).trim() : ""); + detailList.add(detailRow); } } @@ -793,6 +805,9 @@ public class PurchaseOrderController { param.put("code","0001399"); code_map.put("unit_cd", commonService.getJqGridSelectBoxJsonData2("common.getCodeselect", param, "선택", "CODE", "NAME")); + // 배송지 (jqGrid 셀렉트박스용 - 수신업체와 동일 데이터) + code_map.put("delivery_place_grid", commonService.getJqGridSelectBoxJsonData2("common.getClientMngSupplySelect", new HashMap(), "선택", "NAME", "NAME")); + // 결제조건 code_map.put("payment_terms_cd", commonService.bizMakeOptionList("0001074", (String)info.get("PAYMENT_TERMS"),"common.getCodeselect")); diff --git a/src/com/pms/mapper/purchaseOrder.xml b/src/com/pms/mapper/purchaseOrder.xml index 5b89b49..dbff7f5 100644 --- a/src/com/pms/mapper/purchaseOrder.xml +++ b/src/com/pms/mapper/purchaseOrder.xml @@ -890,6 +890,16 @@ COALESCE(NULLIF(SRP.UNIT, ''), PM.UNIT) 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 + COALESCE( + (SELECT MIN(PM2.PART_NAME) FROM MBOM_DETAIL MD2 + JOIN PART_MNG PM2 ON MD2.PART_OBJID::VARCHAR = PM2.OBJID::VARCHAR + WHERE MD2.RAW_MATERIAL_PART_NO = PM.PART_NO + AND MD2.MBOM_HEADER_OBJID::VARCHAR = SRM.MBOM_HEADER_OBJID::VARCHAR), + PM.PART_NAME + ) + ELSE PM.PART_NAME + END AS COMPONENT_PART_NAME, COALESCE(SRP.DELIVERY_REQUEST_DATE, CASE WHEN SRM.MBOM_HEADER_OBJID IS NOT NULL THEN CASE WHEN COALESCE(SRP.MATERIAL_YN, 'N') = 'Y' THEN diff --git a/src/com/pms/service/PurchaseOrderService.java b/src/com/pms/service/PurchaseOrderService.java index 99a1fd4..5b1d6be 100644 --- a/src/com/pms/service/PurchaseOrderService.java +++ b/src/com/pms/service/PurchaseOrderService.java @@ -1944,6 +1944,20 @@ public class PurchaseOrderService { partParam.put("PRODUCT_NAME", CommonUtils.checkNull(partMap.get("project_product_name"))); Object deliveryDateObj = partMap.get("delivery_request_date"); partParam.put("DELIVERY_REQUEST_DATE", deliveryDateObj != null ? String.valueOf(deliveryDateObj).trim() : ""); + + // 비고: 제품명 / 부품명 형태 + String projectProductName = CommonUtils.checkNull(partMap.get("project_product_name")); + String componentPartName = CommonUtils.checkNull(partMap.get("component_part_name")); + String remark = ""; + if(!"".equals(projectProductName) && !"".equals(componentPartName)) { + remark = projectProductName + " / " + componentPartName; + } else if(!"".equals(projectProductName)) { + remark = projectProductName; + } else if(!"".equals(componentPartName)) { + remark = componentPartName; + } + partParam.put("REMARK", remark); + partParam.put("WRITER", writer); partParam.put("STATUS", "create"); From 69d3daf00586eb3f95d9c04c89d597139b9cd585 Mon Sep 17 00:00:00 2001 From: hjjeong Date: Tue, 10 Mar 2026 14:06:34 +0900 Subject: [PATCH 5/5] =?UTF-8?q?=EA=B5=AC=EB=A7=A4=EA=B4=80=EB=A6=AC=5F?= =?UTF-8?q?=ED=92=88=EB=AA=A9=EB=B3=84=EC=9E=85=EA=B3=A0=EA=B4=80=EB=A6=AC?= =?UTF-8?q?=EB=A6=AC=EC=8A=A4=ED=8A=B8=20=EB=B6=80=ED=92=88=ED=92=88?= =?UTF-8?q?=EB=B2=88=20=EC=BB=AC=EB=9F=BC=EC=B6=94=EA=B0=80,=20=EB=A7=A4?= =?UTF-8?q?=EC=9E=85=EB=A7=88=EA=B0=90=EB=B2=84=ED=8A=BC=20=EC=A3=BC?= =?UTF-8?q?=EC=84=9D=EC=B2=98=EB=A6=AC(=EC=9E=85=EA=B3=A0=EC=9D=BC?= =?UTF-8?q?=EB=B3=84=EC=9E=85=EA=B3=A0=EA=B4=80=EB=A6=AC=20=EB=A9=94?= =?UTF-8?q?=EB=89=B4=EB=A1=9C=20=EC=9D=B4=EB=8F=99)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../deliveryMngAcceptancePartList.jsp | 7 ++++--- src/com/pms/mapper/purchaseOrder.xml | 19 +++++++++++++++++++ 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/WebContent/WEB-INF/view/purchaseOrder/deliveryMngAcceptancePartList.jsp b/WebContent/WEB-INF/view/purchaseOrder/deliveryMngAcceptancePartList.jsp index 0a9be81..3542401 100644 --- a/WebContent/WEB-INF/view/purchaseOrder/deliveryMngAcceptancePartList.jsp +++ b/WebContent/WEB-INF/view/purchaseOrder/deliveryMngAcceptancePartList.jsp @@ -101,6 +101,7 @@ var columns = [ } }, {headerHozAlign:'center', hozAlign:'center', minWidth:130, widthGrow:0.9, title:'프로젝트번호', field:'PROJECT_NO'}, + {headerHozAlign:'center', hozAlign:'left', minWidth:120, widthGrow:1.5, title:'부품품번', field:'COMPONENT_PART_NO'}, {headerHozAlign:'center', hozAlign:'left', minWidth:120, widthGrow:1.5, title:'품번', field:'PART_NO'}, {headerHozAlign:'center', hozAlign:'left', minWidth:150, widthGrow:2, title:'품명', field:'PART_NAME'}, {headerHozAlign:'center', hozAlign:'left', minWidth:120, widthGrow:1.2, title:'공급업체', field:'PARTNER_NAME'}, @@ -130,8 +131,8 @@ var columns = [ }, {headerHozAlign:'center', hozAlign:'right', minWidth:90, widthGrow:0.9, title:'확정입고수량', field:'CONFIRMED_QTY', formatter:"money", formatterParams:{thousand:",", symbolAfter:"p", precision:false} - }, - {headerHozAlign:'center', hozAlign:'center', minWidth:90, widthGrow:0.6, title:'매입마감', field:'PURCHASE_CLOSE_DATE'} + } + //,{headerHozAlign:'center', hozAlign:'center', minWidth:90, widthGrow:0.6, title:'매입마감', field:'PURCHASE_CLOSE_DATE'} ]; function fn_search(){ @@ -329,7 +330,7 @@ function fn_purchaseClose(){
- +
diff --git a/src/com/pms/mapper/purchaseOrder.xml b/src/com/pms/mapper/purchaseOrder.xml index dbff7f5..5e0d43b 100644 --- a/src/com/pms/mapper/purchaseOrder.xml +++ b/src/com/pms/mapper/purchaseOrder.xml @@ -6231,6 +6231,25 @@ FROM( ,POM.PURCHASE_ORDER_NO ,CM.PROJECT_NO + + ,COALESCE( + (SELECT + CASE WHEN COALESCE(SRP2.MATERIAL_YN, 'N') = 'Y' AND SRM2.MBOM_HEADER_OBJID IS NOT NULL THEN + (SELECT MIN(PM2.PART_NO) FROM MBOM_DETAIL MD2 + JOIN PART_MNG PM2 ON MD2.PART_OBJID::VARCHAR = PM2.OBJID::VARCHAR + WHERE MD2.RAW_MATERIAL_PART_NO = POP.PART_NO + AND MD2.MBOM_HEADER_OBJID::VARCHAR = SRM2.MBOM_HEADER_OBJID::VARCHAR) + ELSE POP.PART_NO + END + FROM SALES_REQUEST_PART SRP2 + JOIN SALES_REQUEST_MASTER SRM2 ON SRP2.SALES_REQUEST_MASTER_OBJID = SRM2.OBJID + WHERE SRM2.OBJID::VARCHAR = POM.SALES_REQUEST_OBJID + AND SRP2.PART_OBJID = POP.PART_OBJID + LIMIT 1 + ), + POP.PART_NO + ) AS COMPONENT_PART_NO + ,POP.PART_NO ,POP.PART_NAME