diff --git a/WebContent/WEB-INF/view/purchaseOrder/purchaseCloseList.jsp b/WebContent/WEB-INF/view/purchaseOrder/purchaseCloseList.jsp index 1a955c9..24603c5 100644 --- a/WebContent/WEB-INF/view/purchaseOrder/purchaseCloseList.jsp +++ b/WebContent/WEB-INF/view/purchaseOrder/purchaseCloseList.jsp @@ -79,13 +79,14 @@ var columns = [ {title:'PURCHASE_ORDER_PART_OBJID', field:'PURCHASE_ORDER_PART_OBJID', visible:false, frozen:true}, {title:'FORM_TYPE', field:'FORM_TYPE', visible:false, frozen:true}, {title:'ARRIVAL_PLAN_OBJID', field:'ARRIVAL_PLAN_OBJID', visible:false, frozen:true}, - {headerHozAlign:'center', hozAlign:'center', minWidth:110, widthGrow:0.9, title:'품의서 No', field:'PROPOSAL_NO', + {title:'SUB_LOCATION', field:'SUB_LOCATION', visible:false, frozen:true}, + {headerHozAlign:'center', hozAlign:'center', minWidth:110, widthGrow:0.9, title:'품의서 No', field:'PROPOSAL_NO', frozen:true, formatter: fnc_createGridAnchorTag, cellClick: function(e, cell){ fn_openProposalFormPopUp(cell.getData().SALES_REQUEST_OBJID); } }, - {headerHozAlign:'center', hozAlign:'center', minWidth:110, widthGrow:0.9, title:'발주서 No', field:'PURCHASE_ORDER_NO', + {headerHozAlign:'center', hozAlign:'center', minWidth:110, widthGrow:0.9, title:'발주서 No', field:'PURCHASE_ORDER_NO', frozen:true, formatter: fnc_createGridAnchorTag, cellClick: function(e, cell){ var objId = fnc_checkNull(cell.getData().PURCHASE_ORDER_MASTER_OBJID); @@ -93,12 +94,12 @@ var columns = [ fn_formPopUp(objId, formType); } }, - {headerHozAlign:'center', hozAlign:'center', minWidth:120, 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:'center', minWidth:120, widthGrow:0.9, title:'프로젝트번호', field:'PROJECT_NO', frozen:true}, + {headerHozAlign:'center', hozAlign:'left', minWidth:120, widthGrow:1.5, title:'부품품번', field:'COMPONENT_PART_NO', frozen:true}, + {headerHozAlign:'center', hozAlign:'left', minWidth:120, widthGrow:1.5, title:'품번', field:'PART_NO', frozen:true}, + {headerHozAlign:'center', hozAlign:'left', minWidth:150, widthGrow:2, title:'품명', field:'PART_NAME', frozen:true}, {headerHozAlign:'center', hozAlign:'left', minWidth:120, widthGrow:1.2, title:'공급업체', field:'PARTNER_NAME'}, - {headerHozAlign:'center', hozAlign:'center', minWidth:90, widthGrow:0.7, title:'입고일', field:'RECEIPT_DATE'}, + {headerHozAlign:'center', hozAlign:'center', minWidth:90, widthGrow:0.7, title:'입고일', field:'RECEIPT_DATE'}, //{headerHozAlign:'center', hozAlign:'center', minWidth:100, widthGrow:0.8, title:'입고요청일', field:'DELIVERY_REQUEST_DATE'}, {headerHozAlign:'center', hozAlign:'center', minWidth:90, widthGrow:1, title:'구매담당자', field:'WRITER_NAME'}, // {headerHozAlign:'center', hozAlign:'right', minWidth:80, widthGrow:0.8, title:'발주수량', field:'ORDER_QTY', @@ -126,7 +127,8 @@ var columns = [ {headerHozAlign:'center', hozAlign:'right', minWidth:100, 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:'left', minWidth:100, widthGrow:1.2, title:'계정과목', field:'SUB_LOCATION_NAME'}, + {headerHozAlign:'center', hozAlign:'center', minWidth:85, widthGrow:0.6, title:'매입마감', field:'PURCHASE_CLOSE_DATE'} ]; function fn_search(){ @@ -145,7 +147,7 @@ function fn_search(){ value: selectedIdValues }).appendTo('#form1'); - _tabulGrid = fnc_tabul_search(_tabul_layout_fitColumns, _tabulGrid, "/purchaseOrder/purchaseCloseGridList.do", columns, true); + _tabulGrid = fnc_tabul_search(_tabul_layout_fitDataStretch, _tabulGrid, "/purchaseOrder/purchaseCloseGridList.do", columns, true); if(_tabulGrid) { _tabulGrid.off("renderComplete"); diff --git a/src/com/pms/mapper/purchaseOrder.xml b/src/com/pms/mapper/purchaseOrder.xml index b4025d4..88be224 100644 --- a/src/com/pms/mapper/purchaseOrder.xml +++ b/src/com/pms/mapper/purchaseOrder.xml @@ -6555,6 +6555,10 @@ FROM( ,(COALESCE(AP_AGG.TOTAL_DELIVERY_QTY, 0) - COALESCE(DEFECT_AGG.DEFECT_QTY, 0)) AS CONFIRMED_QTY + + ,AP.SUB_LOCATION + ,COALESCE((SELECT ACCT_NM FROM ERP_ACCT_CODE WHERE ACCT_CD = AP.SUB_LOCATION), AP.SUB_LOCATION) AS SUB_LOCATION_NAME + ,AP.PURCHASE_CLOSE_DATE diff --git a/src/com/pms/service/ApprovalService.java b/src/com/pms/service/ApprovalService.java index 641476e..73a5dae 100644 --- a/src/com/pms/service/ApprovalService.java +++ b/src/com/pms/service/ApprovalService.java @@ -3286,108 +3286,127 @@ public class ApprovalService { StringBuilder html = new StringBuilder(); String proposalNo = CommonUtils.checkNull(proposalInfo.get("PROPOSAL_NO")); - String projectNumber = CommonUtils.checkNull(proposalInfo.get("PROJECT_NUMBER")); - String projectName = CommonUtils.checkNull(proposalInfo.get("PROJECT_NAME")); - String purchaseTypeName = CommonUtils.checkNull(proposalInfo.get("PURCHASE_TYPE_NAME")); - String orderTypeName = CommonUtils.checkNull(proposalInfo.get("ORDER_TYPE_NAME")); - String productName = CommonUtils.checkNull(proposalInfo.get("PRODUCT_NAME_TITLE")); - String customerName = CommonUtils.checkNull(proposalInfo.get("PROJECT_CUSTOMER_NAME")); String writerName = CommonUtils.checkNull(proposalInfo.get("WRITER_NAME")); String regdate = CommonUtils.checkNull(proposalInfo.get("REGDATE_TITLE")); - String remark = CommonUtils.checkNull(proposalInfo.get("REMARK")); - String totalAmount = CommonUtils.checkNull(proposalInfo.get("TOTAL_AMOUNT")); - 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(""); - if(!totalAmount.isEmpty()){ - html.append(""); - html.append(""); - } else { - html.append(""); + String deptName = "-"; + String writerOnly = "-"; + if(!writerName.isEmpty()){ + if(writerName.contains(" ")){ + deptName = writerName.substring(0, writerName.indexOf(" ")); + writerOnly = writerName.substring(writerName.lastIndexOf(" ") + 1); + } else { + deptName = writerName; + writerOnly = writerName; + } } - html.append(""); - html.append("
품의서 No").append(escapeHtml(proposalNo)).append("작성일").append(escapeHtml(regdate)).append("
프로젝트번호").append(escapeHtml(projectNumber)).append("프로젝트명").append(escapeHtml(projectName)).append("
구매유형").append(escapeHtml(purchaseTypeName)).append("주문유형").append(escapeHtml(orderTypeName)).append("
제품구분").append(escapeHtml(productName)).append("고객사").append(escapeHtml(customerName)).append("
작성자").append(escapeHtml(writerName)).append("합계금액").append(escapeHtml(totalAmount)).append("
"); - - // 품의서 품목 리스트 조회 + List partList = null; try { Map partParam = new HashMap(); partParam.put("PROPOSAL_OBJID", targetObjId); - List partList = sqlSession.selectList("salesMng.getProposalPartList", partParam); - - if(partList != null && !partList.isEmpty()){ - 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 idx = 1; - for(Map partInfo : partList){ - html.append(""); - html.append(""); - html.append(""); - html.append(""); - html.append(""); - html.append(""); - html.append(""); - html.append(""); - html.append(""); - html.append(""); - } - html.append("
No품번품명규격수량단가금액거래처
").append(idx++).append("").append(escapeHtml(CommonUtils.checkNull(partInfo.get("PART_NO")))).append("").append(escapeHtml(CommonUtils.checkNull(partInfo.get("PART_NAME")))).append("").append(escapeHtml(CommonUtils.checkNull(partInfo.get("SPEC")))).append("").append(escapeHtml(CommonUtils.checkNull(partInfo.get("QTY")))).append("").append(escapeHtml(CommonUtils.checkNull(partInfo.get("UNIT_PRICE")))).append("").append(escapeHtml(CommonUtils.checkNull(partInfo.get("TOTAL_PRICE")))).append("").append(escapeHtml(CommonUtils.checkNull(partInfo.get("VENDOR_NAME")))).append("
"); - } + partList = sqlSession.selectList("salesMng.getProposalPartList", partParam); } catch(Exception e){ System.err.println("품의서 품목 리스트 조회 오류: " + e.getMessage()); } - // 비고 - if(!remark.isEmpty()){ - html.append("

비고: ").append(escapeHtml(remark)).append("

"); + long totalAmount = 0; + if(partList != null){ + for(Map part : partList){ + try { + Object tp = part.get("TOTAL_PRICE"); + if(tp != null) totalAmount += Math.round(Double.parseDouble(tp.toString())); + } catch(Exception ignore){} + } } + // 인라인 스타일 상수 + String LBL = "border:1px solid #999;background-color:#f5f5f5;font-weight:bold;text-align:center;padding:2px 4px;height:26px;vertical-align:middle;width:90px;"; + String VAL = "border:1px solid #999;padding:2px 8px;height:26px;vertical-align:middle;text-align:left;"; + String HDR = "border:1px solid #999;background-color:#ebf1de;font-weight:bold;padding:5px 8px;text-align:center;vertical-align:middle;"; + String CELL = "border:1px solid #999;padding:5px 8px;text-align:center;vertical-align:middle;"; + String TOT_HDR = "border:1px solid #999;background-color:#dce6f1;font-weight:bold;padding:5px 8px;text-align:center;vertical-align:middle;"; + String TOT_VAL = "border:1px solid #999;background-color:#ffffcc;font-weight:bold;text-align:right;font-size:14px;padding:5px 8px;vertical-align:middle;"; + String ITH = "border:1px solid #999;background-color:#f5f5f5;font-weight:bold;text-align:center;padding:1px 2px;height:30px;vertical-align:middle;font-size:11px;"; + String ITC = "border:1px solid #999;text-align:center;padding:1px 2px;height:35px;vertical-align:middle;font-size:11px;"; + String ITL = "border:1px solid #999;text-align:left;padding:1px 4px;height:35px;vertical-align:middle;font-size:11px;"; + String ITR = "border:1px solid #999;text-align:right;padding:1px 4px;height:35px;vertical-align:middle;font-size:11px;"; + String BORDER_LR = "border-left:2px solid #000;border-right:2px solid #000;"; + + html.append("
"); + + // 제목 + html.append("
구 매 품 의 서
"); + + // 상단 기본정보 + html.append(""); + html.append(""); + html.append(""); + html.append(""); + html.append(""); + html.append("
품의번호").append(escapeHtml(proposalNo)).append("
작성일자").append(escapeHtml(regdate)).append("
기안부서").append(escapeHtml(deptName)).append("
기 안 자").append(escapeHtml(writerOnly)).append("
"); + + // 개정 정보 + html.append("
[구매품의서 개정 : 22.05.17]
"); + + // 중간 정보 섹션 + 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(escapeHtml(regdate)).append("총 합 계
").append(escapeHtml(deptName)).append("").append(escapeHtml(deptName)).append("기 안 자").append(escapeHtml(writerOnly)).append("").append(formatNumber(totalAmount)).append("
"); + + // 품목 테이블 (12컬럼 - JSP와 동일) + 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(""); + + if(partList != null && !partList.isEmpty()){ + int idx = 1; + for(Map partInfo : partList){ + 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(""); + } + } else { + html.append(""); + } + + html.append("
No.목 적제 품 명부 품 명품 명규 격업 체 명입고요청일수량단위단가합 계
").append(idx++).append("").append(escapeHtml(CommonUtils.checkNull(partInfo.get("REMARK")))).append("").append(escapeHtml(CommonUtils.checkNull(partInfo.get("PROJECT_PRODUCT_NAME")))).append("").append(escapeHtml(CommonUtils.checkNull(partInfo.get("COMPONENT_PART_NAME")))).append("").append(escapeHtml(CommonUtils.checkNull(partInfo.get("DISPLAY_PART_NAME")))).append("").append(escapeHtml(CommonUtils.checkNull(partInfo.get("DISPLAY_SPEC")))).append("").append(escapeHtml(CommonUtils.checkNull(partInfo.get("VENDOR_NAME")))).append("").append(escapeHtml(CommonUtils.checkNull(partInfo.get("DELIVERY_REQUEST_DATE_TITLE")))).append("").append(formatNumber(CommonUtils.checkNull(partInfo.get("QTY")))).append("").append(escapeHtml(CommonUtils.checkNull(partInfo.get("UNIT_TITLE")))).append("").append(formatDecimalNumber(CommonUtils.checkNull(partInfo.get("UNIT_PRICE")))).append("").append(formatDecimalNumber(CommonUtils.checkNull(partInfo.get("TOTAL_PRICE")))).append("
등록된 품목이 없습니다.
"); html.append("
"); return html.toString(); } @@ -3503,48 +3522,54 @@ public class ApprovalService { h.append("").append(formatNumber(totalAmount)).append(""); h.append("
"); - // 품목 테이블 + // 품목 테이블 (12컬럼 - JSP와 동일) h.append("
"); - h.append(""); - h.append(""); - h.append(""); - h.append(""); - h.append(""); - h.append(""); - h.append(""); - h.append(""); - h.append(""); + h.append(""); + h.append(""); + h.append(""); + h.append(""); + h.append(""); + h.append(""); + h.append(""); + h.append(""); + h.append(""); + h.append(""); + h.append(""); + h.append(""); h.append(""); if(partList != null && !partList.isEmpty()){ int idx = 1; for(Map part : partList){ - String partName = CommonUtils.checkNull(part.get("PART_NAME")); - String spec = CommonUtils.checkNull(part.get("SPEC")); String partRemark = CommonUtils.checkNull(part.get("REMARK")); - String deliveryDate = CommonUtils.checkNull(part.get("DELIVERY_REQUEST_DATE_TITLE")); + String projectProductName = CommonUtils.checkNull(part.get("PROJECT_PRODUCT_NAME")); + String componentPartName = CommonUtils.checkNull(part.get("COMPONENT_PART_NAME")); + String displayPartName = CommonUtils.checkNull(part.get("DISPLAY_PART_NAME")); + String displaySpec = CommonUtils.checkNull(part.get("DISPLAY_SPEC")); String vendorName = CommonUtils.checkNull(part.get("VENDOR_NAME")); + String deliveryDate = CommonUtils.checkNull(part.get("DELIVERY_REQUEST_DATE_TITLE")); String qty = CommonUtils.checkNull(part.get("QTY")); - String unit = CommonUtils.checkNull(part.get("UNIT_NAME")); + String unitTitle = CommonUtils.checkNull(part.get("UNIT_TITLE")); String unitPrice = CommonUtils.checkNull(part.get("UNIT_PRICE")); String totalPrice = CommonUtils.checkNull(part.get("TOTAL_PRICE")); h.append(""); h.append(""); h.append(""); - h.append(""); - h.append(""); + h.append(""); + h.append(""); + h.append(""); + h.append(""); h.append(""); + h.append(""); h.append(""); - h.append(""); - h.append(""); - h.append(""); + h.append(""); + h.append(""); + h.append(""); h.append(""); } } else { - h.append(""); + h.append(""); } h.append("
No.목 적품명 / 규격납 기 일업 체 명수량단위단가합 계No.목 적제 품 명부 품 명품 명규 격업 체 명입고요청일수량단위단가합 계
").append(idx++).append("").append(escapeHtml(partRemark)).append("").append(escapeHtml(partName)); - if(!spec.isEmpty()) h.append("
(").append(escapeHtml(spec)).append(")"); - h.append("
").append(escapeHtml(deliveryDate)).append("").append(escapeHtml(projectProductName)).append("").append(escapeHtml(componentPartName)).append("").append(escapeHtml(displayPartName)).append("").append(escapeHtml(displaySpec)).append("").append(escapeHtml(vendorName)).append("").append(escapeHtml(deliveryDate)).append("").append(formatNumber(qty)).append("").append(escapeHtml(unit)).append("").append(formatNumber(unitPrice)).append("").append(formatNumber(totalPrice)).append("").append(escapeHtml(unitTitle)).append("").append(formatDecimalNumber(unitPrice)).append("").append(formatDecimalNumber(totalPrice)).append("
등록된 품목이 없습니다.
등록된 품목이 없습니다.
"); @@ -3571,6 +3596,21 @@ public class ApprovalService { } } + /** + * 숫자 천단위 콤마 + 소수점 2자리 포맷 (단가, 합계용) + */ + private String formatDecimalNumber(Object value){ + if(value == null) return "0.00"; + try { + String strVal = value.toString().replaceAll("[^0-9.\\-]", ""); + if(strVal.isEmpty()) return "0.00"; + double num = Double.parseDouble(strVal); + return String.format("%,.2f", num); + } catch(Exception e){ + return value.toString(); + } + } + /** * HTML 이스케이프 (XSS 방지) */