CER관리의 설계변경요청서와 반제품관리
This commit is contained in:
@@ -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
|
||||
<if test="INSPECTION_GROUP_ID != null and INSPECTION_GROUP_ID != ''">
|
||||
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
|
||||
<if test="search_request_date_from != null and search_request_date_from != ''">
|
||||
@@ -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}
|
||||
</select>
|
||||
@@ -2253,6 +2263,20 @@
|
||||
WHERE OBJID = #{OBJID}
|
||||
</update>
|
||||
|
||||
<!-- 설계변경요청서 저장 -->
|
||||
<update id="updateEcrDoc" parameterType="map">
|
||||
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}
|
||||
</update>
|
||||
|
||||
<!-- =====================================================
|
||||
수입검사 상세 그리드 목록 (입고 결과 기준)
|
||||
===================================================== -->
|
||||
|
||||
257
WebContent/WEB-INF/view/quality/ecrDocFormPopUp.jsp
Normal file
257
WebContent/WEB-INF/view/quality/ecrDocFormPopUp.jsp
Normal file
@@ -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"%>
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||||
<title>ECR - Engineering Change Request</title>
|
||||
<link rel="stylesheet" type="text/css" href="/css/basic.css">
|
||||
<script src="/js/jquery-3.2.1.min.js"></script>
|
||||
<script src="/js/sweetalert2.all.min.js"></script>
|
||||
<style>
|
||||
* {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
body {
|
||||
font-family: 'Malgun Gothic', 'Arial', sans-serif;
|
||||
background: #fff;
|
||||
padding: 0;
|
||||
}
|
||||
.ecr_container {
|
||||
width: 100%;
|
||||
max-width: 800px;
|
||||
margin: 0 auto;
|
||||
border: 1px solid #333;
|
||||
}
|
||||
/* 헤더 영역 */
|
||||
.ecr_header {
|
||||
display: table;
|
||||
width: 100%;
|
||||
border-bottom: 1px solid #333;
|
||||
}
|
||||
.ecr_header_left {
|
||||
display: table-cell;
|
||||
width: 180px;
|
||||
vertical-align: middle;
|
||||
padding: 10px 15px;
|
||||
border-right: 1px solid #333;
|
||||
}
|
||||
.ecr_logo {
|
||||
display: block;
|
||||
width: 150px;
|
||||
height: 40px;
|
||||
background: url(/images/logo.png) center center no-repeat;
|
||||
background-size: contain;
|
||||
}
|
||||
.ecr_header_center {
|
||||
display: table-cell;
|
||||
vertical-align: middle;
|
||||
text-align: center;
|
||||
background: #1565a0;
|
||||
color: white;
|
||||
padding: 15px;
|
||||
}
|
||||
.ecr_header_center h1 {
|
||||
font-size: 28px;
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
.ecr_header_center p {
|
||||
font-size: 14px;
|
||||
}
|
||||
.ecr_header_right {
|
||||
display: table-cell;
|
||||
width: 180px;
|
||||
vertical-align: top;
|
||||
border-left: 1px solid #333;
|
||||
}
|
||||
.ecr_header_right table {
|
||||
width: 100%;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
.ecr_header_right td {
|
||||
padding: 5px 8px;
|
||||
font-size: 12px;
|
||||
border-bottom: 1px solid #ccc;
|
||||
}
|
||||
.ecr_header_right td:first-child {
|
||||
font-weight: bold;
|
||||
width: 70px;
|
||||
}
|
||||
.ecr_header_right input {
|
||||
border: none;
|
||||
width: 80px;
|
||||
font-size: 12px;
|
||||
}
|
||||
/* 본문 영역 */
|
||||
.ecr_body {
|
||||
padding: 20px;
|
||||
min-height: 500px;
|
||||
border-bottom: 1px dashed #999;
|
||||
}
|
||||
.ecr_section {
|
||||
margin-bottom: 25px;
|
||||
}
|
||||
.ecr_section_title {
|
||||
font-weight: bold;
|
||||
font-size: 13px;
|
||||
margin-bottom: 5px;
|
||||
text-decoration: underline;
|
||||
}
|
||||
.ecr_section_title_kr {
|
||||
font-size: 12px;
|
||||
color: #333;
|
||||
text-decoration: underline;
|
||||
margin-bottom: 8px;
|
||||
}
|
||||
.ecr_textarea {
|
||||
width: 100%;
|
||||
min-height: 120px;
|
||||
border: 1px solid #ccc;
|
||||
padding: 10px;
|
||||
font-size: 13px;
|
||||
resize: vertical;
|
||||
font-family: inherit;
|
||||
}
|
||||
.ecr_textarea:focus {
|
||||
outline: 2px solid #1565a0;
|
||||
}
|
||||
/* 푸터 영역 */
|
||||
.ecr_footer {
|
||||
background: #fff;
|
||||
color: #333;
|
||||
padding: 10px 15px;
|
||||
font-size: 11px;
|
||||
border-top: 1px solid #ccc;
|
||||
}
|
||||
/* 버튼 영역 */
|
||||
.btn_area {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
gap: 10px;
|
||||
padding: 15px;
|
||||
background: #f5f5f5;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<input type="hidden" id="OBJID" value="${resultMap.objid}">
|
||||
|
||||
<div class="ecr_container">
|
||||
<!-- 헤더 -->
|
||||
<div class="ecr_header">
|
||||
<div class="ecr_header_left">
|
||||
<span class="ecr_logo"></span>
|
||||
</div>
|
||||
<div class="ecr_header_center">
|
||||
<h1>ECR</h1>
|
||||
<p>(Engineering Change Request)</p>
|
||||
</div>
|
||||
<div class="ecr_header_right">
|
||||
<table>
|
||||
<tr>
|
||||
<td>Form no.</td>
|
||||
<td><input type="text" id="ECR_DOC_FORM_NO" value="${resultMap.ecr_doc_form_no}"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Rev.no</td>
|
||||
<td><input type="text" id="ECR_REV_NO" value="${resultMap.ecr_rev_no}"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Rev. date</td>
|
||||
<td><input type="text" id="ECR_REV_DATE" value="${resultMap.ecr_rev_date}"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Author</td>
|
||||
<td><input type="text" id="ECR_DOC_AUTHOR" value="${resultMap.ecr_doc_author}"></td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 본문 -->
|
||||
<div class="ecr_body">
|
||||
<div class="ecr_section">
|
||||
<%-- <div class="ecr_section_title">Fill out clearly, concisely</div> --%>
|
||||
<div class="ecr_section_title_kr">명확하고 간결하게 작성</div>
|
||||
<textarea class="ecr_textarea" id="ECR_DOC_SUMMARY">${resultMap.ecr_doc_summary}</textarea>
|
||||
</div>
|
||||
|
||||
<div class="ecr_section">
|
||||
<%-- <div class="ecr_section_title">Description of the change (reason / background)</div> --%>
|
||||
<div class="ecr_section_title_kr">변경사항 설명 (이유 / 배경)</div>
|
||||
<textarea class="ecr_textarea" id="ECR_DOC_REASON" style="min-height:150px;">${resultMap.ecr_doc_reason}</textarea>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 푸터 -->
|
||||
<div class="ecr_footer">
|
||||
<p>Confidential! © RPS reserves all rights even in the event of industrial property rights.</p>
|
||||
<p>We reserve all rights of disposal such as copying and passing on to third parties!</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 버튼 영역 -->
|
||||
<div class="btn_area">
|
||||
<input type="button" class="plm_btns" value="저장" onclick="fn_save()">
|
||||
<input type="button" class="plm_btns" value="닫기" onclick="self.close()">
|
||||
</div>
|
||||
|
||||
<script>
|
||||
$(document).ready(function(){
|
||||
console.log("ECR 팝업 로드됨");
|
||||
console.log("OBJID:", "${resultMap.OBJID}");
|
||||
console.log("ECR_NO:", "${resultMap.ECR_NO}");
|
||||
console.log("REQUESTER_NAME:", "${resultMap.REQUESTER_NAME}");
|
||||
console.log("resultMap 전체:", "${resultMap}");
|
||||
});
|
||||
|
||||
function fn_save(){
|
||||
var objId = $("#OBJID").val();
|
||||
var formNo = $("#ECR_DOC_FORM_NO").val();
|
||||
var revNo = $("#ECR_REV_NO").val();
|
||||
var revDate = $("#ECR_REV_DATE").val();
|
||||
var author = $("#ECR_DOC_AUTHOR").val();
|
||||
var summary = $("#ECR_DOC_SUMMARY").val();
|
||||
var reason = $("#ECR_DOC_REASON").val();
|
||||
|
||||
if(!summary && !reason){
|
||||
Swal.fire({icon:'warning', title:'알림', text:'내용을 입력해주세요.'});
|
||||
return;
|
||||
}
|
||||
|
||||
$.ajax({
|
||||
url: "/quality/saveEcrDoc.do",
|
||||
type: "POST",
|
||||
data: {
|
||||
OBJID: objId,
|
||||
ECR_DOC_FORM_NO: formNo,
|
||||
ECR_REV_NO: revNo,
|
||||
ECR_REV_DATE: revDate,
|
||||
ECR_DOC_AUTHOR: author,
|
||||
ECR_DOC_SUMMARY: summary,
|
||||
ECR_DOC_REASON: reason
|
||||
},
|
||||
dataType: "json",
|
||||
success: function(result){
|
||||
if(result.result == "success"){
|
||||
Swal.fire({icon:'success', title:'저장완료', text:'설계변경요청서가 저장되었습니다.'}).then(function(){
|
||||
self.close();
|
||||
});
|
||||
} else {
|
||||
Swal.fire({icon:'error', title:'오류', text:'저장에 실패했습니다: ' + (result.message || '')});
|
||||
}
|
||||
},
|
||||
error: function(xhr, status, error){
|
||||
console.log("AJAX 에러:", xhr.responseText);
|
||||
Swal.fire({icon:'error', title:'오류', text:'저장 중 오류가 발생했습니다.'});
|
||||
}
|
||||
});
|
||||
}
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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 "<a href='javascript:void(0);' style='color:#2196F3; text-decoration:underline;'>" + val + "</a>";
|
||||
}
|
||||
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) {
|
||||
|
||||
@@ -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'}
|
||||
}
|
||||
];
|
||||
|
||||
// 조회
|
||||
|
||||
@@ -928,6 +928,29 @@ public class QualityController {
|
||||
return service.saveEcrResult(request, paramMap);
|
||||
}
|
||||
|
||||
/**
|
||||
* 설계변경요청서 팝업
|
||||
*/
|
||||
@RequestMapping("/quality/ecrDocFormPopUp.do")
|
||||
public String ecrDocFormPopUp(HttpServletRequest request, @RequestParam Map<String, Object> 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<String, Object> paramMap){
|
||||
return service.saveEcrDoc(request, paramMap);
|
||||
}
|
||||
|
||||
// =====================================================
|
||||
// 수입검사 불량상세 관련
|
||||
// =====================================================
|
||||
|
||||
@@ -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
|
||||
<if test="INSPECTION_GROUP_ID != null and INSPECTION_GROUP_ID != ''">
|
||||
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
|
||||
<if test="search_request_date_from != null and search_request_date_from != ''">
|
||||
@@ -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}
|
||||
</select>
|
||||
@@ -2253,6 +2263,20 @@
|
||||
WHERE OBJID = #{OBJID}
|
||||
</update>
|
||||
|
||||
<!-- 설계변경요청서 저장 -->
|
||||
<update id="updateEcrDoc" parameterType="map">
|
||||
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}
|
||||
</update>
|
||||
|
||||
<!-- =====================================================
|
||||
수입검사 상세 그리드 목록 (입고 결과 기준)
|
||||
===================================================== -->
|
||||
|
||||
@@ -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*/
|
||||
|
||||
Reference in New Issue
Block a user