438 lines
15 KiB
Plaintext
438 lines
15 KiB
Plaintext
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
|
|
<%@ page import="com.pms.common.utils.*"%>
|
|
<%@ page import="java.util.*" %>
|
|
<%@include file= "/init.jsp" %>
|
|
<!DOCTYPE html>
|
|
<html>
|
|
<head>
|
|
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
|
<title><%=Constants.SYSTEM_NAME%></title>
|
|
|
|
<script>
|
|
// confirm/alert 헬퍼 함수
|
|
function showConfirm(options) {
|
|
if(typeof options === 'string') {
|
|
alert(options);
|
|
return Promise.resolve({isConfirmed: true});
|
|
}
|
|
|
|
var message = '';
|
|
if(options.title) message += options.title + '\n\n';
|
|
if(options.html) {
|
|
// HTML 태그 제거
|
|
message += options.html.replace(/<br\s*\/?>/gi, '\n').replace(/<[^>]+>/g, '');
|
|
} else if(options.text) {
|
|
message += options.text;
|
|
}
|
|
|
|
if(options.showCancelButton !== false && (options.icon === 'warning' || options.icon === 'question')) {
|
|
var result = confirm(message);
|
|
return Promise.resolve({isConfirmed: result});
|
|
} else {
|
|
alert(message);
|
|
return Promise.resolve({isConfirmed: true});
|
|
}
|
|
}
|
|
|
|
$(function(){
|
|
|
|
$('.select2').select2();
|
|
|
|
//Part 연결
|
|
$("#moveLeft").click(function(){
|
|
// Tabulator에서 선택된 오른쪽 행 데이터 가져오기
|
|
var rightFrame = parent.frames['rightFrame'];
|
|
var rightSelectedRows = rightFrame.getSelectedRows ? rightFrame.getSelectedRows() : [];
|
|
|
|
if(rightSelectedRows.length === 0) {
|
|
showConfirm("선택된 파트가 없습니다.");
|
|
return false;
|
|
}
|
|
|
|
// 왼쪽 프레임에서 선택된 행 데이터 가져오기
|
|
var leftPartNoObj = $("input[name=checkedPartNo]:checked", parent.frames['leftFrame'].document);
|
|
|
|
var leftPartChildObjId = null;
|
|
var leftPartNo = null;
|
|
var leftPartNoQty = null;
|
|
var leftParentObjId = null;
|
|
var leftPartLastObjId = null;
|
|
var leftQtyParObjId = null;
|
|
var leftParentParts = "";
|
|
|
|
if(leftPartNoObj.length > 0) {
|
|
leftPartChildObjId = leftPartNoObj.val();
|
|
leftPartNo = leftPartNoObj.attr("data-PART_NO");
|
|
leftPartNoQty = leftPartNoObj.attr("data-PART_NO_QTY");
|
|
leftParentObjId = leftPartNoObj.attr("data-OBJID");
|
|
leftPartLastObjId = leftPartNoObj.attr("data-LAST_PART_OBJID");
|
|
leftQtyParObjId = leftPartNoObj.attr("data-PART_OBJID");
|
|
leftParentParts = leftPartNoObj.attr("data-PARENT_PARTS") || "";
|
|
}
|
|
|
|
// 같은 Part를 연결한건지 체크
|
|
var isSamePart = false;
|
|
for(var i = 0; i < rightSelectedRows.length; i++){
|
|
var rowData = rightSelectedRows[i].getData();
|
|
var rightPartNo = rowData.PART_NO;
|
|
if(rightPartNo == leftPartNo){
|
|
showConfirm({
|
|
title: '연결 불가',
|
|
html: '오류 Part No : <strong>['+rightPartNo+']</strong><br>같은 Part No끼리 연결할 수 없습니다.',
|
|
icon: 'error'
|
|
});
|
|
isSamePart = true;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if(isSamePart) return false;
|
|
|
|
// 연결하려는 part가 상위에 있는 part인지 확인
|
|
var deniedPartArr = [];
|
|
if(fnc_checkNull(leftParentParts).indexOf(",") > 0){
|
|
deniedPartArr = leftParentParts.split(",");
|
|
}
|
|
var isDeniedPart = false;
|
|
|
|
for(var i = 0; i < rightSelectedRows.length; i++){
|
|
var rowData = rightSelectedRows[i].getData();
|
|
var rightPartNo = rowData.PART_NO;
|
|
var rightPartType = rowData.PART_TYPE;
|
|
|
|
if("unique" == rightPartType){
|
|
for(var j = 0 ; j < deniedPartArr.length ; j++){
|
|
if(rightPartNo == deniedPartArr[j]){
|
|
showConfirm({
|
|
title: '연결 불가',
|
|
html: '오류 Part No : <strong>['+rightPartNo+']</strong><br>이미 상위에 등록된 Part No 입니다.',
|
|
icon: 'error'
|
|
});
|
|
isDeniedPart = true;
|
|
break;
|
|
}
|
|
}
|
|
if(isDeniedPart) break;
|
|
}
|
|
}
|
|
|
|
if(isDeniedPart) return;
|
|
|
|
// 선택된 파트의 OBJID 배열 생성
|
|
var rightCheckedArr = [];
|
|
for(var i = 0; i < rightSelectedRows.length; i++){
|
|
var rowData = rightSelectedRows[i].getData();
|
|
rightCheckedArr.push(rowData.OBJID);
|
|
}
|
|
|
|
if(fnc_checkNull(leftPartNo) == ""){
|
|
var flag = fn_checkSameTopPartNo(rightCheckedArr);
|
|
if(flag == "true"){
|
|
showConfirm({
|
|
title: '중복 등록 불가',
|
|
text: '1레벨에 같은 Part No가 중복 등록될 수 없습니다.',
|
|
icon: 'error'
|
|
});
|
|
return;
|
|
}
|
|
}
|
|
|
|
// Part 연결 확인
|
|
showConfirm({
|
|
title: 'Part 연결',
|
|
text: '선택한 Part를 연결하시겠습니까?',
|
|
icon: 'question',
|
|
showCancelButton: true,
|
|
confirmButtonColor: '#3085d6',
|
|
cancelButtonColor: '#d33',
|
|
confirmButtonText: '연결',
|
|
cancelButtonText: '취소',
|
|
reverseButtons: false
|
|
}).then(result => {
|
|
if (result.isConfirmed) {
|
|
fn_relatePartInfo(leftPartChildObjId, rightCheckedArr, leftPartNoQty, leftPartLastObjId, leftPartChildObjId, leftQtyParObjId);
|
|
}
|
|
});
|
|
});
|
|
//end of Part 연결
|
|
|
|
//연결된 part 삭제
|
|
$("#moveRight").click(function(){
|
|
var leftPartNoObj = $("input[name=checkedPartNo]:checked", parent.frames['leftFrame'].document);
|
|
var leftPartChildObjId = leftPartNoObj.val();
|
|
var leftPartNo = $("input[name=checkedPartNo]:checked", parent.frames['leftFrame'].document).attr("data-PART_NO");
|
|
var leftParentPartNo = $("input[name=checkedPartNo]:checked", parent.frames['leftFrame'].document).attr("data-PARENT_PART_NO");
|
|
var leftParentObjId = $("input[name=checkedPartNo]:checked", parent.frames['leftFrame'].document).attr("data-PARENT_OBJID");
|
|
var leftPartLastObjId = $("input[name=checkedPartNo]:checked", parent.frames['leftFrame'].document).attr("data-LAST_PART_OBJID");
|
|
|
|
fn_deletePartRelateInfo(leftPartNoObj.val(), leftPartLastObjId, leftParentPartNo, leftParentObjId, leftPartChildObjId);
|
|
});
|
|
//end of 연결된 part 삭제
|
|
|
|
//연결된 part 변경
|
|
$("#moveChange").click(function(){
|
|
var leftPartNoList = $("input[name=checkedPartNo]:checked", parent.frames['leftFrame'].document);
|
|
|
|
if(leftPartNoList.length === 0){
|
|
showConfirm("선택된 파트가 없습니다.");
|
|
return false;
|
|
}
|
|
|
|
if(leftPartNoList.length > 1){
|
|
showConfirm("한번에 1개의 파트만 변경가능합니다.");
|
|
return false;
|
|
}
|
|
|
|
var leftPartNo = leftPartNoList.attr("data-PART_NO");
|
|
var leftPartObjid = leftPartNoList.attr("data-BOM_LAST_PART_OBJID");
|
|
var leftParentPartObjid = leftPartNoList.attr("data-PARENT_PART_NO");
|
|
var leftPartChildObjId = leftPartNoList.val();
|
|
var leftPartBomQtyObjId = leftPartNoList.attr("data-OBJID");
|
|
|
|
// Tabulator에서 선택된 오른쪽 행 데이터 가져오기
|
|
var rightFrame = parent.frames['rightFrame'];
|
|
var rightSelectedRows = rightFrame.getSelectedRows ? rightFrame.getSelectedRows() : [];
|
|
|
|
if(rightSelectedRows.length === 0){
|
|
showConfirm("선택된 파트가 없습니다.");
|
|
return false;
|
|
}
|
|
|
|
if(rightSelectedRows.length > 1){
|
|
showConfirm("한번에 1개의 파트만 변경가능합니다.");
|
|
return false;
|
|
}
|
|
|
|
var rightRowData = rightSelectedRows[0].getData();
|
|
var rightPartNo = rightRowData.PART_NO;
|
|
var rightPartRev = rightRowData.REVISION || "";
|
|
var rightObjId = rightRowData.OBJID;
|
|
|
|
// Part 변경 확인
|
|
showConfirm({
|
|
title: 'Part 변경',
|
|
html: '선택한 Part를 변경하시겠습니까?<br><br>' +
|
|
'<strong>기존:</strong> ' + leftPartNo + '<br>' +
|
|
'<strong>변경:</strong> ' + rightPartNo,
|
|
icon: 'warning',
|
|
showCancelButton: true,
|
|
confirmButtonColor: '#3085d6',
|
|
cancelButtonColor: '#d33',
|
|
confirmButtonText: '변경',
|
|
cancelButtonText: '취소',
|
|
reverseButtons: false
|
|
}).then(result => {
|
|
if (result.isConfirmed) {
|
|
fn_changeRelatePartInfo(leftPartBomQtyObjId, rightObjId, leftPartChildObjId, leftParentPartObjid, leftPartChildObjId, leftPartObjid, rightPartNo, rightPartRev);
|
|
}
|
|
});
|
|
});
|
|
|
|
});
|
|
|
|
//1레벨에 같은 Part No가 등록되어있는지 확인.
|
|
function fn_checkSameTopPartNo(rightCheckedArr){
|
|
var result = false;
|
|
|
|
$.ajax({
|
|
url: "/partMng/checkSameTopPartNo.do",
|
|
method: 'post',
|
|
traditional: true, // 배열 파라미터 처리를 위한 옵션
|
|
data: {"OBJID":$("#objId").val(), "rightCheckedArr[]":rightCheckedArr}, // [] 추가
|
|
dataType: 'json',
|
|
async:false,
|
|
success: function(data) {
|
|
result = data.result;
|
|
}
|
|
, error: function(jqxhr, status, error){
|
|
/* alert(jqxhr.statusText + ", " + status + ", " + error);
|
|
alert(jqxhr.status);
|
|
alert(jqxhr.responseText); */
|
|
}
|
|
});
|
|
return result;
|
|
}
|
|
//end of 1레벨에 같은 Part No가 등록되어있는지 확인.
|
|
|
|
//구조 연결 해제
|
|
function fn_deletePartRelateInfo(leftObjId, leftPartLastObjId, leftParentPartNo, leftParentObjId, leftPartChildObjId){
|
|
if(leftObjId == null){
|
|
showConfirm("연결 해제할 Part를 선택해 주시기 바랍니다.");
|
|
return;
|
|
}
|
|
|
|
showConfirm({
|
|
title: 'Part 연결 해제',
|
|
text: '선택한 Part의 연결을 해제하시겠습니까?',
|
|
icon: 'warning',
|
|
showCancelButton: true,
|
|
confirmButtonColor: '#3085d6',
|
|
cancelButtonColor: '#d33',
|
|
confirmButtonText: '연결 해제',
|
|
cancelButtonText: '취소',
|
|
reverseButtons: false
|
|
}).then(result => {
|
|
if (!result.isConfirmed) return;
|
|
|
|
fn_executeDeletePartRelateInfo(leftObjId, leftPartLastObjId, leftParentPartNo, leftParentObjId, leftPartChildObjId);
|
|
});
|
|
}
|
|
|
|
// 실제 Part 연결 해제 실행 함수
|
|
function fn_executeDeletePartRelateInfo(leftObjId, leftPartLastObjId, leftParentPartNo, leftParentObjId, leftPartChildObjId){
|
|
|
|
$.ajax({
|
|
url: "/partMng/deleteStatusPartRelateInfo.do",
|
|
method: 'post',
|
|
data: {"OBJID":$("#objId").val(), "leftObjId":leftObjId, "partObjId":leftPartLastObjId, "BOM_REPORT_OBJID":$("#objId").val()
|
|
, "leftPartChildObjId":leftPartChildObjId, "leftParentPartNo":leftParentPartNo, "leftParentObjId":leftParentObjId},
|
|
dataType: 'json',
|
|
success: function(data) {
|
|
if(data.result){
|
|
$(parent.frames['leftFrame'].document.location.reload());
|
|
//$(parent.frames['rightFrame'].fn_searchPart());
|
|
|
|
// 부모 창(E-BOM 목록) 새로고침
|
|
if(window.opener && window.opener.fn_search) {
|
|
window.opener.fn_search();
|
|
}
|
|
}
|
|
}
|
|
, error: function(jqxhr, status, error){
|
|
/* alert(jqxhr.statusText + ", " + status + ", " + error);
|
|
alert(jqxhr.status);
|
|
alert(jqxhr.responseText); */
|
|
}
|
|
});
|
|
}
|
|
//end of 구조 연결 해제
|
|
|
|
//구조 연결
|
|
function fn_relatePartInfo(leftObjId, rightCheckedArr, leftPartNoQty, leftPartLastObjId, leftPartChildObjId, leftQtyParObjId){
|
|
if(typeof rightCheckedArr != "undefined" && rightCheckedArr.length == 0){
|
|
showConfirm("선택된 Part가 없습니다.");
|
|
return;
|
|
}
|
|
|
|
if(leftObjId == null){
|
|
showConfirm({
|
|
title: '1레벨 등록 확인',
|
|
html: '좌측에 선택된 Part정보가 없습니다.<br>이대로 연결하면 1레벨로 등록됩니다.<br><br>진행하시겠습니까?',
|
|
icon: 'warning',
|
|
showCancelButton: true,
|
|
confirmButtonColor: '#3085d6',
|
|
cancelButtonColor: '#d33',
|
|
confirmButtonText: '진행',
|
|
cancelButtonText: '취소',
|
|
reverseButtons: false
|
|
}).then(result => {
|
|
if (result.isConfirmed) {
|
|
fn_executeRelatePartInfo(leftObjId, rightCheckedArr, leftPartNoQty, leftPartLastObjId, leftPartChildObjId, leftQtyParObjId);
|
|
}
|
|
});
|
|
return;
|
|
}
|
|
|
|
fn_executeRelatePartInfo(leftObjId, rightCheckedArr, leftPartNoQty, leftPartLastObjId, leftPartChildObjId, leftQtyParObjId);
|
|
}
|
|
|
|
// 실제 Part 연결 실행 함수
|
|
function fn_executeRelatePartInfo(leftObjId, rightCheckedArr, leftPartNoQty, leftPartLastObjId, leftPartChildObjId, leftQtyParObjId){
|
|
|
|
$.ajax({
|
|
url: "/partMng/relatePartInfo.do",
|
|
method: 'post',
|
|
traditional: true, // 배열 파라미터 처리를 위한 옵션
|
|
data: {
|
|
"leftObjId": leftObjId,
|
|
"leftPartNoQty": leftPartNoQty,
|
|
"OBJID": $("#objId").val(),
|
|
"rightCheckedArr[]": rightCheckedArr, // Spring의 @RequestParam(value = "rightCheckedArr[]") 형식
|
|
"partObjId": leftPartLastObjId,
|
|
"BOM_REPORT_OBJID": $("#objId").val(),
|
|
"leftPartChildObjId": leftPartChildObjId,
|
|
"leftQtyParObjId": leftQtyParObjId
|
|
},
|
|
dataType: 'json',
|
|
async:false,
|
|
success: function(data) {
|
|
if(data.result){
|
|
// 왼쪽 프레임 새로고침
|
|
$(parent.frames['leftFrame'].document.location.reload());
|
|
|
|
// 오른쪽 프레임 선택 해제 (Tabulator)
|
|
var rightFrame = parent.frames['rightFrame'];
|
|
if(rightFrame.clearSelection) {
|
|
rightFrame.clearSelection();
|
|
}
|
|
|
|
// 부모 창(E-BOM 목록) 새로고침
|
|
if(window.opener && window.opener.fn_search) {
|
|
window.opener.fn_search();
|
|
}
|
|
}
|
|
}
|
|
, error: function(jqxhr, status, error){
|
|
/* alert(jqxhr.statusText + ", " + status + ", " + error);
|
|
alert(jqxhr.status);
|
|
alert(jqxhr.responseText); */
|
|
}
|
|
});
|
|
}
|
|
//end of 구조 연결
|
|
|
|
//구조 연결 변경
|
|
function fn_changeRelatePartInfo(objId,rightObjId,leftObjId,leftPartNoQty,leftPartChildObjId,leftPartObjid,rightPartNo,rightPartRev){
|
|
$.ajax({
|
|
url: "/partMng/changeRelatePartInfo.do",
|
|
method: 'post',
|
|
data: {"rightObjId":rightObjId, "OBJID":objId,"BOM_REPORT_OBJID":$("#objId").val(),
|
|
"leftObjId":leftObjId,"leftPartNoQty":leftPartNoQty,"leftPartChildObjId":leftPartChildObjId,
|
|
"leftPartObjid":leftPartObjid, "rightPartNo":rightPartNo, "rightPartRev":rightPartRev},
|
|
dataType: 'json',
|
|
async:false,
|
|
success: function(data) {
|
|
if(data.result){
|
|
// 왼쪽 프레임 새로고침
|
|
$(parent.frames['leftFrame'].document.location.reload());
|
|
|
|
// 오른쪽 프레임 검색 다시 수행
|
|
var rightFrame = parent.frames['rightFrame'];
|
|
if(rightFrame.fn_searchPart) {
|
|
rightFrame.fn_searchPart();
|
|
}
|
|
|
|
// 오른쪽 프레임 선택 해제 (Tabulator)
|
|
if(rightFrame.clearSelection) {
|
|
rightFrame.clearSelection();
|
|
}
|
|
|
|
// 부모 창(E-BOM 목록) 새로고침
|
|
if(window.opener && window.opener.fn_search) {
|
|
window.opener.fn_search();
|
|
}
|
|
}
|
|
}
|
|
, error: function(jqxhr, status, error){
|
|
/* alert(jqxhr.statusText + ", " + status + ", " + error);
|
|
alert(jqxhr.status);
|
|
alert(jqxhr.responseText); */
|
|
}
|
|
});
|
|
}
|
|
</script>
|
|
</head>
|
|
<body class="backcolor" style="border:border:1px solid #ccc;">
|
|
<form name="form1" id="form1" action="" method="post">
|
|
<input type="hidden" name="objId" id="objId" value="${param.objId}" />
|
|
|
|
<div id="structurePopupBtnW" style="padding-top:20px;">
|
|
<input type="button" value="변경" class="plm_btns" id="moveChange">
|
|
<br>
|
|
<input type="button" value="<<" class="plm_btns" id="moveLeft" style="margin-left:0px;">
|
|
<br>
|
|
<input type="button" value=">>" class="plm_btns" id="moveRight" style="margin-left:0px;">
|
|
</div>
|
|
</form>
|
|
</body>
|
|
</html> |