From 68120dc749d8bb282709ef7347b75fd0bd6f4527 Mon Sep 17 00:00:00 2001 From: hjjeong Date: Thu, 12 Mar 2026 10:13:50 +0900 Subject: [PATCH] =?UTF-8?q?=EA=B5=AC=EB=A7=A4=ED=92=88=EC=9D=98=EC=84=9C?= =?UTF-8?q?=20=EC=95=84=EB=A7=88=EB=9E=80=EC=8A=A4=20=EA=B2=B0=EC=9E=AC=20?= =?UTF-8?q?=EC=96=91=EC=8B=9D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/com/pms/service/ApprovalService.java | 260 +++++++++++++---------- 1 file changed, 150 insertions(+), 110 deletions(-) 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 방지) */