V2026012702 #129
@@ -154,7 +154,7 @@ $(document).ready(function() {
|
||||
['Supply', 'CNT'],
|
||||
|
||||
<c:forEach var="item" items="${LISTSUPPLY}" varStatus="status">
|
||||
['${item.SUPPLY_NAME}',${item.TOTAL_SUPPLY_UNIT_CNT}],
|
||||
['${item.CLIENT_NM}',${item.TOTAL_SUPPLY_UNIT_CNT}],
|
||||
</c:forEach>
|
||||
]);
|
||||
|
||||
@@ -2175,7 +2175,7 @@ function fn_projectFilter(statusNm, cnt){
|
||||
</div>
|
||||
-->
|
||||
<div class="graph_section " id="piechart2" style=" width:120%; overflow:hidden;margin-left:-17px;">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="float_r ">
|
||||
@@ -2487,7 +2487,7 @@ function fn_projectFilter(statusNm, cnt){
|
||||
-->
|
||||
<div class="contents_section50">
|
||||
<!--3단 start-->
|
||||
<div class="n_wrap2" style="margin:100px 20px">
|
||||
<div class="n_wrap2" style="margin:0px 20px">
|
||||
<div class="float_l w70"><!-- asd_box -->
|
||||
<div class="section_title">
|
||||
<div>
|
||||
@@ -2561,23 +2561,20 @@ function fn_projectFilter(statusNm, cnt){
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="float_l w100 " style="margin-top:20px;"><!-- asd_box -->
|
||||
<!-- <div class="float_l w100 " style="margin-top:20px;">
|
||||
<div class="section_title">
|
||||
<div>
|
||||
<i class="fa-solid fa-square-poll-vertical"></i>투입원가현황
|
||||
</div>
|
||||
</div>
|
||||
<div class="tablebox"> <!-- tableBox -->
|
||||
<table class=" n_table2"><!-- scrolltable -->
|
||||
<div class="tablebox">
|
||||
<table class=" n_table2">
|
||||
<colgroup>
|
||||
<col width="12%">
|
||||
<col width="25%">
|
||||
<col width="20%">
|
||||
<col width="20%">
|
||||
<col width="13%">
|
||||
<%--
|
||||
<col width="10%">
|
||||
--%>
|
||||
</colgroup>
|
||||
<thead>
|
||||
<tr class="">
|
||||
@@ -2586,16 +2583,13 @@ function fn_projectFilter(statusNm, cnt){
|
||||
<th>목표원가(원)</th>
|
||||
<th>투입원가(원)</th>
|
||||
<th>투입율(%)</th>
|
||||
<!--
|
||||
<th>상태</th>
|
||||
-->
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="costStatusListArea" style="height: 205px;">
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div> -->
|
||||
|
||||
<div class="float_l w70" style="margin-top:20px;">
|
||||
<div class="section_title">
|
||||
|
||||
@@ -87,39 +87,57 @@ $(document).ready(function(){
|
||||
fn_search();
|
||||
});
|
||||
|
||||
// 컬럼: 품의서 No, 발주서 No, 프로젝트번호, 품번, 품명, 공급업체, 입고결과, 요청일, 요청자, 검사자, 검사일, 검사결과
|
||||
// =====================================================
|
||||
// 컬럼 정의 (입고품목 상세 기준) - 신규
|
||||
// =====================================================
|
||||
var columns = [
|
||||
{headerHozAlign:'center', hozAlign:'center', minWidth:100, widthGrow:1, title:'검사일', field:'INSPECTION_DATE'},
|
||||
{headerHozAlign:'center', hozAlign:'center', minWidth:80, widthGrow:1, title:'검사자', field:'INSPECTOR_NAME'},
|
||||
{headerHozAlign:'center', hozAlign:'center', minWidth:120, widthGrow:1, title:'품의서 No', field:'PROPOSAL_NO'
|
||||
// formatter:fnc_createGridAnchorTag,
|
||||
// cellClick:function(e, cell){
|
||||
// var objId = fnc_checkNull(cell.getData().PROPOSAL_OBJID);
|
||||
// if(objId != '') fn_openProposalPopUp(objId);
|
||||
// }
|
||||
{headerHozAlign:'center', hozAlign:'center', minWidth:80, widthGrow:1, title:'검사일', field:'INSPECTION_DATE', frozen: true},
|
||||
{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:'center', minWidth:120, widthGrow:1, title:'발주서 No', field:'PURCHASE_ORDER_NO'
|
||||
// formatter:fnc_createGridAnchorTag,
|
||||
// cellClick:function(e, cell){
|
||||
// var objId = fnc_checkNull(cell.getData().OBJID);
|
||||
// fn_formPopUp(objId);
|
||||
// }
|
||||
},
|
||||
{headerHozAlign:'center', hozAlign:'center', minWidth:130, widthGrow:1, title:'프로젝트번호', field:'PROJECT_NO'},
|
||||
{headerHozAlign:'center', hozAlign:'center', minWidth:110, widthGrow:1, title:'제품구분', field:'PRODUCT_NAME'},
|
||||
{headerHozAlign:'center', hozAlign:'left', minWidth:120, widthGrow:2, title:'품번', field:'PART_NO'},
|
||||
{headerHozAlign:'center', hozAlign:'left', minWidth:130, widthGrow:3, title:'품명', field:'PART_NAME'},
|
||||
{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'},
|
||||
{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().OBJID);
|
||||
var DELIVERY_STATUS = fnc_checkNull(cell.getData().DELIVERY_STATUS);
|
||||
fn_deliveryAcceptanceViewPopUp(objId,DELIVERY_STATUS);
|
||||
}
|
||||
},
|
||||
// {headerHozAlign:'center', hozAlign:'center', minWidth:100, widthGrow:1, title:'요청일', field:'REQUEST_DATE'},
|
||||
// {headerHozAlign:'center', hozAlign:'center', minWidth:80, widthGrow:1, title:'요청자', field:'REQUEST_USER_NAME'},
|
||||
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());
|
||||
@@ -128,21 +146,23 @@ var columns = [
|
||||
if(val === '진행중') return '<span style="color:#ffc107;font-weight:bold;">진행중</span>';
|
||||
return '<span style="color:#999;cursor:pointer;">미검사</span>';
|
||||
},
|
||||
cellClick:function(e, cell){
|
||||
cellClick: function(e, cell){
|
||||
var objId = fnc_checkNull(cell.getData().OBJID);
|
||||
fn_inspectionPopUp(objId);
|
||||
}
|
||||
},
|
||||
{headerHozAlign : 'center', hozAlign : 'center', minWidth : 100, 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_FILE","검사성적서");
|
||||
}
|
||||
}
|
||||
{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();
|
||||
@@ -153,23 +173,18 @@ function fn_search(){
|
||||
value: selectedProjectNos
|
||||
}).appendTo('#form1');
|
||||
|
||||
// 수입검사 진행 리스트는 요청완료 건만 조회
|
||||
$('input[name="request_status_filter"]').remove();
|
||||
$('<input>').attr({
|
||||
type: 'hidden',
|
||||
name: 'request_status_filter',
|
||||
value: '요청완료'
|
||||
}).appendTo('#form1');
|
||||
|
||||
_tabulGrid = fnc_tabul_search(_tabul_layout_fitColumns, _tabulGrid, "/quality/incomingInspectionGridList.do", columns, true);
|
||||
// 신규 API 호출 (입고품목 상세 기준)
|
||||
_tabulGrid = fnc_tabul_search(_tabul_layout_fitColumns, _tabulGrid, "/quality/incomingInspectionProgressGridList.do", columns, true);
|
||||
}
|
||||
|
||||
// 수입검사 진행 팝업
|
||||
// =====================================================
|
||||
// 수입검사 진행 팝업 (INCOMING_INSPECTION_DETAIL.OBJID 전달) - 신규
|
||||
// =====================================================
|
||||
function fn_inspectionPopUp(objId){
|
||||
var selected = [];
|
||||
|
||||
if(objId){
|
||||
// 검사결과 클릭으로 호출된 경우
|
||||
// 검사현황 클릭으로 호출된 경우
|
||||
selected = [{OBJID: objId}];
|
||||
} else {
|
||||
// 버튼 클릭으로 호출된 경우
|
||||
@@ -184,8 +199,9 @@ function fn_inspectionPopUp(objId){
|
||||
}
|
||||
}
|
||||
|
||||
var popup_width = 1800;
|
||||
var popup_height = 700;
|
||||
// 팝업 크기 조정 (불량상세만 표시하므로 너비 축소)
|
||||
var popup_width = 1400;
|
||||
var popup_height = 600;
|
||||
var hiddenForm = document.hiddenForm;
|
||||
var target = "incomingInspectionProgressPopUp";
|
||||
var url = "/quality/incomingInspectionProgressPopUp.do";
|
||||
@@ -193,11 +209,21 @@ function fn_inspectionPopUp(objId){
|
||||
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;
|
||||
@@ -232,21 +258,17 @@ function fn_excelDownload(){
|
||||
|
||||
// 첨부파일 팝업
|
||||
function fn_FileRegist(objId, docType, docTypeName){
|
||||
var popup_width = 800;
|
||||
var popup_height = 300;
|
||||
|
||||
var objId = objId;
|
||||
var docType = docType;
|
||||
var docTypeName = docTypeName;
|
||||
var params = "?targetObjId="+objId+"&docType="+docType+"&docTypeName="+docTypeName;
|
||||
var url = "/projectConcept/FileRegistPopup.do"+params;
|
||||
|
||||
fn_centerPopup(popup_width, popup_height, url);
|
||||
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,DELIVERY_STATUS){
|
||||
// 입고결과 팝업 (발주서 기준)
|
||||
function fn_deliveryAcceptanceViewPopUp(objId, deliveryStatus){
|
||||
var popup_width = 1560;
|
||||
var popup_height = 1050;
|
||||
var popup_height = 1050;
|
||||
|
||||
var hiddenForm = document.hiddenForm;
|
||||
var target = "deliveryAcceptancePopUp";
|
||||
@@ -255,8 +277,8 @@ function fn_deliveryAcceptanceViewPopUp(objId,DELIVERY_STATUS){
|
||||
|
||||
hiddenForm.action = url;
|
||||
hiddenForm.PURCHASE_ORDER_MASTER_OBJID.value = objId;
|
||||
hiddenForm.DELIVERY_STATUS.value = DELIVERY_STATUS;
|
||||
hiddenForm.actionType.value = 'view'; // 뷰 전용으로 설정
|
||||
hiddenForm.DELIVERY_STATUS.value = deliveryStatus;
|
||||
hiddenForm.actionType.value = 'view';
|
||||
hiddenForm.target = target;
|
||||
hiddenForm.submit();
|
||||
}
|
||||
|
||||
@@ -18,48 +18,45 @@ String connector = person.getUserId();
|
||||
</head>
|
||||
|
||||
<style>
|
||||
.form-header {
|
||||
/* 품목 정보 헤더 */
|
||||
.item-info-header {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 20px;
|
||||
padding: 10px 15px;
|
||||
flex-wrap: wrap;
|
||||
gap: 15px;
|
||||
padding: 12px 15px;
|
||||
background: #f8f9fa;
|
||||
border-bottom: 1px solid #ddd;
|
||||
font-size: 13px;
|
||||
}
|
||||
.form-header label {
|
||||
.item-info-header .info-item {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
.item-info-header label {
|
||||
font-weight: bold;
|
||||
margin-right: 5px;
|
||||
margin-right: 8px;
|
||||
color: #555;
|
||||
}
|
||||
.form-header .required {
|
||||
color: red;
|
||||
}
|
||||
.form-header input, .form-header select {
|
||||
padding: 5px 10px;
|
||||
border: 1px solid #ccc;
|
||||
.item-info-header .info-value {
|
||||
color: #333;
|
||||
padding: 3px 8px;
|
||||
background: #fff;
|
||||
border: 1px solid #ddd;
|
||||
border-radius: 3px;
|
||||
}
|
||||
.form-header .info-text {
|
||||
color: #666;
|
||||
font-size: 12px;
|
||||
.item-info-header .info-value.highlight {
|
||||
background: #e3f2fd;
|
||||
border-color: #90caf9;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
/* 좌/우 분할 레이아웃 */
|
||||
.split-container {
|
||||
display: flex;
|
||||
height: calc(100vh - 180px);
|
||||
gap: 10px;
|
||||
/* 그리드 컨테이너 */
|
||||
.grid-wrapper {
|
||||
height: calc(100vh - 150px);
|
||||
padding: 10px;
|
||||
}
|
||||
.left-panel {
|
||||
width: 35%;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
border: 1px solid #ddd;
|
||||
border-radius: 4px;
|
||||
overflow: hidden;
|
||||
}
|
||||
.right-panel {
|
||||
width: 65%;
|
||||
.panel {
|
||||
height: 100%;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
border: 1px solid #ddd;
|
||||
@@ -99,37 +96,15 @@ String connector = person.getUserId();
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
/* 선택된 행 하이라이트 */
|
||||
.tabulator-row.selected-row {
|
||||
background-color: #e3f2fd !important;
|
||||
#gridDiv {
|
||||
height: 0px !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; // 현재 선택된 입고품목 데이터
|
||||
var defectGrid; // 불량상세 그리드
|
||||
var inspectionDetailObjid = "${param.OBJID}"; // INCOMING_INSPECTION_DETAIL.OBJID
|
||||
|
||||
// 불량유형 목록 (0001820)
|
||||
var _DEFECT_TYPE_LIST = [];
|
||||
@@ -169,14 +144,6 @@ $(document).ready(function(){
|
||||
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();
|
||||
@@ -198,193 +165,17 @@ $(document).ready(function(){
|
||||
});
|
||||
|
||||
// 그리드 초기화 및 조회
|
||||
fn_initLeftGrid();
|
||||
fn_initRightGrid();
|
||||
fn_searchLeftGrid();
|
||||
fn_initDefectGrid();
|
||||
fn_searchDefectGrid();
|
||||
});
|
||||
|
||||
// =====================================================
|
||||
// 좌측 그리드 (입고품목) 초기화
|
||||
// 불량상세 그리드 초기화
|
||||
// =====================================================
|
||||
function fn_initLeftGrid() {
|
||||
var columns = [
|
||||
{formatter:"rowSelection", titleFormatter:"rowSelection", headerHozAlign:"center", hozAlign:"center", headerSort:false, width:30, frozen: true},
|
||||
{title:'품번', field:'PART_NO', headerHozAlign:'center', hozAlign:'left', width:150, frozen: true,
|
||||
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, frozen: true},
|
||||
{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:80,
|
||||
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;
|
||||
}
|
||||
},
|
||||
{title:'검사수량', field:'INSPECTION_QTY', headerHozAlign:'center', hozAlign:'right', width:85,
|
||||
editor:"number",
|
||||
editorParams: {min:0, step:1},
|
||||
formatter: function(cell) {
|
||||
var val = cell.getValue();
|
||||
if(val === null || val === '' || val === undefined) return '';
|
||||
return parseInt(val).toLocaleString();
|
||||
}
|
||||
},
|
||||
{title:'불량수량', field:'DEFECT_QTY_SUM', headerHozAlign:'center', hozAlign:'right', width:80,
|
||||
formatter: function(cell) {
|
||||
var val = cell.getValue();
|
||||
if(val === null || val === '' || val === undefined) return '0';
|
||||
return parseInt(val).toLocaleString();
|
||||
}
|
||||
},
|
||||
{title:'불량율', field:'LEFT_DEFECT_RATE', headerHozAlign:'center', hozAlign:'right', width:70,
|
||||
formatter: function(cell) {
|
||||
var val = cell.getValue();
|
||||
if(val === null || val === '' || val === undefined) return '';
|
||||
return val + '%';
|
||||
}
|
||||
},
|
||||
{title:'검사성적서', field:'INSPECTION_FILE_CNT', headerHozAlign:'center', hozAlign:'center', width:90,
|
||||
formatter: fnc_subInfoValueFormatter,
|
||||
cellClick: function(e, cell) {
|
||||
var objId = fnc_checkNull(cell.getData().INSPECTION_DETAIL_OBJID);
|
||||
if(objId) {
|
||||
fn_openInspectionFilePopUp(objId);
|
||||
} else {
|
||||
Swal.fire("먼저 저장 후 파일을 등록할 수 있습니다.");
|
||||
}
|
||||
}
|
||||
}
|
||||
];
|
||||
|
||||
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) {
|
||||
var row = cell.getRow();
|
||||
var data = row.getData();
|
||||
var field = cell.getField();
|
||||
|
||||
// 검사수량 변경 시 불량율 재계산
|
||||
if (field === 'INSPECTION_QTY') {
|
||||
fn_calcLeftGridDefectRate(row);
|
||||
}
|
||||
|
||||
data.GRID_STATUS = 'U';
|
||||
});
|
||||
}
|
||||
|
||||
// 좌측 그리드 불량율 계산 (불량수량합계 / 입고수량 * 100)
|
||||
function fn_calcLeftGridDefectRate(row) {
|
||||
var data = row.getData();
|
||||
var deliveryQty = parseInt(data.DELIVERY_QTY) || 0;
|
||||
var defectQtySum = parseInt(data.DEFECT_QTY_SUM) || 0;
|
||||
|
||||
if (deliveryQty > 0) {
|
||||
var rate = (defectQtySum / deliveryQty * 100).toFixed(2);
|
||||
row.update({"LEFT_DEFECT_RATE": rate});
|
||||
} else {
|
||||
row.update({"LEFT_DEFECT_RATE": ""});
|
||||
}
|
||||
}
|
||||
|
||||
// 검사성적서 파일 팝업
|
||||
function fn_openInspectionFilePopUp(objId) {
|
||||
var popup_width = 800;
|
||||
var popup_height = 300;
|
||||
var params = "?targetObjId=" + objId + "&docType=INSPECTION_REPORT&docTypeName=검사성적서";
|
||||
var url = "/common/FileRegistPopup.do" + params;
|
||||
window.open(url, "inspectionFilePopUp", "width=" + popup_width + ",height=" + popup_height + ",scrollbars=yes,resizable=yes");
|
||||
}
|
||||
|
||||
// 좌측 그리드 불량수량 합계/불량율 실시간 업데이트 (우측 그리드 변경 시)
|
||||
function fn_updateLeftGridDefectSum() {
|
||||
if(!selectedRowData) return;
|
||||
|
||||
// 우측 그리드의 불량수량 합계 계산
|
||||
var rightGridData = rightGrid.getData();
|
||||
var defectQtySum = 0;
|
||||
rightGridData.forEach(function(row) {
|
||||
if(row.GRID_STATUS !== 'D') { // 삭제 표시된 행 제외
|
||||
defectQtySum += parseInt(row.DEFECT_QTY) || 0;
|
||||
}
|
||||
});
|
||||
|
||||
// 좌측 그리드에서 현재 선택된 행 찾기
|
||||
var leftRows = leftGrid.getRows();
|
||||
leftRows.forEach(function(row) {
|
||||
var data = row.getData();
|
||||
if(data.INSPECTION_DETAIL_OBJID === selectedDetailObjid) {
|
||||
// 불량수량 합계 업데이트
|
||||
row.update({"DEFECT_QTY_SUM": defectQtySum});
|
||||
|
||||
// 불량율 재계산 (불량수량합계 / 입고수량 * 100)
|
||||
var deliveryQty = parseInt(data.DELIVERY_QTY) || 0;
|
||||
if(deliveryQty > 0) {
|
||||
var rate = (defectQtySum / deliveryQty * 100).toFixed(2);
|
||||
row.update({"LEFT_DEFECT_RATE": rate});
|
||||
} else {
|
||||
row.update({"LEFT_DEFECT_RATE": ""});
|
||||
}
|
||||
|
||||
// 변경 표시
|
||||
data.GRID_STATUS = 'U';
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// =====================================================
|
||||
// 우측 그리드 (불량상세) 초기화
|
||||
// =====================================================
|
||||
function fn_initRightGrid() {
|
||||
function fn_initDefectGrid() {
|
||||
var columns = [
|
||||
{formatter:"rowSelection", titleFormatter:"rowSelection", headerHozAlign:"center", hozAlign:"center", headerSort:false, width:30},
|
||||
{title:'검사구분', field:'INSPECTION_TYPE', headerHozAlign:'center', hozAlign:'center', width:80,
|
||||
{title:'검사구분', field:'INSPECTION_TYPE', headerHozAlign:'center', hozAlign:'center', width:90,
|
||||
editor:"select",
|
||||
editorParams:{values:{"":"선택", "원자재":"원자재", "외주가공":"외주가공"}},
|
||||
formatter: function(cell) {
|
||||
@@ -392,8 +183,8 @@ function fn_initRightGrid() {
|
||||
if(!val || val === '') return '';
|
||||
return val;
|
||||
}
|
||||
},
|
||||
{title:'불량유형', field:'DEFECT_TYPE', headerHozAlign:'center', hozAlign:'center', width:100,
|
||||
},
|
||||
{title:'불량유형', field:'DEFECT_TYPE', headerHozAlign:'center', hozAlign:'center', width:110,
|
||||
editor: fnc_customSelectEditor,
|
||||
formatter: function(cell) {
|
||||
var val = cell.getValue();
|
||||
@@ -402,7 +193,7 @@ function fn_initRightGrid() {
|
||||
},
|
||||
editorParams: {valueId:"CODE", labelId:"NAME", values:_DEFECT_TYPE_LIST}
|
||||
},
|
||||
{title:'불량원인', field:'DEFECT_REASON', headerHozAlign:'center', hozAlign:'center', width:100,
|
||||
{title:'불량원인', field:'DEFECT_REASON', headerHozAlign:'center', hozAlign:'center', width:110,
|
||||
editor: fnc_customSelectEditor,
|
||||
formatter: function(cell) {
|
||||
var val = cell.getValue();
|
||||
@@ -427,7 +218,7 @@ function fn_initRightGrid() {
|
||||
return {valueId:"CODE", labelId:"NAME", values: [{"CODE": "", "NAME": "선택"}]};
|
||||
}
|
||||
},
|
||||
{title:'처리현황', field:'ACTION_STATUS', headerHozAlign:'center', hozAlign:'center', width:80,
|
||||
{title:'처리현황', field:'ACTION_STATUS', headerHozAlign:'center', hozAlign:'center', width:90,
|
||||
editor: fnc_customSelectEditor,
|
||||
formatter: function(cell) {
|
||||
var val = cell.getValue();
|
||||
@@ -436,34 +227,28 @@ function fn_initRightGrid() {
|
||||
},
|
||||
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,
|
||||
{title:'검사수량', field:'INSPECTION_QTY', headerHozAlign:'center', hozAlign:'right', width:90,
|
||||
editor:"number",
|
||||
editorParams: {min:0, step:1},
|
||||
formatter: function(cell) {
|
||||
var val = cell.getValue();
|
||||
if(val === null || val === '' || val === undefined) return '';
|
||||
return parseInt(val);
|
||||
return parseInt(val).toLocaleString();
|
||||
}
|
||||
},
|
||||
// {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,
|
||||
{title:'불량수량', field:'DEFECT_QTY', headerHozAlign:'center', hozAlign:'right', width:90,
|
||||
editor:"number",
|
||||
editorParams: {min:0, step:1},
|
||||
formatter: function(cell) {
|
||||
var val = cell.getValue();
|
||||
if(val === null || val === '' || val === undefined) return '';
|
||||
return parseInt(val).toLocaleString();
|
||||
}
|
||||
},
|
||||
{title:'검사일', field:'INSPECTION_DATE', headerHozAlign:'center', hozAlign:'center', width:110,
|
||||
editor:"date"
|
||||
},
|
||||
{title:'검사자', field:'INSPECTOR_ID', headerHozAlign:'center', hozAlign:'center', width:100,
|
||||
{title:'검사자', field:'INSPECTOR_ID', headerHozAlign:'center', hozAlign:'center', width:110,
|
||||
editor: fnc_customSelectEditor,
|
||||
formatter: function(cell) {
|
||||
var val = cell.getValue();
|
||||
@@ -472,7 +257,7 @@ function fn_initRightGrid() {
|
||||
},
|
||||
editorParams: {valueId:"CODE", labelId:"NAME", values:_INSPECTOR_LIST}
|
||||
},
|
||||
{title:'처리결과', field:'ACTION_RESULT', headerHozAlign:'center', hozAlign:'center', width:80,
|
||||
{title:'처리결과', field:'ACTION_RESULT', headerHozAlign:'center', hozAlign:'center', width:100,
|
||||
editor: fnc_customSelectEditor,
|
||||
formatter: function(cell) {
|
||||
var val = cell.getValue();
|
||||
@@ -481,7 +266,7 @@ function fn_initRightGrid() {
|
||||
},
|
||||
editorParams: {valueId:"CODE", labelId:"NAME", values:_ACTION_RESULT_LIST}
|
||||
},
|
||||
{title:'검사결과', field:'INSPECTION_RESULT', headerHozAlign:'center', hozAlign:'center', width:80,
|
||||
{title:'검사결과', field:'INSPECTION_RESULT', headerHozAlign:'center', hozAlign:'center', width:90,
|
||||
editor: fnc_customSelectEditor,
|
||||
formatter: function(cell) {
|
||||
var val = cell.getValue();
|
||||
@@ -491,11 +276,11 @@ function fn_initRightGrid() {
|
||||
},
|
||||
editorParams: {valueId:"CODE", labelId:"NAME", values:_INSPECTION_RESULT_LIST}
|
||||
},
|
||||
{title:'이미지파일', field:'IMAGE_FILE_CNT', headerHozAlign:'center', hozAlign:'center', width:90,
|
||||
{title:'이미지', field:'IMAGE_FILE_CNT', headerHozAlign:'center', hozAlign:'center', width:80,
|
||||
formatter: fnc_subInfoValueFormatter,
|
||||
cellClick: function(e, cell) {
|
||||
var objId = fnc_checkNull(cell.getData().OBJID);
|
||||
if(objId) {
|
||||
if(objId && cell.getData().GRID_STATUS !== 'I') {
|
||||
fn_openImageFilePopUp(objId);
|
||||
} else {
|
||||
Swal.fire("먼저 저장 후 이미지를 등록할 수 있습니다.");
|
||||
@@ -506,28 +291,28 @@ function fn_initRightGrid() {
|
||||
formatter: fnc_subInfoValueFormatter,
|
||||
cellClick: function(e, cell) {
|
||||
var objId = fnc_checkNull(cell.getData().OBJID);
|
||||
if(objId) {
|
||||
if(objId && cell.getData().GRID_STATUS !== 'I') {
|
||||
fn_openAttachFilePopUp(objId);
|
||||
} else {
|
||||
Swal.fire("먼저 저장 후 파일을 등록할 수 있습니다.");
|
||||
}
|
||||
}
|
||||
},
|
||||
{title:'비고', field:'REMARK', headerHozAlign:'center', hozAlign:'left', width:150,
|
||||
{title:'비고', field:'REMARK', headerHozAlign:'center', hozAlign:'left', minWidth:150, widthGrow:1,
|
||||
editor:"input"
|
||||
}
|
||||
];
|
||||
|
||||
rightGrid = new Tabulator("#rightGrid", {
|
||||
defectGrid = new Tabulator("#defectGrid", {
|
||||
layout: "fitDataStretch",
|
||||
height: "99.6%",
|
||||
placeholder: "좌측에서 품목을 선택하세요.",
|
||||
height: "100%",
|
||||
placeholder: "불량상세 데이터가 없습니다. [+ 행 추가] 버튼을 클릭하여 추가하세요.",
|
||||
columns: columns,
|
||||
selectable: true
|
||||
});
|
||||
|
||||
// 셀 편집 이벤트
|
||||
rightGrid.on("cellEdited", function(cell) {
|
||||
defectGrid.on("cellEdited", function(cell) {
|
||||
var row = cell.getRow();
|
||||
var data = row.getData();
|
||||
var field = cell.getField();
|
||||
@@ -537,21 +322,17 @@ function fn_initRightGrid() {
|
||||
row.update({"DEFECT_REASON": ""});
|
||||
}
|
||||
|
||||
// 불량수량 변경 시 정수로 변환
|
||||
// 검사수량 변경 시 정수로 변환
|
||||
if (field === 'INSPECTION_QTY') {
|
||||
var inspectionQty = parseInt(data.INSPECTION_QTY) || 0;
|
||||
row.update({"INSPECTION_QTY": inspectionQty});
|
||||
}
|
||||
|
||||
// 불량수량 변경 시 정수로 변환 및 검사결과 자동 설정
|
||||
if (field === 'DEFECT_QTY') {
|
||||
var defectQty = parseInt(data.DEFECT_QTY) || 0;
|
||||
row.update({"DEFECT_QTY": defectQty});
|
||||
// 불량율 계산
|
||||
fn_calcDefectRate(row);
|
||||
// 검사결과 자동 설정
|
||||
fn_updateInspectionResult(row);
|
||||
// 좌측 그리드 불량수량 합계/불량율 업데이트
|
||||
fn_updateLeftGridDefectSum();
|
||||
}
|
||||
|
||||
// 검사수량 변경 시 불량율 자동 계산
|
||||
if (field === 'INSPECTION_QTY') {
|
||||
fn_calcDefectRate(row);
|
||||
}
|
||||
|
||||
// 처리결과 변경 시 검사결과 자동 설정
|
||||
@@ -563,20 +344,6 @@ function fn_initRightGrid() {
|
||||
});
|
||||
}
|
||||
|
||||
// 불량율 계산
|
||||
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": ""});
|
||||
}
|
||||
}
|
||||
|
||||
// 검사결과 자동 설정
|
||||
// 처리결과가 '수정' 또는 '특채'이면 OK, 불량수량 > 0 이면 NG, 그 외 OK
|
||||
function fn_updateInspectionResult(row) {
|
||||
@@ -584,8 +351,6 @@ function fn_updateInspectionResult(row) {
|
||||
var defectQty = parseInt(data.DEFECT_QTY) || 0;
|
||||
var actionResult = fnc_checkNull(data.ACTION_RESULT);
|
||||
|
||||
console.log("[검사결과 자동설정] 불량수량:", defectQty, ", 처리결과:", actionResult);
|
||||
|
||||
var newResult = "OK";
|
||||
// 처리결과가 '수정' 또는 '특채'이면 불량수량 있어도 OK
|
||||
if (actionResult === '수정' || actionResult === '특채') {
|
||||
@@ -595,44 +360,15 @@ function fn_updateInspectionResult(row) {
|
||||
newResult = "NG";
|
||||
}
|
||||
|
||||
console.log("[검사결과 자동설정] 결과:", newResult);
|
||||
row.update({"INSPECTION_RESULT": newResult});
|
||||
}
|
||||
|
||||
// =====================================================
|
||||
// 좌측 그리드 조회
|
||||
// 불량상세 그리드 조회
|
||||
// =====================================================
|
||||
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) {
|
||||
function fn_searchDefectGrid() {
|
||||
if(!inspectionDetailObjid) {
|
||||
rightGrid.setData([]);
|
||||
defectGrid.setData([]);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -642,55 +378,26 @@ function fn_searchRightGrid(inspectionDetailObjid) {
|
||||
data: {INSPECTION_DETAIL_OBJID: inspectionDetailObjid},
|
||||
dataType: "json",
|
||||
success: function(data) {
|
||||
if(data.list) {
|
||||
rightGrid.setData(data.list);
|
||||
if(data.list && data.list.length > 0) {
|
||||
defectGrid.setData(data.list);
|
||||
} else {
|
||||
rightGrid.setData([]);
|
||||
defectGrid.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;
|
||||
}
|
||||
// 입고수량 (검사수량 기본값으로 사용)
|
||||
var deliveryQty = parseInt("${info.DELIVERY_QTY}") || 0;
|
||||
|
||||
if(selectedRowData && selectedRowData.INSPECTION_YN === '스킵') {
|
||||
Swal.fire("검사여부가 '스킵'인 항목은 불량상세를 추가할 수 없습니다.");
|
||||
return;
|
||||
}
|
||||
|
||||
// 새 행 데이터 (검사일: 오늘, 검사자: 접속자)
|
||||
// 새 행 데이터 (검사일: 오늘, 검사자: 접속자, 검사수량: 입고수량)
|
||||
var newRow = {
|
||||
OBJID: fnc_createObjId(),
|
||||
INSPECTION_DETAIL_OBJID: selectedDetailObjid,
|
||||
INSPECTION_DETAIL_OBJID: inspectionDetailObjid,
|
||||
INSPECTION_TYPE: "",
|
||||
INSPECTION_DATE: "${today}",
|
||||
INSPECTOR_ID: "<%=connector%>",
|
||||
@@ -698,22 +405,21 @@ function fn_addDefectRow() {
|
||||
DEFECT_REASON: "",
|
||||
ACTION_STATUS: "",
|
||||
ACTION_RESULT: "",
|
||||
INSPECTION_QTY: selectedRowData ? selectedRowData.DELIVERY_QTY : 0, // 입고수량을 기본값으로
|
||||
INSPECTION_QTY: deliveryQty,
|
||||
DEFECT_QTY: 0,
|
||||
DEFECT_RATE: "",
|
||||
INSPECTION_RESULT: "",
|
||||
REMARK: "",
|
||||
GRID_STATUS: "I"
|
||||
};
|
||||
|
||||
rightGrid.addRow(newRow);
|
||||
defectGrid.addRow(newRow);
|
||||
}
|
||||
|
||||
// =====================================================
|
||||
// 불량상세 행 삭제
|
||||
// =====================================================
|
||||
function fn_deleteDefectRow() {
|
||||
var selectedRows = rightGrid.getSelectedRows();
|
||||
var selectedRows = defectGrid.getSelectedRows();
|
||||
if(selectedRows.length === 0) {
|
||||
Swal.fire("삭제할 행을 선택하세요.");
|
||||
return;
|
||||
@@ -742,21 +448,10 @@ function fn_deleteDefectRow() {
|
||||
row.getElement().style.display = 'none';
|
||||
}
|
||||
});
|
||||
// 좌측 그리드 불량수량 합계/불량율 업데이트
|
||||
fn_updateLeftGridDefectSum();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// 품목상세 팝업
|
||||
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;
|
||||
@@ -785,14 +480,13 @@ function fn_watchPopupClose(popup, objId, fieldName, docType) {
|
||||
var checkPopup = setInterval(function() {
|
||||
if(popup.closed) {
|
||||
clearInterval(checkPopup);
|
||||
// 파일 카운트 조회 후 해당 행만 업데이트
|
||||
fn_updateRightGridFileCnt(objId, fieldName, docType);
|
||||
fn_updateGridFileCnt(objId, fieldName, docType);
|
||||
}
|
||||
}, 500);
|
||||
}
|
||||
|
||||
// 우측 그리드 파일 카운트 업데이트
|
||||
function fn_updateRightGridFileCnt(objId, fieldName, docType) {
|
||||
// 그리드 파일 카운트 업데이트
|
||||
function fn_updateGridFileCnt(objId, fieldName, docType) {
|
||||
$.ajax({
|
||||
url: "/common/getFileList.do",
|
||||
type: "POST",
|
||||
@@ -800,7 +494,7 @@ function fn_updateRightGridFileCnt(objId, fieldName, docType) {
|
||||
dataType: "json",
|
||||
success: function(data) {
|
||||
var cnt = data ? data.length : 0;
|
||||
var rows = rightGrid.getRows();
|
||||
var rows = defectGrid.getRows();
|
||||
rows.forEach(function(row) {
|
||||
if(row.getData().OBJID === objId) {
|
||||
var updateData = {};
|
||||
@@ -812,44 +506,12 @@ function fn_updateRightGridFileCnt(objId, fieldName, docType) {
|
||||
});
|
||||
}
|
||||
|
||||
// 공통 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();
|
||||
// 불량상세 그리드 데이터
|
||||
var defectGridData = defectGrid.getData();
|
||||
|
||||
Swal.fire({
|
||||
title: '저장 확인',
|
||||
@@ -862,13 +524,13 @@ function fn_save() {
|
||||
cancelButtonText: '취소'
|
||||
}).then((result) => {
|
||||
if (result.isConfirmed) {
|
||||
var param = $("#form1").serializeObject();
|
||||
param.dataListJson = JSON.stringify(leftGridData);
|
||||
param.defectListJson = JSON.stringify(rightGridData);
|
||||
param.selectedDetailObjid = selectedDetailObjid;
|
||||
var param = {
|
||||
INSPECTION_DETAIL_OBJID: inspectionDetailObjid,
|
||||
defectListJson: JSON.stringify(defectGridData)
|
||||
};
|
||||
|
||||
$.ajax({
|
||||
url: "/quality/saveIncomingInspectionProgress.do",
|
||||
url: "/quality/saveIncomingInspectionDefect.do",
|
||||
type: "POST",
|
||||
data: param,
|
||||
dataType: "json",
|
||||
@@ -879,10 +541,8 @@ function fn_save() {
|
||||
icon: data.result ? 'success' : 'error'
|
||||
}).then(() => {
|
||||
if(data.result){
|
||||
// 우측 그리드 새로고침
|
||||
if(selectedDetailObjid) {
|
||||
fn_searchRightGrid(selectedDetailObjid);
|
||||
}
|
||||
// 그리드 새로고침
|
||||
fn_searchDefectGrid();
|
||||
// 부모창 새로고침
|
||||
if(opener && opener.fn_search) {
|
||||
opener.fn_search();
|
||||
@@ -908,9 +568,7 @@ window.addEventListener('unload', function() {
|
||||
|
||||
<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}">
|
||||
<input type="hidden" name="INSPECTION_DETAIL_OBJID" id="INSPECTION_DETAIL_OBJID" value="${param.OBJID}">
|
||||
|
||||
<div class="plm_menu_name_gdnsi">
|
||||
<h2><span>수입검사 진행</span></h2>
|
||||
@@ -920,46 +578,45 @@ window.addEventListener('unload', function() {
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- <div class="form-header">
|
||||
<div>
|
||||
<label>발주번호</label>
|
||||
<span class="info-text">${info.PURCHASE_ORDER_NO}</span>
|
||||
<!-- 품목 정보 헤더 -->
|
||||
<div class="item-info-header">
|
||||
<div class="info-item">
|
||||
<label>발주서No</label>
|
||||
<span class="info-value">${info.PURCHASE_ORDER_NO}</span>
|
||||
</div>
|
||||
<div>
|
||||
<label>요청일</label>
|
||||
<span class="info-text">${info.REQUEST_DATE}</span>
|
||||
<div class="info-item">
|
||||
<label>프로젝트</label>
|
||||
<span class="info-value">${info.PROJECT_NO}</span>
|
||||
</div>
|
||||
<div>
|
||||
<label>요청자</label>
|
||||
<span class="info-text">${info.REQUEST_USER_NAME}</span>
|
||||
<div class="info-item">
|
||||
<label>제품구분</label>
|
||||
<span class="info-value">${info.PRODUCT_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 class="info-item">
|
||||
<label>품번</label>
|
||||
<span class="info-value highlight">${info.PART_NO}</span>
|
||||
</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 class="info-item">
|
||||
<label>품명</label>
|
||||
<span class="info-value highlight">${info.PART_NAME}</span>
|
||||
</div>
|
||||
</div> -->
|
||||
<div class="info-item">
|
||||
<label>공급업체</label>
|
||||
<span class="info-value">${info.PARTNER_NAME}</span>
|
||||
</div>
|
||||
<div class="info-item">
|
||||
<label>입고일</label>
|
||||
<span class="info-value">${info.DELIVERY_DATE}</span>
|
||||
</div>
|
||||
<div class="info-item">
|
||||
<label>입고수량</label>
|
||||
<span class="info-value">${info.DELIVERY_QTY}</span>
|
||||
</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="grid-wrapper">
|
||||
<div class="panel">
|
||||
<div class="panel-header">
|
||||
<span>불량상세</span>
|
||||
<div class="btn-group">
|
||||
@@ -967,8 +624,8 @@ window.addEventListener('unload', function() {
|
||||
<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 class="panel-body">
|
||||
<div id="defectGrid" class="grid-container"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -312,6 +312,12 @@ 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 workerList = [
|
||||
<c:forEach var="worker" items="${workerList}" varStatus="status">
|
||||
"${worker.USER_NAME}"<c:if test="${!status.last}">,</c:if>
|
||||
</c:forEach>
|
||||
];
|
||||
var processStatusList = ["수정", "폐기"];
|
||||
var dispositionTypeList = ["수정완료", "폐기", "특채완료"];
|
||||
|
||||
@@ -592,6 +598,10 @@ function fn_initRightGrid(){
|
||||
editor: createSelect2Editor(responsibleDeptList),
|
||||
editable: isEditable
|
||||
},
|
||||
{title:"작업자", field:"WORKER", minWidth:80, headerSort:false,
|
||||
editor: createSelect2Editor(workerList),
|
||||
editable: isEditable
|
||||
},
|
||||
{title:"부적합보고서", field:"NCR_FILE_CNT", minWidth:95, headerSort:false, hozAlign:"center",
|
||||
formatter: fnc_subInfoValueFormatter,
|
||||
cellClick: function(e, cell){
|
||||
|
||||
@@ -218,15 +218,16 @@ async function fn_createExcelFile(data){
|
||||
}
|
||||
}
|
||||
|
||||
// 컬럼: 검사일, 검사자, 품명(모델명), 작업지시번호, 부품품번, 부품명, 입고수량 합계, 양품수량 합계, 불량수량 합계, 불량율, 재생수량 합계, 최종양품수량 합계
|
||||
// 컬럼: 검사일, 검사자, 제품구분, 품명(모델명), 작업지시번호, 부품품번, 부품명, 입고수량 합계, 양품수량 합계, 불량수량 합계, 불량율, 재생수량 합계, 최종양품수량 합계
|
||||
var columns = [
|
||||
{headerHozAlign:'center', hozAlign:'center', minWidth:110, widthGrow:1, title:'검사일', field:'INSPECTION_DATE',
|
||||
{headerHozAlign:'center', hozAlign:'center', minWidth:150, 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:'center', minWidth:100, widthGrow:2, title:'제품구분', field:'PRODUCT_TYPE'},
|
||||
{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'},
|
||||
@@ -426,12 +427,10 @@ function fn_registPopUp(){
|
||||
</select>
|
||||
</td>
|
||||
|
||||
<td><label for="">검사일</label></td>
|
||||
<td class=""><label>검사일</label></td>
|
||||
<td>
|
||||
<select name="search_inspection_date" id="search_inspection_date" class="select2" style="width:150px;" autocomplete="off">
|
||||
<option value="">전체</option>
|
||||
${code_map.inspection_date}
|
||||
</select>
|
||||
<input type="text" name="inspection_start_date" id="inspection_start_date" style="width:120px;" autocomplete="off" value="${param.inspection_start_date}" class="date_icon">~
|
||||
<input type="text" name="inspection_end_date" id="inspection_end_date" style="width:120px;" autocomplete="off" value="${param.inspection_end_date }" class="date_icon">
|
||||
</td>
|
||||
|
||||
<td><label for="">검사자</label></td>
|
||||
|
||||
@@ -121,6 +121,11 @@ $(document).ready(function(){
|
||||
fn_openQuotationRequestPopup();
|
||||
});
|
||||
|
||||
// 단가초기화
|
||||
$("#btnResetPrice").click(function(){
|
||||
fn_resetMbomPrice();
|
||||
});
|
||||
|
||||
$("#btnOrderBOMReg").click(function(){
|
||||
fn_salesRequestTargetBOMListPopUp();
|
||||
});
|
||||
@@ -514,6 +519,106 @@ function fn_formPopUp(objId,sales_request_objid){
|
||||
hiddenForm.submit(); */
|
||||
}
|
||||
|
||||
/**
|
||||
* 단가초기화 함수
|
||||
* - 선택된 구매요청서의 M-BOM에서 소재단가/가공단가를 0으로 초기화
|
||||
* - 재수주 시 이전 단가를 삭제하고 새로운 견적을 받기 위함
|
||||
*/
|
||||
function fn_resetMbomPrice() {
|
||||
// 1. 선택된 행 확인
|
||||
var selectedRows = _tabulGrid.getSelectedData();
|
||||
|
||||
if(selectedRows.length == 0) {
|
||||
Swal.fire({
|
||||
title: '알림',
|
||||
text: '단가를 초기화할 구매요청서를 선택해주세요.',
|
||||
icon: 'info'
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
if(selectedRows.length > 1) {
|
||||
Swal.fire({
|
||||
title: '알림',
|
||||
text: '한 번에 하나의 구매요청서만 선택해주세요.',
|
||||
icon: 'info'
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
var selectedRow = selectedRows[0];
|
||||
var mbomHeaderObjid = fnc_checkNull(selectedRow.MBOM_HEADER_OBJID);
|
||||
var salesRequestObjid = fnc_checkNull(selectedRow.OBJID);
|
||||
var projectNumber = fnc_checkNull(selectedRow.PROJECT_NUMBER);
|
||||
|
||||
// MBOM_HEADER_OBJID 확인
|
||||
if(!mbomHeaderObjid) {
|
||||
Swal.fire({
|
||||
title: '알림',
|
||||
text: 'M-BOM 정보가 없습니다.\n구매리스트가 생성되지 않았거나 M-BOM이 할당되지 않았습니다.',
|
||||
icon: 'warning'
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
// 확인 메시지
|
||||
Swal.fire({
|
||||
title: '단가 초기화',
|
||||
html: '<p>선택된 구매요청서의 M-BOM 단가를 초기화하시겠습니까?</p>' +
|
||||
'<p style="font-size:12px; color:#666;">프로젝트: <strong>' + projectNumber + '</strong></p>' +
|
||||
'<div style="margin-top:15px; padding:10px; background:#fff3cd; border:1px solid #ffc107; border-radius:4px; text-align:left;">' +
|
||||
'<p style="margin:0; color:#856404;"><strong>초기화 대상:</strong></p>' +
|
||||
'<ul style="margin:5px 0 0 0; padding-left:20px; color:#856404;">' +
|
||||
'<li>소재단가 (UNIT_PRICE) → 0</li>' +
|
||||
'<li>가공단가 (PROCESSING_UNIT_PRICE) → 0</li>' +
|
||||
'</ul>' +
|
||||
'</div>',
|
||||
icon: 'warning',
|
||||
showCancelButton: true,
|
||||
confirmButtonText: '초기화',
|
||||
cancelButtonText: '취소',
|
||||
confirmButtonColor: '#ff9800'
|
||||
}).then((result) => {
|
||||
if(result.isConfirmed) {
|
||||
// 초기화 실행
|
||||
$.ajax({
|
||||
url: "/salesMng/resetMbomPrice.do",
|
||||
type: "POST",
|
||||
data: {
|
||||
MBOM_HEADER_OBJID: mbomHeaderObjid,
|
||||
SALES_REQUEST_MASTER_OBJID: salesRequestObjid
|
||||
},
|
||||
dataType: "json",
|
||||
success: function(response) {
|
||||
if(response.resultFlag === "S") {
|
||||
Swal.fire({
|
||||
title: '완료',
|
||||
html: response.message || '단가가 초기화되었습니다.',
|
||||
icon: 'success'
|
||||
}).then(() => {
|
||||
fn_search(); // 목록 새로고침
|
||||
});
|
||||
} else {
|
||||
Swal.fire({
|
||||
title: '오류',
|
||||
html: response.message || '단가 초기화 중 오류가 발생했습니다.',
|
||||
icon: 'error'
|
||||
});
|
||||
}
|
||||
},
|
||||
error: function(xhr, status, error) {
|
||||
console.error("단가 초기화 오류:", status, error);
|
||||
Swal.fire({
|
||||
title: '오류',
|
||||
text: '서버 통신 중 오류가 발생했습니다.',
|
||||
icon: 'error'
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 품의서 생성 함수
|
||||
* - 선택된 구매요청서에서 소재단가/가공단가가 입력된 품목만 필터링
|
||||
@@ -971,6 +1076,7 @@ function fn_executeCreateQuotationRequests(salesRequestObjid, supplyVendorGroups
|
||||
<!-- <input type="button" value="구매요청서작성" class="plm_btns" id="btnOrderReg"> -->
|
||||
<input type="button" value="견적요청서생성" class="plm_btns" id="btnQuotationRequest" style="background-color: #4CAF50; border-color: #4CAF50;">
|
||||
<input type="button" value="품의서생성" class="plm_btns" id="btnReg">
|
||||
<input type="button" value="단가초기화" class="plm_btns" id="btnResetPrice" style="background-color: #ff9800; border-color: #ff9800;">
|
||||
</div>
|
||||
</div>
|
||||
<div id="plmSearchZon">
|
||||
|
||||
@@ -372,9 +372,9 @@ public class QualityController {
|
||||
}
|
||||
|
||||
/**
|
||||
* 수입검사 진행 팝업
|
||||
* 수입검사 진행 팝업 (신규 - 입고품목 상세 기준)
|
||||
* @param request
|
||||
* @param paramMap
|
||||
* @param paramMap - OBJID: INCOMING_INSPECTION_DETAIL.OBJID
|
||||
* @return
|
||||
*/
|
||||
@RequestMapping("/quality/incomingInspectionProgressPopUp.do")
|
||||
@@ -386,19 +386,14 @@ public class QualityController {
|
||||
PersonBean person = (PersonBean) request.getSession().getAttribute(Constants.PERSON_BEAN);
|
||||
String loginUserId = person != null ? person.getUserId() : "";
|
||||
|
||||
// 기존 검사 정보 조회 (검사자, 검사일 가져오기)
|
||||
Map info = service.getIncomingInspectionDetailInfo(paramMap);
|
||||
String savedInspectorId = "";
|
||||
if(info != null && info.get("inspector_id") != null) {
|
||||
savedInspectorId = (String) info.get("inspector_id");
|
||||
// 선택된 입고품목 상세 정보 조회 (INCOMING_INSPECTION_DETAIL.OBJID 기준)
|
||||
Map info = service.getIncomingInspectionProgressDetailInfo(paramMap);
|
||||
if(info != null) {
|
||||
request.setAttribute("info", CommonUtils.toUpperCaseMapKey(info));
|
||||
} else {
|
||||
// 저장된 값 없으면 로그인 사용자로 기본 설정
|
||||
savedInspectorId = loginUserId;
|
||||
}
|
||||
|
||||
// 검사자 목록 (기존 값 또는 로그인 사용자 selected)
|
||||
code_map.put("inspector_id", commonService.bizMakeOptionList("", savedInspectorId, "common.getUserselect"));
|
||||
// 검사자 목록 (로그인 사용자 기본 선택)
|
||||
code_map.put("inspector_id", commonService.bizMakeOptionList("", loginUserId, "common.getUserselect"));
|
||||
} catch(Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
@@ -457,7 +452,7 @@ public class QualityController {
|
||||
}
|
||||
|
||||
/**
|
||||
* 수입검사 진행 상세 그리드 목록 조회 (검사여부='검사'인 항목만)
|
||||
* 수입검사 진행 상세 그리드 목록 조회 (검사여부='검사'인 항목만) - 팝업용 (기존)
|
||||
* @param request
|
||||
* @param paramMap
|
||||
* @return
|
||||
@@ -469,6 +464,19 @@ public class QualityController {
|
||||
return paramMap;
|
||||
}
|
||||
|
||||
/**
|
||||
* 수입검사 진행 리스트 그리드 조회 (입고품목 상세 기준) - 신규
|
||||
* @param request
|
||||
* @param paramMap
|
||||
* @return
|
||||
*/
|
||||
@ResponseBody
|
||||
@RequestMapping("/quality/incomingInspectionProgressGridList.do")
|
||||
public Map incomingInspectionProgressGridList(HttpServletRequest request, @RequestParam Map<String, Object> paramMap){
|
||||
commonService.selectListPagingNew("quality.getIncomingInspectionProgressList", request, paramMap);
|
||||
return paramMap;
|
||||
}
|
||||
|
||||
/**
|
||||
* 수입검사 요청 저장
|
||||
* @param request
|
||||
@@ -678,6 +686,15 @@ public class QualityController {
|
||||
public String semiProductInspectionFormPopUp(HttpServletRequest request, @RequestParam Map<String, Object> paramMap){
|
||||
Map info = service.getSemiProductInspectionInfo(paramMap);
|
||||
request.setAttribute("info", info);
|
||||
|
||||
// 작업자 목록 조회 (사용자 목록)
|
||||
try {
|
||||
List<Map> workerList = commonService.selectList("common.getUserList", request, paramMap);
|
||||
request.setAttribute("workerList", workerList);
|
||||
} catch(Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
return "/quality/semiProductInspectionFormPopUp";
|
||||
}
|
||||
|
||||
@@ -1014,7 +1031,7 @@ public class QualityController {
|
||||
}
|
||||
|
||||
/**
|
||||
* 수입검사 진행 저장 (입고품목 + 불량상세)
|
||||
* 수입검사 진행 저장 (입고품목 + 불량상세) - 기존
|
||||
*/
|
||||
@ResponseBody
|
||||
@RequestMapping("/quality/saveIncomingInspectionProgress.do")
|
||||
@@ -1022,6 +1039,15 @@ public class QualityController {
|
||||
return service.saveIncomingInspectionProgress(request, paramMap);
|
||||
}
|
||||
|
||||
/**
|
||||
* 수입검사 불량상세 저장 (단일 품목의 불량상세만) - 신규
|
||||
*/
|
||||
@ResponseBody
|
||||
@RequestMapping("/quality/saveIncomingInspectionDefect.do")
|
||||
public Map saveIncomingInspectionDefect(HttpServletRequest request, @RequestParam Map<String, Object> paramMap){
|
||||
return service.saveIncomingInspectionDefect(request, paramMap);
|
||||
}
|
||||
|
||||
/**
|
||||
* OBJID 생성 (첨부파일 등록을 위한 미리 생성)
|
||||
*/
|
||||
|
||||
@@ -3055,8 +3055,68 @@ ORDER BY COALESCE(T.REVISION, '1.0')
|
||||
SELECT
|
||||
P.OBJID::VARCHAR AS CODE_ID
|
||||
,P.PROJECT_NO AS CODE_NAME
|
||||
,(SELECT SUPPLY_NAME FROM SUPPLY_MNG SM WHERE SM.OBJID::VARCHAR = P.CUSTOMER_OBJID) || ' ' || P.PROJECT_NO || ' ' || C.PROJECT_NAME AS PROJ_INFO
|
||||
,P.REQ_DEL_DATE
|
||||
,(SELECT CLIENT_NM FROM CLIENT_MNG SM WHERE 'C_' || SM.OBJID::VARCHAR = P.CUSTOMER_OBJID) || ' ' || P.PROJECT_NO AS PROJ_INFO
|
||||
,P.DUE_DATE
|
||||
FROM PROJECT_MGMT P
|
||||
INNER JOIN CONTRACT_MGMT C
|
||||
ON C.OBJID = P.CONTRACT_OBJID
|
||||
LEFT OUTER JOIN (
|
||||
SELECT
|
||||
T.CONTRACT_OBJID,
|
||||
CASE
|
||||
WHEN COUNT(CASE WHEN PARENT_OBJID IS NOT NULL AND PARENT_OBJID != '' THEN 1 END) = 0 THEN 0
|
||||
ELSE ROUND((
|
||||
COUNT(CASE WHEN SETUP_ACT_END != '' AND SETUP_ACT_END IS NOT NULL AND PARENT_OBJID IS NOT NULL AND PARENT_OBJID != '' THEN 1 END)::FLOAT
|
||||
/
|
||||
COUNT(CASE WHEN PARENT_OBJID IS NOT NULL AND PARENT_OBJID != '' THEN 1 END)
|
||||
* 100
|
||||
)::numeric, 1)
|
||||
END AS SETUP_RATETOTAL
|
||||
FROM
|
||||
SETUP_WBS_TASK T
|
||||
GROUP BY
|
||||
T.CONTRACT_OBJID
|
||||
) ST ON ST.CONTRACT_OBJID = P.OBJID
|
||||
LEFT OUTER JOIN (
|
||||
SELECT
|
||||
CONTRACT_OBJID,
|
||||
COUNT(CASE WHEN DESIGN_act_start IS NOT NULL AND DESIGN_act_start!='' THEN 1 END) AS DESIGN_START_COUNT
|
||||
FROM
|
||||
PMS_WBS_TASK
|
||||
GROUP BY
|
||||
CONTRACT_OBJID
|
||||
) WT ON WT.CONTRACT_OBJID = P.OBJID
|
||||
WHERE (C.CONTRACT_RESULT = '0000964' or C.CONTRACT_RESULT = '0000968')
|
||||
<if test="SEARCH_PROJECT_YEAR != null and SEARCH_PROJECT_YEAR !=''">
|
||||
<!-- AND #{SEARCH_PROJECT_YEAR} BETWEEN
|
||||
(SELECT
|
||||
LEAST(
|
||||
MIN(TO_CHAR(TO_DATE(NULLIF(PURCHASE_PLAN_START, ''), 'YYYY'), 'YYYY')),
|
||||
MIN(TO_CHAR(TO_DATE(NULLIF(PRODUCE_PLAN_START , ''), 'YYYY'), 'YYYY')),
|
||||
MIN(TO_CHAR(TO_DATE(NULLIF(DESIGN_PLAN_START , ''), 'YYYY'), 'YYYY')),
|
||||
MIN(TO_CHAR(TO_DATE(NULLIF(SETUP_PLAN_START , ''), 'YYYY'), 'YYYY'))
|
||||
)
|
||||
FROM PMS_WBS_TASK O
|
||||
WHERE O.CONTRACT_OBJID=P.OBJID)
|
||||
AND (SELECT
|
||||
GREATEST(
|
||||
MAX(TO_CHAR(TO_DATE(NULLIF(PURCHASE_PLAN_END, ''), 'YYYY'), 'YYYY')),
|
||||
MAX(TO_CHAR(TO_DATE(NULLIF(PRODUCE_PLAN_END , ''), 'YYYY'), 'YYYY')),
|
||||
MAX(TO_CHAR(TO_DATE(NULLIF(DESIGN_PLAN_END , ''), 'YYYY'), 'YYYY')),
|
||||
MAX(TO_CHAR(TO_DATE(NULLIF(SETUP_PLAN_END , ''), 'YYYY'), 'YYYY'))
|
||||
)
|
||||
FROM PMS_WBS_TASK O
|
||||
WHERE O.CONTRACT_OBJID=P.OBJID) -->
|
||||
</if>
|
||||
ORDER BY SUBSTRING(P.PROJECT_NO,POSITION('-' IN P.PROJECT_NO)+1) DESC
|
||||
</select>
|
||||
|
||||
<select id="getProgressProjectNoList_old" parameterType="map" resultType="map">
|
||||
SELECT
|
||||
P.OBJID::VARCHAR AS CODE_ID
|
||||
,P.PROJECT_NO AS CODE_NAME
|
||||
,(SELECT CLIENT_NM FROM CLIENT_MNG SM WHERE 'C_' || SM.OBJID::VARCHAR = P.CUSTOMER_OBJID) || ' ' || P.PROJECT_NO AS PROJ_INFO
|
||||
,P.DUE_DATE
|
||||
FROM PROJECT_MGMT P
|
||||
INNER JOIN CONTRACT_MGMT C
|
||||
ON C.OBJID = P.CONTRACT_OBJID
|
||||
@@ -3117,7 +3177,7 @@ ORDER BY COALESCE(T.REVISION, '1.0')
|
||||
-->
|
||||
ORDER BY SUBSTRING(P.PROJECT_NO,POSITION('-' IN P.PROJECT_NO)+1) DESC
|
||||
</select>
|
||||
|
||||
|
||||
<!-- //유저 ID 조회 -->
|
||||
<select id="getUserInfo" resultType="map" parameterType="map">
|
||||
SELECT
|
||||
|
||||
@@ -1428,8 +1428,96 @@
|
||||
반제품검사 관리
|
||||
===================================================== -->
|
||||
|
||||
<!-- 반제품검사 목록 조회 (영업관리 방식: 작업지시번호 기준 그룹화, 나머지는 "외 N건") -->
|
||||
<!-- 반제품검사 목록 조회 (개별 행으로 표시, 양품 데이터 기준) -->
|
||||
<select id="getSemiProductInspectionList" parameterType="map" resultType="map">
|
||||
SELECT SPI.OBJID
|
||||
, COALESCE(SPI.INSPECTION_GROUP_ID::VARCHAR, SPI.OBJID::VARCHAR) AS INSPECTION_GROUP_ID
|
||||
, COALESCE(TO_CHAR(SPI.INSPECTION_DATE, 'YYYY-MM-DD'), TO_CHAR(SPI.REG_DATE, 'YYYY-MM-DD')) AS INSPECTION_DATE
|
||||
, COALESCE((SELECT USER_NAME FROM USER_INFO WHERE USER_ID = SPI.INSPECTOR),
|
||||
(SELECT USER_NAME FROM USER_INFO WHERE USER_ID = SPI.WRITER), '') AS WRITER_NAME
|
||||
, COALESCE(SPI.MODEL_NAME, '') AS MODEL_NAME
|
||||
, COALESCE(SPI.PRODUCT_TYPE, '') AS PRODUCT_TYPE
|
||||
, COALESCE(SPI.WORK_ORDER_NO, '') AS WORK_ORDER_NO
|
||||
, COALESCE(SPI.PART_NO, '') AS PART_NO
|
||||
, COALESCE(SPI.PART_NAME, '') AS PART_NAME
|
||||
, COALESCE(SPI.RECEIPT_QTY, 0) AS RECEIPT_QTY
|
||||
, COALESCE(SPI.GOOD_QTY, 0) AS GOOD_QTY
|
||||
<!-- 불량수량: 해당 양품에 연결된 불량 데이터의 합계 (PART_NO 기준) -->
|
||||
, COALESCE((SELECT SUM(DEFECT_QTY) FROM PMS_QUALITY_SEMI_PRODUCT_INSPECTION D
|
||||
WHERE D.INSPECTION_GROUP_ID = SPI.INSPECTION_GROUP_ID
|
||||
AND D.DATA_TYPE = 'DEFECT'
|
||||
AND D.PART_NO = SPI.PART_NO), 0) AS DEFECTIVE_QTY
|
||||
<!-- 불량율 계산 -->
|
||||
, CASE
|
||||
WHEN COALESCE(SPI.RECEIPT_QTY, 0) > 0
|
||||
THEN ROUND(COALESCE((SELECT SUM(DEFECT_QTY) FROM PMS_QUALITY_SEMI_PRODUCT_INSPECTION D
|
||||
WHERE D.INSPECTION_GROUP_ID = SPI.INSPECTION_GROUP_ID
|
||||
AND D.DATA_TYPE = 'DEFECT'
|
||||
AND D.PART_NO = SPI.PART_NO), 0) * 100.0 / SPI.RECEIPT_QTY, 2)
|
||||
ELSE 0
|
||||
END AS DEFECT_RATE
|
||||
<!-- 재생수량: 처리결과가 '수정완료'인 불량수량 -->
|
||||
, COALESCE((SELECT SUM(DEFECT_QTY) FROM PMS_QUALITY_SEMI_PRODUCT_INSPECTION D
|
||||
WHERE D.INSPECTION_GROUP_ID = SPI.INSPECTION_GROUP_ID
|
||||
AND D.DATA_TYPE = 'DEFECT'
|
||||
AND D.PART_NO = SPI.PART_NO
|
||||
AND D.DISPOSITION_TYPE = '수정완료'), 0) AS REGENERATION_QTY
|
||||
<!-- 최종양품수량: 양품수량 + 재생수량 -->
|
||||
, COALESCE(SPI.GOOD_QTY, 0) + COALESCE((SELECT SUM(DEFECT_QTY) FROM PMS_QUALITY_SEMI_PRODUCT_INSPECTION D
|
||||
WHERE D.INSPECTION_GROUP_ID = SPI.INSPECTION_GROUP_ID
|
||||
AND D.DATA_TYPE = 'DEFECT'
|
||||
AND D.PART_NO = SPI.PART_NO
|
||||
AND D.DISPOSITION_TYPE = '수정완료'), 0) AS FINAL_GOOD_QTY
|
||||
FROM PMS_QUALITY_SEMI_PRODUCT_INSPECTION SPI
|
||||
WHERE SPI.DATA_TYPE = 'GOOD' <!-- 양품 데이터만 조회 (불량은 서브쿼리로 집계) -->
|
||||
<!-- 품명(모델명) 검색 -->
|
||||
<if test="search_model_name != null and search_model_name != ''">
|
||||
AND UPPER(SPI.MODEL_NAME) LIKE UPPER('%' || #{search_model_name} || '%')
|
||||
</if>
|
||||
<!-- 작업지시번호 검색 -->
|
||||
<if test="search_work_order_no != null and search_work_order_no != ''">
|
||||
AND UPPER(SPI.WORK_ORDER_NO) LIKE UPPER('%' || #{search_work_order_no} || '%')
|
||||
</if>
|
||||
<!-- 부품품번 검색 -->
|
||||
<if test="search_part_no != null and search_part_no != ''">
|
||||
AND UPPER(SPI.PART_NO) LIKE UPPER('%' || #{search_part_no} || '%')
|
||||
</if>
|
||||
<!-- 부품명 검색 -->
|
||||
<if test="search_part_name != null and search_part_name != ''">
|
||||
AND UPPER(SPI.PART_NAME) LIKE UPPER('%' || #{search_part_name} || '%')
|
||||
</if>
|
||||
<!-- 검사일 검색 -->
|
||||
<if test="inspection_start_date != null and inspection_start_date != ''">
|
||||
AND COALESCE(SPI.INSPECTION_DATE, SPI.REG_DATE) <![CDATA[>=]]> #{inspection_start_date}::DATE
|
||||
</if>
|
||||
<if test="inspection_end_date != null and inspection_end_date != ''">
|
||||
AND COALESCE(SPI.INSPECTION_DATE, SPI.REG_DATE) <![CDATA[<=]]> #{inspection_end_date}::DATE
|
||||
</if>
|
||||
<!-- 검사자 검색 -->
|
||||
<if test="search_writer != null and search_writer != ''">
|
||||
AND SPI.WRITER = #{search_writer}
|
||||
</if>
|
||||
<!-- 불량유형 검색 (불량 데이터에서 검색) -->
|
||||
<if test="search_defect_type != null and search_defect_type != ''">
|
||||
AND EXISTS (SELECT 1 FROM PMS_QUALITY_SEMI_PRODUCT_INSPECTION D
|
||||
WHERE D.INSPECTION_GROUP_ID = SPI.INSPECTION_GROUP_ID
|
||||
AND D.DATA_TYPE = 'DEFECT'
|
||||
AND D.PART_NO = SPI.PART_NO
|
||||
AND UPPER(D.DEFECT_TYPE) LIKE UPPER('%' || #{search_defect_type} || '%'))
|
||||
</if>
|
||||
<!-- 귀책부서 검색 (불량 데이터에서 검색) -->
|
||||
<if test="search_responsible_dept != null and search_responsible_dept != ''">
|
||||
AND EXISTS (SELECT 1 FROM PMS_QUALITY_SEMI_PRODUCT_INSPECTION D
|
||||
WHERE D.INSPECTION_GROUP_ID = SPI.INSPECTION_GROUP_ID
|
||||
AND D.DATA_TYPE = 'DEFECT'
|
||||
AND D.PART_NO = SPI.PART_NO
|
||||
AND UPPER(D.RESPONSIBLE_DEPT) LIKE UPPER('%' || #{search_responsible_dept} || '%'))
|
||||
</if>
|
||||
ORDER BY COALESCE(SPI.INSPECTION_DATE, SPI.REG_DATE) DESC, SPI.OBJID DESC
|
||||
</select>
|
||||
|
||||
<!-- 반제품검사 목록 조회 (그룹화 버전 - 백업용) -->
|
||||
<select id="getSemiProductInspectionList_old" parameterType="map" resultType="map">
|
||||
SELECT T.INSPECTION_GROUP_ID
|
||||
, MIN(T.OBJID) AS OBJID
|
||||
<!-- 작업지시번호: 여러 개면 "XXX 외 N건" (빈값/NULL 제외) -->
|
||||
@@ -1452,6 +1540,16 @@
|
||||
WHERE T2.INSPECTION_GROUP_ID = T.INSPECTION_GROUP_ID
|
||||
AND T2.MODEL_NAME IS NOT NULL AND T2.MODEL_NAME != '') sub
|
||||
) AS MODEL_NAME
|
||||
<!-- 제품구분: 여러 개면 "XXX 외 N건" (빈값/NULL 제외) -->
|
||||
, (SELECT CASE
|
||||
WHEN COUNT(*) = 0 THEN ''
|
||||
WHEN COUNT(*) = 1 THEN MAX(val)
|
||||
ELSE MAX(val) || ' 외 ' || (COUNT(*) - 1) || '건'
|
||||
END
|
||||
FROM (SELECT DISTINCT T2.PRODUCT_TYPE AS val FROM PMS_QUALITY_SEMI_PRODUCT_INSPECTION T2
|
||||
WHERE T2.INSPECTION_GROUP_ID = T.INSPECTION_GROUP_ID
|
||||
AND T2.PRODUCT_TYPE IS NOT NULL AND T2.PRODUCT_TYPE != '') sub
|
||||
) AS PRODUCT_TYPE
|
||||
<!-- 부품품번: 여러 개면 "XXX 외 N건" (빈값/NULL 제외) -->
|
||||
, (SELECT CASE
|
||||
WHEN COUNT(*) = 0 THEN ''
|
||||
@@ -1531,17 +1629,20 @@
|
||||
<if test="search_work_order_no != null and search_work_order_no != ''">
|
||||
AND UPPER(SPI.WORK_ORDER_NO) LIKE UPPER('%' || #{search_work_order_no} || '%')
|
||||
</if>
|
||||
<!-- 부품품번 검색 (LIKE 검색 - 외 N건 항목도 검색 가능) -->
|
||||
<!-- 부품품번 검색 -->
|
||||
<if test="search_part_no != null and search_part_no != ''">
|
||||
AND UPPER(SPI.PART_NO) LIKE UPPER('%' || #{search_part_no} || '%')
|
||||
</if>
|
||||
<!-- 부품명 검색 (LIKE 검색 - 외 N건 항목도 검색 가능) -->
|
||||
<!-- 부품명 검색 -->
|
||||
<if test="search_part_name != null and search_part_name != ''">
|
||||
AND UPPER(SPI.PART_NAME) LIKE UPPER('%' || #{search_part_name} || '%')
|
||||
</if>
|
||||
<!-- 검사일 검색 -->
|
||||
<if test="search_inspection_date != null and search_inspection_date != ''">
|
||||
AND TO_CHAR(SPI.REG_DATE, 'YYYY-MM-DD') = #{search_inspection_date}
|
||||
<if test="inspection_start_date != null and inspection_start_date != ''">
|
||||
AND SPI.INSPECTION_DATE <![CDATA[>=]]> #{inspection_start_date}
|
||||
</if>
|
||||
<if test="inspection_end_date != null and inspection_end_date != ''">
|
||||
AND SPI.INSPECTION_DATE <![CDATA[<=]]> #{inspection_end_date}
|
||||
</if>
|
||||
<!-- 검사자 검색 -->
|
||||
<if test="search_writer != null and search_writer != ''">
|
||||
@@ -1714,6 +1815,7 @@
|
||||
, COALESCE(SPI.DEFECT_TYPE, '') AS "DEFECT_TYPE"
|
||||
, COALESCE(SPI.DEFECT_CAUSE, '') AS "DEFECT_CAUSE"
|
||||
, COALESCE(SPI.RESPONSIBLE_DEPT, '') AS "RESPONSIBLE_DEPT"
|
||||
, COALESCE(SPI.WORKER, '') AS "WORKER"
|
||||
, COALESCE(SPI.PROCESS_STATUS, '') AS "PROCESS_STATUS"
|
||||
, COALESCE(TO_CHAR(SPI.INSPECTION_DATE, 'YYYY-MM-DD'), '') AS "INSPECTION_DATE"
|
||||
, COALESCE(SPI.INSPECTOR, '') AS "INSPECTOR"
|
||||
@@ -1807,6 +1909,7 @@
|
||||
, DEFECT_TYPE
|
||||
, DEFECT_CAUSE
|
||||
, RESPONSIBLE_DEPT
|
||||
, WORKER
|
||||
, PROCESS_STATUS
|
||||
, INSPECTION_DATE
|
||||
, INSPECTOR
|
||||
@@ -1830,6 +1933,7 @@
|
||||
, #{DEFECT_TYPE}
|
||||
, #{DEFECT_CAUSE}
|
||||
, #{RESPONSIBLE_DEPT}
|
||||
, #{WORKER}
|
||||
, #{PROCESS_STATUS}
|
||||
, CASE WHEN #{INSPECTION_DATE} = '' THEN NULL ELSE #{INSPECTION_DATE}::DATE END
|
||||
, #{INSPECTOR}
|
||||
@@ -1857,6 +1961,7 @@
|
||||
, DEFECT_TYPE = #{DEFECT_TYPE}
|
||||
, DEFECT_CAUSE = #{DEFECT_CAUSE}
|
||||
, RESPONSIBLE_DEPT = #{RESPONSIBLE_DEPT}
|
||||
, WORKER = #{WORKER}
|
||||
, PROCESS_STATUS = #{PROCESS_STATUS}
|
||||
, INSPECTION_DATE = CASE WHEN #{INSPECTION_DATE} = '' THEN NULL ELSE #{INSPECTION_DATE}::DATE END
|
||||
, INSPECTOR = #{INSPECTOR}
|
||||
@@ -2364,6 +2469,14 @@
|
||||
SELECT IMI.OBJID
|
||||
, IMI.PARENT_OBJID
|
||||
, IM.PART_OBJID
|
||||
/* 제품구분: PROJECT_MGMT.PRODUCT (코드명 조회) */
|
||||
, COALESCE((SELECT CODE_NAME(PJM.PRODUCT) FROM SALES_REQUEST_MASTER SRM2
|
||||
LEFT JOIN PROJECT_MGMT PJM ON PJM.OBJID::VARCHAR = SRM2.PROJECT_NO
|
||||
WHERE SRM2.OBJID = POM.SALES_REQUEST_OBJID), '') AS PRODUCT_TYPE
|
||||
/* 품명(모델명): PROJECT_MGMT.PART_NAME */
|
||||
, COALESCE((SELECT PJM.PART_NAME FROM SALES_REQUEST_MASTER SRM2
|
||||
LEFT JOIN PROJECT_MGMT PJM ON PJM.OBJID::VARCHAR = SRM2.PROJECT_NO
|
||||
WHERE SRM2.OBJID = POM.SALES_REQUEST_OBJID), '') AS MODEL_NAME
|
||||
, PM.PART_NO
|
||||
, PM.PART_NAME
|
||||
, COALESCE(IMI.RECEIPT_DATE, TO_CHAR(IMI.REGDATE, 'YYYY-MM-DD')) AS DELIVERY_DATE
|
||||
@@ -2415,7 +2528,7 @@
|
||||
ORDER BY IMI.REGDATE, PM.PART_NO
|
||||
</select>
|
||||
|
||||
<!-- 수입검사 진행 상세 그리드 목록 조회 (검사여부가 '검사'인 항목만) -->
|
||||
<!-- 수입검사 진행 상세 그리드 목록 조회 (검사여부가 '검사'인 항목만) - 팝업용 (기존) -->
|
||||
<select id="getIncomingInspectionProgressDetailList" parameterType="map" resultType="map">
|
||||
SELECT IMI.OBJID
|
||||
, IMI.PARENT_OBJID
|
||||
@@ -2460,7 +2573,135 @@
|
||||
ORDER BY IMI.REGDATE, PM.PART_NO
|
||||
</select>
|
||||
|
||||
<!-- 수입검사 상세 정보 조회 (발주서 기준 첫번째 검사 정보) -->
|
||||
<!-- =====================================================
|
||||
수입검사 진행 리스트 (입고품목 상세 기준) - 신규
|
||||
===================================================== -->
|
||||
<select id="getIncomingInspectionProgressList" parameterType="map" resultType="map">
|
||||
SELECT IID.OBJID
|
||||
/* 발주서 정보 */
|
||||
, POM.OBJID AS PURCHASE_ORDER_MASTER_OBJID
|
||||
, POM.PURCHASE_ORDER_NO
|
||||
, (SELECT REQUEST_MNG_NO FROM SALES_REQUEST_MASTER WHERE OBJID::VARCHAR = POM.SALES_REQUEST_OBJID) AS PROPOSAL_NO
|
||||
/* 프로젝트 정보 */
|
||||
, PJM.PROJECT_NO
|
||||
, CODE_NAME(PJM.PRODUCT) AS PRODUCT_NAME
|
||||
, PJM.PART_NAME AS MODEL_NAME
|
||||
/* 품목 정보 */
|
||||
, IM.PART_OBJID
|
||||
, PM.PART_NO
|
||||
, PM.PART_NAME
|
||||
/* 공급업체 */
|
||||
, (SELECT CLIENT_NM FROM CLIENT_MNG WHERE OBJID::VARCHAR = POM.PARTNER_OBJID) AS PARTNER_NAME
|
||||
/* 입고 정보 */
|
||||
, COALESCE(IMI.RECEIPT_DATE, TO_CHAR(IMI.REGDATE, 'YYYY-MM-DD')) AS DELIVERY_DATE
|
||||
, IMI.RECEIPT_QTY AS DELIVERY_QTY
|
||||
/* 입고결과 */
|
||||
, (CASE
|
||||
WHEN 0 <![CDATA[>=]]> ((SELECT SUM(ORDER_QTY::NUMERIC) FROM PURCHASE_ORDER_PART WHERE PURCHASE_ORDER_MASTER_OBJID = POM.OBJID::VARCHAR)
|
||||
- COALESCE((SELECT SUM(RECEIPT_QTY::NUMERIC) FROM INVENTORY_MGMT_IN WHERE PURCHASE_ORDER_MASTER_OBJID = POM.OBJID::VARCHAR), 0))
|
||||
THEN '입고완료'
|
||||
WHEN TO_CHAR(NOW(),'YYYY-MM-DD') <![CDATA[>]]> POM.DELIVERY_DATE THEN '지연'
|
||||
ELSE '입고중'
|
||||
END) AS DELIVERY_STATUS
|
||||
/* 검사 정보 */
|
||||
, IID.INSPECTION_YN
|
||||
/* 검사수량 합계 (INCOMING_INSPECTION_DEFECT 테이블에서 집계) */
|
||||
, COALESCE((SELECT SUM(COALESCE(NULLIF(INSPECTION_QTY, ''), '0')::NUMERIC) FROM INCOMING_INSPECTION_DEFECT WHERE INSPECTION_DETAIL_OBJID = IID.OBJID), 0) AS INSPECTION_QTY
|
||||
/* 불량수량 합계 (INCOMING_INSPECTION_DEFECT 테이블에서 집계) */
|
||||
, COALESCE((SELECT SUM(COALESCE(NULLIF(DEFECT_QTY, ''), '0')::NUMERIC) FROM INCOMING_INSPECTION_DEFECT WHERE INSPECTION_DETAIL_OBJID = IID.OBJID), 0) AS DEFECT_QTY_SUM
|
||||
/* 불량율 (불량수량합계 / 검사수량합계 * 100) */
|
||||
, CASE WHEN COALESCE((SELECT SUM(COALESCE(NULLIF(INSPECTION_QTY, ''), '0')::NUMERIC) FROM INCOMING_INSPECTION_DEFECT WHERE INSPECTION_DETAIL_OBJID = IID.OBJID), 0) > 0
|
||||
THEN ROUND(COALESCE((SELECT SUM(COALESCE(NULLIF(DEFECT_QTY, ''), '0')::NUMERIC) FROM INCOMING_INSPECTION_DEFECT WHERE INSPECTION_DETAIL_OBJID = IID.OBJID), 0)
|
||||
/ COALESCE((SELECT SUM(COALESCE(NULLIF(INSPECTION_QTY, ''), '0')::NUMERIC) FROM INCOMING_INSPECTION_DEFECT WHERE INSPECTION_DETAIL_OBJID = IID.OBJID), 1) * 100, 2)
|
||||
ELSE NULL END AS DEFECT_RATE
|
||||
/* 검사일/검사자 (불량상세에서 최신 값) */
|
||||
, (SELECT TO_CHAR(MAX(INSPECTION_DATE), 'YYYY-MM-DD') FROM INCOMING_INSPECTION_DEFECT WHERE INSPECTION_DETAIL_OBJID = IID.OBJID) AS INSPECTION_DATE
|
||||
, (SELECT U.USER_NAME FROM USER_INFO U WHERE U.USER_ID = (SELECT INSPECTOR_ID FROM INCOMING_INSPECTION_DEFECT WHERE INSPECTION_DETAIL_OBJID = IID.OBJID ORDER BY INSPECTION_DATE DESC LIMIT 1)) AS INSPECTOR_NAME
|
||||
/* 검사현황: 불량상세가 있고 전부 처리결과 입력 = 완료, 일부만 = 진행중, 없으면 미검사 */
|
||||
, (CASE
|
||||
WHEN (SELECT COUNT(*) FROM INCOMING_INSPECTION_DEFECT WHERE INSPECTION_DETAIL_OBJID = IID.OBJID) > 0
|
||||
AND (SELECT COUNT(*) FROM INCOMING_INSPECTION_DEFECT WHERE INSPECTION_DETAIL_OBJID = IID.OBJID)
|
||||
= (SELECT COUNT(*) FROM INCOMING_INSPECTION_DEFECT WHERE INSPECTION_DETAIL_OBJID = IID.OBJID AND ACTION_RESULT IS NOT NULL AND ACTION_RESULT != '')
|
||||
THEN '완료'
|
||||
WHEN (SELECT COUNT(*) FROM INCOMING_INSPECTION_DEFECT WHERE INSPECTION_DETAIL_OBJID = IID.OBJID AND ACTION_RESULT IS NOT NULL AND ACTION_RESULT != '') > 0
|
||||
THEN '진행중'
|
||||
ELSE ''
|
||||
END) AS INSPECTION_RESULT
|
||||
/* 검사성적서 파일 수 */
|
||||
, (SELECT COUNT(*) FROM ATTACH_FILE_INFO WHERE TARGET_OBJID = IID.OBJID AND DOC_TYPE = 'INSPECTION_REPORT' AND UPPER(STATUS) = 'ACTIVE') AS INSPECTION_FILE_CNT
|
||||
FROM INCOMING_INSPECTION_DETAIL IID
|
||||
INNER JOIN INVENTORY_MGMT_IN IMI ON IMI.OBJID = IID.INVENTORY_IN_OBJID
|
||||
INNER JOIN INVENTORY_MGMT IM ON IM.OBJID = IMI.PARENT_OBJID
|
||||
INNER JOIN PART_MNG PM ON PM.OBJID::VARCHAR = IM.PART_OBJID
|
||||
LEFT JOIN PURCHASE_ORDER_MASTER POM ON POM.OBJID = IMI.PURCHASE_ORDER_MASTER_OBJID
|
||||
LEFT JOIN SALES_REQUEST_MASTER SRM ON SRM.OBJID = POM.SALES_REQUEST_OBJID
|
||||
LEFT JOIN PROJECT_MGMT PJM ON PJM.OBJID::VARCHAR = SRM.PROJECT_NO
|
||||
WHERE 1=1
|
||||
/* 검사여부가 '검사'인 항목만 조회 */
|
||||
AND IID.INSPECTION_YN = '검사'
|
||||
/* 검색 조건 */
|
||||
<if test="search_proposal_no != null and search_proposal_no != ''">
|
||||
AND (SELECT REQUEST_MNG_NO FROM SALES_REQUEST_MASTER WHERE OBJID::VARCHAR = POM.SALES_REQUEST_OBJID) LIKE '%' || #{search_proposal_no} || '%'
|
||||
</if>
|
||||
<if test="search_purchase_order_no != null and search_purchase_order_no != ''">
|
||||
AND TRIM(UPPER(POM.PURCHASE_ORDER_NO)) LIKE '%' || TRIM(UPPER(#{search_purchase_order_no})) || '%'
|
||||
</if>
|
||||
<if test="project_nos != null and project_nos != ''">
|
||||
AND PJM.PROJECT_NO IN
|
||||
<foreach item="item" collection="project_nos.split(',')" open="(" separator="," close=")">
|
||||
#{item}
|
||||
</foreach>
|
||||
</if>
|
||||
<if test="search_part_objid != null and search_part_objid != ''">
|
||||
AND PM.OBJID::VARCHAR = #{search_part_objid}
|
||||
</if>
|
||||
<if test="search_partner != null and search_partner != ''">
|
||||
AND POM.PARTNER_OBJID = #{search_partner}
|
||||
</if>
|
||||
<if test="search_delivery_status != null and search_delivery_status != ''">
|
||||
<if test="search_delivery_status == '입고완료'">
|
||||
AND 0 <![CDATA[>=]]> ((SELECT SUM(ORDER_QTY::NUMERIC) FROM PURCHASE_ORDER_PART WHERE PURCHASE_ORDER_MASTER_OBJID = POM.OBJID::VARCHAR)
|
||||
- COALESCE((SELECT SUM(RECEIPT_QTY::NUMERIC) FROM INVENTORY_MGMT_IN WHERE PURCHASE_ORDER_MASTER_OBJID = POM.OBJID::VARCHAR), 0))
|
||||
</if>
|
||||
<if test="search_delivery_status == '입고중'">
|
||||
AND 0 <![CDATA[<]]> ((SELECT SUM(ORDER_QTY::NUMERIC) FROM PURCHASE_ORDER_PART WHERE PURCHASE_ORDER_MASTER_OBJID = POM.OBJID::VARCHAR)
|
||||
- COALESCE((SELECT SUM(RECEIPT_QTY::NUMERIC) FROM INVENTORY_MGMT_IN WHERE PURCHASE_ORDER_MASTER_OBJID = POM.OBJID::VARCHAR), 0))
|
||||
AND (TO_CHAR(NOW(),'YYYY-MM-DD') <![CDATA[<=]]> POM.DELIVERY_DATE OR POM.DELIVERY_DATE IS NULL)
|
||||
</if>
|
||||
<if test="search_delivery_status == '지연'">
|
||||
AND 0 <![CDATA[<]]> ((SELECT SUM(ORDER_QTY::NUMERIC) FROM PURCHASE_ORDER_PART WHERE PURCHASE_ORDER_MASTER_OBJID = POM.OBJID::VARCHAR)
|
||||
- COALESCE((SELECT SUM(RECEIPT_QTY::NUMERIC) FROM INVENTORY_MGMT_IN WHERE PURCHASE_ORDER_MASTER_OBJID = POM.OBJID::VARCHAR), 0))
|
||||
AND TO_CHAR(NOW(),'YYYY-MM-DD') <![CDATA[>]]> POM.DELIVERY_DATE
|
||||
</if>
|
||||
</if>
|
||||
<if test="search_product_cd != null and search_product_cd != ''">
|
||||
AND PJM.PRODUCT = #{search_product_cd}
|
||||
</if>
|
||||
<if test="inspector_id != null and inspector_id != ''">
|
||||
AND EXISTS (SELECT 1 FROM INCOMING_INSPECTION_DEFECT WHERE INSPECTION_DETAIL_OBJID = IID.OBJID AND INSPECTOR_ID = #{inspector_id})
|
||||
</if>
|
||||
<if test="inspection_start_date != null and inspection_start_date != ''">
|
||||
AND EXISTS (SELECT 1 FROM INCOMING_INSPECTION_DEFECT WHERE INSPECTION_DETAIL_OBJID = IID.OBJID AND INSPECTION_DATE <![CDATA[>=]]> #{inspection_start_date}::DATE)
|
||||
</if>
|
||||
<if test="inspection_end_date != null and inspection_end_date != ''">
|
||||
AND EXISTS (SELECT 1 FROM INCOMING_INSPECTION_DEFECT WHERE INSPECTION_DETAIL_OBJID = IID.OBJID AND INSPECTION_DATE <![CDATA[<=]]> #{inspection_end_date}::DATE)
|
||||
</if>
|
||||
<if test="search_inspection_status != null and search_inspection_status != ''">
|
||||
<if test="search_inspection_status == '완료'">
|
||||
AND (SELECT COUNT(*) FROM INCOMING_INSPECTION_DEFECT WHERE INSPECTION_DETAIL_OBJID = IID.OBJID) > 0
|
||||
AND (SELECT COUNT(*) FROM INCOMING_INSPECTION_DEFECT WHERE INSPECTION_DETAIL_OBJID = IID.OBJID)
|
||||
= (SELECT COUNT(*) FROM INCOMING_INSPECTION_DEFECT WHERE INSPECTION_DETAIL_OBJID = IID.OBJID AND ACTION_RESULT IS NOT NULL AND ACTION_RESULT != '')
|
||||
</if>
|
||||
<if test="search_inspection_status == '진행중'">
|
||||
AND (SELECT COUNT(*) FROM INCOMING_INSPECTION_DEFECT WHERE INSPECTION_DETAIL_OBJID = IID.OBJID AND ACTION_RESULT IS NOT NULL AND ACTION_RESULT != '') > 0
|
||||
AND (SELECT COUNT(*) FROM INCOMING_INSPECTION_DEFECT WHERE INSPECTION_DETAIL_OBJID = IID.OBJID)
|
||||
> (SELECT COUNT(*) FROM INCOMING_INSPECTION_DEFECT WHERE INSPECTION_DETAIL_OBJID = IID.OBJID AND ACTION_RESULT IS NOT NULL AND ACTION_RESULT != '')
|
||||
</if>
|
||||
</if>
|
||||
ORDER BY IID.REG_DATE DESC, PM.PART_NO
|
||||
</select>
|
||||
|
||||
<!-- 수입검사 상세 정보 조회 (발주서 기준 첫번째 검사 정보) - 기존 -->
|
||||
<select id="getIncomingInspectionDetailInfo" parameterType="map" resultType="map">
|
||||
SELECT IID.INSPECTION_DATE
|
||||
, IID.INSPECTOR_ID
|
||||
@@ -2470,6 +2711,39 @@
|
||||
LIMIT 1
|
||||
</select>
|
||||
|
||||
<!-- 수입검사 진행 팝업용 상세 정보 조회 (INCOMING_INSPECTION_DETAIL.OBJID 기준) - 신규 -->
|
||||
<select id="getIncomingInspectionProgressDetailInfo" parameterType="map" resultType="map">
|
||||
SELECT IID.OBJID AS INSPECTION_DETAIL_OBJID
|
||||
/* 발주서 정보 */
|
||||
, POM.OBJID AS PURCHASE_ORDER_MASTER_OBJID
|
||||
, POM.PURCHASE_ORDER_NO
|
||||
, (SELECT REQUEST_MNG_NO FROM SALES_REQUEST_MASTER WHERE OBJID::VARCHAR = POM.SALES_REQUEST_OBJID) AS PROPOSAL_NO
|
||||
/* 프로젝트 정보 */
|
||||
, PJM.PROJECT_NO
|
||||
, CODE_NAME(PJM.PRODUCT) AS PRODUCT_NAME
|
||||
, PJM.PART_NAME AS MODEL_NAME
|
||||
/* 품목 정보 */
|
||||
, IM.PART_OBJID
|
||||
, PM.PART_NO
|
||||
, PM.PART_NAME
|
||||
/* 공급업체 */
|
||||
, (SELECT CLIENT_NM FROM CLIENT_MNG WHERE OBJID::VARCHAR = POM.PARTNER_OBJID) AS PARTNER_NAME
|
||||
/* 입고 정보 */
|
||||
, COALESCE(IMI.RECEIPT_DATE, TO_CHAR(IMI.REGDATE, 'YYYY-MM-DD')) AS DELIVERY_DATE
|
||||
, IMI.RECEIPT_QTY AS DELIVERY_QTY
|
||||
/* 검사 정보 */
|
||||
, IID.INSPECTION_YN
|
||||
, IID.INSPECTION_QTY
|
||||
FROM INCOMING_INSPECTION_DETAIL IID
|
||||
INNER JOIN INVENTORY_MGMT_IN IMI ON IMI.OBJID = IID.INVENTORY_IN_OBJID
|
||||
INNER JOIN INVENTORY_MGMT IM ON IM.OBJID = IMI.PARENT_OBJID
|
||||
INNER JOIN PART_MNG PM ON PM.OBJID::VARCHAR = IM.PART_OBJID
|
||||
LEFT JOIN PURCHASE_ORDER_MASTER POM ON POM.OBJID = IMI.PURCHASE_ORDER_MASTER_OBJID
|
||||
LEFT JOIN SALES_REQUEST_MASTER SRM ON SRM.OBJID = POM.SALES_REQUEST_OBJID
|
||||
LEFT JOIN PROJECT_MGMT PJM ON PJM.OBJID::VARCHAR = SRM.PROJECT_NO
|
||||
WHERE IID.OBJID = #{OBJID}
|
||||
</select>
|
||||
|
||||
<!-- 수입검사 상세 저장 (UPSERT) -->
|
||||
<update id="saveIncomingInspectionDetail" parameterType="map">
|
||||
INSERT INTO INCOMING_INSPECTION_DETAIL (
|
||||
@@ -2630,4 +2904,12 @@
|
||||
WHERE INSPECTION_DETAIL_OBJID = #{INSPECTION_DETAIL_OBJID}
|
||||
</delete>
|
||||
|
||||
<!-- 수입검사 상세 불량수량 합계 업데이트 -->
|
||||
<update id="updateIncomingInspectionDetailDefectQty" parameterType="map">
|
||||
UPDATE INCOMING_INSPECTION_DETAIL
|
||||
SET DEFECT_QTY = #{DEFECT_QTY}
|
||||
, MOD_DATE = NOW()
|
||||
WHERE OBJID = #{OBJID}
|
||||
</update>
|
||||
|
||||
</mapper>
|
||||
@@ -4825,6 +4825,19 @@ ORDER BY V.PATH2
|
||||
WHERE OBJID = #{SALES_REQUEST_PART_OBJID}
|
||||
</update>
|
||||
|
||||
<!-- MBOM_DETAIL 단가 초기화 (재수주 시 기존 단가 삭제) -->
|
||||
<!-- 소재단가(UNIT_PRICE), 가공단가(PROCESSING_UNIT_PRICE)를 0으로 초기화 -->
|
||||
<update id="resetMbomDetailPrice" parameterType="map">
|
||||
UPDATE MBOM_DETAIL SET
|
||||
UNIT_PRICE = 0,
|
||||
PROCESSING_UNIT_PRICE = 0,
|
||||
TOTAL_PRICE = 0,
|
||||
PROCESSING_TOTAL_PRICE = 0,
|
||||
GRAND_TOTAL_PRICE = 0,
|
||||
EDIT_DATE = NOW()
|
||||
WHERE MBOM_HEADER_OBJID = #{MBOM_HEADER_OBJID}
|
||||
</update>
|
||||
|
||||
<!-- 구매리스트에서 견적요청서 생성 대상 조회 - M-BOM 기반 (MBOM_DETAIL에서 조회) -->
|
||||
<!-- 공급업체/가공업체별로 견적요청서 생성 가능 여부 플래그 포함 -->
|
||||
<select id="getPurchaseListForQuotationFromMBom" parameterType="map" resultType="map">
|
||||
|
||||
@@ -1542,6 +1542,51 @@ public class SalesMngController {
|
||||
return createProposal(request, paramMap);
|
||||
}
|
||||
|
||||
/**
|
||||
* M-BOM 단가 초기화 (재수주 시 기존 단가 삭제)
|
||||
* - 소재단가(UNIT_PRICE), 가공단가(PROCESSING_UNIT_PRICE)를 0으로 초기화
|
||||
* @param request
|
||||
* @param paramMap MBOM_HEADER_OBJID, SALES_REQUEST_MASTER_OBJID
|
||||
* @return
|
||||
*/
|
||||
@ResponseBody
|
||||
@RequestMapping("/salesMng/resetMbomPrice.do")
|
||||
public Map resetMbomPrice(HttpServletRequest request, @RequestParam Map<String, Object> paramMap){
|
||||
Map resultMap = new HashMap();
|
||||
SqlSession sqlSession = null;
|
||||
|
||||
try {
|
||||
String mbomHeaderObjid = CommonUtils.checkNull(paramMap.get("MBOM_HEADER_OBJID"));
|
||||
|
||||
if("".equals(mbomHeaderObjid)) {
|
||||
resultMap.put("resultFlag", "F");
|
||||
resultMap.put("message", "M-BOM 정보가 없습니다.");
|
||||
return resultMap;
|
||||
}
|
||||
|
||||
sqlSession = SqlMapConfig.getInstance().getSqlSession(false);
|
||||
|
||||
// MBOM_DETAIL 단가 초기화
|
||||
int updateCount = sqlSession.update("salesMng.resetMbomDetailPrice", paramMap);
|
||||
|
||||
sqlSession.commit();
|
||||
|
||||
resultMap.put("resultFlag", "S");
|
||||
resultMap.put("message", "단가가 초기화되었습니다.\n(총 " + updateCount + "건 초기화)");
|
||||
resultMap.put("updateCount", updateCount);
|
||||
|
||||
} catch (Exception e) {
|
||||
if(sqlSession != null) sqlSession.rollback();
|
||||
e.printStackTrace();
|
||||
resultMap.put("resultFlag", "F");
|
||||
resultMap.put("message", "단가 초기화 중 오류가 발생했습니다: " + e.getMessage());
|
||||
} finally {
|
||||
if(sqlSession != null) sqlSession.close();
|
||||
}
|
||||
|
||||
return resultMap;
|
||||
}
|
||||
|
||||
/**
|
||||
* 품의서 저장 (마스터 + 품목)
|
||||
* @param request
|
||||
|
||||
@@ -3556,54 +3556,56 @@ SELECT (CASE WHEN GROUPING(cc.code_id) = 1 THEN '소계' ELSE cc.CODE_ID END) AS
|
||||
</select>
|
||||
|
||||
<select id="getContractDashBoard" parameterType="map" resultType="map">
|
||||
/* contractMgmt.getContractDashBoard - 수주현황 대시보드 (ORDER_TOTAL_AMOUNT 기준) */
|
||||
WITH WITH_BASE_DATA AS (
|
||||
SELECT *
|
||||
, CAST(DATE_TRUNC('MONTH', TO_DATE(CD.YEAR_MONTH2, 'YYYY-MM')) AS DATE) AS MONTH_FIRST_DAY
|
||||
, (DATE_TRUNC('MONTH', TO_DATE(CD.YEAR_MONTH2, 'YYYY-MM')) + INTERVAL '1 MONTH - 1 DAY')::DATE AS MONTH_LAST_DAY
|
||||
, (DATE_TRUNC('MONTH', TO_DATE(CD.YEAR_MONTH2, 'YYYY-MM')) + INTERVAL '1 MONTH - 1 DAY')::DATE AS MONTH_LAST_DAY
|
||||
FROM
|
||||
(
|
||||
(SELECT
|
||||
OBJID
|
||||
, CODE_ID
|
||||
, CODE_NAME
|
||||
FROM COMM_CODE CC
|
||||
WHERE PARENT_CODE_ID = '0000001'
|
||||
|
||||
) CD
|
||||
INNER JOIN (SELECT #{Year}|| RIGHT('0' || LINE_VALUE, 2) YEAR_MONTH
|
||||
,#{Year}|| '-'||RIGHT('0' || LINE_VALUE, 2) YEAR_MONTH2
|
||||
,LINE_VALUE MM
|
||||
FROM GENERATE_SERIES(1,12) AS TBL(LINE_VALUE)) YEAR_MONTH
|
||||
ON 1=1
|
||||
) CD
|
||||
LEFT OUTER JOIN(
|
||||
SELECT
|
||||
CM.PRODUCT
|
||||
,TO_CHAR(TO_DATE(CM.CONTRACT_DATE,'YYYY-MM-DD'),'YYYYMM') AS CONTRACT_YEAR_MONTH
|
||||
,SUM(COALESCE(CM.CONTRACT_PRICE::FLOAT,0)) CONTRACT_COST
|
||||
,COUNT(1) CONTRACT_CNT
|
||||
,SUM(CM.QTY) QTY
|
||||
FROM
|
||||
(SELECT CM.PRODUCT
|
||||
,CM.CONTRACT_DATE
|
||||
,(CASE WHEN NVL(CM.CONTRACT_PRICE, '0') != '0' THEN NVL(CM.CONTRACT_PRICE, '0')
|
||||
WHEN CONTRACT_CURRENCY = '0001566' AND NVL(CM.CONTRACT_PRICE_CURRENCY, '0') != '0' THEN NVL(CM.CONTRACT_PRICE_CURRENCY, '0')
|
||||
ELSE NVL(CM.CONTRACT_PRICE, '0')
|
||||
END) CONTRACT_PRICE
|
||||
,( SELECT COUNT(1) QTY
|
||||
FROM PROJECT_MGMT AS PM
|
||||
RIGHT JOIN RELEASE_MGMT AS RM
|
||||
ON PM.OBJID = RM.PARENT_OBJID
|
||||
WHERE CM.OBJID = PM.CONTRACT_OBJID
|
||||
) QTY
|
||||
FROM CONTRACT_MGMT CM
|
||||
LEFT OUTER JOIN SUPPLY_MNG SM
|
||||
(
|
||||
(SELECT
|
||||
OBJID
|
||||
, CODE_ID
|
||||
, CODE_NAME
|
||||
FROM COMM_CODE CC
|
||||
WHERE PARENT_CODE_ID = '0000001'
|
||||
) CD
|
||||
INNER JOIN (
|
||||
SELECT #{Year}|| RIGHT('0' || LINE_VALUE, 2) YEAR_MONTH
|
||||
,#{Year}|| '-'||RIGHT('0' || LINE_VALUE, 2) YEAR_MONTH2
|
||||
,LINE_VALUE MM
|
||||
FROM GENERATE_SERIES(1,12) AS TBL(LINE_VALUE)
|
||||
) YEAR_MONTH
|
||||
ON 1=1
|
||||
) CD
|
||||
LEFT OUTER JOIN(
|
||||
SELECT
|
||||
CM.PRODUCT
|
||||
,TO_CHAR(TO_DATE(CM.ORDER_DATE,'YYYY-MM-DD'),'YYYYMM') AS CONTRACT_YEAR_MONTH
|
||||
,SUM(COALESCE(NULLIF(CM.ORDER_SUPPLY_PRICE,'')::NUMERIC, 0)) ORDER_SUPPLY_PRICE
|
||||
,SUM(COALESCE(NULLIF(CM.ORDER_VAT,'')::NUMERIC, 0)) ORDER_VAT
|
||||
,SUM(COALESCE(NULLIF(CM.ORDER_TOTAL_AMOUNT,'')::NUMERIC, 0)) ORDER_TOTAL_AMOUNT
|
||||
,COUNT(1) CONTRACT_CNT
|
||||
,SUM(CM.QTY) QTY
|
||||
FROM
|
||||
(SELECT CM.PRODUCT
|
||||
,CM.ORDER_DATE
|
||||
,CM.ORDER_SUPPLY_PRICE
|
||||
,CM.ORDER_VAT
|
||||
,CM.ORDER_TOTAL_AMOUNT
|
||||
,( SELECT COUNT(1) QTY
|
||||
FROM PROJECT_MGMT AS PM
|
||||
RIGHT JOIN RELEASE_MGMT AS RM
|
||||
ON PM.OBJID = RM.PARENT_OBJID
|
||||
WHERE CM.OBJID = PM.CONTRACT_OBJID
|
||||
) QTY
|
||||
FROM CONTRACT_MGMT CM
|
||||
LEFT OUTER JOIN SUPPLY_MNG SM
|
||||
ON CM.CUSTOMER_OBJID = SM.OBJID::VARCHAR
|
||||
WHERE CM.CONTRACT_DATE IS NOT NULL
|
||||
AND CM.CONTRACT_RESULT = '0000964'
|
||||
WHERE CM.ORDER_DATE IS NOT NULL
|
||||
AND CM.CONTRACT_RESULT = '0000964'
|
||||
<if test="Year !=null and Year != '' ">
|
||||
<!-- AND TO_CHAR(CM.REGDATE,'YYYY') = #{Year} -->
|
||||
AND TO_CHAR(TO_DATE(CONTRACT_DATE,'YYYY-MM-DD'),'YYYY') = #{Year}
|
||||
AND TO_CHAR(TO_DATE(ORDER_DATE,'YYYY-MM-DD'),'YYYY') = #{Year}
|
||||
</if>
|
||||
<if test="customer_objid !=null and customer_objid != '' ">
|
||||
AND UPPER(CUSTOMER_OBJID) LIKE UPPER('%${customer_objid}%')
|
||||
@@ -3612,58 +3614,36 @@ SELECT (CASE WHEN GROUPING(cc.code_id) = 1 THEN '소계' ELSE cc.CODE_ID END) AS
|
||||
AND PRODUCER_CD = #{producer_cd}
|
||||
</if>
|
||||
<if test="category_cd !=null and category_cd != '' ">
|
||||
AND CATEGORY_CD = #{category_cd}
|
||||
</if>
|
||||
<if test="product !=null and product != '' ">
|
||||
AND CATEGORY_CD = #{category_cd}
|
||||
</if>
|
||||
<if test="product !=null and product != '' ">
|
||||
AND CM.PRODUCT = #{product}
|
||||
</if>
|
||||
) CM
|
||||
GROUP BY CM.PRODUCT
|
||||
,TO_CHAR(TO_DATE(CM.CONTRACT_DATE,'YYYY-MM-DD'),'YYYYMM')
|
||||
) CT
|
||||
ON CD.CODE_ID = CT.PRODUCT
|
||||
AND CD.YEAR_MONTH = CT.CONTRACT_YEAR_MONTH
|
||||
<!-- 240822 아래쿼리는 문제 있어서 위 서브쿼리로 이동(QTY 출고수량)
|
||||
LEFT OUTER JOIN(
|
||||
SELECT RM1.PRODUCT
|
||||
,TO_CHAR(TO_DATE(RM1.RELEASE_DATE,'YYYY-MM-DD'),'MM') AS RELEASE_YEAR_MONTH
|
||||
,1 AS QTY
|
||||
FROM CONTRACT_MGMT CM1,(SELECT RM.*,PM.CONTRACT_OBJID FROM PROJECT_MGMT AS PM RIGHT JOIN RELEASE_MGMT AS RM
|
||||
ON PM.OBJID = RM.PARENT_OBJID) AS RM1
|
||||
WHERE CM1.OBJID = RM1.CONTRACT_OBJID
|
||||
<if test="Year !=null and Year != '' ">
|
||||
AND TO_CHAR(TO_DATE(RM1.RELEASE_DATE,'YYYY-MM-DD'),'YYYY') = #{Year}
|
||||
</if>
|
||||
<if test="category_cd !=null and category_cd != '' ">
|
||||
AND CATEGORY_CD = #{category_cd}
|
||||
</if>
|
||||
<if test="customer_objid !=null and customer_objid != '' ">
|
||||
AND CUSTOMER_OBJID = #{customer_objid}
|
||||
</if>
|
||||
<if test="product !=null and product != '' ">
|
||||
AND RM1.PRODUCT = #{product}
|
||||
</if>
|
||||
) AS RM
|
||||
ON CD.CODE_ID = RM.PRODUCT
|
||||
AND CD.YEAR_MONTH = RM.RELEASE_YEAR_MONTH
|
||||
-->
|
||||
GROUP BY CM.PRODUCT
|
||||
,TO_CHAR(TO_DATE(CM.ORDER_DATE,'YYYY-MM-DD'),'YYYYMM')
|
||||
) CT
|
||||
ON CD.CODE_ID = CT.PRODUCT
|
||||
AND CD.YEAR_MONTH = CT.CONTRACT_YEAR_MONTH
|
||||
)
|
||||
SELECT
|
||||
'1' ORDER_NO
|
||||
,YEAR_MONTH
|
||||
,MM
|
||||
,SUM(COALESCE(CONTRACT_CNT, 0)) CONTRACT_CNT_YEAR
|
||||
,SUM(COALESCE(CONTRACT_COST, 0)) CONTRACT_COST_YEAR_ORG
|
||||
,SUM(COALESCE(CONTRACT_COST, 0))/100000000 CONTRACT_COST_YEAR
|
||||
,SUM(COALESCE(QTY, 0)) RELEASE_CNT_YEAR
|
||||
<foreach collection="moldKindCdList" item="obj">
|
||||
,SUM(CASE WHEN CODE_ID = '${obj.CODE}' THEN CONTRACT_CNT ELSE 0 END) CONTRACT_CNT_MONTH_${obj.CODE}
|
||||
,SUM(CASE WHEN CODE_ID = '${obj.CODE}' THEN CONTRACT_COST ELSE 0 END) CONTRACT_COST_MONTH_${obj.CODE}
|
||||
'1' ORDER_NO
|
||||
,YEAR_MONTH
|
||||
,MM
|
||||
,SUM(COALESCE(CONTRACT_CNT, 0)) CONTRACT_CNT_YEAR
|
||||
,SUM(COALESCE(ORDER_SUPPLY_PRICE, 0)) ORDER_SUPPLY_PRICE_YEAR
|
||||
,SUM(COALESCE(ORDER_VAT, 0)) ORDER_VAT_YEAR
|
||||
,SUM(COALESCE(ORDER_TOTAL_AMOUNT, 0)) CONTRACT_COST_YEAR_ORG
|
||||
,SUM(COALESCE(ORDER_TOTAL_AMOUNT, 0))/100000000 CONTRACT_COST_YEAR
|
||||
,SUM(COALESCE(QTY, 0)) RELEASE_CNT_YEAR
|
||||
<foreach collection="moldKindCdList" item="obj">
|
||||
,SUM(CASE WHEN CODE_ID = '${obj.CODE}' THEN CONTRACT_CNT ELSE 0 END) CONTRACT_CNT_MONTH_${obj.CODE}
|
||||
,SUM(CASE WHEN CODE_ID = '${obj.CODE}' THEN ORDER_TOTAL_AMOUNT ELSE 0 END) CONTRACT_COST_MONTH_${obj.CODE}
|
||||
</foreach>
|
||||
,#{Year} AS TARGET_YEAR
|
||||
FROM WITH_BASE_DATA
|
||||
GROUP BY ROLLUP (
|
||||
(YEAR_MONTH, MM) )
|
||||
(YEAR_MONTH, MM) )
|
||||
ORDER BY YEAR_MONTH
|
||||
</select>
|
||||
|
||||
@@ -3682,23 +3662,20 @@ SELECT year, annual, five
|
||||
|
||||
<!-- 영업목표 -->
|
||||
<select id="getYearGoalInfo" parameterType="map" resultType="map">
|
||||
/* contractMgmt.getYearGoalInfo - 연간 목표 대비 실적 (ORDER_TOTAL_AMOUNT 기준) */
|
||||
WITH W_CM AS (
|
||||
SELECT
|
||||
AREA_CD,
|
||||
<!-- (SUM(COALESCE( -->
|
||||
(CASE WHEN NVL(CM.CONTRACT_PRICE, '0') != '0' THEN NVL(CM.CONTRACT_PRICE, '0')
|
||||
WHEN CONTRACT_CURRENCY = '0001566' AND NVL(CM.CONTRACT_PRICE_CURRENCY, '0') != '0' THEN NVL(CM.CONTRACT_PRICE_CURRENCY, '0')
|
||||
ELSE NVL(CM.CONTRACT_PRICE, '0')
|
||||
END) CONTRACT_PRICE
|
||||
<!-- ::FLOAT, 0))) CONTRACT_PRICE -->
|
||||
FROM CONTRACT_MGMT CM
|
||||
WHERE CM.CONTRACT_RESULT = '0000964'
|
||||
AND TO_CHAR(TO_DATE(CONTRACT_DATE, 'YYYY-MM-DD'), 'YYYY') = #{Year}
|
||||
)
|
||||
SELECT
|
||||
AREA_CD,
|
||||
COALESCE(NULLIF(CM.ORDER_TOTAL_AMOUNT, '')::NUMERIC, 0) AS ORDER_TOTAL_AMOUNT
|
||||
FROM CONTRACT_MGMT CM
|
||||
WHERE (CM.CONTRACT_RESULT = '0000964' or CM.CONTRACT_RESULT = '0000968')
|
||||
AND CM.ORDER_DATE IS NOT NULL
|
||||
AND TO_CHAR(TO_DATE(ORDER_DATE, 'YYYY-MM-DD'), 'YYYY') = #{Year}
|
||||
)
|
||||
SELECT
|
||||
*
|
||||
,CASE WHEN CONTRACT_CNT_YEAR_ALL IS NULL OR CONTRACT_CNT_YEAR_ALL = 0 THEN NULL
|
||||
ELSE CONTRACT_CNT_YEAR / CONTRACT_CNT_YEAR_ALL * 100 END AS CONTRACT_CNT_YEAR_RATE
|
||||
ELSE CONTRACT_CNT_YEAR / CONTRACT_CNT_YEAR_ALL * 100 END AS CONTRACT_CNT_YEAR_RATE
|
||||
FROM(
|
||||
SELECT
|
||||
OBJID YEAR_GOAL_OBJID
|
||||
@@ -3706,23 +3683,19 @@ SELECT year, annual, five
|
||||
,PRICE::integer
|
||||
,WRITER
|
||||
,REGDATE
|
||||
,(SELECT count(1) FROM CONTRACT_MGMT WHERE TO_CHAR(TO_DATE(CONTRACT_DATE,'YYYY-MM-DD'),'YYYY') = #{Year} ) AS CONTRACT_CNT_YEAR_ALL
|
||||
,(SELECT count(1) FROM CONTRACT_MGMT WHERE ORDER_DATE IS NOT NULL AND TO_CHAR(TO_DATE(ORDER_DATE,'YYYY-MM-DD'),'YYYY') = #{Year} ) AS CONTRACT_CNT_YEAR_ALL
|
||||
,(SELECT count(1) FROM W_CM CM ) AS CONTRACT_CNT_YEAR
|
||||
,(SELECT count(1) FROM W_CM CM WHERE AREA_CD = '0001220' ) AS CONTRACT_CNT_YEAR_IN
|
||||
,(SELECT count(1) FROM W_CM CM WHERE AREA_CD = '0001221' ) AS CONTRACT_CNT_YEAR_OUT
|
||||
,coalesce((SELECT (SUM(coalesce(NVL(CM.CONTRACT_PRICE, '0')::FLOAT, 0)))/100000000 FROM W_CM CM )::integer,0) AS CONTRACT_COST_YEAR
|
||||
<!-- ,(SELECT ROUND(SUM(CASE WHEN CONTRACT_PRICE IS NULL OR CONTRACT_PRICE = '' THEN '0' ELSE CONTRACT_PRICE::INTEGER END) / 100000000.0, 1) FROM CONTRACT_MGMT WHERE TO_CHAR(CONTRACT_DATE::DATE, 'YYYY') = #{Year}) AS CONTRACT_COST_YEAR-->
|
||||
,COALESCE((SELECT SUM(ORDER_TOTAL_AMOUNT)/100000000 FROM W_CM CM)::integer, 0) AS CONTRACT_COST_YEAR
|
||||
,CASE
|
||||
WHEN PRICE IS NULL OR PRICE::integer = 0
|
||||
THEN 0
|
||||
ELSE coalesce((((select (SUM(coalesce(NVL(CM.CONTRACT_PRICE, '0')::FLOAT, 0)))/100000000 FROM W_CM CM) / price::integer) * 100),0)
|
||||
END AS GOAL_RATE
|
||||
WHEN PRICE IS NULL OR PRICE::integer = 0
|
||||
THEN 0
|
||||
ELSE COALESCE((((SELECT SUM(ORDER_TOTAL_AMOUNT)/100000000 FROM W_CM CM) / price::integer) * 100), 0)
|
||||
END AS GOAL_RATE
|
||||
FROM
|
||||
PMS_PJT_YEAR_GOAL FMB
|
||||
WHERE 1=1
|
||||
<!--
|
||||
AND OBJID = #{OBJID}
|
||||
-->
|
||||
<if test="YEAR_GOAL_OBJID != null and !''.equals(YEAR_GOAL_OBJID)">
|
||||
AND OBJID = #{YEAR_GOAL_OBJID}
|
||||
</if>
|
||||
@@ -3772,10 +3745,10 @@ SELECT year, annual, five
|
||||
<select id="getContractCNTBySupply" parameterType="map" resultType="map">
|
||||
SELECT
|
||||
ASM.OBJID
|
||||
,ASM.SUPPLY_NAME
|
||||
,ASM.CLIENT_NM
|
||||
,S1.*
|
||||
FROM
|
||||
SUPPLY_MNG ASM
|
||||
CLIENT_MNG ASM
|
||||
,(
|
||||
SELECT
|
||||
CM.CUSTOMER_OBJID
|
||||
@@ -3784,12 +3757,12 @@ FROM
|
||||
FROM
|
||||
CONTRACT_MGMT CM
|
||||
WHERE CM.CONTRACT_RESULT = '0000964'
|
||||
AND TO_CHAR(TO_DATE(CONTRACT_DATE,'YYYY-MM-DD'),'YYYY') = #{Year}
|
||||
AND TO_CHAR(TO_DATE(ORDER_DATE,'YYYY-MM-DD'),'YYYY') = #{Year}
|
||||
GROUP BY CM.CUSTOMER_OBJID
|
||||
) AS S1
|
||||
WHERE 1=1
|
||||
AND ASM.OBJID::VARCHAR = S1.CUSTOMER_OBJID
|
||||
ORDER BY ASM.SUPPLY_NAME
|
||||
AND 'C_' || ASM.OBJID::VARCHAR = S1.CUSTOMER_OBJID
|
||||
ORDER BY ASM.CLIENT_NM
|
||||
</select>
|
||||
|
||||
|
||||
|
||||
@@ -662,6 +662,23 @@ public class QualityService extends BaseService{
|
||||
return resultMap;
|
||||
}
|
||||
|
||||
/**
|
||||
* 수입검사 진행 팝업용 상세 정보 조회 (INCOMING_INSPECTION_DETAIL.OBJID 기준)
|
||||
*/
|
||||
public Map getIncomingInspectionProgressDetailInfo(Map paramMap){
|
||||
Map resultMap = new HashMap();
|
||||
SqlSession sqlSession = null;
|
||||
try{
|
||||
sqlSession = SqlMapConfig.getInstance().getSqlSession();
|
||||
resultMap = sqlSession.selectOne("quality.getIncomingInspectionProgressDetailInfo", paramMap);
|
||||
}catch(Exception e){
|
||||
e.printStackTrace();
|
||||
}finally{
|
||||
sqlSession.close();
|
||||
}
|
||||
return resultMap;
|
||||
}
|
||||
|
||||
/**
|
||||
* 수입검사 요청 저장 (검사여부, 요청일, 요청자만 저장)
|
||||
*/
|
||||
@@ -1243,6 +1260,7 @@ public class QualityService extends BaseService{
|
||||
sqlParamMap.put("DEFECT_TYPE", "");
|
||||
sqlParamMap.put("DEFECT_CAUSE", "");
|
||||
sqlParamMap.put("RESPONSIBLE_DEPT", "");
|
||||
sqlParamMap.put("WORKER", "");
|
||||
sqlParamMap.put("PROCESS_STATUS", "");
|
||||
sqlParamMap.put("INSPECTION_DATE", "");
|
||||
sqlParamMap.put("INSPECTOR", "");
|
||||
@@ -1324,6 +1342,7 @@ public class QualityService extends BaseService{
|
||||
sqlParamMap.put("DEFECT_TYPE", CommonUtils.checkNull(item.get("DEFECT_TYPE")));
|
||||
sqlParamMap.put("DEFECT_CAUSE", CommonUtils.checkNull(item.get("DEFECT_CAUSE")));
|
||||
sqlParamMap.put("RESPONSIBLE_DEPT", CommonUtils.checkNull(item.get("RESPONSIBLE_DEPT")));
|
||||
sqlParamMap.put("WORKER", CommonUtils.checkNull(item.get("WORKER")));
|
||||
sqlParamMap.put("PROCESS_STATUS", CommonUtils.checkNull(item.get("PROCESS_STATUS")));
|
||||
sqlParamMap.put("INSPECTION_DATE", CommonUtils.checkNull(item.get("INSPECTION_DATE")));
|
||||
sqlParamMap.put("INSPECTOR", CommonUtils.checkNull(item.get("INSPECTOR")));
|
||||
@@ -1924,4 +1943,96 @@ public class QualityService extends BaseService{
|
||||
return resultMap;
|
||||
}
|
||||
|
||||
/**
|
||||
* 수입검사 불량상세 저장 (단일 품목의 불량상세만) - 신규
|
||||
*/
|
||||
public Map saveIncomingInspectionDefect(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 inspectionDetailObjid = CommonUtils.checkNull(paramMap.get("INSPECTION_DETAIL_OBJID"));
|
||||
|
||||
// 불량상세 데이터 저장
|
||||
String defectListJson = CommonUtils.checkNull(paramMap.get("defectListJson"));
|
||||
|
||||
if(!defectListJson.isEmpty() && !inspectionDetailObjid.isEmpty()) {
|
||||
List<Map<String, Object>> defectList = JsonUtil.JsonToList(defectListJson);
|
||||
|
||||
// 불량수량 합계 계산용
|
||||
int totalDefectQty = 0;
|
||||
|
||||
for(Map defect : defectList) {
|
||||
String gridStatus = CommonUtils.checkNull(defect.get("GRID_STATUS"));
|
||||
|
||||
// 불량수량 정수 변환 (소수점 제거)
|
||||
String defectQtyStr = CommonUtils.checkNull(defect.get("DEFECT_QTY"));
|
||||
int defectQtyInt = 0;
|
||||
if(!defectQtyStr.isEmpty()) {
|
||||
defectQtyInt = (int) Double.parseDouble(defectQtyStr);
|
||||
}
|
||||
|
||||
// 검사수량 정수 변환
|
||||
String inspectionQtyStr = CommonUtils.checkNull(defect.get("INSPECTION_QTY"));
|
||||
int inspectionQtyInt = 0;
|
||||
if(!inspectionQtyStr.isEmpty()) {
|
||||
inspectionQtyInt = (int) Double.parseDouble(inspectionQtyStr);
|
||||
}
|
||||
|
||||
Map sqlParamMap = new HashMap();
|
||||
sqlParamMap.put("OBJID", CommonUtils.checkNull(defect.get("OBJID")));
|
||||
sqlParamMap.put("INSPECTION_DETAIL_OBJID", inspectionDetailObjid);
|
||||
sqlParamMap.put("INSPECTION_TYPE", CommonUtils.checkNull(defect.get("INSPECTION_TYPE")));
|
||||
sqlParamMap.put("INSPECTION_DATE", CommonUtils.checkNull(defect.get("INSPECTION_DATE")));
|
||||
sqlParamMap.put("INSPECTOR_ID", CommonUtils.checkNull(defect.get("INSPECTOR_ID")));
|
||||
sqlParamMap.put("DEFECT_TYPE", CommonUtils.checkNull(defect.get("DEFECT_TYPE")));
|
||||
sqlParamMap.put("DEFECT_REASON", CommonUtils.checkNull(defect.get("DEFECT_REASON")));
|
||||
sqlParamMap.put("ACTION_STATUS", CommonUtils.checkNull(defect.get("ACTION_STATUS")));
|
||||
sqlParamMap.put("ACTION_RESULT", CommonUtils.checkNull(defect.get("ACTION_RESULT")));
|
||||
sqlParamMap.put("INSPECTION_QTY", String.valueOf(inspectionQtyInt));
|
||||
sqlParamMap.put("DEFECT_QTY", String.valueOf(defectQtyInt));
|
||||
sqlParamMap.put("INSPECTION_RESULT", CommonUtils.checkNull(defect.get("INSPECTION_RESULT")));
|
||||
sqlParamMap.put("REMARK", CommonUtils.checkNull(defect.get("REMARK")));
|
||||
sqlParamMap.put("WRITER", writer);
|
||||
|
||||
if("D".equals(gridStatus)) {
|
||||
// 삭제
|
||||
sqlSession.delete("quality.deleteIncomingInspectionDefect", sqlParamMap);
|
||||
} else {
|
||||
// 신규/수정
|
||||
sqlSession.insert("quality.saveIncomingInspectionDefect", sqlParamMap);
|
||||
// 불량수량 합계 (삭제 제외)
|
||||
totalDefectQty += defectQtyInt;
|
||||
}
|
||||
}
|
||||
|
||||
// INCOMING_INSPECTION_DETAIL의 DEFECT_QTY 업데이트 (불량수량 합계)
|
||||
Map updateParam = new HashMap();
|
||||
updateParam.put("OBJID", inspectionDetailObjid);
|
||||
updateParam.put("DEFECT_QTY", String.valueOf(totalDefectQty));
|
||||
sqlSession.update("quality.updateIncomingInspectionDetailDefectQty", updateParam);
|
||||
}
|
||||
|
||||
sqlSession.commit();
|
||||
resultMap.put("result", true);
|
||||
resultMap.put("msg", "저장되었습니다.");
|
||||
|
||||
}catch(Exception e){
|
||||
if(sqlSession != null) sqlSession.rollback();
|
||||
resultMap.put("result", false);
|
||||
resultMap.put("msg", e.getMessage());
|
||||
e.printStackTrace();
|
||||
}finally{
|
||||
if(sqlSession != null) sqlSession.close();
|
||||
}
|
||||
|
||||
return resultMap;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user