품질관리_공정검사관리
This commit is contained in:
@@ -1,13 +1,16 @@
|
||||
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
|
||||
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
|
||||
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
|
||||
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
|
||||
<%@ page import="com.pms.common.utils.*"%>
|
||||
<%@ page import="java.util.*" %>
|
||||
<%@include file= "/init.jsp" %>
|
||||
<script type="text/javascript" src="/js/tabulator/tabulator_custom.js"></script>
|
||||
<%
|
||||
String menuObjId = request.getParameter("menuObjId");
|
||||
String menuName = CommonUtils.getMenuName(menuObjId, "공정검사 등록");
|
||||
PersonBean person = (PersonBean) session.getAttribute(Constants.PERSON_BEAN);
|
||||
String connector = person.getUserId();
|
||||
%>
|
||||
<c:set var="now" value="<%=new java.util.Date()%>" />
|
||||
<c:set var="today"><fmt:formatDate value="${now}" pattern="yyyy-MM-dd" /></c:set>
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
@@ -15,88 +18,471 @@ String menuName = CommonUtils.getMenuName(menuObjId, "공정검사 등록");
|
||||
<title><%=Constants.SYSTEM_NAME%></title>
|
||||
</head>
|
||||
|
||||
<style>
|
||||
.form-header {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 20px;
|
||||
padding: 10px 15px;
|
||||
background: #f8f9fa;
|
||||
border-bottom: 1px solid #ddd;
|
||||
}
|
||||
.form-header label {
|
||||
font-weight: bold;
|
||||
margin-right: 5px;
|
||||
}
|
||||
.form-header .required {
|
||||
color: red;
|
||||
}
|
||||
.form-header input, .form-header select {
|
||||
padding: 5px 10px;
|
||||
border: 1px solid #ccc;
|
||||
border-radius: 3px;
|
||||
}
|
||||
/* 검사결과 스타일 */
|
||||
.inspection-ng { color: #dc3545; font-weight: bold; }
|
||||
.inspection-ok { color: #28a745; font-weight: bold; }
|
||||
</style>
|
||||
|
||||
<script type="text/javascript">
|
||||
var _editable = true;
|
||||
var grid;
|
||||
var rowIndex = 0;
|
||||
|
||||
// 진행공정 목록
|
||||
var _PROCESS_LIST = [];
|
||||
// 프로젝트 목록
|
||||
var _PROJECT_LIST = [];
|
||||
// 작업환경상태 목록
|
||||
var _WORK_ENV_STATUS_LIST = [
|
||||
{"CODE": "", "NAME": "선택"},
|
||||
{"CODE": "양호", "NAME": "양호"},
|
||||
{"CODE": "불량", "NAME": "불량"}
|
||||
];
|
||||
// 측정기 목록 (양호/불량)
|
||||
var _MEASURING_DEVICE_LIST = [
|
||||
{"CODE": "", "NAME": "선택"},
|
||||
{"CODE": "양호", "NAME": "양호"},
|
||||
{"CODE": "불량", "NAME": "불량"}
|
||||
];
|
||||
// 담당팀 목록
|
||||
var _DEPT_LIST = [];
|
||||
// 담당자 목록
|
||||
var _USER_LIST = [];
|
||||
// 검사결과 목록
|
||||
var _INSPECTION_RESULT_LIST = [
|
||||
{"CODE": "", "NAME": "선택"},
|
||||
{"CODE": "OK", "NAME": "OK"},
|
||||
{"CODE": "NG", "NAME": "NG"}
|
||||
];
|
||||
|
||||
$(document).ready(function(){
|
||||
fnc_datepick();
|
||||
$('.select2').select2();
|
||||
|
||||
// 저장
|
||||
// 진행공정 목록 조회 (더존 기준정보>내부공정)
|
||||
_PROCESS_LIST = [{"CODE": "", "NAME": "선택"}].concat(
|
||||
fnc_getJsonAllDataListBySqlId({"sqlId": "common.getCodeselect", "code": "0001870"})
|
||||
);
|
||||
|
||||
// 프로젝트 목록 조회
|
||||
_PROJECT_LIST = [{"CODE": "", "NAME": "선택"}].concat(
|
||||
fnc_getJsonAllDataListBySqlId({"sqlId": "common.getProjectNameList"})
|
||||
);
|
||||
|
||||
// 담당팀 목록 조회
|
||||
_DEPT_LIST = [{"CODE": "", "NAME": "선택"}].concat(
|
||||
fnc_getJsonAllDataListBySqlId({"sqlId": "common.getDeptselect"})
|
||||
);
|
||||
|
||||
// 담당자 목록 조회
|
||||
_USER_LIST = [{"CODE": "", "NAME": "선택"}].concat(
|
||||
fnc_getJsonAllDataListBySqlId({"sqlId": "common.getUserselect"})
|
||||
);
|
||||
|
||||
// 검사일 기본 설정 (저장된 값 없으면 오늘 날짜)
|
||||
var savedInspectionDate = "${info.inspection_date}";
|
||||
if(savedInspectionDate != '' && savedInspectionDate != 'null'){
|
||||
$("#INSPECTION_DATE").val(savedInspectionDate);
|
||||
} else if($("#INSPECTION_DATE").val() == ''){
|
||||
$("#INSPECTION_DATE").val("${today}");
|
||||
}
|
||||
|
||||
// 행추가 버튼
|
||||
$("#btnAddRow").click(function(){
|
||||
fn_addRow();
|
||||
});
|
||||
|
||||
// 행삭제 버튼
|
||||
$("#btnDelRow").click(function(){
|
||||
fn_deleteRow();
|
||||
});
|
||||
|
||||
// 저장 버튼
|
||||
$("#btnSave").click(function(){
|
||||
fn_save();
|
||||
});
|
||||
|
||||
// 닫기
|
||||
// 닫기 버튼
|
||||
$("#btnClose").click(function(){
|
||||
window.close();
|
||||
self.close();
|
||||
});
|
||||
|
||||
// 그리드 초기화 및 조회
|
||||
fn_search();
|
||||
});
|
||||
|
||||
function fn_save(){
|
||||
// TODO: 저장 로직 구현
|
||||
Swal.fire("저장 기능 준비중입니다.");
|
||||
// 프로젝트별 파트 목록 캐시
|
||||
var _PART_LIST_CACHE = {};
|
||||
|
||||
// 프로젝트번호로 MBOM 파트 목록 조회
|
||||
function fn_getPartListByProject(projectNo) {
|
||||
if (!projectNo) return [{"CODE": "", "NAME": "선택"}];
|
||||
|
||||
// 캐시에 있으면 캐시에서 반환
|
||||
if (_PART_LIST_CACHE[projectNo]) {
|
||||
return _PART_LIST_CACHE[projectNo];
|
||||
}
|
||||
|
||||
// 서버에서 조회
|
||||
var partList = [{"CODE": "", "NAME": "선택"}].concat(
|
||||
fnc_getJsonAllDataListBySqlId({"sqlId": "common.getMbomPartListByProjectNo", "PROJECT_NO": projectNo})
|
||||
);
|
||||
|
||||
// 캐시에 저장
|
||||
_PART_LIST_CACHE[projectNo] = partList;
|
||||
|
||||
return partList;
|
||||
}
|
||||
|
||||
// 그리드 초기화 및 조회
|
||||
function fn_search(){
|
||||
var columns = [
|
||||
{formatter:"rowSelection", titleFormatter:"rowSelection", hozAlign:"center", headerSort:false, width:30},
|
||||
{title:'진행공정', field:'PROCESS_CD', headerHozAlign:'center', hozAlign:'center', width:130,
|
||||
editor: fnc_customSelectEditor,
|
||||
formatter: function(cell) {
|
||||
return fnc_customSelectFormatter(cell, {valueId:"CODE", labelId:"NAME", values:_PROCESS_LIST});
|
||||
},
|
||||
editorParams: {valueId:"CODE", labelId:"NAME", values:_PROCESS_LIST}
|
||||
},
|
||||
{title:'프로젝트번호', field:'PROJECT_OBJID', headerHozAlign:'center', hozAlign:'center', width:130,
|
||||
editor: fnc_customSelectEditor,
|
||||
formatter: function(cell) {
|
||||
return fnc_customSelectFormatter(cell, {valueId:"CODE", labelId:"NAME", values:_PROJECT_LIST});
|
||||
},
|
||||
editorParams: {valueId:"CODE", labelId:"NAME", values:_PROJECT_LIST}
|
||||
},
|
||||
{title:'품번', field:'PART_OBJID', headerHozAlign:'center', hozAlign:'left', width:250,
|
||||
editor: fnc_customSelectEditor,
|
||||
formatter: function(cell) {
|
||||
var projectObjid = cell.getData().PROJECT_OBJID;
|
||||
var partList = fn_getPartListByProject(projectObjid);
|
||||
return fnc_customSelectFormatter(cell, {valueId:"CODE", labelId:"NAME", values: partList});
|
||||
},
|
||||
editorParams: function(cell) {
|
||||
var projectObjid = cell.getData().PROJECT_OBJID;
|
||||
var partList = fn_getPartListByProject(projectObjid);
|
||||
return {valueId:"CODE", labelId:"NAME", values: partList};
|
||||
}
|
||||
},
|
||||
{title:'품명', field:'PART_NAME', headerHozAlign:'center', hozAlign:'left', width:180,
|
||||
editor: false
|
||||
},
|
||||
{title:'검사수량', field:'INSPECTION_QTY', headerHozAlign:'center', hozAlign:'right', width:80,
|
||||
editor:"input",
|
||||
formatter:"money", formatterParams:{thousand:",", precision:false}
|
||||
},
|
||||
{title:'불량수량', field:'DEFECT_QTY', headerHozAlign:'center', hozAlign:'right', width:80,
|
||||
editor:"input",
|
||||
formatter:"money", formatterParams:{thousand:",", precision:false}
|
||||
},
|
||||
{title:'작업환경상태', field:'WORK_ENV_STATUS', headerHozAlign:'center', hozAlign:'center', width:100,
|
||||
editor: fnc_customSelectEditor,
|
||||
formatter: function(cell) {
|
||||
return fnc_customSelectFormatter(cell, {valueId:"CODE", labelId:"NAME", values:_WORK_ENV_STATUS_LIST});
|
||||
},
|
||||
editorParams: {valueId:"CODE", labelId:"NAME", values:_WORK_ENV_STATUS_LIST}
|
||||
},
|
||||
{title:'측정기', field:'MEASURING_DEVICE', headerHozAlign:'center', hozAlign:'center', width:100,
|
||||
editor: fnc_customSelectEditor,
|
||||
formatter: function(cell) {
|
||||
return fnc_customSelectFormatter(cell, {valueId:"CODE", labelId:"NAME", values:_MEASURING_DEVICE_LIST});
|
||||
},
|
||||
editorParams: {valueId:"CODE", labelId:"NAME", values:_MEASURING_DEVICE_LIST}
|
||||
},
|
||||
{title:'담당팀', field:'DEPT_CD', headerHozAlign:'center', hozAlign:'center', width:100,
|
||||
editor: fnc_customSelectEditor,
|
||||
formatter: function(cell) {
|
||||
return fnc_customSelectFormatter(cell, {valueId:"CODE", labelId:"NAME", values:_DEPT_LIST});
|
||||
},
|
||||
editorParams: {valueId:"CODE", labelId:"NAME", values:_DEPT_LIST}
|
||||
},
|
||||
{title:'담당자', field:'USER_ID', headerHozAlign:'center', hozAlign:'center', width:100,
|
||||
editor: fnc_customSelectEditor,
|
||||
formatter: function(cell) {
|
||||
return fnc_customSelectFormatter(cell, {valueId:"CODE", labelId:"NAME", values:_USER_LIST});
|
||||
},
|
||||
editorParams: {valueId:"CODE", labelId:"NAME", values:_USER_LIST}
|
||||
},
|
||||
{title:'특이사항', field:'REMARK', headerHozAlign:'center', hozAlign:'left', width:150,
|
||||
editor:"input"
|
||||
},
|
||||
{title:'조치현황', field:'ACTION_STATUS', headerHozAlign:'center', hozAlign:'left', width:150,
|
||||
editor:"input"
|
||||
},
|
||||
{title:'검사결과', field:'INSPECTION_RESULT', headerHozAlign:'center', hozAlign:'center', width:80,
|
||||
editor: fnc_customSelectEditor,
|
||||
formatter: function(cell) {
|
||||
var val = cell.getValue();
|
||||
if(val === 'NG') return '<span class="inspection-ng">NG</span>';
|
||||
if(val === 'OK') return '<span class="inspection-ok">OK</span>';
|
||||
return fnc_customSelectFormatter(cell, {valueId:"CODE", labelId:"NAME", values:_INSPECTION_RESULT_LIST});
|
||||
},
|
||||
editorParams: {valueId:"CODE", labelId:"NAME", values:_INSPECTION_RESULT_LIST}
|
||||
}
|
||||
];
|
||||
|
||||
// 그리드가 없으면 생성
|
||||
if(!grid){
|
||||
grid = new Tabulator("#grid", {
|
||||
layout: "fitColumns",
|
||||
height: "calc(100vh - 150px)",
|
||||
columns: columns,
|
||||
data: [],
|
||||
selectableRows: true,
|
||||
placeholder: "데이터가 없습니다."
|
||||
});
|
||||
|
||||
// 셀 편집 이벤트
|
||||
grid.on("cellEdited", function(cell) {
|
||||
var row = cell.getRow();
|
||||
var field = cell.getField();
|
||||
|
||||
// 프로젝트 변경 시 파트 초기화 및 목록 갱신
|
||||
if (field === 'PROJECT_OBJID') {
|
||||
var projectObjid = cell.getValue();
|
||||
// 파트 목록 미리 로드 (캐시에 저장)
|
||||
if (projectObjid) {
|
||||
fn_getPartListByProject(projectObjid);
|
||||
}
|
||||
// 파트 초기화
|
||||
row.update({
|
||||
"PART_OBJID": "",
|
||||
"PART_NO": "",
|
||||
"PART_NAME": ""
|
||||
});
|
||||
// 행 다시 렌더링
|
||||
row.reformat();
|
||||
}
|
||||
|
||||
// 파트 선택 시 품번/품명 자동 설정
|
||||
if (field === 'PART_OBJID') {
|
||||
var partObjid = cell.getValue();
|
||||
var projectObjid = row.getData().PROJECT_OBJID;
|
||||
if (partObjid && projectObjid) {
|
||||
var partList = fn_getPartListByProject(projectObjid);
|
||||
for (var i = 0; i < partList.length; i++) {
|
||||
if (partList[i].CODE == partObjid) {
|
||||
row.update({
|
||||
"PART_NO": partList[i].PART_NO || '',
|
||||
"PART_NAME": partList[i].PART_NAME || ''
|
||||
});
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 불량수량 입력 시 검사결과 자동 설정
|
||||
if (field === 'DEFECT_QTY') {
|
||||
var defectQty = parseInt(cell.getValue()) || 0;
|
||||
if (defectQty > 0) {
|
||||
row.update({"INSPECTION_RESULT": "NG"});
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// 데이터 조회 (마스터 OBJID가 있을 때만)
|
||||
var masterObjId = $("#MASTER_OBJID").val();
|
||||
if(masterObjId){
|
||||
var param = {
|
||||
MASTER_OBJID: masterObjId
|
||||
};
|
||||
grid = fnc_tabul_search(_tabul_layout_fitDataStretch, grid, "/quality/processInspectionDetailGridList.do", columns, false, false, true, param);
|
||||
}
|
||||
}
|
||||
|
||||
// 행 추가
|
||||
function fn_addRow(){
|
||||
rowIndex++;
|
||||
var newRow = {
|
||||
"ROW_INDEX": rowIndex,
|
||||
"PROCESS_CD": "",
|
||||
"PROJECT_OBJID": "",
|
||||
"PART_OBJID": "",
|
||||
"PART_NO": "",
|
||||
"PART_NAME": "",
|
||||
"INSPECTION_QTY": "",
|
||||
"DEFECT_QTY": "",
|
||||
"WORK_ENV_STATUS": "",
|
||||
"MEASURING_DEVICE": "",
|
||||
"DEPT_CD": "",
|
||||
"USER_ID": "",
|
||||
"REMARK": "",
|
||||
"ACTION_STATUS": "",
|
||||
"INSPECTION_RESULT": ""
|
||||
};
|
||||
grid.addRow(newRow, false);
|
||||
}
|
||||
|
||||
// 행 삭제
|
||||
function fn_deleteRow(){
|
||||
var selectedRows = grid.getSelectedRows();
|
||||
if(selectedRows.length == 0){
|
||||
Swal.fire("삭제할 행을 선택하세요.");
|
||||
return;
|
||||
}
|
||||
|
||||
Swal.fire({
|
||||
title: '선택한 ' + selectedRows.length + '건을 삭제하시겠습니까?',
|
||||
icon: 'warning',
|
||||
showCancelButton: true,
|
||||
confirmButtonText: '삭제',
|
||||
cancelButtonText: '취소'
|
||||
}).then((result) => {
|
||||
if(result.isConfirmed){
|
||||
selectedRows.forEach(function(row){
|
||||
row.delete();
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// 저장
|
||||
function fn_save(){
|
||||
var inspectionDate = $("#INSPECTION_DATE").val();
|
||||
var inspectorId = $("#INSPECTOR_ID").val();
|
||||
|
||||
if(inspectionDate == ''){
|
||||
Swal.fire("검사일을 입력하세요.");
|
||||
$("#INSPECTION_DATE").focus();
|
||||
return;
|
||||
}
|
||||
if(inspectorId == ''){
|
||||
Swal.fire("검사자를 선택하세요.");
|
||||
$("#INSPECTOR_ID").focus();
|
||||
return;
|
||||
}
|
||||
|
||||
var gridData = grid.getData();
|
||||
if(gridData.length == 0){
|
||||
Swal.fire("저장할 데이터가 없습니다.");
|
||||
return;
|
||||
}
|
||||
|
||||
// 필수값 검증
|
||||
for(var i = 0; i < gridData.length; i++){
|
||||
if(!gridData[i].PROCESS_CD){
|
||||
Swal.fire((i+1) + "번째 행의 진행공정을 선택하세요.");
|
||||
return;
|
||||
}
|
||||
if(!gridData[i].PART_NO){
|
||||
Swal.fire((i+1) + "번째 행의 품번을 입력하세요.");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
Swal.fire({
|
||||
title: '저장하시겠습니까?',
|
||||
icon: 'question',
|
||||
showCancelButton: true,
|
||||
confirmButtonText: '저장',
|
||||
cancelButtonText: '취소'
|
||||
}).then((result) => {
|
||||
if(result.isConfirmed){
|
||||
$.ajax({
|
||||
url: "/quality/saveProcessInspection.do",
|
||||
type: "POST",
|
||||
data: {
|
||||
"MASTER_OBJID": $("#MASTER_OBJID").val(),
|
||||
"INSPECTION_DATE": inspectionDate,
|
||||
"INSPECTOR_ID": inspectorId,
|
||||
"dataList": JSON.stringify(gridData)
|
||||
},
|
||||
dataType: "json",
|
||||
success: function(result){
|
||||
if(result.RESULT == "SUCCESS"){
|
||||
// 저장된 마스터 OBJID 저장
|
||||
if(result.MASTER_OBJID){
|
||||
$("#MASTER_OBJID").val(result.MASTER_OBJID);
|
||||
}
|
||||
Swal.fire({
|
||||
title: '저장되었습니다.',
|
||||
icon: 'success'
|
||||
}).then(() => {
|
||||
if(window.opener && window.opener.fn_search){
|
||||
window.opener.fn_search();
|
||||
}
|
||||
});
|
||||
} else {
|
||||
Swal.fire({
|
||||
title: '저장 실패',
|
||||
text: result.MESSAGE || '저장 중 오류가 발생했습니다.',
|
||||
icon: 'error'
|
||||
});
|
||||
}
|
||||
},
|
||||
error: function(xhr, status, error){
|
||||
Swal.fire({
|
||||
title: '저장 실패',
|
||||
text: '서버 통신 오류가 발생했습니다.',
|
||||
icon: 'error'
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// 팝업 닫힐 때 부모 새로고침
|
||||
window.addEventListener('unload', function() {
|
||||
if(window.opener && window.opener.fn_search) {
|
||||
window.opener.fn_search();
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
<body>
|
||||
<form name="form1" id="form1" method="post">
|
||||
<div class="popup_wrap">
|
||||
<div class="popup_header">
|
||||
<h2><%=menuName%></h2>
|
||||
<div class="btnArea">
|
||||
<input type="button" class="plm_btns" value="저장" id="btnSave">
|
||||
<input type="button" class="plm_btns" value="닫기" id="btnClose">
|
||||
</div>
|
||||
</div>
|
||||
<div class="popup_content">
|
||||
<table class="plm_form_table">
|
||||
<colgroup>
|
||||
<col width="120px"><col width="*">
|
||||
<col width="120px"><col width="*">
|
||||
</colgroup>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td class="label">검사일</td>
|
||||
<td><input type="text" name="INSPECTION_DATE" id="INSPECTION_DATE" class="date_icon"></td>
|
||||
<td class="label">프로젝트번호</td>
|
||||
<td><input type="text" name="PROJECT_NO" id="PROJECT_NO"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="label">품번</td>
|
||||
<td><input type="text" name="PART_NO" id="PART_NO"></td>
|
||||
<td class="label">품명</td>
|
||||
<td><input type="text" name="PART_NAME" id="PART_NAME"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="label">불량수량</td>
|
||||
<td><input type="text" name="DEFECT_QTY" id="DEFECT_QTY"></td>
|
||||
<td class="label">작업환경상태</td>
|
||||
<td><input type="text" name="WORK_ENV_STATUS" id="WORK_ENV_STATUS"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="label">측정기</td>
|
||||
<td><input type="text" name="MEASURING_DEVICE" id="MEASURING_DEVICE"></td>
|
||||
<td class="label">검사자</td>
|
||||
<td><input type="text" name="INSPECTOR_NAME" id="INSPECTOR_NAME"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="label">검사결과</td>
|
||||
<td>
|
||||
<select name="INSPECTION_RESULT" id="INSPECTION_RESULT">
|
||||
<option value="">선택</option>
|
||||
<option value="OK">OK</option>
|
||||
<option value="NG">NG</option>
|
||||
</select>
|
||||
</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="label">비고</td>
|
||||
<td colspan="3"><textarea name="REMARK" id="REMARK" rows="3" style="width:100%;"></textarea></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<body style="overflow-x: hidden;">
|
||||
<form name="form1" id="form1" action="" method="post" onsubmit="return false">
|
||||
<input type="hidden" name="MASTER_OBJID" id="MASTER_OBJID" value="${param.OBJID}">
|
||||
|
||||
<div class="plm_menu_name_gdnsi">
|
||||
<h2><span>공정검사 등록</span></h2>
|
||||
<div class="btnArea">
|
||||
<input type="button" value="행추가" class="plm_btns" id="btnAddRow">
|
||||
<input type="button" value="행삭제" class="plm_btns" id="btnDelRow">
|
||||
<input type="button" value="저장" class="plm_btns" id="btnSave">
|
||||
<input type="button" value="닫기" class="plm_btns" id="btnClose">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-header">
|
||||
<div>
|
||||
<label>검사일<span class="required">*</span></label>
|
||||
<input type="text" name="INSPECTION_DATE" id="INSPECTION_DATE" class="date_icon" style="width:120px;" value="${info.inspection_date}">
|
||||
</div>
|
||||
<div>
|
||||
<label>검사자<span class="required">*</span></label>
|
||||
<select name="INSPECTOR_ID" id="INSPECTOR_ID" class="select2" style="width:150px;">
|
||||
<option value="">선택</option>
|
||||
${code_map.inspector_id}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="grid" style="margin: 10px;"></div>
|
||||
</form>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -83,11 +83,16 @@ $(document).ready(function(){
|
||||
|
||||
// 컬럼: 검사일, 프로젝트번호, 품번, 품명, 불량수량, 작업환경상태, 측정기, 검사자, 검사결과
|
||||
var columns = [
|
||||
{headerHozAlign:'center', hozAlign:'center', minWidth:110, widthGrow:1, title:'검사일', field:'INSPECTION_DATE'},
|
||||
{headerHozAlign:'center', hozAlign:'center', minWidth:130, widthGrow:1, title:'프로젝트번호', field:'PROJECT_NO'},
|
||||
{headerHozAlign:'center', hozAlign:'left', minWidth:140, widthGrow:2, title:'품번', field:'PART_NO'},
|
||||
{headerHozAlign:'center', hozAlign:'left', minWidth:180, widthGrow:3, title:'품명', field:'PART_NAME'},
|
||||
{headerHozAlign:'center', hozAlign:'right', minWidth:100, widthGrow:1, title:'불량수량', field:'DEFECT_QTY',
|
||||
{headerHozAlign:'center', hozAlign:'center', minWidth:110, widthGrow:1, title:'검사일', field:'INSPECTION_DATE',
|
||||
formatter: fnc_createGridAnchorTag,
|
||||
cellClick: function(e, cell){
|
||||
fn_openFormPopUp(cell.getData().OBJID);
|
||||
}
|
||||
},
|
||||
{headerHozAlign:'center', hozAlign:'center', minWidth:150, widthGrow:2, title:'프로젝트번호', field:'PROJECT_NO'},
|
||||
{headerHozAlign:'center', hozAlign:'left', minWidth:180, widthGrow:2, title:'품번', field:'PART_NO'},
|
||||
{headerHozAlign:'center', hozAlign:'left', minWidth:200, widthGrow:3, title:'품명', field:'PART_NAME'},
|
||||
{headerHozAlign:'center', hozAlign:'right', minWidth:100, widthGrow:1, title:'불량수량 합계', field:'DEFECT_QTY',
|
||||
formatter:"money", formatterParams:{thousand:",", precision:false}
|
||||
},
|
||||
{headerHozAlign:'center', hozAlign:'center', minWidth:120, widthGrow:1, title:'작업환경상태', field:'WORK_ENV_STATUS'},
|
||||
@@ -103,6 +108,14 @@ var columns = [
|
||||
}
|
||||
];
|
||||
|
||||
// 수정 팝업
|
||||
function fn_openFormPopUp(objId){
|
||||
var popup_width = 1500;
|
||||
var popup_height = 700;
|
||||
var url = "/quality/processInspectionFormPopUp.do?OBJID=" + objId;
|
||||
window.open(url, "processInspectionPopUp", "width=" + popup_width + ",height=" + popup_height + ",scrollbars=yes,resizable=yes");
|
||||
}
|
||||
|
||||
// 조회
|
||||
function fn_search(){
|
||||
_tabulGrid = fnc_tabul_search(_tabul_layout_fitColumns, _tabulGrid, "/quality/processInspectionGridList.do", columns, true);
|
||||
@@ -110,41 +123,22 @@ function fn_search(){
|
||||
|
||||
// 검색조건 초기화
|
||||
function fn_reset(){
|
||||
$("#search_inspection_date_from").val("");
|
||||
$("#search_inspection_date_to").val("");
|
||||
$("#search_inspector").val("");
|
||||
$("#search_project_no").val("");
|
||||
$("#search_part_no").val("");
|
||||
$("#search_part_name").val("");
|
||||
$("#search_work_env_status").val("");
|
||||
$("#search_measuring_device").val("");
|
||||
$("#search_inspector").val("");
|
||||
$("#search_inspection_date_from").val("");
|
||||
$("#search_inspection_date_to").val("");
|
||||
$("#search_inspection_result").val("");
|
||||
}
|
||||
|
||||
// 공정검사 등록 팝업
|
||||
function fn_registPopUp(){
|
||||
var selected = _tabulGrid.getSelectedData();
|
||||
if(selected.length == 0){
|
||||
Swal.fire("선택된 데이터가 없습니다.");
|
||||
return;
|
||||
}
|
||||
if(selected.length > 1){
|
||||
Swal.fire("한건씩 등록 가능합니다.");
|
||||
return;
|
||||
}
|
||||
|
||||
var popup_width = 1200;
|
||||
var popup_height = 800;
|
||||
var hiddenForm = document.hiddenForm;
|
||||
var target = "processInspectionPopUp";
|
||||
var popup_width = 1500;
|
||||
var popup_height = 700;
|
||||
var url = "/quality/processInspectionFormPopUp.do";
|
||||
|
||||
fn_centerPopup(popup_width, popup_height, "", target);
|
||||
|
||||
hiddenForm.action = url;
|
||||
hiddenForm.OBJID.value = selected[0].OBJID;
|
||||
hiddenForm.target = target;
|
||||
hiddenForm.submit();
|
||||
window.open(url, "processInspectionPopUp", "width=" + popup_width + ",height=" + popup_height + ",scrollbars=yes,resizable=yes");
|
||||
}
|
||||
|
||||
// 엑셀 다운로드
|
||||
@@ -178,6 +172,16 @@ function fn_excelDownload(){
|
||||
|
||||
<div id="plmSearchZon">
|
||||
<div style="display:flex; flex-wrap:wrap; gap:10px; align-items:center;">
|
||||
<div class="search-item">
|
||||
<label>검사일</label>
|
||||
<input type="text" name="search_inspection_date_from" id="search_inspection_date_from" class="date_icon" style="width:110px;" autocomplete="off">
|
||||
<span>~</span>
|
||||
<input type="text" name="search_inspection_date_to" id="search_inspection_date_to" class="date_icon" style="width:110px;" autocomplete="off">
|
||||
</div>
|
||||
<div class="search-item">
|
||||
<label>검사자</label>
|
||||
<input type="text" name="search_inspector" id="search_inspector" style="width:120px;" autocomplete="off">
|
||||
</div>
|
||||
<div class="search-item">
|
||||
<label>프로젝트번호</label>
|
||||
<input type="text" name="search_project_no" id="search_project_no" style="width:120px;" autocomplete="off">
|
||||
@@ -190,24 +194,6 @@ function fn_excelDownload(){
|
||||
<label>품명</label>
|
||||
<input type="text" name="search_part_name" id="search_part_name" style="width:120px;" autocomplete="off">
|
||||
</div>
|
||||
<div class="search-item">
|
||||
<label>작업환경상태</label>
|
||||
<input type="text" name="search_work_env_status" id="search_work_env_status" style="width:120px;" autocomplete="off">
|
||||
</div>
|
||||
<div class="search-item">
|
||||
<label>측정기</label>
|
||||
<input type="text" name="search_measuring_device" id="search_measuring_device" style="width:120px;" autocomplete="off">
|
||||
</div>
|
||||
<div class="search-item">
|
||||
<label>검사자</label>
|
||||
<input type="text" name="search_inspector" id="search_inspector" style="width:120px;" autocomplete="off">
|
||||
</div>
|
||||
<div class="search-item">
|
||||
<label>검사일</label>
|
||||
<input type="text" name="search_inspection_date_from" id="search_inspection_date_from" class="date_icon" style="width:110px;" autocomplete="off">
|
||||
<span>~</span>
|
||||
<input type="text" name="search_inspection_date_to" id="search_inspection_date_to" class="date_icon" style="width:110px;" autocomplete="off">
|
||||
</div>
|
||||
<div class="search-item">
|
||||
<label>검사결과</label>
|
||||
<select name="search_inspection_result" id="search_inspection_result" style="width:100px;">
|
||||
|
||||
@@ -391,10 +391,11 @@ public class QualityController {
|
||||
/**
|
||||
* 공정검사 관리 그리드 목록 조회
|
||||
*/
|
||||
@ResponseBody
|
||||
@RequestMapping("/quality/processInspectionGridList.do")
|
||||
public String processInspectionGridList(HttpServletRequest request, @RequestParam Map<String, Object> paramMap){
|
||||
request.setAttribute("RESULT", CommonUtils.getJsonArray(service.getProcessInspectionList(request, paramMap)));
|
||||
return "/ajax/ajaxResult";
|
||||
public Map processInspectionGridList(HttpServletRequest request, @RequestParam Map<String, Object> paramMap){
|
||||
commonService.selectListPagingNew("quality.getProcessInspectionList", request, paramMap);
|
||||
return paramMap;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -402,11 +403,53 @@ public class QualityController {
|
||||
*/
|
||||
@RequestMapping("/quality/processInspectionFormPopUp.do")
|
||||
public String processInspectionFormPopUp(HttpServletRequest request, @RequestParam Map<String, Object> paramMap){
|
||||
Map info = service.getProcessInspectionInfo(paramMap);
|
||||
request.setAttribute("info", info);
|
||||
Map code_map = new HashMap();
|
||||
|
||||
try {
|
||||
// 로그인 사용자 정보
|
||||
PersonBean person = (PersonBean) request.getSession().getAttribute(Constants.PERSON_BEAN);
|
||||
String loginUserId = person != null ? person.getUserId() : "";
|
||||
|
||||
// 기존 검사 정보 조회
|
||||
Map info = service.getProcessInspectionInfo(paramMap);
|
||||
String savedInspectorId = "";
|
||||
if(info != null && info.get("inspector_id") != null) {
|
||||
savedInspectorId = (String) info.get("inspector_id");
|
||||
request.setAttribute("info", info);
|
||||
} else {
|
||||
savedInspectorId = loginUserId;
|
||||
}
|
||||
|
||||
// 검사자 목록
|
||||
code_map.put("inspector_id", commonService.bizMakeOptionList("", savedInspectorId, "common.getUserselect"));
|
||||
} catch(Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
request.setAttribute("code_map", code_map);
|
||||
return "/quality/processInspectionFormPopUp";
|
||||
}
|
||||
|
||||
/**
|
||||
* 공정검사 상세 그리드 목록 조회
|
||||
*/
|
||||
@ResponseBody
|
||||
@RequestMapping("/quality/processInspectionDetailGridList.do")
|
||||
public Map processInspectionDetailGridList(HttpServletRequest request, @RequestParam Map<String, Object> paramMap){
|
||||
commonService.selectListPagingNew("quality.getProcessInspectionDetailList", request, paramMap);
|
||||
return paramMap;
|
||||
}
|
||||
|
||||
/**
|
||||
* 공정검사 저장
|
||||
*/
|
||||
@RequestMapping("/quality/saveProcessInspection.do")
|
||||
public String saveProcessInspection(HttpServletRequest request, @RequestParam Map paramMap){
|
||||
Map map = service.saveProcessInspection(request, paramMap);
|
||||
request.setAttribute("RESULT", CommonUtils.getJsonMap(map));
|
||||
return "/ajax/ajaxResult";
|
||||
}
|
||||
|
||||
/**
|
||||
* 공정검사 엑셀 다운로드
|
||||
*/
|
||||
|
||||
@@ -3317,4 +3317,20 @@ ORDER BY COALESCE(T.REVISION, '1.0')
|
||||
</otherwise>
|
||||
</choose>
|
||||
</select>
|
||||
|
||||
<!-- 프로젝트 OBJID로 MBOM 파트 목록 조회 -->
|
||||
<select id="getMbomPartListByProjectNo" parameterType="map" resultType="map">
|
||||
SELECT PM.OBJID AS CODE
|
||||
, PM.PART_NO || ' - ' || PM.PART_NAME AS NAME
|
||||
, PM.OBJID AS CODE_ID
|
||||
, PM.PART_NO || ' - ' || PM.PART_NAME AS CODE_NAME
|
||||
, PM.PART_NO
|
||||
, PM.PART_NAME
|
||||
FROM MBOM_DETAIL MD
|
||||
INNER JOIN MBOM_HEADER MH ON MH.OBJID = MD.MBOM_HEADER_OBJID
|
||||
INNER JOIN PROJECT_MGMT PJ ON PJ.OBJID = MH.PROJECT_OBJID
|
||||
INNER JOIN PART_MNG PM ON PM.OBJID::VARCHAR = MD.PART_OBJID
|
||||
WHERE PJ.OBJID = #{PROJECT_NO}
|
||||
ORDER BY PM.PART_NO
|
||||
</select>
|
||||
</mapper>
|
||||
@@ -881,74 +881,221 @@
|
||||
공정검사 관리
|
||||
===================================================== -->
|
||||
|
||||
<!-- 공정검사 목록 조회 -->
|
||||
<!-- 공정검사 마스터 목록 조회 -->
|
||||
<select id="getProcessInspectionList" parameterType="map" resultType="map">
|
||||
SELECT PPI.OBJID
|
||||
, TO_CHAR(PPI.INSPECTION_DATE, 'YYYY-MM-DD') AS INSPECTION_DATE
|
||||
, PPI.PROJECT_NO
|
||||
, PPI.PART_NO
|
||||
, PPI.PART_NAME
|
||||
, PPI.DEFECT_QTY
|
||||
, PPI.WORK_ENV_STATUS
|
||||
, PPI.MEASURING_DEVICE
|
||||
, PPI.INSPECTOR_ID
|
||||
, (SELECT USER_NAME FROM USER_INFO WHERE USER_ID = PPI.INSPECTOR_ID) AS INSPECTOR_NAME
|
||||
, PPI.INSPECTION_RESULT
|
||||
FROM PMS_QUALITY_PROCESS_INSPECTION PPI
|
||||
SELECT PIM.OBJID
|
||||
, PIM.INSPECTION_DATE
|
||||
, PIM.INSPECTOR_ID
|
||||
, (SELECT USER_NAME FROM USER_INFO WHERE USER_ID = PIM.INSPECTOR_ID) AS INSPECTOR_NAME
|
||||
<!-- 프로젝트명 (외 N건) -->
|
||||
, (SELECT
|
||||
CASE WHEN COUNT(DISTINCT PID.PROJECT_OBJID) > 1
|
||||
THEN (SELECT PROJECT_NO FROM PROJECT_MGMT WHERE OBJID = MIN(PID.PROJECT_OBJID)) || ' 외 ' || (COUNT(DISTINCT PID.PROJECT_OBJID) - 1) || '건'
|
||||
ELSE (SELECT PROJECT_NO FROM PROJECT_MGMT WHERE OBJID = MIN(PID.PROJECT_OBJID))
|
||||
END
|
||||
FROM PROCESS_INSPECTION_DETAIL PID WHERE PID.MASTER_OBJID = PIM.OBJID
|
||||
) AS PROJECT_NO
|
||||
<!-- 품번 (외 N건) -->
|
||||
, (SELECT
|
||||
CASE WHEN COUNT(*) > 1
|
||||
THEN MIN(PID.PART_NO) || ' 외 ' || (COUNT(*) - 1) || '건'
|
||||
ELSE MIN(PID.PART_NO)
|
||||
END
|
||||
FROM PROCESS_INSPECTION_DETAIL PID WHERE PID.MASTER_OBJID = PIM.OBJID
|
||||
) AS PART_NO
|
||||
<!-- 품명 (외 N건) -->
|
||||
, (SELECT
|
||||
CASE WHEN COUNT(*) > 1
|
||||
THEN MIN(PID.PART_NAME) || ' 외 ' || (COUNT(*) - 1) || '건'
|
||||
ELSE MIN(PID.PART_NAME)
|
||||
END
|
||||
FROM PROCESS_INSPECTION_DETAIL PID WHERE PID.MASTER_OBJID = PIM.OBJID
|
||||
) AS PART_NAME
|
||||
<!-- 불량수량 합계 -->
|
||||
, (SELECT COALESCE(SUM(PID.DEFECT_QTY), 0) FROM PROCESS_INSPECTION_DETAIL PID WHERE PID.MASTER_OBJID = PIM.OBJID) AS DEFECT_QTY
|
||||
<!-- 작업환경상태 (하나라도 불량이면 불량) -->
|
||||
, (SELECT CASE WHEN COUNT(CASE WHEN PID.WORK_ENV_STATUS = '불량' THEN 1 END) > 0 THEN '불량' ELSE '양호' END
|
||||
FROM PROCESS_INSPECTION_DETAIL PID WHERE PID.MASTER_OBJID = PIM.OBJID
|
||||
) AS WORK_ENV_STATUS
|
||||
<!-- 측정기 (하나라도 불량이면 불량) -->
|
||||
, (SELECT CASE WHEN COUNT(CASE WHEN PID.MEASURING_DEVICE = '불량' THEN 1 END) > 0 THEN '불량' ELSE '양호' END
|
||||
FROM PROCESS_INSPECTION_DETAIL PID WHERE PID.MASTER_OBJID = PIM.OBJID
|
||||
) AS MEASURING_DEVICE
|
||||
<!-- 검사결과 (하나라도 NG면 NG) -->
|
||||
, (SELECT CASE WHEN COUNT(CASE WHEN PID.INSPECTION_RESULT = 'NG' THEN 1 END) > 0 THEN 'NG' ELSE 'OK' END
|
||||
FROM PROCESS_INSPECTION_DETAIL PID WHERE PID.MASTER_OBJID = PIM.OBJID
|
||||
) AS INSPECTION_RESULT
|
||||
, PIM.REMARK
|
||||
FROM PROCESS_INSPECTION_MASTER PIM
|
||||
WHERE 1=1
|
||||
<if test="search_project_no != null and search_project_no != ''">
|
||||
AND UPPER(PPI.PROJECT_NO) LIKE UPPER('%' || #{search_project_no} || '%')
|
||||
AND EXISTS (SELECT 1 FROM PROCESS_INSPECTION_DETAIL PID
|
||||
JOIN PROJECT_MGMT PM ON PM.OBJID = PID.PROJECT_OBJID
|
||||
WHERE PID.MASTER_OBJID = PIM.OBJID
|
||||
AND UPPER(PM.PROJECT_NO) LIKE UPPER('%' || #{search_project_no} || '%'))
|
||||
</if>
|
||||
<if test="search_part_no != null and search_part_no != ''">
|
||||
AND UPPER(PPI.PART_NO) LIKE UPPER('%' || #{search_part_no} || '%')
|
||||
AND EXISTS (SELECT 1 FROM PROCESS_INSPECTION_DETAIL PID
|
||||
WHERE PID.MASTER_OBJID = PIM.OBJID
|
||||
AND UPPER(PID.PART_NO) LIKE UPPER('%' || #{search_part_no} || '%'))
|
||||
</if>
|
||||
<if test="search_part_name != null and search_part_name != ''">
|
||||
AND UPPER(PPI.PART_NAME) LIKE UPPER('%' || #{search_part_name} || '%')
|
||||
</if>
|
||||
<if test="search_work_env_status != null and search_work_env_status != ''">
|
||||
AND UPPER(PPI.WORK_ENV_STATUS) LIKE UPPER('%' || #{search_work_env_status} || '%')
|
||||
</if>
|
||||
<if test="search_measuring_device != null and search_measuring_device != ''">
|
||||
AND UPPER(PPI.MEASURING_DEVICE) LIKE UPPER('%' || #{search_measuring_device} || '%')
|
||||
AND EXISTS (SELECT 1 FROM PROCESS_INSPECTION_DETAIL PID
|
||||
WHERE PID.MASTER_OBJID = PIM.OBJID
|
||||
AND UPPER(PID.PART_NAME) LIKE UPPER('%' || #{search_part_name} || '%'))
|
||||
</if>
|
||||
<if test="search_inspector != null and search_inspector != ''">
|
||||
AND (
|
||||
UPPER(PPI.INSPECTOR_ID) LIKE UPPER('%' || #{search_inspector} || '%')
|
||||
OR UPPER((SELECT USER_NAME FROM USER_INFO WHERE USER_ID = PPI.INSPECTOR_ID)) LIKE UPPER('%' || #{search_inspector} || '%')
|
||||
UPPER(PIM.INSPECTOR_ID) LIKE UPPER('%' || #{search_inspector} || '%')
|
||||
OR UPPER((SELECT USER_NAME FROM USER_INFO WHERE USER_ID = PIM.INSPECTOR_ID)) LIKE UPPER('%' || #{search_inspector} || '%')
|
||||
)
|
||||
</if>
|
||||
<if test="search_inspection_date_from != null and search_inspection_date_from != ''">
|
||||
AND PPI.INSPECTION_DATE >= TO_DATE(#{search_inspection_date_from}, 'YYYY-MM-DD')
|
||||
AND PIM.INSPECTION_DATE <![CDATA[>=]]> #{search_inspection_date_from}
|
||||
</if>
|
||||
<if test="search_inspection_date_to != null and search_inspection_date_to != ''">
|
||||
AND PPI.INSPECTION_DATE <![CDATA[<=]]> TO_DATE(#{search_inspection_date_to}, 'YYYY-MM-DD')
|
||||
AND PIM.INSPECTION_DATE <![CDATA[<=]]> #{search_inspection_date_to}
|
||||
</if>
|
||||
<if test="search_inspection_result != null and search_inspection_result != ''">
|
||||
AND PPI.INSPECTION_RESULT = #{search_inspection_result}
|
||||
AND (SELECT CASE WHEN COUNT(CASE WHEN PID.INSPECTION_RESULT = 'NG' THEN 1 END) > 0 THEN 'NG' ELSE 'OK' END
|
||||
FROM PROCESS_INSPECTION_DETAIL PID WHERE PID.MASTER_OBJID = PIM.OBJID) = #{search_inspection_result}
|
||||
</if>
|
||||
ORDER BY PPI.INSPECTION_DATE DESC, PPI.REG_DATE DESC
|
||||
ORDER BY PIM.INSPECTION_DATE DESC, PIM.REG_DATE DESC
|
||||
</select>
|
||||
|
||||
<!-- 공정검사 상세 조회 -->
|
||||
<!-- 공정검사 마스터 상세 조회 -->
|
||||
<select id="getProcessInspectionInfo" parameterType="map" resultType="map">
|
||||
SELECT PPI.OBJID
|
||||
, TO_CHAR(PPI.INSPECTION_DATE, 'YYYY-MM-DD') AS INSPECTION_DATE
|
||||
, PPI.PROJECT_NO
|
||||
, PPI.PART_NO
|
||||
, PPI.PART_NAME
|
||||
, PPI.DEFECT_QTY
|
||||
, PPI.WORK_ENV_STATUS
|
||||
, PPI.MEASURING_DEVICE
|
||||
, PPI.INSPECTOR_ID
|
||||
, (SELECT USER_NAME FROM USER_INFO WHERE USER_ID = PPI.INSPECTOR_ID) AS INSPECTOR_NAME
|
||||
, PPI.INSPECTION_RESULT
|
||||
, PPI.REMARK
|
||||
, PPI.WRITER
|
||||
, TO_CHAR(PPI.REG_DATE, 'YYYY-MM-DD') AS REG_DATE
|
||||
FROM PMS_QUALITY_PROCESS_INSPECTION PPI
|
||||
WHERE PPI.OBJID = #{OBJID}
|
||||
SELECT PIM.OBJID
|
||||
, PIM.INSPECTION_DATE
|
||||
, PIM.INSPECTOR_ID
|
||||
, (SELECT USER_NAME FROM USER_INFO WHERE USER_ID = PIM.INSPECTOR_ID) AS INSPECTOR_NAME
|
||||
, PIM.REMARK
|
||||
, PIM.WRITER
|
||||
, TO_CHAR(PIM.REG_DATE, 'YYYY-MM-DD') AS REG_DATE
|
||||
FROM PROCESS_INSPECTION_MASTER PIM
|
||||
WHERE PIM.OBJID = #{OBJID}
|
||||
</select>
|
||||
|
||||
<!-- 공정검사 디테일 그리드 목록 조회 -->
|
||||
<select id="getProcessInspectionDetailList" parameterType="map" resultType="map">
|
||||
SELECT PID.OBJID
|
||||
, PID.MASTER_OBJID
|
||||
, PID.PROCESS_CD
|
||||
, (SELECT CODE_NAME FROM COMM_CODE WHERE CODE_ID = PID.PROCESS_CD) AS PROCESS_NAME
|
||||
, PID.PROJECT_OBJID
|
||||
, (SELECT PROJECT_NO FROM PROJECT_MGMT WHERE OBJID = PID.PROJECT_OBJID) AS PROJECT_NO
|
||||
, PID.PART_OBJID
|
||||
, PID.PART_NO
|
||||
, PID.PART_NAME
|
||||
, PID.INSPECTION_QTY
|
||||
, PID.DEFECT_QTY
|
||||
, PID.WORK_ENV_STATUS
|
||||
, PID.MEASURING_DEVICE
|
||||
, PID.DEPT_CD
|
||||
, (SELECT DEPT_NAME FROM DEPT_INFO WHERE OBJID::VARCHAR = PID.DEPT_CD) AS DEPT_NAME
|
||||
, PID.USER_ID
|
||||
, (SELECT USER_NAME FROM USER_INFO WHERE USER_ID = PID.USER_ID) AS USER_NAME
|
||||
, PID.REMARK
|
||||
, PID.ACTION_STATUS
|
||||
, PID.INSPECTION_RESULT
|
||||
FROM PROCESS_INSPECTION_DETAIL PID
|
||||
WHERE PID.MASTER_OBJID = #{MASTER_OBJID}
|
||||
ORDER BY PID.REG_DATE
|
||||
</select>
|
||||
|
||||
<!-- 공정검사 마스터 저장 -->
|
||||
<insert id="insertProcessInspectionMaster" parameterType="map">
|
||||
INSERT INTO PROCESS_INSPECTION_MASTER (
|
||||
OBJID
|
||||
, INSPECTION_DATE
|
||||
, INSPECTOR_ID
|
||||
, REMARK
|
||||
, WRITER
|
||||
, REG_DATE
|
||||
) VALUES (
|
||||
#{OBJID}
|
||||
, #{INSPECTION_DATE}
|
||||
, #{INSPECTOR_ID}
|
||||
, #{REMARK}
|
||||
, #{WRITER}
|
||||
, NOW()
|
||||
)
|
||||
</insert>
|
||||
|
||||
<!-- 공정검사 마스터 수정 -->
|
||||
<update id="updateProcessInspectionMaster" parameterType="map">
|
||||
UPDATE PROCESS_INSPECTION_MASTER SET
|
||||
INSPECTION_DATE = #{INSPECTION_DATE}
|
||||
, INSPECTOR_ID = #{INSPECTOR_ID}
|
||||
, REMARK = #{REMARK}
|
||||
, MOD_DATE = NOW()
|
||||
WHERE OBJID = #{OBJID}
|
||||
</update>
|
||||
|
||||
<!-- 공정검사 디테일 저장 (UPSERT) -->
|
||||
<update id="saveProcessInspectionDetail" parameterType="map">
|
||||
INSERT INTO PROCESS_INSPECTION_DETAIL (
|
||||
OBJID
|
||||
, MASTER_OBJID
|
||||
, PROCESS_CD
|
||||
, PROJECT_OBJID
|
||||
, PART_OBJID
|
||||
, PART_NO
|
||||
, PART_NAME
|
||||
, INSPECTION_QTY
|
||||
, DEFECT_QTY
|
||||
, WORK_ENV_STATUS
|
||||
, MEASURING_DEVICE
|
||||
, DEPT_CD
|
||||
, USER_ID
|
||||
, REMARK
|
||||
, ACTION_STATUS
|
||||
, INSPECTION_RESULT
|
||||
, WRITER
|
||||
, REG_DATE
|
||||
) VALUES (
|
||||
#{OBJID}
|
||||
, #{MASTER_OBJID}
|
||||
, #{PROCESS_CD}
|
||||
, #{PROJECT_OBJID}
|
||||
, #{PART_OBJID}
|
||||
, #{PART_NO}
|
||||
, #{PART_NAME}
|
||||
, NULLIF(#{INSPECTION_QTY}, '')::NUMERIC
|
||||
, NULLIF(#{DEFECT_QTY}, '')::NUMERIC
|
||||
, #{WORK_ENV_STATUS}
|
||||
, #{MEASURING_DEVICE}
|
||||
, #{DEPT_CD}
|
||||
, #{USER_ID}
|
||||
, #{REMARK}
|
||||
, #{ACTION_STATUS}
|
||||
, #{INSPECTION_RESULT}
|
||||
, #{WRITER}
|
||||
, NOW()
|
||||
)
|
||||
ON CONFLICT (OBJID) DO UPDATE SET
|
||||
PROCESS_CD = #{PROCESS_CD}
|
||||
, PROJECT_OBJID = #{PROJECT_OBJID}
|
||||
, PART_OBJID = #{PART_OBJID}
|
||||
, PART_NO = #{PART_NO}
|
||||
, PART_NAME = #{PART_NAME}
|
||||
, INSPECTION_QTY = NULLIF(#{INSPECTION_QTY}, '')::NUMERIC
|
||||
, DEFECT_QTY = NULLIF(#{DEFECT_QTY}, '')::NUMERIC
|
||||
, WORK_ENV_STATUS = #{WORK_ENV_STATUS}
|
||||
, MEASURING_DEVICE = #{MEASURING_DEVICE}
|
||||
, DEPT_CD = #{DEPT_CD}
|
||||
, USER_ID = #{USER_ID}
|
||||
, REMARK = #{REMARK}
|
||||
, ACTION_STATUS = #{ACTION_STATUS}
|
||||
, INSPECTION_RESULT = #{INSPECTION_RESULT}
|
||||
, MOD_DATE = NOW()
|
||||
</update>
|
||||
|
||||
<!-- 공정검사 디테일 삭제 (마스터 기준) -->
|
||||
<delete id="deleteProcessInspectionDetailByMaster" parameterType="map">
|
||||
DELETE FROM PROCESS_INSPECTION_DETAIL WHERE MASTER_OBJID = #{MASTER_OBJID}
|
||||
</delete>
|
||||
|
||||
<!-- =====================================================
|
||||
반제품검사 관리
|
||||
===================================================== -->
|
||||
|
||||
@@ -792,6 +792,94 @@ public class QualityService extends BaseService{
|
||||
return resultList;
|
||||
}
|
||||
|
||||
/**
|
||||
* 공정검사 저장 (마스터 + 디테일)
|
||||
*/
|
||||
public Map saveProcessInspection(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() : "";
|
||||
|
||||
String masterObjId = CommonUtils.checkNull(paramMap.get("MASTER_OBJID"));
|
||||
String inspectionDate = CommonUtils.checkNull(paramMap.get("INSPECTION_DATE"));
|
||||
String inspectorId = CommonUtils.checkNull(paramMap.get("INSPECTOR_ID"));
|
||||
String masterRemark = CommonUtils.checkNull(paramMap.get("MASTER_REMARK"));
|
||||
String dataListJson = CommonUtils.checkNull(paramMap.get("dataList"));
|
||||
|
||||
// 마스터 저장
|
||||
Map<String, Object> masterParamMap = new HashMap<String, Object>();
|
||||
masterParamMap.put("INSPECTION_DATE", inspectionDate);
|
||||
masterParamMap.put("INSPECTOR_ID", inspectorId);
|
||||
masterParamMap.put("REMARK", masterRemark);
|
||||
masterParamMap.put("WRITER", writer);
|
||||
|
||||
if(masterObjId.isEmpty()){
|
||||
// 신규 등록
|
||||
masterObjId = CommonUtils.checkNull(CommonUtils.createObjId());
|
||||
masterParamMap.put("OBJID", masterObjId);
|
||||
sqlSession.insert("quality.insertProcessInspectionMaster", masterParamMap);
|
||||
} else {
|
||||
// 수정
|
||||
masterParamMap.put("OBJID", masterObjId);
|
||||
sqlSession.update("quality.updateProcessInspectionMaster", masterParamMap);
|
||||
// 기존 디테일 삭제 후 재등록
|
||||
Map<String, Object> deleteParamMap = new HashMap<String, Object>();
|
||||
deleteParamMap.put("MASTER_OBJID", masterObjId);
|
||||
sqlSession.delete("quality.deleteProcessInspectionDetailByMaster", deleteParamMap);
|
||||
}
|
||||
|
||||
// 디테일 저장
|
||||
if(dataListJson != null && !dataListJson.isEmpty()){
|
||||
com.google.gson.Gson gson = new com.google.gson.Gson();
|
||||
java.lang.reflect.Type listType = new com.google.gson.reflect.TypeToken<List<Map<String, Object>>>(){}.getType();
|
||||
List<Map<String, Object>> dataList = gson.fromJson(dataListJson, listType);
|
||||
|
||||
for(Map<String, Object> rowData : dataList){
|
||||
Map<String, Object> sqlParamMap = new HashMap<String, Object>();
|
||||
|
||||
String detailObjId = CommonUtils.checkNull(CommonUtils.createObjId());
|
||||
|
||||
sqlParamMap.put("OBJID", detailObjId);
|
||||
sqlParamMap.put("MASTER_OBJID", masterObjId);
|
||||
sqlParamMap.put("PROCESS_CD", CommonUtils.checkNull(rowData.get("PROCESS_CD")));
|
||||
sqlParamMap.put("PROJECT_OBJID", CommonUtils.checkNull(rowData.get("PROJECT_OBJID")));
|
||||
sqlParamMap.put("PART_OBJID", CommonUtils.checkNull(rowData.get("PART_OBJID")));
|
||||
sqlParamMap.put("PART_NO", CommonUtils.checkNull(rowData.get("PART_NO")));
|
||||
sqlParamMap.put("PART_NAME", CommonUtils.checkNull(rowData.get("PART_NAME")));
|
||||
sqlParamMap.put("INSPECTION_QTY", CommonUtils.checkNull(rowData.get("INSPECTION_QTY")));
|
||||
sqlParamMap.put("DEFECT_QTY", CommonUtils.checkNull(rowData.get("DEFECT_QTY")));
|
||||
sqlParamMap.put("WORK_ENV_STATUS", CommonUtils.checkNull(rowData.get("WORK_ENV_STATUS")));
|
||||
sqlParamMap.put("MEASURING_DEVICE", CommonUtils.checkNull(rowData.get("MEASURING_DEVICE")));
|
||||
sqlParamMap.put("DEPT_CD", CommonUtils.checkNull(rowData.get("DEPT_CD")));
|
||||
sqlParamMap.put("USER_ID", CommonUtils.checkNull(rowData.get("USER_ID")));
|
||||
sqlParamMap.put("REMARK", CommonUtils.checkNull(rowData.get("REMARK")));
|
||||
sqlParamMap.put("ACTION_STATUS", CommonUtils.checkNull(rowData.get("ACTION_STATUS")));
|
||||
sqlParamMap.put("INSPECTION_RESULT", CommonUtils.checkNull(rowData.get("INSPECTION_RESULT")));
|
||||
sqlParamMap.put("WRITER", writer);
|
||||
|
||||
sqlSession.insert("quality.saveProcessInspectionDetail", sqlParamMap);
|
||||
}
|
||||
}
|
||||
|
||||
resultMap.put("RESULT", "SUCCESS");
|
||||
resultMap.put("MASTER_OBJID", masterObjId);
|
||||
|
||||
}catch(Exception e){
|
||||
e.printStackTrace();
|
||||
resultMap.put("RESULT", "FAIL");
|
||||
resultMap.put("MESSAGE", e.getMessage());
|
||||
}finally{
|
||||
if(sqlSession != null) sqlSession.close();
|
||||
}
|
||||
|
||||
return resultMap;
|
||||
}
|
||||
|
||||
// =====================================================
|
||||
// 반제품검사 관리
|
||||
// =====================================================
|
||||
|
||||
Reference in New Issue
Block a user