Files
wace_plm/WebContent/WEB-INF/view/quality/incomingInspectionProgressPopUp.jsp
2025-12-16 17:33:39 +09:00

845 lines
25 KiB
Plaintext

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ 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" %>
<%
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>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<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;
}
.form-header .info-text {
color: #666;
font-size: 12px;
}
/* 좌/우 분할 레이아웃 */
.split-container {
display: flex;
height: calc(100vh - 180px);
gap: 10px;
padding: 10px;
}
.left-panel {
width: 35%;
display: flex;
flex-direction: column;
border: 1px solid #ddd;
border-radius: 4px;
overflow: hidden;
}
.right-panel {
width: 65%;
display: flex;
flex-direction: column;
border: 1px solid #ddd;
border-radius: 4px;
overflow: hidden;
}
.panel-header {
background: #4a5568;
color: white;
padding: 10px 15px;
font-weight: bold;
display: flex;
justify-content: space-between;
align-items: center;
}
.panel-header .btn-group button {
padding: 4px 10px;
margin-left: 5px;
border: none;
border-radius: 3px;
cursor: pointer;
font-size: 12px;
}
.panel-header .btn-add {
background: #48bb78;
color: white;
}
.panel-header .btn-delete {
background: #e53e3e;
color: white;
}
.panel-body {
flex: 1;
overflow: auto;
}
.grid-container {
height: 100%;
}
/* 선택된 행 하이라이트 */
.tabulator-row.selected-row {
background-color: #e3f2fd !important;
}
/* 스킵 행 스타일 */
.tabulator-row.skip-row {
background-color: #f5f5f5 !important;
color: #999 !important;
}
/* 비활성화 안내 */
.disabled-notice {
display: flex;
align-items: center;
justify-content: center;
height: 100%;
color: #999;
font-size: 14px;
}
#gridDiv {
height: 0px !important;
}
</style>
<script type="text/javascript">
var _editable = true;
var leftGrid; // 입고품목 그리드 (좌측)
var rightGrid; // 불량상세 그리드 (우측)
var selectedDetailObjid = null; // 현재 선택된 입고품목의 OBJID
var selectedRowData = null; // 현재 선택된 입고품목 데이터
// 불량유형 목록 (0001820)
var _DEFECT_TYPE_LIST = [];
// 처리현황 목록
var _ACTION_STATUS_LIST = [
{"CODE": "", "NAME": "선택"},
{"CODE": "Rework", "NAME": "Rework"},
{"CODE": "Scrap", "NAME": "Scrap"}
];
// 처리결과 목록
var _ACTION_RESULT_LIST = [
{"CODE": "", "NAME": "선택"},
{"CODE": "수정", "NAME": "수정"},
{"CODE": "폐기", "NAME": "폐기"},
{"CODE": "특채", "NAME": "특채"}
];
// 검사자 목록
var _INSPECTOR_LIST = [];
// 검사결과 목록
var _INSPECTION_RESULT_LIST = [
{"CODE": "", "NAME": "선택"},
{"CODE": "OK", "NAME": "OK"},
{"CODE": "NG", "NAME": "NG"}
];
$(document).ready(function(){
fnc_datepick();
$('.select2').select2();
// 불량유형 목록 조회
_DEFECT_TYPE_LIST = [{"CODE": "", "NAME": "선택"}].concat(
fnc_getJsonAllDataListBySqlId({"sqlId": "common.getCodeselect", "code": "0001820"})
);
// 검사자 목록 조회
_INSPECTOR_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}");
}
// 저장 버튼
$("#btnSave").click(function(){
fn_save();
});
// 닫기 버튼
$("#btnClose").click(function(){
self.close();
});
// 행 추가 버튼
$("#btnAddRow").click(function(){
fn_addDefectRow();
});
// 행 삭제 버튼
$("#btnDeleteRow").click(function(){
fn_deleteDefectRow();
});
// 그리드 초기화 및 조회
fn_initLeftGrid();
fn_initRightGrid();
fn_searchLeftGrid();
});
// =====================================================
// 좌측 그리드 (입고품목) 초기화
// =====================================================
function fn_initLeftGrid() {
var columns = [
{formatter:"rowSelection", titleFormatter:"rowSelection", headerHozAlign:"center", hozAlign:"center", headerSort:false, width:30},
{title:'품번', field:'PART_NO', headerHozAlign:'center', hozAlign:'left', width:150,
formatter: fnc_createGridAnchorTag,
cellClick: function(e, cell) {
// 품번 클릭 시 품목상세 팝업
if(e.target.tagName === 'A') {
fn_openPartDetailPopUp(cell.getData().PART_OBJID);
}
}
},
{title:'품명', field:'PART_NAME', headerHozAlign:'center', hozAlign:'left', width:150},
{title:'입고일', field:'DELIVERY_DATE', headerHozAlign:'center', hozAlign:'center', width:90},
{title:'입고수량', field:'DELIVERY_QTY', headerHozAlign:'center', hozAlign:'right', width:90,
formatter:"money", formatterParams:{thousand:",", precision:false}
},
{title:'검사여부', field:'INSPECTION_YN', headerHozAlign:'center', hozAlign:'center', width:70,
formatter: function(cell) {
var val = cell.getValue();
if(val === '검사') return '<span style="color:#007bff;font-weight:bold;">검사</span>';
if(val === '스킵') return '<span style="color:#999;">스킵</span>';
return val;
}
}
];
leftGrid = new Tabulator("#leftGrid", {
layout: "fitDataStretch",
height: "99.6%",
placeholder: "데이터가 없습니다.",
columns: columns,
selectable: 1, // 단일 선택
rowFormatter: function(row) {
var data = row.getData();
// 스킵인 행은 회색 처리
if(data.INSPECTION_YN === '스킵') {
row.getElement().classList.add('skip-row');
}
}
});
// 행 선택 이벤트
leftGrid.on("rowSelected", function(row) {
var data = row.getData();
selectedDetailObjid = data.INSPECTION_DETAIL_OBJID; // INCOMING_INSPECTION_DETAIL.OBJID
selectedRowData = data;
// 검사여부가 '검사'인 경우만 우측 그리드 활성화
if(data.INSPECTION_YN === '검사' && data.INSPECTION_DETAIL_OBJID) {
fn_enableRightGrid();
fn_searchRightGrid(data.INSPECTION_DETAIL_OBJID);
} else {
fn_disableRightGrid();
}
});
// 행 선택 해제 이벤트
leftGrid.on("rowDeselected", function(row) {
selectedDetailObjid = null;
selectedRowData = null;
fn_clearRightGrid();
});
// 셀 편집 이벤트
leftGrid.on("cellEdited", function(cell) {
cell.getData().GRID_STATUS = 'U';
});
}
// =====================================================
// 우측 그리드 (불량상세) 초기화
// =====================================================
function fn_initRightGrid() {
var columns = [
{formatter:"rowSelection", titleFormatter:"rowSelection", headerHozAlign:"center", hozAlign:"center", headerSort:false, width:30},
{title:'검사구분', field:'INSPECTION_TYPE', headerHozAlign:'center', hozAlign:'center', width:80,
editor:"select",
editorParams:{values:{"":"선택", "원자재":"원자재", "외주가공":"외주가공"}},
formatter: function(cell) {
var val = cell.getValue();
if(!val || val === '') return '';
return val;
}
},
{title:'불량유형', field:'DEFECT_TYPE', headerHozAlign:'center', hozAlign:'center', width:100,
editor: fnc_customSelectEditor,
formatter: function(cell) {
var val = cell.getValue();
if(!val || val === '') return '';
return fnc_customSelectFormatter(cell, {valueId:"CODE", labelId:"NAME", values:_DEFECT_TYPE_LIST});
},
editorParams: {valueId:"CODE", labelId:"NAME", values:_DEFECT_TYPE_LIST}
},
{title:'불량원인', field:'DEFECT_REASON', headerHozAlign:'center', hozAlign:'center', width:100,
editor: fnc_customSelectEditor,
formatter: function(cell) {
var val = cell.getValue();
if(!val || val === '') return '';
var defectType = cell.getData().DEFECT_TYPE;
if (defectType) {
var reasonList = [{"CODE": "", "NAME": "선택"}].concat(
fnc_getJsonAllDataListBySqlId({"sqlId": "common.getCodeselect", "code": defectType})
);
return fnc_customSelectFormatter(cell, {valueId:"CODE", labelId:"NAME", values: reasonList});
}
return '';
},
editorParams: function(cell) {
var defectType = cell.getData().DEFECT_TYPE;
if (defectType) {
var reasonList = [{"CODE": "", "NAME": "선택"}].concat(
fnc_getJsonAllDataListBySqlId({"sqlId": "common.getCodeselect", "code": defectType})
);
return {valueId:"CODE", labelId:"NAME", values: reasonList};
}
return {valueId:"CODE", labelId:"NAME", values: [{"CODE": "", "NAME": "선택"}]};
}
},
{title:'처리현황', field:'ACTION_STATUS', headerHozAlign:'center', hozAlign:'center', width:80,
editor: fnc_customSelectEditor,
formatter: function(cell) {
var val = cell.getValue();
if(!val || val === '') return '';
return fnc_customSelectFormatter(cell, {valueId:"CODE", labelId:"NAME", values:_ACTION_STATUS_LIST});
},
editorParams: {valueId:"CODE", labelId:"NAME", values:_ACTION_STATUS_LIST}
},
{title:'검사수량', field:'INSPECTION_QTY', headerHozAlign:'center', hozAlign:'right', width:80,
editor:"input",
formatter: function(cell) {
var val = cell.getValue();
if(val === null || val === '' || val === undefined) return '';
return parseInt(val);
}
},
{title:'불량수량', field:'DEFECT_QTY', headerHozAlign:'center', hozAlign:'right', width:80,
editor:"input",
formatter: function(cell) {
var val = cell.getValue();
if(val === null || val === '' || val === undefined) return '';
return parseInt(val);
}
},
{title:'불량율', field:'DEFECT_RATE', headerHozAlign:'center', hozAlign:'right', width:70, editor:false,
formatter: function(cell) {
var val = cell.getValue();
if (val) return val + '%';
return '';
}
},
{title:'검사일', field:'INSPECTION_DATE', headerHozAlign:'center', hozAlign:'center', width:100,
editor:"date"
},
{title:'검사자', field:'INSPECTOR_ID', headerHozAlign:'center', hozAlign:'center', width:100,
editor: fnc_customSelectEditor,
formatter: function(cell) {
var val = cell.getValue();
if(!val || val === '') return '';
return fnc_customSelectFormatter(cell, {valueId:"CODE", labelId:"NAME", values:_INSPECTOR_LIST});
},
editorParams: {valueId:"CODE", labelId:"NAME", values:_INSPECTOR_LIST}
},
{title:'처리결과', field:'ACTION_RESULT', headerHozAlign:'center', hozAlign:'center', width:80,
editor: fnc_customSelectEditor,
formatter: function(cell) {
var val = cell.getValue();
if(!val || val === '') return '';
return fnc_customSelectFormatter(cell, {valueId:"CODE", labelId:"NAME", values:_ACTION_RESULT_LIST});
},
editorParams: {valueId:"CODE", labelId:"NAME", values:_ACTION_RESULT_LIST}
},
{title:'검사결과', field:'INSPECTION_RESULT', headerHozAlign:'center', hozAlign:'center', width:80,
editor: fnc_customSelectEditor,
formatter: function(cell) {
var val = cell.getValue();
if (val === 'OK') return '<span style="color:#28a745;font-weight:bold;">OK</span>';
if (val === 'NG') return '<span style="color:#dc3545;font-weight:bold;">NG</span>';
if(!val || val === '') return '';
},
editorParams: {valueId:"CODE", labelId:"NAME", values:_INSPECTION_RESULT_LIST}
},
{title:'이미지파일', field:'IMAGE_FILE_CNT', headerHozAlign:'center', hozAlign:'center', width:90,
formatter: fnc_subInfoValueFormatter,
cellClick: function(e, cell) {
var objId = fnc_checkNull(cell.getData().OBJID);
if(objId) {
fn_openImageFilePopUp(objId);
} else {
Swal.fire("먼저 저장 후 이미지를 등록할 수 있습니다.");
}
}
},
{title:'첨부파일', field:'ATTACH_FILE_CNT', headerHozAlign:'center', hozAlign:'center', width:80,
formatter: fnc_subInfoValueFormatter,
cellClick: function(e, cell) {
var objId = fnc_checkNull(cell.getData().OBJID);
if(objId) {
fn_openAttachFilePopUp(objId);
} else {
Swal.fire("먼저 저장 후 파일을 등록할 수 있습니다.");
}
}
},
{title:'비고', field:'REMARK', headerHozAlign:'center', hozAlign:'left', width:150,
editor:"input"
}
];
rightGrid = new Tabulator("#rightGrid", {
layout: "fitDataStretch",
height: "99.6%",
placeholder: "좌측에서 품목을 선택하세요.",
columns: columns,
selectable: true
});
// 셀 편집 이벤트
rightGrid.on("cellEdited", function(cell) {
var row = cell.getRow();
var data = row.getData();
// 불량유형 변경 시 불량원인 초기화
if (cell.getField() === 'DEFECT_TYPE') {
row.update({"DEFECT_REASON": ""});
}
// 검사수량, 불량수량 변경 시 불량율 자동 계산
if (cell.getField() === 'INSPECTION_QTY' || cell.getField() === 'DEFECT_QTY') {
fn_calcDefectRate(row);
}
// 불량수량 변경 시 검사결과 자동 설정
if (cell.getField() === 'DEFECT_QTY') {
var defectQty = parseInt(data.DEFECT_QTY) || 0;
if (defectQty > 0) {
row.update({"INSPECTION_RESULT": "NG"});
} else {
row.update({"INSPECTION_RESULT": "OK"});
}
}
data.GRID_STATUS = data.GRID_STATUS === 'I' ? 'I' : 'U';
});
}
// 불량율 계산
function fn_calcDefectRate(row) {
var data = row.getData();
var inspectionQty = parseInt(data.INSPECTION_QTY) || 0;
var defectQty = parseInt(data.DEFECT_QTY) || 0;
if (inspectionQty > 0) {
var rate = (defectQty / inspectionQty * 100).toFixed(2);
row.update({"DEFECT_RATE": rate});
} else {
row.update({"DEFECT_RATE": ""});
}
}
// =====================================================
// 좌측 그리드 조회
// =====================================================
function fn_searchLeftGrid() {
var param = {
PURCHASE_ORDER_MASTER_OBJID: "${param.OBJID}",
INSPECTION_YN: "검사" // 검사여부가 '검사'인 항목만 조회
};
console.log("좌측 그리드 조회 파라미터:", param);
$.ajax({
url: "/quality/incomingInspectionDetailGridList.do",
type: "POST",
data: param,
dataType: "json",
success: function(data) {
console.log("좌측 그리드 조회 결과:", data);
if(data.RESULTLIST) {
leftGrid.setData(data.RESULTLIST);
}
},
error: function(xhr, status, error) {
console.error("좌측 그리드 조회 오류:", error);
}
});
}
// =====================================================
// 우측 그리드 조회 (불량상세)
// =====================================================
function fn_searchRightGrid(inspectionDetailObjid) {
if(!inspectionDetailObjid) {
rightGrid.setData([]);
return;
}
$.ajax({
url: "/quality/getIncomingInspectionDefectList.do",
type: "POST",
data: {INSPECTION_DETAIL_OBJID: inspectionDetailObjid},
dataType: "json",
success: function(data) {
if(data.list) {
rightGrid.setData(data.list);
} else {
rightGrid.setData([]);
}
}
});
}
// 우측 그리드 비활성화 (검사여부가 '검사'가 아닌 경우)
function fn_disableRightGrid() {
rightGrid.setData([]);
$("#rightGridContainer").html('<div class="disabled-notice">검사여부가 "검사"인 항목만 불량상세를 입력할 수 있습니다.</div>');
$("#btnAddRow, #btnDeleteRow").prop('disabled', true);
}
// 우측 그리드 활성화
function fn_enableRightGrid() {
if($("#rightGridContainer .disabled-notice").length > 0) {
$("#rightGridContainer").html('<div id="rightGrid" class="grid-container"></div>');
fn_initRightGrid();
}
$("#btnAddRow, #btnDeleteRow").prop('disabled', false);
}
// 우측 그리드 초기화
function fn_clearRightGrid() {
rightGrid.setData([]);
rightGrid.options.placeholder = "좌측에서 품목을 선택하세요.";
}
// =====================================================
// 불량상세 행 추가
// =====================================================
function fn_addDefectRow() {
if(!selectedDetailObjid) {
Swal.fire("좌측에서 품목을 먼저 선택하세요.");
return;
}
if(selectedRowData && selectedRowData.INSPECTION_YN === '스킵') {
Swal.fire("검사여부가 '스킵'인 항목은 불량상세를 추가할 수 없습니다.");
return;
}
// 새 행 데이터 (검사일: 오늘, 검사자: 접속자)
var newRow = {
OBJID: fnc_createObjId(),
INSPECTION_DETAIL_OBJID: selectedDetailObjid,
INSPECTION_TYPE: "",
INSPECTION_DATE: "${today}",
INSPECTOR_ID: "<%=connector%>",
DEFECT_TYPE: "",
DEFECT_REASON: "",
ACTION_STATUS: "",
ACTION_RESULT: "",
INSPECTION_QTY: selectedRowData ? selectedRowData.DELIVERY_QTY : 0, // 입고수량을 기본값으로
DEFECT_QTY: 0,
DEFECT_RATE: "",
INSPECTION_RESULT: "",
REMARK: "",
GRID_STATUS: "I"
};
rightGrid.addRow(newRow);
}
// =====================================================
// 불량상세 행 삭제
// =====================================================
function fn_deleteDefectRow() {
var selectedRows = rightGrid.getSelectedRows();
if(selectedRows.length === 0) {
Swal.fire("삭제할 행을 선택하세요.");
return;
}
Swal.fire({
title: '삭제 확인',
text: '선택한 ' + selectedRows.length + '개 행을 삭제하시겠습니까?',
icon: 'warning',
showCancelButton: true,
confirmButtonColor: '#d33',
cancelButtonColor: '#3085d6',
confirmButtonText: '삭제',
cancelButtonText: '취소'
}).then((result) => {
if (result.isConfirmed) {
selectedRows.forEach(function(row) {
var data = row.getData();
if(data.GRID_STATUS === 'I') {
// 신규 행은 바로 삭제
row.delete();
} else {
// 기존 행은 삭제 표시
data.GRID_STATUS = 'D';
row.update(data);
row.getElement().style.display = 'none';
}
});
}
});
}
// 품목상세 팝업
function fn_openPartDetailPopUp(partObjId) {
if (!partObjId) return;
var popup_width = 1200;
var popup_height = 900;
var url = "/partMng/partMngDetailPopUp.do?OBJID=" + partObjId;
window.open(url, "partMngDetailPopUp", "width=" + popup_width + ",height=" + popup_height + ",scrollbars=yes,resizable=yes");
}
// 이미지 파일 팝업
function fn_openImageFilePopUp(objId) {
var popup_width = 650;
var popup_height = 550;
var url = "/common/ImageRegistPopup.do?targetObjId=" + objId + "&docType=INSPECTION_DEFECT_IMAGE&docTypeName=검사이미지";
var popup = window.open(url, "imageFilePopUp", "width=" + popup_width + ",height=" + popup_height + ",scrollbars=yes,resizable=yes");
// 팝업 닫힘 감지하여 해당 행의 파일 카운트만 업데이트
fn_watchPopupClose(popup, objId, 'IMAGE_FILE_CNT', 'INSPECTION_DEFECT_IMAGE');
}
// 첨부파일 팝업
function fn_openAttachFilePopUp(objId) {
var popup_width = 800;
var popup_height = 300;
var params = "?targetObjId=" + objId + "&docType=INSPECTION_DEFECT_FILE&docTypeName=검사첨부";
var url = "/common/FileRegistPopup.do" + params;
var popup = window.open(url, "attachFilePopUp", "width=" + popup_width + ",height=" + popup_height + ",scrollbars=yes,resizable=yes");
// 팝업 닫힘 감지하여 해당 행의 파일 카운트만 업데이트
fn_watchPopupClose(popup, objId, 'ATTACH_FILE_CNT', 'INSPECTION_DEFECT_FILE');
}
// 팝업 닫힘 감지 및 파일 카운트 업데이트
function fn_watchPopupClose(popup, objId, fieldName, docType) {
var checkPopup = setInterval(function() {
if(popup.closed) {
clearInterval(checkPopup);
// 파일 카운트 조회 후 해당 행만 업데이트
fn_updateRightGridFileCnt(objId, fieldName, docType);
}
}, 500);
}
// 우측 그리드 파일 카운트 업데이트
function fn_updateRightGridFileCnt(objId, fieldName, docType) {
$.ajax({
url: "/common/getFileList.do",
type: "POST",
data: { targetObjId: objId, docType: docType },
dataType: "json",
success: function(data) {
var cnt = data ? data.length : 0;
var rows = rightGrid.getRows();
rows.forEach(function(row) {
if(row.getData().OBJID === objId) {
var updateData = {};
updateData[fieldName] = cnt;
row.update(updateData);
}
});
}
});
}
// 공통 fnc_tabulCallbackFnc 오버라이드 (이 페이지에서는 rightGrid 사용)
function fnc_tabulCallbackFnc(objId, docType, columnField, fileCnt) {
var rows = rightGrid.getRows();
rows.forEach(function(row) {
if(row.getData().OBJID === objId) {
var updateData = {};
var targetField = (columnField && columnField !== '') ? columnField : 'FILE_CNT';
updateData[targetField] = fileCnt;
row.update(updateData);
}
});
}
// =====================================================
// 저장
// =====================================================
function fn_save() {
// 유효성 검사
if($("#INSPECTION_DATE").val() == ''){
Swal.fire("검사일을 입력해주세요.");
$("#INSPECTION_DATE").focus();
return;
}
if($("#INSPECTOR_ID").val() == ''){
Swal.fire("검사자를 선택해주세요.");
$("#INSPECTOR_ID").focus();
return;
}
// 좌측 그리드 데이터 (입고품목)
var leftGridData = leftGrid.getData();
if(leftGridData.length == 0){
Swal.fire("검사할 항목이 없습니다.");
return;
}
// 우측 그리드 데이터 (불량상세) - 현재 선택된 품목의 불량상세
var rightGridData = rightGrid.getData();
Swal.fire({
title: '저장 확인',
text: '수입검사 내용을 저장하시겠습니까?',
icon: 'question',
showCancelButton: true,
confirmButtonColor: '#3085d6',
cancelButtonColor: '#d33',
confirmButtonText: '저장',
cancelButtonText: '취소'
}).then((result) => {
if (result.isConfirmed) {
var param = $("#form1").serializeObject();
param.dataListJson = JSON.stringify(leftGridData);
param.defectListJson = JSON.stringify(rightGridData);
param.selectedDetailObjid = selectedDetailObjid;
$.ajax({
url: "/quality/saveIncomingInspectionProgress.do",
type: "POST",
data: param,
dataType: "json",
success: function(data) {
Swal.fire({
title: data.result ? '저장 완료' : '저장 실패',
text: data.msg,
icon: data.result ? 'success' : 'error'
}).then(() => {
if(data.result){
// 우측 그리드 새로고침
if(selectedDetailObjid) {
fn_searchRightGrid(selectedDetailObjid);
}
// 부모창 새로고침
if(opener && opener.fn_search) {
opener.fn_search();
}
}
});
},
error: function(xhr, status, error) {
Swal.fire('서버 오류가 발생했습니다.');
}
});
}
});
}
// 팝업 닫힐 때 부모 새로고침
window.addEventListener('unload', function() {
if(window.opener && window.opener.fn_search) {
window.opener.fn_search();
}
});
</script>
<body style="overflow-x: hidden;">
<form name="form1" id="form1" action="" method="post" onsubmit="return false">
<input type="hidden" name="PURCHASE_ORDER_MASTER_OBJID" id="PURCHASE_ORDER_MASTER_OBJID" value="${param.OBJID}">
<input type="hidden" name="REQUEST_DATE" id="REQUEST_DATE" value="${info.REQUEST_DATE}">
<input type="hidden" name="REQUEST_USER_ID" id="REQUEST_USER_ID" value="${info.REQUEST_USER_ID}">
<div class="plm_menu_name_gdnsi">
<h2><span>수입검사 진행</span></h2>
<div class="btnArea">
<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>발주번호</label>
<span class="info-text">${info.PURCHASE_ORDER_NO}</span>
</div>
<div>
<label>요청일</label>
<span class="info-text">${info.REQUEST_DATE}</span>
</div>
<div>
<label>요청자</label>
<span class="info-text">${info.REQUEST_USER_NAME}</span>
</div>
<div style="border-left: 1px solid #ccc; padding-left: 20px;">
<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 class="split-container">
<!-- 좌측: 입고품목 목록 -->
<div class="left-panel">
<div class="panel-header">
<span>입고품목</span>
</div>
<div class="panel-body">
<div id="leftGrid" class="grid-container"></div>
</div>
</div>
<!-- 우측: 불량상세 목록 -->
<div class="right-panel">
<div class="panel-header">
<span>불량상세</span>
<div class="btn-group">
<button type="button" id="btnAddRow" class="btn-add">+ 행 추가</button>
<button type="button" id="btnDeleteRow" class="btn-delete">- 행 삭제</button>
</div>
</div>
<div class="panel-body" id="rightGridContainer">
<div id="rightGrid" class="grid-container"></div>
</div>
</div>
</div>
<%@include file= "/WEB-INF/view/common/common_gridArea.jsp" %>
</form>
</body>
</html>