From 69f14ac511b7dbff91511dcd75c0e2507ede1547 Mon Sep 17 00:00:00 2001 From: leeheejin Date: Fri, 19 Dec 2025 15:07:35 +0900 Subject: [PATCH] =?UTF-8?q?CER=EA=B4=80=EB=A6=AC=EC=9D=98=20=EC=84=A4?= =?UTF-8?q?=EA=B3=84=EB=B3=80=EA=B2=BD=EC=9A=94=EC=B2=AD=EC=84=9C=EC=99=80?= =?UTF-8?q?=20=EB=B0=98=EC=A0=9C=ED=92=88=EA=B4=80=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../classes/com/pms/mapper/quality.xml | 24 ++ .../WEB-INF/view/quality/ecrDocFormPopUp.jsp | 257 ++++++++++++++++++ WebContent/WEB-INF/view/quality/ecrList.jsp | 31 ++- .../semiProductInspectionFormPopUp.jsp | 87 ++++-- .../quality/semiProductInspectionList.jsp | 45 ++- src/com/pms/controller/QualityController.java | 23 ++ src/com/pms/mapper/quality.xml | 24 ++ src/com/pms/service/QualityService.java | 33 +++ 8 files changed, 468 insertions(+), 56 deletions(-) create mode 100644 WebContent/WEB-INF/view/quality/ecrDocFormPopUp.jsp diff --git a/WebContent/WEB-INF/classes/com/pms/mapper/quality.xml b/WebContent/WEB-INF/classes/com/pms/mapper/quality.xml index 6f2cf41..993b93d 100644 --- a/WebContent/WEB-INF/classes/com/pms/mapper/quality.xml +++ b/WebContent/WEB-INF/classes/com/pms/mapper/quality.xml @@ -1665,6 +1665,7 @@ , COALESCE(SPI.WORK_ORDER_NO, '') AS "WORK_ORDER_NO" , COALESCE(SPI.PART_NO, '') AS "PART_NO" , COALESCE(SPI.PART_NAME, '') AS "PART_NAME" + , COALESCE(PM.OBJID::VARCHAR, '') AS "PART_OBJID" , COALESCE(SPI.RECEIPT_QTY, 0) AS "RECEIPT_QTY" , COALESCE(SPI.GOOD_QTY, 0) AS "GOOD_QTY" , COALESCE(SPI.DEFECT_QTY, 0) AS "DEFECT_QTY" @@ -1684,6 +1685,7 @@ , (SELECT COUNT(*) FROM ATTACH_FILE_INFO AFI WHERE AFI.TARGET_OBJID = SPI.OBJID AND AFI.DOC_TYPE = 'SEMI_INSPECTION_NCR' AND AFI.STATUS = 'Active') AS "NCR_FILE_CNT" , (SELECT COUNT(*) FROM ATTACH_FILE_INFO AFI WHERE AFI.TARGET_OBJID = SPI.OBJID AND AFI.DOC_TYPE = 'SEMI_INSPECTION_REPORT' AND AFI.STATUS = 'Active') AS "REPORT_FILE_CNT" FROM PMS_QUALITY_SEMI_PRODUCT_INSPECTION SPI + LEFT JOIN PART_MNG PM ON PM.PART_NO = SPI.PART_NO WHERE 1=1 AND (SPI.INSPECTION_GROUP_ID = #{INSPECTION_GROUP_ID} OR SPI.OBJID = #{INSPECTION_GROUP_ID}) @@ -2102,6 +2104,8 @@ , ECR.COMPLETE_DATE , (SELECT COUNT(*) FROM ATTACH_FILE_INFO AFI WHERE AFI.TARGET_OBJID = ECR.OBJID AND AFI.DOC_TYPE = 'ECR_RESULT_IMAGE' AND STATUS = 'Active') AS IMAGE_FILE , (SELECT COUNT(*) FROM ATTACH_FILE_INFO AFI WHERE AFI.TARGET_OBJID = ECR.OBJID AND AFI.DOC_TYPE = 'ECR_RESULT' AND STATUS = 'Active') AS ATTACH_FILE + , (SELECT COUNT(*) FROM ATTACH_FILE_INFO AFI WHERE AFI.TARGET_OBJID = ECR.OBJID AND AFI.DOC_TYPE = 'ECR_DOC' AND STATUS = 'Active') AS ECR_DOC_FILE + , CASE WHEN (ECR.ECR_DOC_SUMMARY IS NOT NULL AND ECR.ECR_DOC_SUMMARY != '') OR (ECR.ECR_DOC_REASON IS NOT NULL AND ECR.ECR_DOC_REASON != '') THEN 1 ELSE 0 END AS ECR_DOC_CNT FROM PMS_QUALITY_ECR ECR WHERE 1=1 @@ -2176,6 +2180,12 @@ , ECR.REMARK , ECR.WRITER , TO_CHAR(ECR.REG_DATE, 'YYYY-MM-DD') AS REG_DATE + , ECR.ECR_DOC_SUMMARY + , ECR.ECR_DOC_REASON + , ECR.ECR_REV_NO + , ECR.ECR_REV_DATE + , ECR.ECR_DOC_FORM_NO + , ECR.ECR_DOC_AUTHOR FROM PMS_QUALITY_ECR ECR WHERE ECR.OBJID = #{OBJID} @@ -2253,6 +2263,20 @@ WHERE OBJID = #{OBJID} + + + UPDATE PMS_QUALITY_ECR SET + ECR_DOC_FORM_NO = #{ECR_DOC_FORM_NO} + , ECR_REV_NO = #{ECR_REV_NO} + , ECR_REV_DATE = #{ECR_REV_DATE} + , ECR_DOC_AUTHOR = #{ECR_DOC_AUTHOR} + , ECR_DOC_SUMMARY = #{ECR_DOC_SUMMARY} + , ECR_DOC_REASON = #{ECR_DOC_REASON} + , MODIFIER = #{MODIFIER} + , MOD_DATE = NOW() + WHERE OBJID = #{OBJID} + + diff --git a/WebContent/WEB-INF/view/quality/ecrDocFormPopUp.jsp b/WebContent/WEB-INF/view/quality/ecrDocFormPopUp.jsp new file mode 100644 index 0000000..f1e09e4 --- /dev/null +++ b/WebContent/WEB-INF/view/quality/ecrDocFormPopUp.jsp @@ -0,0 +1,257 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> +<%@ page import="com.pms.common.utils.*"%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@include file="/init.jsp"%> + + + + +ECR - Engineering Change Request + + + + + + + + +
+ +
+
+ +
+
+

ECR

+

(Engineering Change Request)

+
+
+ + + + + + + + + + + + + + + + + +
Form no.
Rev.no
Rev. date
Author
+
+
+ + +
+
+ <%--
Fill out clearly, concisely
--%> +
명확하고 간결하게 작성
+ +
+ +
+ <%--
Description of the change (reason / background)
--%> +
변경사항 설명 (이유 / 배경)
+ +
+
+ + + +
+ + +
+ + +
+ + + + + diff --git a/WebContent/WEB-INF/view/quality/ecrList.jsp b/WebContent/WEB-INF/view/quality/ecrList.jsp index 5a93bec..c5c918c 100644 --- a/WebContent/WEB-INF/view/quality/ecrList.jsp +++ b/WebContent/WEB-INF/view/quality/ecrList.jsp @@ -75,9 +75,9 @@ $(document).ready(function(){ fn_search(); }); -// 컬럼: ECR No, 요청일, 요청자, 품번, 품명, 이슈사항, 완료요청일, 조치부서, 조치담당자, 조치자, 조치내용, 완료일, 첨부파일 +// 컬럼: ECR No, 요청일, 요청자, 품번, 품명, 이슈사항, 완료요청일, 조치부서, 조치담당자, 조치자, 조치내용, 완료일, 이미지파일, 첨부파일, 설계변경요청서 var columns = [ - {headerHozAlign:'center', hozAlign:'center', minWidth:110, widthGrow:1, title:'ECR No', field:'ECR_NO', + {headerHozAlign:'center', hozAlign:'center', minWidth:130, widthGrow:1, title:'ECR No', field:'ECR_NO', formatter:fnc_createGridAnchorTag, cellClick: function(e, cell){ var objId = fnc_checkNull(cell.getData().OBJID); @@ -91,11 +91,11 @@ var columns = [ {headerHozAlign:'center', hozAlign:'left', minWidth:150, widthGrow:2, title:'이슈사항', field:'ISSUE_CONTENT'}, {headerHozAlign:'center', hozAlign:'center', minWidth:100, widthGrow:1, title:'완료요청일', field:'DUE_DATE'}, {headerHozAlign:'center', hozAlign:'center', minWidth:90, widthGrow:1, title:'조치부서', field:'ACTION_DEPT_NAME'}, - {headerHozAlign:'center', hozAlign:'center', minWidth:90, widthGrow:1, title:'조치담당자', field:'ACTION_MANAGER_NAME'}, + {headerHozAlign:'center', hozAlign:'center', minWidth:100, widthGrow:1, title:'조치담당자', field:'ACTION_MANAGER_NAME'}, {headerHozAlign:'center', hozAlign:'center', minWidth:80, widthGrow:1, title:'조치자', field:'ACTION_USER_NAME'}, {headerHozAlign:'center', hozAlign:'left', minWidth:150, widthGrow:2, title:'조치내용', field:'ACTION_CONTENT'}, {headerHozAlign:'center', hozAlign:'center', minWidth:100, widthGrow:1, title:'완료일', field:'COMPLETE_DATE'}, - {headerHozAlign:'center', hozAlign:'center', minWidth:80, widthGrow:1, title:'이미지', field:'IMAGE_FILE', + {headerHozAlign:'center', hozAlign:'center', minWidth:85, widthGrow:1, title:'이미지파일', field:'IMAGE_FILE', formatter:fnc_subInfoValueFormatter, cellClick:function(e, cell){ var objId = fnc_checkNull(cell.getData().OBJID); @@ -108,6 +108,13 @@ var columns = [ var objid = fnc_checkNull(cell.getData().OBJID); fn_FileRegist(objid,"ECR_RESULT","ECR결과첨부"); } + }, + {headerHozAlign:'center', hozAlign:'center', minWidth:110, widthGrow:1, title:'설계변경요청서', field:'ECR_DOC_CNT', + formatter:fnc_subInfoValueFormatter, + cellClick:function(e, cell){ + var objid = fnc_checkNull(cell.getData().OBJID); + fn_openEcrDocPopUp(objid); + } } ]; @@ -223,6 +230,22 @@ function fn_FileRegist(objId, docType, docTypeName){ fn_centerPopup(popup_width, popup_height, url); } +// 설계변경요청서 팝업 +function fn_openEcrDocPopUp(objId){ + var popup_width = 600; + var popup_height = 750; + var url = "/quality/ecrDocFormPopUp.do?OBJID=" + objId; + var popup = window.open(url, "ecrDocPopUp", "width="+popup_width+",height="+popup_height+",scrollbars=yes,resizable=yes"); + + // 팝업 닫힘 감지 및 그리드 새로고침 + var checkPopup = setInterval(function(){ + if(popup.closed){ + clearInterval(checkPopup); + fn_search(); // 그리드 새로고침 + } + }, 500); +} + // 결재상신 function fn_approval(){ var selected = _tabulGrid.getSelectedData(); diff --git a/WebContent/WEB-INF/view/quality/semiProductInspectionFormPopUp.jsp b/WebContent/WEB-INF/view/quality/semiProductInspectionFormPopUp.jsp index 8d371ef..b210e8c 100644 --- a/WebContent/WEB-INF/view/quality/semiProductInspectionFormPopUp.jsp +++ b/WebContent/WEB-INF/view/quality/semiProductInspectionFormPopUp.jsp @@ -39,6 +39,7 @@ String loginUserId = CommonUtils.checkNull(person.getUserId()); font-family: 'Malgun Gothic', sans-serif; } + .popup_wrap { display: flex; flex-direction: column; @@ -311,8 +312,8 @@ var productTypeList = ["Machine", "A/S", "D/S", "B/S", "C/T", "A/C", "W/M", "기 var defectTypeList = ["외관불량", "치수불량", "기능불량", "재료불량", "조립불량", "도장불량", "용접불량", "기타"]; var defectCauseList = ["작업자 실수", "설비 이상", "자재 불량", "설계 오류", "공정 이상", "환경 요인", "기타"]; var responsibleDeptList = ["사용자 정보(부서)", "구매", "생산기술", "제조1팀", "제조2팀", "제조3팀", "연구소", "외주업체", "품질"]; -var processStatusList = ["Rework", "Scrap"]; -var dispositionTypeList = ["특채", "수정", "폐기"]; +var processStatusList = ["수정", "폐기"]; +var dispositionTypeList = ["수정완료", "폐기", "특채완료"]; $(document).ready(function(){ // 입고관리 데이터 로드 @@ -422,11 +423,18 @@ function isEditable(cell){ // ===================================================== // 좌측 그리드 (양품 정보) 초기화 +// 컬럼순서: 검사일, 검사자, 품명(모델명), 제품구분, 작업지시번호, 부품품번, 부품명, 입고수량, 양품수량, 검사성적서 // ===================================================== function fn_initLeftGrid(){ var columns = [ {formatter:"rowSelection", titleFormatter:"rowSelection", hozAlign:"center", headerSort:false, width:30}, - {title:"품명(모델명)", field:"MODEL_NAME", minWidth:120, headerSort:false, + {title:"검사일", field:"INSPECTION_DATE", minWidth:90, headerSort:false, + editor: "input", + editorParams: { elementAttributes: { type: "date" } }, + editable: isEditable + }, + {title:"검사자", field:"INSPECTOR", editor:"input", minWidth:70, headerSort:false, editable: isEditable}, + {title:"품명(모델명)", field:"MODEL_NAME", minWidth:110, headerSort:false, editor: createSelect2Editor(modelNameList), editable: isEditable }, @@ -437,9 +445,23 @@ function fn_initLeftGrid(){ {title:"작업지시번호", field:"WORK_ORDER_NO", editor:"input", minWidth:100, headerSort:false, editable: isEditable }, - {title:"부품품번", field:"PART_NO", minWidth:100, headerSort:false, + {title:"부품품번", field:"PART_NO", minWidth:90, headerSort:false, editor: createSelect2Editor(partNoList), editable: isEditable, + formatter: function(cell){ + var val = cell.getValue(); + if(val){ + return "" + val + ""; + } + return val || ""; + }, + cellClick: function(e, cell){ + var partNo = cell.getValue(); + var rowData = cell.getRow().getData(); + if(partNo && rowData.PART_OBJID){ + fn_openPartInfoPopUp(rowData.PART_OBJID); + } + }, cellEdited: function(cell){ var partNo = cell.getValue(); if(partNo){ @@ -447,6 +469,7 @@ function fn_initLeftGrid(){ if(matched){ cell.getRow().update({ PART_NAME: matched.PART_NAME || '', + PART_OBJID: matched.PART_OBJID || '', RECEIPT_QTY: matched.RECEIPT_QTY || matched.DELIVERY_QTY || '' }); } @@ -469,7 +492,7 @@ function fn_initLeftGrid(){ } } }, - {title:"입고수량", field:"RECEIPT_QTY", editor:"number", hozAlign:"right", minWidth:70, headerSort:false, + {title:"입고수량", field:"RECEIPT_QTY", editor:"number", hozAlign:"right", minWidth:80, headerSort:false, editorParams:{min:0, step:1}, editable: isEditable, formatter: function(cell){ @@ -477,13 +500,24 @@ function fn_initLeftGrid(){ return (val !== null && val !== undefined && val !== "") ? Number(val).toLocaleString() : "0"; } }, - {title:"양품수량", field:"GOOD_QTY", editor:"number", hozAlign:"right", minWidth:70, headerSort:false, + {title:"양품수량", field:"GOOD_QTY", editor:"number", hozAlign:"right", minWidth:80, headerSort:false, editorParams:{min:0, step:1}, editable: isEditable, formatter: function(cell){ var val = cell.getValue(); return (val !== null && val !== undefined && val !== "") ? Number(val).toLocaleString() : "0"; } + }, + {title:"검사성적서", field:"REPORT_FILE_CNT", minWidth:85, headerSort:false, hozAlign:"center", + formatter: fnc_subInfoValueFormatter, + cellClick: function(e, cell){ + var objId = fnc_checkNull(cell.getData().OBJID); + if(objId){ + fn_openReportFilePopUp(objId); + } else { + Swal.fire({icon:'info', title:'알림', text:'행을 추가한 후 파일을 등록할 수 있습니다.'}); + } + } } ]; @@ -533,11 +567,12 @@ function fn_initLeftGrid(){ // ===================================================== // 우측 그리드 (불량 정보) 초기화 +// 컬럼순서: 불량수량, 불량유형, 불량원인, 귀책부서, 부적합보고서, 처리현황, 이미지파일, 처리결과, 비고 // ===================================================== function fn_initRightGrid(){ var columns = [ {formatter:"rowSelection", titleFormatter:"rowSelection", hozAlign:"center", headerSort:false, width:30}, - {title:"불량수량", field:"DEFECT_QTY", editor:"number", hozAlign:"right", minWidth:70, headerSort:false, + {title:"불량수량", field:"DEFECT_QTY", editor:"number", hozAlign:"right", minWidth:80, headerSort:false, editorParams:{min:0, step:1}, editable: isEditable, formatter: function(cell){ @@ -549,7 +584,7 @@ function fn_initRightGrid(){ editor: createSelect2Editor(defectTypeList), editable: isEditable }, - {title:"불량원인", field:"DEFECT_CAUSE", minWidth:90, headerSort:false, + {title:"불량원인", field:"DEFECT_CAUSE", minWidth:85, headerSort:false, editor: createSelect2Editor(defectCauseList), editable: isEditable }, @@ -557,7 +592,7 @@ function fn_initRightGrid(){ editor: createSelect2Editor(responsibleDeptList), editable: isEditable }, - {title:"부적합보고서", field:"NCR_FILE_CNT", minWidth:75, headerSort:false, hozAlign:"center", + {title:"부적합보고서", field:"NCR_FILE_CNT", minWidth:95, headerSort:false, hozAlign:"center", formatter: fnc_subInfoValueFormatter, cellClick: function(e, cell){ var objId = fnc_checkNull(cell.getData().OBJID); @@ -568,11 +603,11 @@ function fn_initRightGrid(){ } } }, - {title:"처리현황", field:"PROCESS_STATUS", minWidth:75, headerSort:false, + {title:"처리현황", field:"PROCESS_STATUS", minWidth:80, headerSort:false, editor: createSelect2Editor(processStatusList), editable: isEditable }, - {title:"이미지", field:"IMAGE_FILE_CNT", minWidth:60, headerSort:false, hozAlign:"center", + {title:"이미지파일", field:"IMAGE_FILE_CNT", minWidth:85, headerSort:false, hozAlign:"center", formatter: fnc_subInfoValueFormatter, cellClick: function(e, cell){ var objId = fnc_checkNull(cell.getData().OBJID); @@ -583,27 +618,10 @@ function fn_initRightGrid(){ } } }, - {title:"검사일", field:"INSPECTION_DATE", minWidth:100, headerSort:false, - editor: "input", - editorParams: { elementAttributes: { type: "date" } }, - editable: isEditable - }, - {title:"검사자", field:"INSPECTOR", editor:"input", minWidth:70, headerSort:false, editable: isEditable}, - {title:"처리결과", field:"DISPOSITION_TYPE", minWidth:75, headerSort:false, + {title:"처리결과", field:"DISPOSITION_TYPE", minWidth:80, headerSort:false, editor: createSelect2Editor(dispositionTypeList), editable: isEditable }, - {title:"검사성적서", field:"REPORT_FILE_CNT", minWidth:70, headerSort:false, hozAlign:"center", - formatter: fnc_subInfoValueFormatter, - cellClick: function(e, cell){ - var objId = fnc_checkNull(cell.getData().OBJID); - if(objId){ - fn_openReportFilePopUp(objId); - } else { - Swal.fire({icon:'info', title:'알림', text:'행을 추가한 후 파일을 등록할 수 있습니다.'}); - } - } - }, {title:"비고", field:"REMARK", editor:"input", minWidth:100, headerSort:false, editable: isEditable} ]; @@ -912,6 +930,17 @@ function fn_openReportFilePopUp(objId) { fn_watchPopupClose(popup, objId, 'REPORT_FILE_CNT', 'SEMI_INSPECTION_REPORT'); } +// 파트정보 팝업 (도면 포함) +function fn_openPartInfoPopUp(partObjId) { + if(!partObjId) { + Swal.fire({icon:'info', title:'알림', text:'파트 정보가 없습니다.'}); + return; + } + var popup_width = 1200; + var popup_height = 800; + var url = "/partMng/partMngDetailPopUp.do?OBJID=" + partObjId; + window.open(url, "partMngPopUp", "width=" + popup_width + ",height=" + popup_height + ",scrollbars=yes,resizable=yes"); +} // 팝업 닫힘 감지 및 파일 카운트 업데이트 function fn_watchPopupClose(popup, objId, fieldName, docType) { diff --git a/WebContent/WEB-INF/view/quality/semiProductInspectionList.jsp b/WebContent/WEB-INF/view/quality/semiProductInspectionList.jsp index 1dd4449..28171ce 100644 --- a/WebContent/WEB-INF/view/quality/semiProductInspectionList.jsp +++ b/WebContent/WEB-INF/view/quality/semiProductInspectionList.jsp @@ -121,19 +121,19 @@ async function createExcelFile(data){ const workbook = new ExcelJS.Workbook(); const worksheet = workbook.addWorksheet(pageTitle); - // 헤더 설정 - var headers = ["No", "품명(모델명)", "제품구분", "작업지시번호", "부품품번", "부품명", + // 헤더 설정 (컬럼 순서 변경: 검사일, 검사자를 앞으로) + var headers = ["No", "검사일", "검사자", "품명(모델명)", "작업지시번호", "부품품번", "부품명", "입고수량 합계", "양품수량 합계", "불량수량 합계", "불량율(%)", "재생수량 합계", "최종양품수량 합계", - "검사일", "검사자", "불량유형", "불량원인", "귀책부서", "처리현황", "처리결과", "비고"]; + "불량유형", "불량원인", "귀책부서", "처리현황", "처리결과", "비고"]; // 열 너비 설정 - var colWidths = [6, 25, 12, 18, 20, 25, 15, 15, 15, 12, 15, 18, 12, 12, 15, 15, 12, 12, 12, 20]; + var colWidths = [6, 12, 12, 25, 18, 20, 25, 15, 15, 15, 12, 15, 18, 15, 15, 12, 12, 12, 20]; colWidths.forEach(function(width, idx){ worksheet.getColumn(idx + 1).width = width; }); // 제목 행 추가 - worksheet.mergeCells('A1:T1'); + worksheet.mergeCells('A1:S1'); var titleCell = worksheet.getCell('A1'); titleCell.value = pageTitle; titleCell.font = { size: 16, bold: true }; @@ -171,12 +171,13 @@ async function createExcelFile(data){ }); headerRow.height = 25; - // 데이터 추가 + // 데이터 추가 (컬럼 순서 변경: 검사일, 검사자를 앞으로) data.forEach(function(item, index){ var row = worksheet.addRow([ index + 1, + item.inspection_date || item.INSPECTION_DATE || "", + item.writer_name || item.WRITER_NAME || "", item.model_name || item.MODEL_NAME || "", - item.product_type || item.PRODUCT_TYPE || "", item.work_order_no || item.WORK_ORDER_NO || "", item.part_no || item.PART_NO || "", item.part_name || item.PART_NAME || "", @@ -186,8 +187,6 @@ async function createExcelFile(data){ item.defect_rate || item.DEFECT_RATE || 0, item.regeneration_qty || item.REGENERATION_QTY || 0, item.final_good_qty || item.FINAL_GOOD_QTY || 0, - item.inspection_date || item.INSPECTION_DATE || "", - item.writer_name || item.WRITER_NAME || "", item.defect_type || item.DEFECT_TYPE || "", item.defect_cause || item.DEFECT_CAUSE || "", item.responsible_dept || item.RESPONSIBLE_DEPT || "", @@ -204,14 +203,14 @@ async function createExcelFile(data){ bottom: { style: 'thin' }, right: { style: 'thin' } }; - // 숫자 컬럼 오른쪽 정렬 (7~12번 컬럼: 수량, 불량율) - if(colNumber >= 7 && colNumber <= 12){ + // 숫자 컬럼 오른쪽 정렬 (8~13번 컬럼: 수량, 불량율) + if(colNumber >= 8 && colNumber <= 13){ cell.alignment = { horizontal: 'right' }; // 숫자에 천단위 구분자 (불량율 제외) - if(colNumber !== 10 && typeof cell.value === 'number'){ + if(colNumber !== 11 && typeof cell.value === 'number'){ cell.numFmt = '#,##0'; } - } else if(colNumber === 1){ + } else if(colNumber === 1 || colNumber === 2 || colNumber === 3){ cell.alignment = { horizontal: 'center' }; } }); @@ -231,8 +230,15 @@ async function createExcelFile(data){ saveAs(new Blob([buffer]), fileName); } -// 컬럼: 품명(모델명), 작업지시번호, 부품품번, 부품명, 입고수량 합계, 양품수량 합계, 불량수량 합계, 불량율, 재생수량 합계, 최종 양품수량 합계, 검사일, 검사자 +// 컬럼: 검사일, 검사자, 품명(모델명), 작업지시번호, 부품품번, 부품명, 입고수량 합계, 양품수량 합계, 불량수량 합계, 불량율, 재생수량 합계, 최종양품수량 합계 var columns = [ + {headerHozAlign:'center', hozAlign:'center', minWidth:110, widthGrow:1, title:'검사일', field:'INSPECTION_DATE', + formatter:fnc_createGridAnchorTag, + cellClick: function(e, cell){ + fn_openInspectionPopUp(cell.getData()); + } + }, + {headerHozAlign:'center', hozAlign:'center', minWidth:100, widthGrow:1, title:'검사자', field:'WRITER_NAME'}, {headerHozAlign:'center', hozAlign:'left', minWidth:150, widthGrow:2, title:'품명(모델명)', field:'MODEL_NAME'}, {headerHozAlign:'center', hozAlign:'center', minWidth:140, widthGrow:1, title:'작업지시번호', field:'WORK_ORDER_NO'}, {headerHozAlign:'center', hozAlign:'left', minWidth:150, widthGrow:2, title:'부품품번', field:'PART_NO'}, @@ -255,16 +261,9 @@ var columns = [ {headerHozAlign:'center', hozAlign:'right', minWidth:120, widthGrow:1, title:'재생수량 합계', field:'REGENERATION_QTY', formatter:"money", formatterParams:{thousand:",", precision:false} }, - {headerHozAlign:'center', hozAlign:'right', minWidth:140, widthGrow:1, title:'최종 양품수량 합계', field:'FINAL_GOOD_QTY', + {headerHozAlign:'center', hozAlign:'right', minWidth:140, widthGrow:1, title:'최종양품수량 합계', field:'FINAL_GOOD_QTY', formatter:"money", formatterParams:{thousand:",", precision:false} - }, - {headerHozAlign:'center', hozAlign:'center', minWidth:110, widthGrow:1, title:'검사일', field:'INSPECTION_DATE', - formatter:fnc_createGridAnchorTag, - cellClick: function(e, cell){ - fn_openInspectionPopUp(cell.getData()); - } - }, - {headerHozAlign:'center', hozAlign:'center', minWidth:100, widthGrow:1, title:'검사자', field:'WRITER_NAME'} + } ]; // 조회 diff --git a/src/com/pms/controller/QualityController.java b/src/com/pms/controller/QualityController.java index aa2e6b2..56bb747 100644 --- a/src/com/pms/controller/QualityController.java +++ b/src/com/pms/controller/QualityController.java @@ -928,6 +928,29 @@ public class QualityController { return service.saveEcrResult(request, paramMap); } + /** + * 설계변경요청서 팝업 + */ + @RequestMapping("/quality/ecrDocFormPopUp.do") + public String ecrDocFormPopUp(HttpServletRequest request, @RequestParam Map paramMap){ + try { + Map resultMap = service.getEcrInfo(paramMap); + request.setAttribute("resultMap", resultMap); + } catch(Exception e) { + e.printStackTrace(); + } + return "/quality/ecrDocFormPopUp"; + } + + /** + * 설계변경요청서 저장 + */ + @ResponseBody + @RequestMapping("/quality/saveEcrDoc.do") + public Map saveEcrDoc(HttpServletRequest request, @RequestParam Map paramMap){ + return service.saveEcrDoc(request, paramMap); + } + // ===================================================== // 수입검사 불량상세 관련 // ===================================================== diff --git a/src/com/pms/mapper/quality.xml b/src/com/pms/mapper/quality.xml index 6f2cf41..993b93d 100644 --- a/src/com/pms/mapper/quality.xml +++ b/src/com/pms/mapper/quality.xml @@ -1665,6 +1665,7 @@ , COALESCE(SPI.WORK_ORDER_NO, '') AS "WORK_ORDER_NO" , COALESCE(SPI.PART_NO, '') AS "PART_NO" , COALESCE(SPI.PART_NAME, '') AS "PART_NAME" + , COALESCE(PM.OBJID::VARCHAR, '') AS "PART_OBJID" , COALESCE(SPI.RECEIPT_QTY, 0) AS "RECEIPT_QTY" , COALESCE(SPI.GOOD_QTY, 0) AS "GOOD_QTY" , COALESCE(SPI.DEFECT_QTY, 0) AS "DEFECT_QTY" @@ -1684,6 +1685,7 @@ , (SELECT COUNT(*) FROM ATTACH_FILE_INFO AFI WHERE AFI.TARGET_OBJID = SPI.OBJID AND AFI.DOC_TYPE = 'SEMI_INSPECTION_NCR' AND AFI.STATUS = 'Active') AS "NCR_FILE_CNT" , (SELECT COUNT(*) FROM ATTACH_FILE_INFO AFI WHERE AFI.TARGET_OBJID = SPI.OBJID AND AFI.DOC_TYPE = 'SEMI_INSPECTION_REPORT' AND AFI.STATUS = 'Active') AS "REPORT_FILE_CNT" FROM PMS_QUALITY_SEMI_PRODUCT_INSPECTION SPI + LEFT JOIN PART_MNG PM ON PM.PART_NO = SPI.PART_NO WHERE 1=1 AND (SPI.INSPECTION_GROUP_ID = #{INSPECTION_GROUP_ID} OR SPI.OBJID = #{INSPECTION_GROUP_ID}) @@ -2102,6 +2104,8 @@ , ECR.COMPLETE_DATE , (SELECT COUNT(*) FROM ATTACH_FILE_INFO AFI WHERE AFI.TARGET_OBJID = ECR.OBJID AND AFI.DOC_TYPE = 'ECR_RESULT_IMAGE' AND STATUS = 'Active') AS IMAGE_FILE , (SELECT COUNT(*) FROM ATTACH_FILE_INFO AFI WHERE AFI.TARGET_OBJID = ECR.OBJID AND AFI.DOC_TYPE = 'ECR_RESULT' AND STATUS = 'Active') AS ATTACH_FILE + , (SELECT COUNT(*) FROM ATTACH_FILE_INFO AFI WHERE AFI.TARGET_OBJID = ECR.OBJID AND AFI.DOC_TYPE = 'ECR_DOC' AND STATUS = 'Active') AS ECR_DOC_FILE + , CASE WHEN (ECR.ECR_DOC_SUMMARY IS NOT NULL AND ECR.ECR_DOC_SUMMARY != '') OR (ECR.ECR_DOC_REASON IS NOT NULL AND ECR.ECR_DOC_REASON != '') THEN 1 ELSE 0 END AS ECR_DOC_CNT FROM PMS_QUALITY_ECR ECR WHERE 1=1 @@ -2176,6 +2180,12 @@ , ECR.REMARK , ECR.WRITER , TO_CHAR(ECR.REG_DATE, 'YYYY-MM-DD') AS REG_DATE + , ECR.ECR_DOC_SUMMARY + , ECR.ECR_DOC_REASON + , ECR.ECR_REV_NO + , ECR.ECR_REV_DATE + , ECR.ECR_DOC_FORM_NO + , ECR.ECR_DOC_AUTHOR FROM PMS_QUALITY_ECR ECR WHERE ECR.OBJID = #{OBJID} @@ -2253,6 +2263,20 @@ WHERE OBJID = #{OBJID} + + + UPDATE PMS_QUALITY_ECR SET + ECR_DOC_FORM_NO = #{ECR_DOC_FORM_NO} + , ECR_REV_NO = #{ECR_REV_NO} + , ECR_REV_DATE = #{ECR_REV_DATE} + , ECR_DOC_AUTHOR = #{ECR_DOC_AUTHOR} + , ECR_DOC_SUMMARY = #{ECR_DOC_SUMMARY} + , ECR_DOC_REASON = #{ECR_DOC_REASON} + , MODIFIER = #{MODIFIER} + , MOD_DATE = NOW() + WHERE OBJID = #{OBJID} + + diff --git a/src/com/pms/service/QualityService.java b/src/com/pms/service/QualityService.java index e600ebd..dffaafe 100644 --- a/src/com/pms/service/QualityService.java +++ b/src/com/pms/service/QualityService.java @@ -1714,6 +1714,39 @@ public class QualityService extends BaseService{ return resultMap; } + /** + * 설계변경요청서 저장 + */ + public Map saveEcrDoc(HttpServletRequest request, Map paramMap){ + Map resultMap = new HashMap(); + SqlSession sqlSession = null; + + try{ + sqlSession = SqlMapConfig.getInstance().getSqlSession(); + + // 작성자 정보 설정 + PersonBean person = (PersonBean) request.getSession().getAttribute(Constants.PERSON_BEAN); + String writer = person != null ? person.getUserId() : ""; + paramMap.put("MODIFIER", writer); + + sqlSession.update("quality.updateEcrDoc", paramMap); + + sqlSession.commit(); + resultMap.put("result", "success"); + resultMap.put("message", "저장되었습니다."); + + }catch(Exception e){ + if(sqlSession != null) sqlSession.rollback(); + resultMap.put("result", "fail"); + resultMap.put("message", e.getMessage()); + e.printStackTrace(); + }finally{ + if(sqlSession != null) sqlSession.close(); + } + + return resultMap; + } + /*edhwang start*/ /*edhwang end*/