e-bom, 상태변경 등 경고 표시, 상태변경 권한 적용

This commit is contained in:
2025-11-04 13:35:39 +09:00
parent 4dbc6eb887
commit b719d20ca2
3 changed files with 225 additions and 36 deletions

View File

@@ -2,7 +2,27 @@
<%@ page import="com.pms.common.utils.*"%> <%@ page import="com.pms.common.utils.*"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<%@ page import="java.util.*" %> <%@ page import="java.util.*" %>
<%@include file= "/init.jsp" %> <%@include file= "/init.jsp" %>
<%
// 권한 체크: AUTHORITY_MASTER의 OBJID가 41000668인 그룹에 속한 사용자인지 확인
boolean hasStatusChangeAuth = false;
try {
org.apache.ibatis.session.SqlSession sqlSession = com.pms.common.SqlMapConfig.getInstance().getSqlSession();
java.util.Map<String, Object> authParam = new java.util.HashMap<String, Object>();
authParam.put("userId", connectUserId);
authParam.put("masterObjid", "41000668");
Integer authCount = (Integer)sqlSession.selectOne("common.checkUserAuthority", authParam);
hasStatusChangeAuth = (authCount != null && authCount > 0);
sqlSession.close();
} catch(Exception e) {
e.printStackTrace();
}
%>
<script>
var hasStatusChangeAuth = <%=hasStatusChangeAuth%>;
</script>
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head> <head>
@@ -165,8 +185,8 @@ var columns = [
{headerHozAlign : 'center', hozAlign : 'center', width : '150', title : 'E-BOM', field : 'BOM_CNT', {headerHozAlign : 'center', hozAlign : 'center', width : '150', title : 'E-BOM', field : 'BOM_CNT',
formatter: fnc_subInfoValueFormatter, formatter: fnc_subInfoValueFormatter,
cellClick:function(e, cell){ cellClick:function(e, cell){
var objId = fnc_checkNull(cell.getData().OBJID); var objId = fnc_checkNull(cell.getData().OBJID);
//var bomReportObjId = fnc_checkNull(cell.getData().BOM_REPORMECHANICAL_TYPET_OBJID); // 바로 팝업 열기 (팝업창 내부에서 경고 처리)
fn_openSetStructure(objId); fn_openSetStructure(objId);
} }
}, },
@@ -498,6 +518,16 @@ function fn_openChangeDesignNote(objId){
* 상태변경 팝업 * 상태변경 팝업
*/ */
function fn_openStatusChange() { function fn_openStatusChange() {
// 권한 체크
if(!hasStatusChangeAuth) {
Swal.fire({
title: '권한 없음',
text: '상태변경 권한이 없습니다.',
icon: 'error'
});
return false;
}
var selectedStructure = _tabulGrid.getSelectedData(); var selectedStructure = _tabulGrid.getSelectedData();
if(selectedStructure.length == 0){ if(selectedStructure.length == 0){
@@ -512,8 +542,33 @@ function fn_openStatusChange() {
var selectedData = selectedStructure[0]; var selectedData = selectedStructure[0];
var objId = fnc_checkNull(selectedData.OBJID); var objId = fnc_checkNull(selectedData.OBJID);
var partNo = fnc_checkNull(selectedData.PART_NO);
var partName = fnc_checkNull(selectedData.PART_NAME);
var currentStatus = fnc_checkNull(selectedData.STATUS);
window.open("/partMng/structureStatusChangePopup.do?objId=" + objId, "structureStatusChangePopup", "width=500, height=300, resizable=no"); // 현재 상태 표시용 텍스트 (Y/N만 존재)
var statusText = (currentStatus === 'Y') ? 'Y' : 'N';
// 상태변경 확인 경고
Swal.fire({
title: 'E-BOM 상태 변경',
html: 'E-BOM의 상태변경을 진행하시겠습니까?<br><br>' +
'<strong>품번:</strong> ' + partNo + '<br>' +
'<strong>품명:</strong> ' + partName + '<br>' +
'<strong>현재 상태:</strong> ' + statusText + '<br><br>' +
'상태를 변경하시겠습니까?',
icon: 'warning',
showCancelButton: true,
confirmButtonColor: '#3085d6',
cancelButtonColor: '#d33',
confirmButtonText: '상태변경',
cancelButtonText: '취소',
reverseButtons: false
}).then(result => {
if (result.isConfirmed) {
window.open("/partMng/structureStatusChangePopup.do?objId=" + objId, "structureStatusChangePopup", "width=500, height=300, resizable=no");
}
});
} }
function saveexcelpop() { function saveexcelpop() {
@@ -552,21 +607,40 @@ function saveexcelpop() {
BOM_VERSION = fnc_checkNull(selectedStructure[i].REVISION); BOM_VERSION = fnc_checkNull(selectedStructure[i].REVISION);
} }
// hiddenForm을 사용하여 POST 방식으로 팝업 열기 (한글 인코딩 문제 해결) // CSV 업로드 확인 경고
var hiddenForm = document.hiddenForm; Swal.fire({
var url = "/partMng/openBomReportExcelImportPopUp.do"; title: 'E-BOM CSV 업로드',
var target = "openBomReportExcelImportPopUp"; html: 'CSV 파일을 통해 E-BOM 데이터를 새로 등록합니다.<br><br>' +
'<strong>품번:</strong> ' + BOM_PART_NO + '<br>' +
hiddenForm.PRODUCT_CD.value = BOM_PRODUCT_CD; '<strong>품명:</strong> ' + BOM_PART_NAME + '<br>' +
hiddenForm.BOM_PART_NAME.value = BOM_PART_NAME; '<strong>버전:</strong> ' + BOM_VERSION + '<br><br>' +
hiddenForm.BOM_PART_NO.value = BOM_PART_NO; '계속하시겠습니까?',
hiddenForm.BOM_REPORT_OBJID.value = BOM_REPORT_OBJID; icon: 'question',
hiddenForm.BOM_VERSION.value = BOM_VERSION; showCancelButton: true,
confirmButtonColor: '#3085d6',
window.open('', target, 'width=1920, height=860, menubars=no, scrollbars=yes, resizable=yes'); cancelButtonColor: '#d33',
hiddenForm.action = url; confirmButtonText: '계속',
hiddenForm.target = target; cancelButtonText: '취소',
hiddenForm.submit(); reverseButtons: false
}).then(result => {
if (result.isConfirmed) {
// hiddenForm을 사용하여 POST 방식으로 팝업 열기 (한글 인코딩 문제 해결)
var hiddenForm = document.hiddenForm;
var url = "/partMng/openBomReportExcelImportPopUp.do";
var target = "openBomReportExcelImportPopUp";
hiddenForm.PRODUCT_CD.value = BOM_PRODUCT_CD;
hiddenForm.BOM_PART_NAME.value = BOM_PART_NAME;
hiddenForm.BOM_PART_NO.value = BOM_PART_NO;
hiddenForm.BOM_REPORT_OBJID.value = BOM_REPORT_OBJID;
hiddenForm.BOM_VERSION.value = BOM_VERSION;
window.open('', target, 'width=1920, height=860, menubars=no, scrollbars=yes, resizable=yes');
hiddenForm.action = url;
hiddenForm.target = target;
hiddenForm.submit();
}
});
} }
}else{ }else{
if($("#customer_cd").val()==""){ if($("#customer_cd").val()==""){

View File

@@ -6,8 +6,34 @@
<html> <html>
<head> <head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title><%=Constants.SYSTEM_NAME%></title> <title><%=Constants.SYSTEM_NAME%></title>
<script> <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(){ $(function(){
$('.select2').select2(); $('.select2').select2();
@@ -19,7 +45,7 @@ $(function(){
var rightSelectedRows = rightFrame.getSelectedRows ? rightFrame.getSelectedRows() : []; var rightSelectedRows = rightFrame.getSelectedRows ? rightFrame.getSelectedRows() : [];
if(rightSelectedRows.length === 0) { if(rightSelectedRows.length === 0) {
alert("선택된 파트가 없습니다."); showConfirm("선택된 파트가 없습니다.");
return false; return false;
} }
@@ -50,7 +76,11 @@ $(function(){
var rowData = rightSelectedRows[i].getData(); var rowData = rightSelectedRows[i].getData();
var rightPartNo = rowData.PART_NO; var rightPartNo = rowData.PART_NO;
if(rightPartNo == leftPartNo){ if(rightPartNo == leftPartNo){
alert("오류 Part No : ["+rightPartNo+"]\n같은 Part No끼리 연결할 수 없습니다."); showConfirm({
title: '연결 불가',
html: '오류 Part No : <strong>['+rightPartNo+']</strong><br>같은 Part No끼리 연결할 수 없습니다.',
icon: 'error'
});
isSamePart = true; isSamePart = true;
break; break;
} }
@@ -73,7 +103,11 @@ $(function(){
if("unique" == rightPartType){ if("unique" == rightPartType){
for(var j = 0 ; j < deniedPartArr.length ; j++){ for(var j = 0 ; j < deniedPartArr.length ; j++){
if(rightPartNo == deniedPartArr[j]){ if(rightPartNo == deniedPartArr[j]){
alert("오류 Part No : "+"["+rightPartNo+"]\n이미 상위에 등록된 Part No 입니다."); showConfirm({
title: '연결 불가',
html: '오류 Part No : <strong>['+rightPartNo+']</strong><br>이미 상위에 등록된 Part No 입니다.',
icon: 'error'
});
isDeniedPart = true; isDeniedPart = true;
break; break;
} }
@@ -94,12 +128,31 @@ $(function(){
if(fnc_checkNull(leftPartNo) == ""){ if(fnc_checkNull(leftPartNo) == ""){
var flag = fn_checkSameTopPartNo(rightCheckedArr); var flag = fn_checkSameTopPartNo(rightCheckedArr);
if(flag == "true"){ if(flag == "true"){
alert("1레벨에 같은 Part No가 중복 등록될 수 없습니다."); showConfirm({
title: '중복 등록 불가',
text: '1레벨에 같은 Part No가 중복 등록될 수 없습니다.',
icon: 'error'
});
return; return;
} }
} }
fn_relatePartInfo(leftPartChildObjId, rightCheckedArr, leftPartNoQty, leftPartLastObjId, leftPartChildObjId, leftQtyParObjId); // 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 연결 //end of Part 연결
@@ -121,12 +174,12 @@ $(function(){
var leftPartNoList = $("input[name=checkedPartNo]:checked", parent.frames['leftFrame'].document); var leftPartNoList = $("input[name=checkedPartNo]:checked", parent.frames['leftFrame'].document);
if(leftPartNoList.length === 0){ if(leftPartNoList.length === 0){
alert("선택된 파트가 없습니다."); showConfirm("선택된 파트가 없습니다.");
return false; return false;
} }
if(leftPartNoList.length > 1){ if(leftPartNoList.length > 1){
alert("한번에 1개의 파트만 변경가능합니다."); showConfirm("한번에 1개의 파트만 변경가능합니다.");
return false; return false;
} }
@@ -141,12 +194,12 @@ $(function(){
var rightSelectedRows = rightFrame.getSelectedRows ? rightFrame.getSelectedRows() : []; var rightSelectedRows = rightFrame.getSelectedRows ? rightFrame.getSelectedRows() : [];
if(rightSelectedRows.length === 0){ if(rightSelectedRows.length === 0){
alert("선택된 파트가 없습니다."); showConfirm("선택된 파트가 없습니다.");
return false; return false;
} }
if(rightSelectedRows.length > 1){ if(rightSelectedRows.length > 1){
alert("한번에 1개의 파트만 변경가능합니다."); showConfirm("한번에 1개의 파트만 변경가능합니다.");
return false; return false;
} }
@@ -155,7 +208,24 @@ $(function(){
var rightPartRev = rightRowData.REVISION || ""; var rightPartRev = rightRowData.REVISION || "";
var rightObjId = rightRowData.OBJID; var rightObjId = rightRowData.OBJID;
fn_changeRelatePartInfo(leftPartBomQtyObjId, rightObjId, leftPartChildObjId, leftParentPartObjid, leftPartChildObjId, leftPartObjid, rightPartNo, rightPartRev); // 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);
}
});
}); });
}); });
@@ -187,11 +257,29 @@ function fn_checkSameTopPartNo(rightCheckedArr){
//구조 연결 해제 //구조 연결 해제
function fn_deletePartRelateInfo(leftObjId, leftPartLastObjId, leftParentPartNo, leftParentObjId, leftPartChildObjId){ function fn_deletePartRelateInfo(leftObjId, leftPartLastObjId, leftParentPartNo, leftParentObjId, leftPartChildObjId){
if(leftObjId == null){ if(leftObjId == null){
alert("연결 해제할 Part를 선택해 주시기 바랍니다.") showConfirm("연결 해제할 Part를 선택해 주시기 바랍니다.");
return; return;
} }
if(!confirm("연결 해제하시겠습니까?")) 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({ $.ajax({
url: "/partMng/deleteStatusPartRelateInfo.do", url: "/partMng/deleteStatusPartRelateInfo.do",
@@ -222,16 +310,35 @@ function fn_deletePartRelateInfo(leftObjId, leftPartLastObjId, leftParentPartNo,
//구조 연결 //구조 연결
function fn_relatePartInfo(leftObjId, rightCheckedArr, leftPartNoQty, leftPartLastObjId, leftPartChildObjId, leftQtyParObjId){ function fn_relatePartInfo(leftObjId, rightCheckedArr, leftPartNoQty, leftPartLastObjId, leftPartChildObjId, leftQtyParObjId){
if(typeof rightCheckedArr != "undefined" && rightCheckedArr.length == 0){ if(typeof rightCheckedArr != "undefined" && rightCheckedArr.length == 0){
alert("선택된 Part가 없습니다."); showConfirm("선택된 Part가 없습니다.");
return; return;
} }
if(leftObjId == null){ if(leftObjId == null){
if(!confirm("좌측에 선택된 Part정보가 없습니다.\n이대로 연결하면 1레벨로 등록됩니다.\n진행하시겠습니까?")){ showConfirm({
return; 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({ $.ajax({
url: "/partMng/relatePartInfo.do", url: "/partMng/relatePartInfo.do",
method: 'post', method: 'post',

View File

@@ -3197,4 +3197,12 @@ SELECT option_objid::VARCHAR AS CODE
ORDER BY CODE_ID ORDER BY CODE_ID
</select> </select>
<!-- 사용자 권한 체크 -->
<select id="checkUserAuthority" parameterType="map" resultType="int">
SELECT COUNT(*)
FROM AUTHORITY_SUB_USER
WHERE USER_ID = #{userId}
AND MASTER_OBJID::varchar = #{masterObjid}
</select>
</mapper> </mapper>