diff --git a/WebContent/WEB-INF/view/purchaseOrder/deliveryMngAcceptancePartList.jsp b/WebContent/WEB-INF/view/purchaseOrder/deliveryMngAcceptancePartList.jsp index e0f054e..81be0e5 100644 --- a/WebContent/WEB-INF/view/purchaseOrder/deliveryMngAcceptancePartList.jsp +++ b/WebContent/WEB-INF/view/purchaseOrder/deliveryMngAcceptancePartList.jsp @@ -317,7 +317,7 @@ function fn_purchaseClose(){
- +
diff --git a/WebContent/WEB-INF/view/salesMng/quotationRequestList.jsp b/WebContent/WEB-INF/view/salesMng/quotationRequestList.jsp index f42f22a..3273969 100644 --- a/WebContent/WEB-INF/view/salesMng/quotationRequestList.jsp +++ b/WebContent/WEB-INF/view/salesMng/quotationRequestList.jsp @@ -88,8 +88,28 @@ var columns = [ {headerHozAlign:'center', hozAlign:'center', widthGrow:1.2, title:'프로젝트번호', field:'PROJECT_NUMBER'}, {headerHozAlign:'center', hozAlign:'center', widthGrow:0.7, title:'주문유형', field:'ORDER_TYPE_NAME'}, {headerHozAlign:'center', hozAlign:'center', widthGrow:0.7, title:'제품구분', field:'PRODUCT_NAME_TITLE'}, - {headerHozAlign:'center', hozAlign:'left', widthGrow:1.2, title:'품번', field:'PART_NO'}, - {headerHozAlign:'center', hozAlign:'left', widthGrow:1.5, title:'품명', field:'PART_NAME'}, + {headerHozAlign:'center', hozAlign:'left', widthGrow:1.2, title:'품번', field:'PART_NO', + formatter: function(cell, formatterParams, onRendered){ + var partNo = fnc_checkNull(cell.getValue()); + var detailCount = parseInt(fnc_checkNull(cell.getData().DETAIL_COUNT)) || 0; + if(partNo === '') return ''; + if(detailCount > 1) { + return partNo + ' 외 ' + (detailCount - 1) + '건'; + } + return partNo; + } + }, + {headerHozAlign:'center', hozAlign:'left', widthGrow:1.5, title:'품명', field:'PART_NAME', + formatter: function(cell, formatterParams, onRendered){ + var partName = fnc_checkNull(cell.getValue()); + var detailCount = parseInt(fnc_checkNull(cell.getData().DETAIL_COUNT)) || 0; + if(partName === '') return ''; + if(detailCount > 1) { + return partName + ' 외 ' + (detailCount - 1) + '건'; + } + return partName; + } + }, {headerHozAlign:'center', hozAlign:'left', widthGrow:1.2, title:'업체명', field:'VENDOR_NAME', formatter: function(cell, formatterParams, onRendered){ var value = fnc_checkNull(cell.getValue()); diff --git a/src/com/pms/mapper/salesMng.xml b/src/com/pms/mapper/salesMng.xml index 8cbe26c..8971137 100644 --- a/src/com/pms/mapper/salesMng.xml +++ b/src/com/pms/mapper/salesMng.xml @@ -4503,9 +4503,16 @@ ORDER BY V.PATH2 PM.PROJECT_NO AS PROJECT_NUMBER, -- 업체 정보 CM.CLIENT_NM AS VENDOR_NAME, - -- 품번/품명 (프로젝트 정보) - PM.PART_NO, - PM.PART_NAME, + -- 품번/품명 (견적요청서 상세 - 첫 번째 품목) + (SELECT QRD.PART_NO FROM QUOTATION_REQUEST_DETAIL QRD + WHERE QRD.QUOTATION_REQUEST_MASTER_OBJID = QRM.OBJID + ORDER BY QRD.OBJID LIMIT 1) AS PART_NO, + (SELECT QRD.PART_NAME FROM QUOTATION_REQUEST_DETAIL QRD + WHERE QRD.QUOTATION_REQUEST_MASTER_OBJID = QRM.OBJID + ORDER BY QRD.OBJID LIMIT 1) AS PART_NAME, + -- 견적요청서 상세 품목 개수 + (SELECT COUNT(*) FROM QUOTATION_REQUEST_DETAIL QRD + WHERE QRD.QUOTATION_REQUEST_MASTER_OBJID = QRM.OBJID) AS DETAIL_COUNT, -- 수신견적서 첨부파일 개수 (SELECT COUNT(*) FROM ATTACH_FILE_INFO WHERE TARGET_OBJID = QRM.OBJID::VARCHAR AND DOC_TYPE = 'QUOTATION_RECEIVED' AND STATUS = 'Active') AS ATTACH_FILE_CNT FROM QUOTATION_REQUEST_MASTER QRM diff --git a/src/com/pms/service/PurchaseOrderService.java b/src/com/pms/service/PurchaseOrderService.java index 056b096..2839a39 100644 --- a/src/com/pms/service/PurchaseOrderService.java +++ b/src/com/pms/service/PurchaseOrderService.java @@ -3007,11 +3007,30 @@ public class PurchaseOrderService { masterInfo.put("EXCELFILE_NAME", excelName); masterInfo.put("APPR_COMPLETE_DATE", frm2.format(cal.getTime())); - // 발주서 테이블 내용 생성 - String contents_table = this.makePoContentsTable(masterInfo, detailList, apprList, multiMasterList); + // pdfSessionId 확인 (PDF 첨부 여부 결정) + String pdfSessionId = CommonUtils.checkNull(paramMap.get("pdfSessionId")); + boolean isPdfAttach = false; - // 메일 본문 생성 (사용자 입력 내용 + 발주서 테이블) - String mailContents = this.makeMailContentsWithUserInput(contents, contents_table); + // PDF 파일 존재 여부 확인 + if(!"".equals(pdfSessionId)) { + String tempDir = System.getProperty("java.io.tmpdir"); + File pdfFile = new File(tempDir + File.separator + pdfSessionId + ".pdf"); + isPdfAttach = pdfFile.exists(); + } + + // 발주서 테이블 내용 생성 (PDF 첨부 시에는 사용하지 않음) + String contents_table = ""; + if(!isPdfAttach) { + contents_table = this.makePoContentsTable(masterInfo, detailList, apprList, multiMasterList); + } + + // 메일 본문 생성 (PDF 첨부 시에는 사용자 입력 내용만, 아니면 테이블 포함) + String mailContents = ""; + if(isPdfAttach) { + mailContents = this.makeMailContentsWithoutTable(contents); + } else { + mailContents = this.makeMailContentsWithUserInput(contents, contents_table); + } // 수신인 이메일 목록 생성 ArrayList toUserIdList = new ArrayList(); @@ -3044,10 +3063,26 @@ public class PurchaseOrderService { // 첨부파일 목록 생성 ArrayList attachFileList = new ArrayList(); - // 1. 발주서 엑셀 파일 첨부 - HashMap excelFile = this.makeMailAttachFileOrderSheet(masterInfo, contents_table); - if(excelFile != null) { - attachFileList.add(excelFile); + // 1. 발주서 첨부 (PDF 또는 엑셀) + if(isPdfAttach) { + // PDF 파일 첨부 + String tempDir = System.getProperty("java.io.tmpdir"); + File pdfFile = new File(tempDir + File.separator + pdfSessionId + ".pdf"); + String pdfFileName = "발주서_" + poNo + "_" + todayKor + ".pdf"; + + HashMap pdfFileMap = new HashMap(); + pdfFileMap.put(Constants.Db.COL_FILE_REAL_NAME, pdfFileName); + pdfFileMap.put(Constants.Db.COL_FILE_SAVED_NAME, pdfFile.getName()); + pdfFileMap.put(Constants.Db.COL_FILE_PATH, tempDir); + attachFileList.add(pdfFileMap); + + System.out.println("발주서 PDF 첨부 완료: " + pdfFile.getAbsolutePath()); + } else { + // 엑셀 파일 첨부 (PDF 없을 때) + HashMap excelFile = this.makeMailAttachFileOrderSheet(masterInfo, contents_table); + if(excelFile != null) { + attachFileList.add(excelFile); + } } // 2. 도면 파일 압축 첨부 (includeDrawingFiles가 Y인 경우에만) @@ -3108,6 +3143,36 @@ public class PurchaseOrderService { return resultMap; } + /** + * 사용자 입력 내용만으로 메일 본문 생성 (PDF 첨부 시 테이블 없이) + * @param userContents 사용자가 입력한 메일 내용 + * @return 완성된 메일 본문 + */ + private String makeMailContentsWithoutTable(String userContents) { + StringBuffer sb = new StringBuffer(); + sb.append(""); + sb.append(""); + sb.append(" "); + sb.append(" "); + sb.append(""); + sb.append(""); + + // 사용자 입력 내용 (줄바꿈을
로 변환) + sb.append("
"); + sb.append(userContents.replace("\n", "
")); + sb.append("
"); + + sb.append("
※ 발주서는 첨부파일(PDF)을 확인해주세요.
"); + sb.append(""); + sb.append(""); + + return sb.toString(); + } + /** * 사용자 입력 내용과 발주서 테이블을 합친 메일 본문 생성 * @param userContents 사용자가 입력한 메일 내용