Files
wace_plm/WebContent/WEB-INF/view/quality/incomingInspectionProgressList.jsp

477 lines
18 KiB
Plaintext

<%@ 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"%>
<%@ page import="com.pms.common.utils.*"%>
<%@ page import="java.util.*" %>
<%@include file= "/init.jsp" %>
<c:set var="now" value="<%=new java.util.Date() %>"/>
<c:set var="sysYear"><fmt:formatDate value="${now}" pattern="yyyy" /></c:set>
<%
String menuObjId = request.getParameter("menuObjId");
String menuName = CommonUtils.getMenuName(menuObjId, "수입검사 진행");
%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title><%=Constants.SYSTEM_NAME%></title>
</head>
<style>
.select2-selection__choice {
font-size: 11px;
background-color: #fff !important;
border: none !important;
margin-right: 0px !important;
}
.select2-selection__choice__remove {
display: contents !important;
}
.select2-container .select2-selection--multiple {
min-height: 20px !important;
}
.select2-container--default .select2-selection--multiple .select2-selection__choice {
margin-top: 3.5px !important;
}
.select2-selection__rendered {
height: 18px !important;
}
.select2-container .select2-selection--multiple .select2-selection__rendered {
overflow: auto !important;
}
/* 검사결과 스타일 */
.inspection-ng { color: #dc3545; font-weight: bold; cursor: pointer; }
.inspection-ok { color: #28a745; font-weight: bold; cursor: pointer; }
.inspection-ng:hover, .inspection-ok:hover { text-decoration: underline; }
body, html {
overflow-x: hidden;
width: 100%;
margin: 0;
padding: 0;
}
.totalCntArea {
height: 0px !important;
}
</style>
<script type="text/javascript">
$(document).ready(function(){
fnc_changePaginationAndTotalCountArea();
$('.select2').select2();
fnc_datepick();
// DOM 렌더링 완료 후 그리드 높이 계산
setTimeout(function() {
fnc_calculateContentHeight("gridDiv", 20);
}, 100);
$(window).resize(function() {
fnc_calculateContentHeight("gridDiv", 20);
});
// 품번/품명 Select2 AJAX 초기화
initPartSelect2Ajax("#search_part_no", "#search_part_name", "#search_part_objid");
$("input").keyup(function(e){
if(e.keyCode == 13){
$("#page").val("1");
fn_search();
}
});
// 조회
$("#btnSearch").click(function(){
$("#page").val("1");
fn_search();
});
// 수입검사 진행
$("#btnInspection").click(function(){
fn_inspectionPopUp();
});
// 엑셀 다운로드
$("#btnExcel").click(function(){
fn_excelDownload();
});
fn_search();
});
// =====================================================
// 컬럼 정의 (입고품목 상세 기준) - 신규
// =====================================================
var columns = [
{formatter:"rowSelection", titleFormatter:"rowSelection", hozAlign:"center", headerSort:false, width:40, frozen:true},
{headerHozAlign:'center', hozAlign:'center', minWidth:80, widthGrow:1, title:'검사일', field:'INSPECTION_DATE', frozen: true, sorter: "string"},
{headerHozAlign:'center', hozAlign:'center', minWidth:70, widthGrow:1, title:'검사자', field:'INSPECTOR_NAME', frozen: true},
{headerHozAlign:'center', hozAlign:'center', minWidth:105, widthGrow:1, title:'품의서 No', field:'PROPOSAL_NO', frozen: true},
{headerHozAlign:'center', hozAlign:'center', minWidth:105, widthGrow:1, title:'발주서 No', field:'PURCHASE_ORDER_NO', frozen: true},
{headerHozAlign:'center', hozAlign:'center', minWidth:120, widthGrow:1, title:'프로젝트번호', field:'PROJECT_NO', frozen: true},
{headerHozAlign:'center', hozAlign:'center', minWidth:80, widthGrow:1, title:'제품구분', field:'PRODUCT_NAME', frozen: true},
{headerHozAlign:'center', hozAlign:'left', minWidth:130, widthGrow:3, title:'품명(모델명)', field:'MODEL_NAME', frozen: true},
{headerHozAlign:'center', hozAlign:'left', minWidth:120, widthGrow:2, title:'부품품번', field:'PART_NO', frozen: true,
formatter: fnc_createGridAnchorTag,
cellClick: function(e, cell) {
// 품번 클릭 시 품목상세 팝업
if(e.target.tagName === 'A') {
fn_openPartDetailPopUp(cell.getData().PART_OBJID);
}
}
},
{headerHozAlign:'center', hozAlign:'left', minWidth:120, widthGrow:3, title:'부품명', field:'PART_NAME', frozen: true},
{headerHozAlign:'center', hozAlign:'left', minWidth:130, widthGrow:2, title:'공급업체', field:'PARTNER_NAME'},
{headerHozAlign:'center', hozAlign:'center', minWidth:90, widthGrow:1, title:'입고일', field:'DELIVERY_DATE', sorter: "string"},
{headerHozAlign:'center', hozAlign:'right', minWidth:80, widthGrow:1, title:'입고수량', field:'DELIVERY_QTY',
formatter:"money", formatterParams:{thousand:",", precision:false}
},
{headerHozAlign:'center', hozAlign:'center', minWidth:80, widthGrow:1, title:'입고결과', field:'DELIVERY_STATUS',
formatter: fnc_createGridAnchorTag,
cellClick: function(e, cell){
var objId = fnc_checkNull(cell.getData().PURCHASE_ORDER_MASTER_OBJID);
var deliveryStatus = fnc_checkNull(cell.getData().DELIVERY_STATUS);
fn_deliveryAcceptanceViewPopUp(objId, deliveryStatus);
}
},
{headerHozAlign:'center', hozAlign:'right', minWidth:80, widthGrow:1, title:'검사수량', field:'INSPECTION_QTY',
formatter:"money", formatterParams:{thousand:",", precision:false}
},
{headerHozAlign:'center', hozAlign:'right', minWidth:80, widthGrow:1, title:'불량수량', field:'DEFECT_QTY_SUM',
formatter: function(cell) {
var val = cell.getValue();
if(val === null || val === '' || val === undefined) return '0';
return parseInt(val).toLocaleString();
}
},
{headerHozAlign:'center', hozAlign:'right', minWidth:70, widthGrow:1, title:'불량율', field:'DEFECT_RATE',
formatter: function(cell) {
var val = cell.getValue();
if(val === null || val === '' || val === undefined) return '';
return val + '%';
}
},
{headerHozAlign:'center', hozAlign:'center', minWidth:80, widthGrow:1, title:'검사현황', field:'INSPECTION_RESULT',
formatter: function(cell, formatterParams, onRendered){
var val = fnc_checkNull(cell.getValue());
// 처리결과 기준: 전부 입력 = 완료, 일부만 입력 = 진행중, 없으면 미검사
if(val === '완료') return '<span class="inspection-ok">완료</span>';
if(val === '진행중') return '<span style="color:#ffc107;font-weight:bold;">진행중</span>';
return '<span style="color:#999;cursor:pointer;">미검사</span>';
},
cellClick: function(e, cell){
var objId = fnc_checkNull(cell.getData().OBJID);
fn_inspectionPopUp(objId);
}
},
{headerHozAlign:'center', hozAlign:'center', minWidth:90, widthGrow:1, title:'검사성적서', field:'INSPECTION_FILE_CNT',
formatter: fnc_subInfoValueFormatter,
cellClick: function(e, cell){
var objId = fnc_checkNull(cell.getData().OBJID);
fn_FileRegist(objId, "INSPECTION_REPORT", "검사성적서");
}
}
];
// =====================================================
// 조회 (입고품목 상세 기준) - 신규
// =====================================================
function fn_search(){
// 프로젝트번호 multi select 처리
var selectedProjectNos = $("#project_no").val();
$('input[name="project_nos"]').remove();
$('<input>').attr({
type: 'hidden',
name: 'project_nos',
value: selectedProjectNos
}).appendTo('#form1');
var formData = $("#form1").serializeObject();
$.ajax({
url: "/quality/incomingInspectionProgressGridList.do",
type: "POST",
data: formData,
dataType: "json",
beforeSend: function(){
_startLoading("Loading...");
},
complete: function(){
_endLoading();
},
success: function(response) {
// 그리드 데이터 설정
if(_tabulGrid){
_tabulGrid.setData(response.RESULTLIST || []);
} else {
_tabulGrid = new Tabulator("#mainGrid", {
height: "100%",
layout: _tabul_layout_fitColumns,
columns: columns,
data: response.RESULTLIST || [],
selectable: true
});
}
// Total 합계 계산
var totalDeliveryQty = 0; // 총 입고수량
var totalInspectionQty = 0; // 총 검사수량
var totalGoodQty = 0; // 총 양품수량
var totalDefectQty = 0; // 총 불량수량
if(response.RESULTLIST && response.RESULTLIST.length > 0) {
response.RESULTLIST.forEach(function(row) {
var deliveryQty = parseFloat(row.DELIVERY_QTY || 0);
var inspectionQty = parseFloat(row.INSPECTION_QTY || 0);
var defectQty = parseFloat(row.DEFECT_QTY_SUM || 0);
totalDeliveryQty += deliveryQty;
totalInspectionQty += inspectionQty;
totalDefectQty += defectQty;
// 양품수량 = 검사수량 - 불량수량
totalGoodQty += (inspectionQty - defectQty);
});
}
// 합계 표시
$("#totalDeliveryQty").text(Number(totalDeliveryQty).toLocaleString());
$("#totalInspectionQty").text(Number(totalInspectionQty).toLocaleString());
$("#totalGoodQty").text(Number(totalGoodQty).toLocaleString());
$("#totalDefectQty").text(Number(totalDefectQty).toLocaleString());
// 페이징 HTML 업데이트
if(response.PAGE_HTML){
$(".table_paging_wrap").html(response.PAGE_HTML);
}
},
error: function(xhr, status, error) {
_endLoading();
alert("데이터 조회 중 오류가 발생했습니다.");
console.error("Error:", error);
}
});
}
// =====================================================
// 수입검사 진행 팝업 (INCOMING_INSPECTION_DETAIL.OBJID 전달) - 신규
// =====================================================
function fn_inspectionPopUp(objId){
var selected = [];
if(objId){
// 검사현황 클릭으로 호출된 경우
selected = [{OBJID: objId}];
} else {
// 버튼 클릭으로 호출된 경우
selected = _tabulGrid.getSelectedData();
if(selected.length == 0){
Swal.fire("선택된 데이터가 없습니다.");
return;
}
if(selected.length > 1){
Swal.fire("한건씩 등록 가능합니다.");
return;
}
}
// 팝업 크기 조정 (불량상세만 표시하므로 너비 축소)
var popup_width = 1400;
var popup_height = 600;
var hiddenForm = document.hiddenForm;
var target = "incomingInspectionProgressPopUp";
var url = "/quality/incomingInspectionProgressPopUp.do";
fn_centerPopup(popup_width, popup_height, "", target);
hiddenForm.action = url;
// INCOMING_INSPECTION_DETAIL.OBJID 전달
hiddenForm.OBJID.value = selected[0].OBJID;
hiddenForm.target = target;
hiddenForm.submit();
}
// 품목상세 팝업
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_openProposalPopUp(objId){
var popup_width = 1200;
var popup_height = 900;
var url = "/salesMng/proposalFormPopUp.do?PROPOSAL_OBJID=" + objId;
window.open(url, "proposalFormPopUp", "width="+popup_width+",height="+popup_height+",scrollbars=yes,resizable=yes");
}
// 발주서 팝업
function fn_formPopUp(objId){
var popup_width = 1460;
var popup_height = 1050;
var hiddenForm = document.hiddenForm;
var target = "purchaseOrderFormPopup_new";
var url = "/purchaseOrder/purchaseOrderFormPopup_new.do";
fn_centerPopup(popup_width, popup_height, "", target);
hiddenForm.PURCHASE_ORDER_MASTER_OBJID.value = objId;
hiddenForm.action = url;
hiddenForm.target = target;
hiddenForm.submit();
}
// 엑셀 다운로드
function fn_excelDownload(){
var form = document.form1;
form.action = "/quality/incomingInspectionExcelDownload.do";
form.submit();
form.action = "";
}
// 첨부파일 팝업
function fn_FileRegist(objId, docType, docTypeName){
var popup_width = 800;
var popup_height = 300;
var params = "?targetObjId="+objId+"&docType="+docType+"&docTypeName="+docTypeName;
var url = "/projectConcept/FileRegistPopup.do"+params;
fn_centerPopup(popup_width, popup_height, url);
}
// 입고결과 팝업 (발주서 기준)
function fn_deliveryAcceptanceViewPopUp(objId, deliveryStatus){
var popup_width = 1560;
var popup_height = 1050;
var hiddenForm = document.hiddenForm;
var target = "deliveryAcceptancePopUp";
var url = "/purchaseOrder/deliveryAcceptanceFormPopUp_new.do";
fn_centerPopup(popup_width, popup_height, "", target);
hiddenForm.action = url;
hiddenForm.PURCHASE_ORDER_MASTER_OBJID.value = objId;
hiddenForm.DELIVERY_STATUS.value = deliveryStatus;
hiddenForm.actionType.value = 'view';
hiddenForm.target = target;
hiddenForm.submit();
}
</script>
<body>
<form name="hiddenForm" id="hiddenForm" method="post">
<input type="hidden" name="OBJID" id="OBJID">
<input type="hidden" name="PURCHASE_ORDER_NO" id="PURCHASE_ORDER_NO">
<input type="hidden" name="PURCHASE_ORDER_MASTER_OBJID" id="PURCHASE_ORDER_MASTER_OBJID">
<input type="hidden" name="DELIVERY_STATUS" id="DELIVERY_STATUS">
<input type="hidden" name="actionType" id="actionType">
</form>
<form name="form1" id="form1" action="" method="post">
<div class="content-box" style="height: 99.3%;">
<div class="content-box-s">
<div class="plm_menu_name_gdnsi">
<h2>
<span><%=menuName%></span>
</h2>
<div class="btnArea">
<input type="button" class="plm_btns" value="수입검사 진행" id="btnInspection">
<input type="button" class="plm_btns" value="조회" id="btnSearch">
<input type="button" class="plm_btns excel excelIcon" value="Excel Download" id="btnExcel">
</div>
</div>
<div id="plmSearchZon">
<table>
<tr>
<td><label for="">품의서 No</label></td>
<td><input type="text" name="search_proposal_no" id="search_proposal_no" style="width:120px;" autocomplete="off" value="${param.search_proposal_no}"></td>
<td><label for="">발주서 No</label></td>
<td><input type="text" name="search_purchase_order_no" id="search_purchase_order_no" style="width:120px;" autocomplete="off" value="${param.search_purchase_order_no}"></td>
<td><label for="">프로젝트번호</label></td>
<td>
<select name="project_no" id="project_no" style="width:210px;" class="select2" autocomplete="off" multiple="multiple">
<option value="">선택</option>
${code_map.project_no}
</select>
</td>
<td><label for="">품번</label></td>
<td>
<select name="search_part_no" id="search_part_no" class="select2-part" style="width:170px;">
<option value="">품번 선택</option>
</select>
<input type="hidden" name="search_part_objid" id="search_part_objid" value="">
</td>
<td><label for="">품명</label></td>
<td>
<select name="search_part_name" id="search_part_name" class="select2-part" style="width:170px;">
<option value="">품명 선택</option>
</select>
</td>
<td><label for="">공급업체</label></td>
<td><select name="search_partner" id="search_partner" class="select2" autocomplete="off" style="width:250px;"><option value="">선택</option>${code_map.partner_objid}</select></td>
</tr>
<tr>
<td><label for="">입고결과</label></td>
<td>
<select name="search_delivery_status" id="search_delivery_status" class="select2" autocomplete="off" style="width:120px;">
<option value="">전체</option>
<option value="입고중">입고중</option>
<option value="입고완료">입고완료</option>
<option value="지연">지연</option>
</select>
</td>
<td><label for="">제품구분</label></td>
<td>
<select name="search_product_cd" id="search_product_cd" class="select2" autocomplete="off" style="width:120px;">
<option value="">전체</option>
${code_map.product_cd}
</select>
</td>
<td><label for="">검사자</label></td>
<td><select name="inspector_id" id="inspector_id" class="select2" autocomplete="off" style="width:120px;"><option value="">선택</option>${code_map.inspector_id}</select></td>
<td class=""><label>검사일</label></td>
<td>
<input type="text" name="inspection_start_date" id="inspection_start_date" style="width:100px;" autocomplete="off" value="${param.inspection_start_date}" class="date_icon">~
<input type="text" name="inspection_end_date" id="inspection_end_date" style="width:100px;" autocomplete="off" value="${param.inspection_end_date }" class="date_icon">
</td>
<td><label for="">검사현황</label></td>
<td>
<select name="search_inspection_status" id="search_inspection_status" class="select2" autocomplete="off" style="width:120px;">
<option value="">전체</option>
<option value="완료">완료</option>
<option value="진행중">진행중</option>
</select>
</td>
</tr>
</table>
</div>
<!-- Total 합계 표시 영역 -->
<div style="padding:5px 10px; background: #f5f5f5; border: 1px solid #ddd;">
<span style="font-weight: bold; font-size: 13px;">
Total 입고수량: <span id="totalDeliveryQty" style="color: #2196F3;">0</span>EA &nbsp;&nbsp;
Total 검사수량: <span id="totalInspectionQty" style="color: #FF9800;">0</span>EA &nbsp;&nbsp;
Total 양품수량: <span id="totalGoodQty" style="color: #4CAF50;">0</span>EA &nbsp;&nbsp;
Total 불량수량: <span id="totalDefectQty" style="color: #dc3545;">0</span>EA
</span>
</div>
<%@include file= "/WEB-INF/view/common/common_gridArea.jsp" %>
</div>
</div>
</form>
</body>
</html>