diff --git a/WebContent/WEB-INF/view/contractMgmt/orderMgmtList.jsp b/WebContent/WEB-INF/view/contractMgmt/orderMgmtList.jsp index 1be8465..64366ec 100644 --- a/WebContent/WEB-INF/view/contractMgmt/orderMgmtList.jsp +++ b/WebContent/WEB-INF/view/contractMgmt/orderMgmtList.jsp @@ -151,6 +151,28 @@ $(document).ready(function(){ document.form1.submit(); }); + // 수주취소 + $("#btnOrderCancel").click(function(){ + var selectedData = _tabulGrid.getSelectedData(); + if(selectedData.length < 1){ + Swal.fire("수주취소할 행을 선택해주십시오."); + return false; + } else if(selectedData.length > 1){ + Swal.fire("한번에 한개의 수주만 취소 가능합니다."); + return false; + } + + var contractObjId = fnc_checkNull(selectedData[0].OBJID); + var orderQty = parseInt(selectedData[0].ORDER_QUANTITY) || 0; + + if(orderQty === 0){ + Swal.fire("수주 수량이 없는 건은 취소할 수 없습니다."); + return false; + } + + fn_openOrderCancelPopup(contractObjId); + }); + fn_search(); }); @@ -203,6 +225,14 @@ var columns = [ return Number(value).toLocaleString(); } }, + // 8-1. 수주취소 + {headerHozAlign : 'center', hozAlign : 'right', minWidth : 60, widthGrow: 0.7, title : '수주취소', field : 'CANCEL_QTY_SUM', + formatter: function(cell) { + var value = cell.getValue(); + if(!value || value === '' || value === 0 || value === '0') return ''; + return "" + Number(value).toLocaleString() + ""; + } + }, // 9. 유/무상 {headerHozAlign : 'center', hozAlign : 'center', minWidth : 45, widthGrow: 0.5, title : '유/무상', field : 'PAID_TYPE' }, // 10. 수주상태 @@ -656,6 +686,131 @@ function fn_showSerialNoPopup(serialNoString){ }); } +// 수주취소 팝업 - 품목별 취소 수량 입력 +function fn_openOrderCancelPopup(contractObjId){ + $.ajax({ + url: "/contractMgmt/getContractItems.do", + type: "POST", + data: { contractObjId: contractObjId }, + dataType: "json", + success: function(data){ + if(data.result !== "success" || !data.items || data.items.length === 0){ + Swal.fire("수주 품목 정보가 없습니다."); + return; + } + + var items = data.items; + var html = '
'; + html += ''; + html += ''; + html += ''; + html += ''; + html += ''; + html += ''; + html += ''; + + items.forEach(function(item, idx){ + var objid = item.OBJID || item.objid || ''; + var partNo = item.PART_NO || item.part_no || ''; + var partName = item.PART_NAME || item.part_name || ''; + var orderQty = item.ORDER_QUANTITY || item.order_quantity || '0'; + var cancelQty = item.CANCEL_QTY || item.cancel_qty || ''; + var orderQtyNum = parseInt(orderQty) || 0; + var maxCancel = orderQtyNum > 0 ? orderQtyNum - 1 : 0; + + html += ''; + html += ''; + html += ''; + html += ''; + html += '
품번품명수주수량취소수량
' + partNo + '' + partName + '' + (orderQtyNum > 0 ? Number(orderQtyNum).toLocaleString() : '-') + ''; + if(orderQtyNum > 0){ + html += '= orderQty){ + Swal.showValidationMessage('취소 수량(' + cancelVal + ')은 수주수량(' + orderQty + ')보다 적어야 합니다.'); + hasError = true; + return; + } + + itemObjIds.push(input.getAttribute('data-objid')); + cancelQtys.push(cancelVal); + orderQtys.push(orderQty); + }); + + if(hasError) return false; + + return { itemObjIds: itemObjIds, cancelQtys: cancelQtys, orderQtys: orderQtys }; + } + }).then(function(result){ + if(result.isConfirmed && result.value){ + var val = result.value; + $.ajax({ + url: "/contractMgmt/saveOrderCancelQty.do", + type: "POST", + data: { + itemObjIds: val.itemObjIds.join(","), + cancelQtys: val.cancelQtys.join(","), + orderQtys: val.orderQtys.join(",") + }, + dataType: "json", + success: function(res){ + if(res.result === "true"){ + Swal.fire({ title: '저장 완료', text: res.msg, icon: 'success' }); + fn_search(); + } else { + Swal.fire({ title: '저장 실패', text: res.msg, icon: 'error' }); + } + }, + error: function(){ + Swal.fire("수주취소 저장 중 오류가 발생했습니다."); + } + }); + } + }); + }, + error: function(){ + Swal.fire("품목 정보 조회 중 오류가 발생했습니다."); + } + }); +} + //코드값을 받아와서 동적으로 selectbox 생성 function optionJobGroup(code){ var val=code; @@ -790,11 +945,12 @@ function openProjectFormPopUp(objId){

영업관리_주문서관리

-
- - - -
+
+ + + + +
diff --git a/WebContent/WEB-INF/view/salesMng/purchaseListFormPopUp.jsp b/WebContent/WEB-INF/view/salesMng/purchaseListFormPopUp.jsp index 9690de4..e42704c 100644 --- a/WebContent/WEB-INF/view/salesMng/purchaseListFormPopUp.jsp +++ b/WebContent/WEB-INF/view/salesMng/purchaseListFormPopUp.jsp @@ -75,6 +75,7 @@ body, html {

구매리스트

+ @@ -565,13 +566,11 @@ function fn_initGrid() { title: '공급업체', field: 'VENDOR_PM', editor: function(cell, onRendered, success, cancel, editorParams) { - // Select2 에디터 (가공업체와 동일한 목록 사용) return createSelect2Editor(processingVendorList)(cell, onRendered, success, cancel, editorParams); }, formatter: function(cell) { - var value = cell.getValue(); + var value = (typeof cell.getValue === 'function') ? cell.getValue() : (cell.value || ''); if(!value) return ''; - // processingVendorList에서 해당 값의 이름 찾기 for(var i = 0; i < processingVendorList.length; i++) { if(processingVendorList[i].id == value) { return processingVendorList[i].text; @@ -686,9 +685,8 @@ function fn_initGrid() { return createSelect2Editor(processingVendorList)(cell, onRendered, success, cancel, editorParams); }, formatter: function(cell) { - var value = cell.getValue(); + var value = (typeof cell.getValue === 'function') ? cell.getValue() : (cell.value || ''); if(!value) return ''; - for(var i = 0; i < processingVendorList.length; i++) { if(processingVendorList[i].id == value) { return processingVendorList[i].text; @@ -783,6 +781,32 @@ function fn_initGrid() { return value; } }, + // 35. 소재발주일 + { + headerHozAlign: 'center', + hozAlign: 'center', + width: 100, + title: '소재발주일', + field: 'MATERIAL_PO_DATE', + formatter: function(cell) { + var value = (typeof cell.getValue === 'function') ? cell.getValue() : (cell.value || ''); + if(!value) return ''; + return value.length >= 10 ? value.substring(0, 10) : value; + } + }, + // 36. 소재입고일 + { + headerHozAlign: 'center', + hozAlign: 'center', + width: 100, + title: '소재입고일', + field: 'MATERIAL_RECEIPT_DATE', + formatter: function(cell) { + var value = (typeof cell.getValue === 'function') ? cell.getValue() : (cell.value || ''); + if(!value) return ''; + return value.length >= 10 ? value.substring(0, 10) : value; + } + }, // 34. 가공 품의서작성일 { headerHozAlign: 'center', @@ -791,14 +815,39 @@ function fn_initGrid() { title: '가공품의서일', field: 'PROCESSING_PROPOSAL_DATE', formatter: function(cell) { - var value = cell.getValue(); + var value = (typeof cell.getValue === 'function') ? cell.getValue() : (cell.value || ''); if(!value) return ''; - // YYYY-MM-DD 형식으로 표시 if(value.length >= 10) { return value.substring(0, 10); } return value; } + }, + // 37. 가공발주일 + { + headerHozAlign: 'center', + hozAlign: 'center', + width: 100, + title: '가공발주일', + field: 'PROCESSING_PO_DATE', + formatter: function(cell) { + var value = (typeof cell.getValue === 'function') ? cell.getValue() : (cell.value || ''); + if(!value) return ''; + return value.length >= 10 ? value.substring(0, 10) : value; + } + }, + // 38. 가공입고일 + { + headerHozAlign: 'center', + hozAlign: 'center', + width: 100, + title: '가공입고일', + field: 'PROCESSING_RECEIPT_DATE', + formatter: function(cell) { + var value = (typeof cell.getValue === 'function') ? cell.getValue() : (cell.value || ''); + if(!value) return ''; + return value.length >= 10 ? value.substring(0, 10) : value; + } } ]; @@ -875,8 +924,9 @@ function fn_loadFromMBom(callback) { url: "/salesMng/getMBomForPurchaseList.do", method: 'post', data: { - PROJECT_MGMT_OBJID: mbomHeaderObjid, // MBOM_HEADER_OBJID를 직접 사용 - bomReportObjId: bomReportObjid + PROJECT_MGMT_OBJID: mbomHeaderObjid, + bomReportObjId: bomReportObjid, + SALES_REQUEST_MASTER_OBJID: salesRequestMasterObjid }, dataType: 'json', success: function(data) { diff --git a/WebContent/WEB-INF/view/salesmgmt/salesMgmt/salesMgmtList.jsp b/WebContent/WEB-INF/view/salesmgmt/salesMgmt/salesMgmtList.jsp index 02e1af1..4ee7a37 100644 --- a/WebContent/WEB-INF/view/salesmgmt/salesMgmt/salesMgmtList.jsp +++ b/WebContent/WEB-INF/view/salesmgmt/salesMgmt/salesMgmtList.jsp @@ -91,10 +91,10 @@ fn_bulkRegister(); }); - // 거래명세서 출력 버튼 (주석처리됨) - // $("#btnTransactionStatement").click(function(){ - // fn_printTransactionStatement(); - // }); + // 거래명세서 출력 버튼 + $("#btnTransactionStatement").click(function(){ + fn_printTransactionStatement(); + }); // 분할출하 버튼 $("#btnSplitShipment").click(function(){ @@ -710,9 +710,7 @@ body {
- <%-- 거래명세서 버튼 주석처리 - --%>
diff --git a/src/com/pms/mapper/salesMng.xml b/src/com/pms/mapper/salesMng.xml index 78719d1..2545a63 100644 --- a/src/com/pms/mapper/salesMng.xml +++ b/src/com/pms/mapper/salesMng.xml @@ -3187,7 +3187,51 @@ UPDATE SET 0 AS GRAND_TOTAL_PRICE, SRP.PROPOSAL_DATE, NULL AS PROCESSING_PROPOSAL_DATE, - 'SRP' AS DATA_SOURCE -- 데이터 소스 구분용 + -- 소재발주일: 소재품번으로 매칭 + (SELECT POM.MAIL_SEND_DATE + FROM PURCHASE_ORDER_MASTER POM + JOIN PURCHASE_ORDER_PART POP ON POM.OBJID = POP.PURCHASE_ORDER_MASTER_OBJID + JOIN SALES_REQUEST_MASTER SRM_PO ON POM.SALES_REQUEST_OBJID = SRM_PO.OBJID + WHERE COALESCE(SRP.RAW_MATERIAL_PART_NO, '') != '' + AND POP.PART_OBJID::VARCHAR = (SELECT PM2.OBJID::VARCHAR FROM PART_MNG PM2 WHERE PM2.PART_NO = SRP.RAW_MATERIAL_PART_NO LIMIT 1) + AND SRM_PO.PROJECT_NO = (SELECT PROJECT_NO FROM SALES_REQUEST_MASTER WHERE OBJID = SRP.SALES_REQUEST_MASTER_OBJID) + AND POM.MAIL_SEND_DATE IS NOT NULL + ORDER BY POM.MAIL_SEND_DATE DESC + LIMIT 1) AS MATERIAL_PO_DATE, + -- 소재입고일 + (SELECT SUBSTRING(AP.RECEIPT_DATE, 1, 10) + FROM ARRIVAL_PLAN AP + JOIN PURCHASE_ORDER_PART POP ON AP.ORDER_PART_OBJID = POP.OBJID + JOIN PURCHASE_ORDER_MASTER POM ON POP.PURCHASE_ORDER_MASTER_OBJID = POM.OBJID + JOIN SALES_REQUEST_MASTER SRM_PO ON POM.SALES_REQUEST_OBJID = SRM_PO.OBJID + WHERE COALESCE(SRP.RAW_MATERIAL_PART_NO, '') != '' + AND POP.PART_OBJID::VARCHAR = (SELECT PM2.OBJID::VARCHAR FROM PART_MNG PM2 WHERE PM2.PART_NO = SRP.RAW_MATERIAL_PART_NO LIMIT 1) + AND SRM_PO.PROJECT_NO = (SELECT PROJECT_NO FROM SALES_REQUEST_MASTER WHERE OBJID = SRP.SALES_REQUEST_MASTER_OBJID) + AND AP.RECEIPT_DATE IS NOT NULL AND AP.RECEIPT_DATE != '' + ORDER BY AP.RECEIPT_DATE DESC + LIMIT 1) AS MATERIAL_RECEIPT_DATE, + -- 가공발주일: 부품 PART_OBJID로 직접 매칭 + (SELECT POM.MAIL_SEND_DATE + FROM PURCHASE_ORDER_MASTER POM + JOIN PURCHASE_ORDER_PART POP ON POM.OBJID = POP.PURCHASE_ORDER_MASTER_OBJID + JOIN SALES_REQUEST_MASTER SRM_PO ON POM.SALES_REQUEST_OBJID = SRM_PO.OBJID + WHERE POP.PART_OBJID::VARCHAR = SRP.PART_OBJID::VARCHAR + AND SRM_PO.PROJECT_NO = (SELECT PROJECT_NO FROM SALES_REQUEST_MASTER WHERE OBJID = SRP.SALES_REQUEST_MASTER_OBJID) + AND POM.MAIL_SEND_DATE IS NOT NULL + ORDER BY POM.MAIL_SEND_DATE DESC + LIMIT 1) AS PROCESSING_PO_DATE, + -- 가공입고일 + (SELECT SUBSTRING(AP.RECEIPT_DATE, 1, 10) + FROM ARRIVAL_PLAN AP + JOIN PURCHASE_ORDER_PART POP ON AP.ORDER_PART_OBJID = POP.OBJID + JOIN PURCHASE_ORDER_MASTER POM ON POP.PURCHASE_ORDER_MASTER_OBJID = POM.OBJID + JOIN SALES_REQUEST_MASTER SRM_PO ON POM.SALES_REQUEST_OBJID = SRM_PO.OBJID + WHERE POP.PART_OBJID::VARCHAR = SRP.PART_OBJID::VARCHAR + AND SRM_PO.PROJECT_NO = (SELECT PROJECT_NO FROM SALES_REQUEST_MASTER WHERE OBJID = SRP.SALES_REQUEST_MASTER_OBJID) + AND AP.RECEIPT_DATE IS NOT NULL AND AP.RECEIPT_DATE != '' + ORDER BY AP.RECEIPT_DATE DESC + LIMIT 1) AS PROCESSING_RECEIPT_DATE, + 'SRP' AS DATA_SOURCE FROM SALES_REQUEST_PART SRP LEFT JOIN PART_MNG PM ON SRP.PART_OBJID::VARCHAR = PM.OBJID::VARCHAR @@ -3519,6 +3563,58 @@ SELECT G.PROCESSING_UNIT_PRICE, G.PROCESSING_TOTAL_PRICE, G.GRAND_TOTAL_PRICE, + + -- 소재발주일: 소재품번(RAW_MATERIAL_PART_NO)으로 PART_MNG OBJID 조회 후 매칭 + (SELECT POM.MAIL_SEND_DATE + FROM PURCHASE_ORDER_MASTER POM + JOIN PURCHASE_ORDER_PART POP ON POM.OBJID = POP.PURCHASE_ORDER_MASTER_OBJID + JOIN SALES_REQUEST_MASTER SRM_PO ON POM.SALES_REQUEST_OBJID = SRM_PO.OBJID + WHERE COALESCE(G.RAW_MATERIAL_PART_NO, '') != '' + AND POP.PART_OBJID::VARCHAR = (SELECT PM2.OBJID::VARCHAR FROM PART_MNG PM2 WHERE PM2.PART_NO = G.RAW_MATERIAL_PART_NO LIMIT 1) + AND SRM_PO.PROJECT_NO = (SELECT PROJECT_NO FROM SALES_REQUEST_MASTER WHERE OBJID = #{SALES_REQUEST_MASTER_OBJID}) + AND POM.MAIL_SEND_DATE IS NOT NULL + ORDER BY POM.MAIL_SEND_DATE DESC + LIMIT 1) AS MATERIAL_PO_DATE, + -- 소재입고일 + (SELECT SUBSTRING(AP.RECEIPT_DATE, 1, 10) + FROM ARRIVAL_PLAN AP + JOIN PURCHASE_ORDER_PART POP ON AP.ORDER_PART_OBJID = POP.OBJID + JOIN PURCHASE_ORDER_MASTER POM ON POP.PURCHASE_ORDER_MASTER_OBJID = POM.OBJID + JOIN SALES_REQUEST_MASTER SRM_PO ON POM.SALES_REQUEST_OBJID = SRM_PO.OBJID + WHERE COALESCE(G.RAW_MATERIAL_PART_NO, '') != '' + AND POP.PART_OBJID::VARCHAR = (SELECT PM2.OBJID::VARCHAR FROM PART_MNG PM2 WHERE PM2.PART_NO = G.RAW_MATERIAL_PART_NO LIMIT 1) + AND SRM_PO.PROJECT_NO = (SELECT PROJECT_NO FROM SALES_REQUEST_MASTER WHERE OBJID = #{SALES_REQUEST_MASTER_OBJID}) + AND AP.RECEIPT_DATE IS NOT NULL AND AP.RECEIPT_DATE != '' + ORDER BY AP.RECEIPT_DATE DESC + LIMIT 1) AS MATERIAL_RECEIPT_DATE, + -- 가공발주일: 부품 PART_OBJID로 직접 매칭 + (SELECT POM.MAIL_SEND_DATE + FROM PURCHASE_ORDER_MASTER POM + JOIN PURCHASE_ORDER_PART POP ON POM.OBJID = POP.PURCHASE_ORDER_MASTER_OBJID + JOIN SALES_REQUEST_MASTER SRM_PO ON POM.SALES_REQUEST_OBJID = SRM_PO.OBJID + WHERE POP.PART_OBJID::VARCHAR = G.PART_OBJID::VARCHAR + AND SRM_PO.PROJECT_NO = (SELECT PROJECT_NO FROM SALES_REQUEST_MASTER WHERE OBJID = #{SALES_REQUEST_MASTER_OBJID}) + AND POM.MAIL_SEND_DATE IS NOT NULL + ORDER BY POM.MAIL_SEND_DATE DESC + LIMIT 1) AS PROCESSING_PO_DATE, + -- 가공입고일 + (SELECT SUBSTRING(AP.RECEIPT_DATE, 1, 10) + FROM ARRIVAL_PLAN AP + JOIN PURCHASE_ORDER_PART POP ON AP.ORDER_PART_OBJID = POP.OBJID + JOIN PURCHASE_ORDER_MASTER POM ON POP.PURCHASE_ORDER_MASTER_OBJID = POM.OBJID + JOIN SALES_REQUEST_MASTER SRM_PO ON POM.SALES_REQUEST_OBJID = SRM_PO.OBJID + WHERE POP.PART_OBJID::VARCHAR = G.PART_OBJID::VARCHAR + AND SRM_PO.PROJECT_NO = (SELECT PROJECT_NO FROM SALES_REQUEST_MASTER WHERE OBJID = #{SALES_REQUEST_MASTER_OBJID}) + AND AP.RECEIPT_DATE IS NOT NULL AND AP.RECEIPT_DATE != '' + ORDER BY AP.RECEIPT_DATE DESC + LIMIT 1) AS PROCESSING_RECEIPT_DATE, + + + NULL AS MATERIAL_PO_DATE, + NULL AS MATERIAL_RECEIPT_DATE, + NULL AS PROCESSING_PO_DATE, + NULL AS PROCESSING_RECEIPT_DATE, + 'MBOM' AS DATA_SOURCE FROM GROUPED_BOM G LEFT JOIN PART_MNG P ON P.OBJID::VARCHAR = G.PART_OBJID::VARCHAR diff --git a/src/com/pms/salesmgmt/controller/ContractMgmtController.java b/src/com/pms/salesmgmt/controller/ContractMgmtController.java index 5de59ff..c3435b2 100644 --- a/src/com/pms/salesmgmt/controller/ContractMgmtController.java +++ b/src/com/pms/salesmgmt/controller/ContractMgmtController.java @@ -2853,6 +2853,25 @@ public class ContractMgmtController { return resultMap; } + /** + * 수주취소 수량 저장 + */ + @ResponseBody + @RequestMapping(value="/contractMgmt/saveOrderCancelQty.do", method=RequestMethod.POST) + public Map saveOrderCancelQty(HttpServletRequest request, @RequestParam Map paramMap){ + Map resultMap = new HashMap(); + + try { + resultMap = contractMgmtService.saveOrderCancelQty(request, paramMap); + } catch (Exception e) { + e.printStackTrace(); + resultMap.put("result", "false"); + resultMap.put("msg", "수주취소 저장 중 오류가 발생했습니다."); + } + + return resultMap; + } + @RequestMapping("/contractMgmt/FileRegistPopup.do") public String FileRegistPopup(HttpServletRequest request, @RequestParam Map paramMap){ request.setAttribute("docType", CommonUtils.checkNull(paramMap.get("docType"))); diff --git a/src/com/pms/salesmgmt/mapper/contractMgmt.xml b/src/com/pms/salesmgmt/mapper/contractMgmt.xml index 166227c..9386ede 100644 --- a/src/com/pms/salesmgmt/mapper/contractMgmt.xml +++ b/src/com/pms/salesmgmt/mapper/contractMgmt.xml @@ -717,6 +717,16 @@ AND ORDER_QUANTITY != '' AND ORDER_QUANTITY != '0' ) AS HAS_ORDER_DATA + -- 수주취소 수량 합계 + ,( + SELECT COALESCE(SUM(CAST(NULLIF(CANCEL_QTY, '') AS NUMERIC)), 0) + FROM CONTRACT_ITEM + WHERE CONTRACT_OBJID = T.OBJID + AND STATUS = 'ACTIVE' + AND CANCEL_QTY IS NOT NULL + AND CANCEL_QTY != '' + AND CANCEL_QTY != '0' + ) AS CANCEL_QTY_SUM FROM CONTRACT_MGMT AS T LEFT OUTER JOIN @@ -5092,7 +5102,8 @@ WHERE CI.ORDER_UNIT_PRICE, CI.ORDER_SUPPLY_PRICE, CI.ORDER_VAT, - CI.ORDER_TOTAL_AMOUNT + CI.ORDER_TOTAL_AMOUNT, + CI.CANCEL_QTY FROM CONTRACT_ITEM CI LEFT JOIN PART_MNG PM ON CI.PART_OBJID = PM.OBJID @@ -5117,7 +5128,8 @@ WHERE CI.ORDER_UNIT_PRICE, CI.ORDER_SUPPLY_PRICE, CI.ORDER_VAT, - CI.ORDER_TOTAL_AMOUNT + CI.ORDER_TOTAL_AMOUNT, + CI.CANCEL_QTY ORDER BY CI.SEQ @@ -5133,6 +5145,16 @@ WHERE WHERE OBJID = #{contractItemObjId} + + + UPDATE CONTRACT_ITEM + SET + CANCEL_QTY = #{cancelQty}, + CHGDATE = NOW(), + CHG_USER_ID = #{userId} + WHERE OBJID = #{itemObjId} + + diff --git a/src/com/pms/salesmgmt/service/ContractMgmtService.java b/src/com/pms/salesmgmt/service/ContractMgmtService.java index 0629287..2398004 100644 --- a/src/com/pms/salesmgmt/service/ContractMgmtService.java +++ b/src/com/pms/salesmgmt/service/ContractMgmtService.java @@ -3865,4 +3865,89 @@ private String encodeImageToBase64(String imagePath) { e.printStackTrace(); } } + + /** + * 수주취소 수량 저장 + * 품목별로 부분 취소 수량을 업데이트한다. (전체 취소 불가, 부분만 가능) + */ + public Map saveOrderCancelQty(HttpServletRequest request, Map paramMap) { + Map resultMap = new HashMap(); + SqlSession sqlSession = null; + + try { + sqlSession = SqlMapConfig.getInstance().getSqlSession(); + + HttpSession session = request.getSession(); + PersonBean person = (PersonBean) session.getAttribute(Constants.PERSON_BEAN); + String userId = person.getUserId(); + + String itemObjIdsStr = CommonUtils.checkNull(paramMap.get("itemObjIds")); + String cancelQtysStr = CommonUtils.checkNull(paramMap.get("cancelQtys")); + String orderQtysStr = CommonUtils.checkNull(paramMap.get("orderQtys")); + + if ("".equals(itemObjIdsStr) || "".equals(cancelQtysStr)) { + resultMap.put("result", "false"); + resultMap.put("msg", "취소 수량 정보가 없습니다."); + return resultMap; + } + + String[] itemObjIds = itemObjIdsStr.split(","); + String[] cancelQtys = cancelQtysStr.split(","); + String[] orderQtys = orderQtysStr.split(","); + + for (int i = 0; i < itemObjIds.length; i++) { + String cancelQty = cancelQtys[i].trim(); + String orderQty = orderQtys[i].trim(); + + // 빈 값이면 스킵 + if ("".equals(cancelQty) || "0".equals(cancelQty)) { + // 취소수량 0이면 초기화 + Map updateParam = new HashMap(); + updateParam.put("itemObjId", itemObjIds[i].trim()); + updateParam.put("cancelQty", ""); + updateParam.put("userId", userId); + sqlSession.update("contractMgmt.updateContractItemCancelQty", updateParam); + continue; + } + + int cancelQtyInt = Integer.parseInt(cancelQty); + int orderQtyInt = Integer.parseInt(orderQty); + + // 전체 수량 취소 불가 (부분만 가능) + if (cancelQtyInt >= orderQtyInt) { + resultMap.put("result", "false"); + resultMap.put("msg", "수주취소 수량은 수주수량(" + orderQtyInt + ")보다 적어야 합니다."); + sqlSession.rollback(); + return resultMap; + } + + if (cancelQtyInt < 0) { + resultMap.put("result", "false"); + resultMap.put("msg", "수주취소 수량은 0 이상이어야 합니다."); + sqlSession.rollback(); + return resultMap; + } + + Map updateParam = new HashMap(); + updateParam.put("itemObjId", itemObjIds[i].trim()); + updateParam.put("cancelQty", cancelQty); + updateParam.put("userId", userId); + sqlSession.update("contractMgmt.updateContractItemCancelQty", updateParam); + } + + sqlSession.commit(); + resultMap.put("result", "true"); + resultMap.put("msg", "수주취소 수량이 저장되었습니다."); + + } catch (Exception e) { + e.printStackTrace(); + if (sqlSession != null) sqlSession.rollback(); + resultMap.put("result", "false"); + resultMap.put("msg", "수주취소 저장 중 오류가 발생했습니다."); + } finally { + if (sqlSession != null) sqlSession.close(); + } + + return resultMap; + } } diff --git a/src/com/pms/service/ApprovalService.java b/src/com/pms/service/ApprovalService.java index e3665df..48a1132 100644 --- a/src/com/pms/service/ApprovalService.java +++ b/src/com/pms/service/ApprovalService.java @@ -2168,8 +2168,8 @@ public class ApprovalService { private String buildOrderContentsHtml(Map orderInfo, List itemList){ StringBuilder html = new StringBuilder(); - String contractNo = CommonUtils.checkNull(orderInfo.get("CONTRACT_NO")); String orderDate = CommonUtils.checkNull(orderInfo.get("ORDER_DATE")); + String poNo = escapeHtml(CommonUtils.checkNull(orderInfo.get("PO_NO"))); String clientNm = escapeHtml(CommonUtils.checkNull(orderInfo.get("CLIENT_NM"))); String clientBusRegNo = escapeHtml(CommonUtils.checkNull(orderInfo.get("CLIENT_BUS_REG_NO"))); String clientCeoNm = escapeHtml(CommonUtils.checkNull(orderInfo.get("CLIENT_CEO_NM"))); @@ -2183,63 +2183,79 @@ public class ApprovalService { String vat = CommonUtils.checkNull(orderInfo.get("ORDER_VAT")); String totalAmount = CommonUtils.checkNull(orderInfo.get("ORDER_TOTAL_AMOUNT")); String vatNote = escapeHtml(CommonUtils.checkNull(orderInfo.get("VAT_NOTE"))); + String regDatetime = escapeHtml(CommonUtils.checkNull(orderInfo.get("REG_DATETIME"))); - final String TH = "style='border:1px solid #999; padding:4px 8px; background-color:#f5f5f5; text-align:center; font-weight:bold; font-size:12px;'"; - final String TD = "style='border:1px solid #999; padding:4px 8px; font-size:12px;'"; - final String TD_C = "style='border:1px solid #999; padding:4px 8px; font-size:12px; text-align:center;'"; - final String TD_R = "style='border:1px solid #999; padding:4px 8px; font-size:12px; text-align:right;'"; + final String S = "border:1px solid #000; padding:2px 4px; font-size:11px; vertical-align:middle;"; + final String LBL = S + " text-align:center; font-weight:bold; background-color:#e8faff;"; + final String VL = LBL + " writing-mode:vertical-rl; letter-spacing:5px; font-size:12px;"; - html.append("
"); - html.append("

주 문 서

"); + html.append("
"); + html.append("

주 문 서

"); + html.append("

주문일자 : ").append(escapeHtml(orderDate)).append("

"); + html.append("

증빙번호 : ").append(poNo).append("

"); - // 헤더 - String poNo = escapeHtml(CommonUtils.checkNull(orderInfo.get("PO_NO"))); - html.append("

주문일자 : ").append(escapeHtml(orderDate)).append("

"); - html.append("

증빙번호 : ").append(poNo).append("

"); - - // 공급받는자/공급자 테이블 - html.append(""); - html.append(""); - html.append(""); - html.append(""); - html.append(""); - - html.append(""); - html.append(""); - html.append(""); - html.append(""); - - html.append(""); - html.append(""); - - html.append(""); - html.append(""); - html.append(""); - html.append(""); - html.append("
공급받는자등록번호").append(clientBusRegNo).append("공급자등록번호314-81-75146
상호").append(clientNm).append("성명").append(clientCeoNm).append("상호주식회사알피에스본사성명이동헌
주소").append(clientAddr).append("주소대전광역시 유성구 국제과학10로 8(둔곡동)
업태").append(clientBusType).append("종목").append(clientBusItem).append("업태제조업종목금속절삭가공기계,반도체제조용기계
"); - - // 납품처/담당자 - html.append(""); - html.append(""); - html.append(""); - html.append(""); - html.append(""); - html.append(""); - html.append(""); - html.append("
납품처").append(clientNm).append("전화번호").append(clientTelNo).append("팩스번호").append(clientFaxNo).append("
주소").append(clientAddr).append("담당자").append(writerName).append("C.P.번호
"); - - // 품목 테이블 - html.append(""); + // 공급받는자 / 공급자 (10컬럼: 세로3% + 라벨8% + 값auto + 라벨6% + 값9% × 2세트) + html.append("
"); + html.append(""); + html.append(""); + html.append(""); + html.append(""); + // row1: 등록번호 html.append(""); - html.append(""); - html.append(""); - html.append(""); - html.append(""); - html.append(""); - html.append(""); - html.append(""); - html.append(""); - html.append(""); + html.append(""); + html.append(""); + html.append(""); + html.append(""); + html.append(""); + html.append(""); + html.append(""); + // row2: 상호/성명 + html.append(""); + html.append(""); + html.append(""); + html.append(""); + html.append(""); + html.append(""); + // row3: 주소 + html.append(""); + html.append(""); + html.append(""); + html.append(""); + // row4: 업태/종목 + html.append(""); + html.append(""); + html.append(""); + html.append(""); + html.append(""); + html.append("
No.품번품명규격단위납기일수량단가금액공급받는자등록번호").append(clientBusRegNo).append("공 급 자등록번호314-81-75146
상 호").append(clientNm).append("성명").append(clientCeoNm).append("상 호주식회사알피에스본사성명이동헌
주 소").append(clientAddr).append("주 소대전광역시 유성구 국제과학10로 8(둔곡동)
업 태").append(clientBusType).append("종목").append(clientBusItem).append("업 태제조업종목금속절삭가공기계,반도체제조용기계
"); + + // 납품처 / 담당자 (6컬럼) + html.append(""); + html.append(""); + html.append(""); + html.append(""); + html.append(""); + html.append(""); + html.append(""); + html.append(""); + html.append(""); + html.append(""); + html.append("
납 품 처").append(clientNm).append("전화번호").append(clientTelNo).append("팩스번호").append(clientFaxNo).append("
주 소").append(clientAddr).append("담 당 자").append(writerName).append("C.P.번호
"); + + // 품목 테이블 (9컬럼) + html.append(""); + html.append(""); + html.append(""); + html.append(""); + html.append(""); + html.append(""); + html.append(""); + html.append(""); + html.append(""); + html.append(""); + html.append(""); + html.append(""); + html.append(""); html.append(""); int totalQty = 0; @@ -2253,40 +2269,42 @@ public class ApprovalService { String itemSupply = CommonUtils.checkNull(item.get("ORDER_SUPPLY_PRICE")); html.append(""); - html.append(""); - html.append(""); - html.append(""); - html.append(""); - html.append(""); - html.append(""); - html.append(""); - html.append(""); - html.append(""); + html.append(""); + html.append(""); + html.append(""); + html.append(""); + html.append(""); + html.append(""); + html.append(""); + html.append(""); + html.append(""); html.append(""); } } - // 합계 - html.append(""); - html.append(""); - html.append(""); - html.append(""); - html.append(""); + // 합계행 + html.append(""); + html.append(""); + html.append(""); + html.append(""); + html.append(""); + html.append(""); html.append("
No.품번품명규격단위납기일수량단가금액
").append(i + 1).append("").append(escapeHtml(CommonUtils.checkNull(item.get("PART_NO")))).append("").append(escapeHtml(CommonUtils.checkNull(item.get("PART_NAME")))).append("").append(escapeHtml(CommonUtils.checkNull(item.get("SPEC")))).append("").append(escapeHtml(CommonUtils.checkNull(item.get("UNIT_NAME")))).append("").append(escapeHtml(CommonUtils.checkNull(item.get("DUE_DATE")))).append("").append(formatNumber(qty)).append("").append(formatNumber(unitPrice)).append("").append(formatNumber(itemSupply)).append("").append(i + 1).append("").append(escapeHtml(CommonUtils.checkNull(item.get("PART_NO")))).append("").append(escapeHtml(CommonUtils.checkNull(item.get("PART_NAME")))).append("").append(escapeHtml(CommonUtils.checkNull(item.get("SPEC")))).append("").append(escapeHtml(CommonUtils.checkNull(item.get("UNIT_NAME")))).append("").append(escapeHtml(CommonUtils.checkNull(item.get("DUE_DATE")))).append("").append(formatNumber(qty)).append("").append(formatNumber(unitPrice)).append("").append(formatNumber(itemSupply)).append("
합 계").append(formatNumber(totalQty)).append("").append(formatNumber(supplyPrice)).append("
합 계
").append(formatNumber(totalQty)).append("").append(formatNumber(supplyPrice)).append("
"); - // 비고(합계 요약) - html.append(""); - html.append(""); - html.append(""); - html.append(""); - html.append(""); - html.append(""); + // 비고(합계 요약) - 4컬럼 + html.append("
비 고공 급 가 액 합 계").append(formatNumber(supplyPrice)).append("
부 가 가 치 세").append(formatNumber(vat)).append("
총 계").append(formatNumber(totalAmount)).append("
"); + html.append(""); + html.append(""); + html.append(""); + html.append(""); + html.append(""); + html.append(""); html.append("
비 고공 급 가 액 합 계").append(formatNumber(supplyPrice)).append("
부 가 가 치 세").append(formatNumber(vat)).append("
총 계").append(formatNumber(totalAmount)).append("
"); // 하단 부가세 구분 + 날짜 - html.append("
"); - html.append("").append(vatNote).append(""); - html.append("").append(escapeHtml(CommonUtils.checkNull(orderInfo.get("REG_DATETIME")))).append(""); - html.append("
"); + html.append(""); + html.append(""); + html.append(""); + html.append("
").append(vatNote).append("").append(regDatetime).append("
"); html.append("
"); @@ -2301,6 +2319,7 @@ public class ApprovalService { String contractNo = CommonUtils.checkNull(orderInfo.get("CONTRACT_NO")); String orderDate = CommonUtils.checkNull(orderInfo.get("ORDER_DATE")); + String poNo = CommonUtils.checkNull(orderInfo.get("PO_NO")); String clientNm = CommonUtils.checkNull(orderInfo.get("CLIENT_NM")); String clientBusRegNo = CommonUtils.checkNull(orderInfo.get("CLIENT_BUS_REG_NO")); String clientCeoNm = CommonUtils.checkNull(orderInfo.get("CLIENT_CEO_NM")); @@ -2319,55 +2338,54 @@ public class ApprovalService { html.append(""); html.append("주문서 - ").append(contractNo).append(""); html.append(""); - html.append("
주 문 서
"); - String poNo = CommonUtils.checkNull(orderInfo.get("PO_NO")); - html.append("
주문일자 : ").append(orderDate).append("
"); - html.append("
증빙번호 : ").append(poNo).append("
"); + html.append("
"); + html.append("
주 문 서
"); + html.append("
주문일자 : ").append(orderDate).append("
"); + html.append("
증빙번호 : ").append(poNo).append("
"); - // 공급받는자/공급자 - html.append(""); - html.append(""); - html.append(""); - html.append(""); - html.append(""); - - html.append(""); - html.append(""); - - html.append(""); - html.append(""); - - html.append(""); - html.append(""); + // 공급받는자 / 공급자 (10컬럼) + html.append("




등록번호").append(clientBusRegNo).append("

등록번호314-81-75146
상 호").append(clientNm).append("성명").append(clientCeoNm).append("상 호주식회사알피에스본사성명이동헌
주 소").append(clientAddr).append("주 소대전광역시 유성구 국제과학10로 8(둔곡동)
업 태").append(clientBusType).append("종목").append(clientBusItem).append("업 태제조업종목금속절삭가공기계,반도체제조용기계
"); + html.append(""); + html.append(""); + html.append(""); + html.append(""); + html.append(""); + html.append(""); + html.append(""); + html.append(""); + html.append(""); + html.append(""); + html.append(""); + html.append(""); + html.append(""); + html.append(""); + html.append(""); html.append("
공급받는자등록번호").append(clientBusRegNo).append("공 급 자등록번호314-81-75146
상 호").append(clientNm).append("성명").append(clientCeoNm).append("상 호주식회사알피에스본사성명이동헌
주 소").append(clientAddr).append("주 소대전광역시 유성구 국제과학10로 8(둔곡동)
업 태").append(clientBusType).append("종목").append(clientBusItem).append("업 태제조업종목금속절삭가공기계,반도체제조용기계
"); - // 납품처/담당자 - html.append(""); - html.append(""); - html.append(""); - html.append(""); - html.append(""); - html.append(""); - html.append(""); + // 납품처 / 담당자 (6컬럼) + html.append("
납 품 처").append(clientNm).append("전화번호").append(clientTelNo).append("팩스번호").append(clientFaxNo).append("
주 소").append(clientAddr).append("담 당 자").append(writerName).append("C.P.번호
"); + html.append(""); + html.append(""); + html.append(""); + html.append(""); + html.append(""); + html.append(""); + html.append(""); html.append("
납 품 처").append(clientNm).append("전화번호").append(clientTelNo).append("팩스번호").append(clientFaxNo).append("
주 소").append(clientAddr).append("담 당 자").append(writerName).append("C.P.번호
"); - // 품목 - html.append(""); - html.append(""); - html.append(""); - html.append(""); + // 품목 (9컬럼) + html.append("
No.품번품명규격단위납기일수량단가금액
"); + html.append(""); + html.append(""); + html.append(""); int totalQty = 0; if(itemList != null){ @@ -2378,37 +2396,41 @@ public class ApprovalService { totalQty += qty; html.append(""); - html.append(""); - html.append(""); + html.append(""); + html.append(""); html.append(""); html.append(""); - html.append(""); - html.append(""); - html.append(""); - html.append(""); - html.append(""); + html.append(""); + html.append(""); + html.append(""); + html.append(""); + html.append(""); html.append(""); } } - html.append(""); - html.append(""); - html.append(""); + // 합계 + html.append(""); + html.append(""); + html.append(""); + html.append(""); html.append("
No.품번품명규격단위납기일수량단가금액
").append(i + 1).append("").append(CommonUtils.checkNull(item.get("PART_NO"))).append("").append(i + 1).append("").append(CommonUtils.checkNull(item.get("PART_NO"))).append("").append(CommonUtils.checkNull(item.get("PART_NAME"))).append("").append(CommonUtils.checkNull(item.get("SPEC"))).append("").append(CommonUtils.checkNull(item.get("UNIT_NAME"))).append("").append(CommonUtils.checkNull(item.get("DUE_DATE"))).append("").append(formatNumber(qty)).append("").append(formatNumber(CommonUtils.checkNull(item.get("ORDER_UNIT_PRICE")))).append("").append(formatNumber(CommonUtils.checkNull(item.get("ORDER_SUPPLY_PRICE")))).append("").append(CommonUtils.checkNull(item.get("UNIT_NAME"))).append("").append(CommonUtils.checkNull(item.get("DUE_DATE"))).append("").append(formatNumber(qty)).append("").append(formatNumber(CommonUtils.checkNull(item.get("ORDER_UNIT_PRICE")))).append("").append(formatNumber(CommonUtils.checkNull(item.get("ORDER_SUPPLY_PRICE")))).append("
합 계").append(formatNumber(totalQty)).append("").append(formatNumber(supplyPrice)).append("
합 계
").append(formatNumber(totalQty)).append("").append(formatNumber(supplyPrice)).append("
"); - // 비고 - html.append(""); - html.append(""); + // 비고 (4컬럼) + html.append("
비 고
"); + html.append(""); + html.append(""); html.append(""); - html.append(""); - html.append(""); - html.append(""); + html.append(""); + html.append(""); + html.append(""); html.append("
비 고공 급 가 액 합 계").append(formatNumber(supplyPrice)).append("
부 가 가 치 세").append(formatNumber(vat)).append("
총 계").append(formatNumber(totalAmount)).append("
공 급 가 액 합 계").append(formatNumber(supplyPrice)).append("
부 가 가 치 세").append(formatNumber(vat)).append("
총 계").append(formatNumber(totalAmount)).append("
"); // 하단 부가세 구분 + 날짜 html.append("
"); html.append("").append(vatNote).append(""); html.append("").append(regDatetime).append(""); html.append("
"); + html.append("
"); html.append("");