E-BOM 확인/수정 품목추가로직수정 #16
BIN
.playwright-mcp/structure_popup_main.png
Normal file
BIN
.playwright-mcp/structure_popup_main.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 426 KiB |
@@ -14,70 +14,82 @@ $(function(){
|
||||
|
||||
//Part 연결
|
||||
$("#moveLeft").click(function(){
|
||||
var rightPartArr = $(".partChks:checked", parent.frames['rightFrame'].document);
|
||||
// Tabulator에서 선택된 오른쪽 행 데이터 가져오기
|
||||
var rightFrame = parent.frames['rightFrame'];
|
||||
var rightSelectedRows = rightFrame.getSelectedRows ? rightFrame.getSelectedRows() : [];
|
||||
|
||||
// Tabulator에서 선택된 행 데이터 가져오기
|
||||
var leftPartNoObj = $("input[name=checkedPartNo]:checked", parent.frames['leftFrame'].document);
|
||||
|
||||
if(leftPartNoObj.length === 0){
|
||||
// Tabulator 방식: 라디오가 선택되지 않았을 수 있으므로 체크
|
||||
var leftPartChildObjId = null;
|
||||
var leftPartNo = null;
|
||||
var leftPartNoQty = null;
|
||||
var leftParentObjId = null;
|
||||
var leftPartLastObjId = null;
|
||||
var leftQtyParObjId = null;
|
||||
} else {
|
||||
var leftPartChildObjId = leftPartNoObj.val();
|
||||
var leftPartNo = leftPartNoObj.attr("data-PART_NO");
|
||||
var leftPartNoQty = leftPartNoObj.attr("data-PART_NO_QTY");
|
||||
var leftParentObjId = leftPartNoObj.attr("data-OBJID");
|
||||
var leftPartLastObjId = leftPartNoObj.attr("data-LAST_PART_OBJID");
|
||||
var leftQtyParObjId = leftPartNoObj.attr("data-PART_OBJID");
|
||||
if(rightSelectedRows.length === 0) {
|
||||
alert("선택된 파트가 없습니다.");
|
||||
return false;
|
||||
}
|
||||
|
||||
//같은 Part를 연결한건지 체크
|
||||
// 왼쪽 프레임에서 선택된 행 데이터 가져오기
|
||||
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;
|
||||
$(rightPartArr).each(function(i){
|
||||
var rightPartNo = $(this).val();
|
||||
for(var i = 0; i < rightSelectedRows.length; i++){
|
||||
var rowData = rightSelectedRows[i].getData();
|
||||
var rightPartNo = rowData.PART_NO;
|
||||
if(rightPartNo == leftPartNo){
|
||||
alert("오류 Part No : ["+rightPartNo+"]\n같은 Part No끼리 연결할 수 없습니다.");
|
||||
isSamePart = true;
|
||||
break;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
if(isSamePart) return false;
|
||||
|
||||
//연결하려는 part가 상위에 있는 part인지 확인.
|
||||
var leftParentParts = $("input[name=checkedPartNo]:checked", parent.frames['leftFrame'].document).attr("data-PARENT_PARTS");
|
||||
// 연결하려는 part가 상위에 있는 part인지 확인
|
||||
var deniedPartArr = [];
|
||||
if(fnc_checkNull(leftParentParts).indexOf(",") > 0){
|
||||
deniedPartArr = leftParentParts.split(",");
|
||||
}
|
||||
var isDeniedPart = false;
|
||||
|
||||
$(rightPartArr).each(function(i){
|
||||
var rightPartNo = $(this).val();
|
||||
var rightPartType = $(this).attr("data-PART_TYPE");
|
||||
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 i = 0 ; i < deniedPartArr.length ; i++){
|
||||
if(rightPartNo == deniedPartArr[i]){
|
||||
for(var j = 0 ; j < deniedPartArr.length ; j++){
|
||||
if(rightPartNo == deniedPartArr[j]){
|
||||
alert("오류 Part No : "+"["+rightPartNo+"]\n이미 상위에 등록된 Part No 입니다.");
|
||||
isDeniedPart = true;
|
||||
return;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(isDeniedPart) break;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
if(isDeniedPart) return;
|
||||
//연결하려는 part가 상위에 있는 part인지 확인. end
|
||||
|
||||
// 선택된 파트의 OBJID 배열 생성
|
||||
var rightCheckedArr = [];
|
||||
$(rightPartArr).each(function(i){
|
||||
rightCheckedArr.push($(this).val());
|
||||
});
|
||||
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);
|
||||
@@ -87,7 +99,7 @@ $(function(){
|
||||
}
|
||||
}
|
||||
|
||||
fn_relatePartInfo(leftPartNoObj.val(), rightCheckedArr, leftPartNoQty, leftPartLastObjId, leftPartChildObjId, leftQtyParObjId);
|
||||
fn_relatePartInfo(leftPartChildObjId, rightCheckedArr, leftPartNoQty, leftPartLastObjId, leftPartChildObjId, leftQtyParObjId);
|
||||
});
|
||||
//end of Part 연결
|
||||
|
||||
@@ -107,36 +119,43 @@ $(function(){
|
||||
//연결된 part 변경
|
||||
$("#moveChange").click(function(){
|
||||
var leftPartNoList = $("input[name=checkedPartNo]:checked", parent.frames['leftFrame'].document);
|
||||
var leftPartNo = $("input[name=checkedPartNo]:checked", parent.frames['leftFrame'].document).attr("data-PART_NO");
|
||||
var leftPartObjid = $("input[name=checkedPartNo]:checked", parent.frames['leftFrame'].document).attr("data-BOM_LAST_PART_OBJID");
|
||||
var leftParentPartObjid = $("input[name=checkedPartNo]:checked", parent.frames['leftFrame'].document).attr("data-PARENT_PART_NO");
|
||||
var rightPartNoList = $(".partChks:checked", parent.frames['rightFrame'].document);
|
||||
var rightPartNo = $(".partChks:checked", parent.frames['rightFrame'].document).attr("data-PART_NO");
|
||||
var rightPartRev = $(".partChks:checked", parent.frames['rightFrame'].document).attr("data-PART_REV");
|
||||
|
||||
var leftPartChildObjId = leftPartNoList.val();
|
||||
//var leftPartNoQty = $("input[name=checkedPartNo]:checked", parent.frames['leftFrame'].document).attr("data-PART_NO_QTY");
|
||||
|
||||
//alert("leftPartObjid::"+leftPartObjid);
|
||||
var leftPartBomQtyObjId = $("input[name=checkedPartNo]:checked", parent.frames['leftFrame'].document).attr("data-OBJID");
|
||||
|
||||
if(0 == leftPartNoList.length){
|
||||
if(leftPartNoList.length === 0){
|
||||
alert("선택된 파트가 없습니다.");
|
||||
return false;
|
||||
}else if(1 == leftPartNoList.length){
|
||||
if(0 == rightPartNoList.length){
|
||||
alert("선택된 파트가 없습니다.");
|
||||
return false;
|
||||
}else if(1 == rightPartNoList.length){
|
||||
fn_changeRelatePartInfo(leftPartBomQtyObjId,rightPartNoList.val(),leftPartNoList.val(),leftParentPartObjid,leftPartChildObjId,leftPartObjid,rightPartNo,rightPartRev);
|
||||
}else{
|
||||
alert("한번에 1개의 파트만 변경가능합니다.");
|
||||
return false;
|
||||
}
|
||||
}else{
|
||||
}
|
||||
|
||||
if(leftPartNoList.length > 1){
|
||||
alert("한번에 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){
|
||||
alert("선택된 파트가 없습니다.");
|
||||
return false;
|
||||
}
|
||||
|
||||
if(rightSelectedRows.length > 1){
|
||||
alert("한번에 1개의 파트만 변경가능합니다.");
|
||||
return false;
|
||||
}
|
||||
|
||||
var rightRowData = rightSelectedRows[0].getData();
|
||||
var rightPartNo = rightRowData.PART_NO;
|
||||
var rightPartRev = rightRowData.REVISION || "";
|
||||
var rightObjId = rightRowData.OBJID;
|
||||
|
||||
fn_changeRelatePartInfo(leftPartBomQtyObjId, rightObjId, leftPartChildObjId, leftParentPartObjid, leftPartChildObjId, leftPartObjid, rightPartNo, rightPartRev);
|
||||
});
|
||||
|
||||
});
|
||||
@@ -148,7 +167,8 @@ function fn_checkSameTopPartNo(rightCheckedArr){
|
||||
$.ajax({
|
||||
url: "/partMng/checkSameTopPartNo.do",
|
||||
method: 'post',
|
||||
data: {"OBJID":$("#objId").val(), "rightCheckedArr":rightCheckedArr},
|
||||
traditional: true, // 배열 파라미터 처리를 위한 옵션
|
||||
data: {"OBJID":$("#objId").val(), "rightCheckedArr[]":rightCheckedArr}, // [] 추가
|
||||
dataType: 'json',
|
||||
async:false,
|
||||
success: function(data) {
|
||||
@@ -210,26 +230,29 @@ function fn_relatePartInfo(leftObjId, rightCheckedArr, leftPartNoQty, leftPartLa
|
||||
$.ajax({
|
||||
url: "/partMng/relatePartInfo.do",
|
||||
method: 'post',
|
||||
data: {"leftObjId":leftObjId,"leftPartNoQty":leftPartNoQty, "OBJID":$("#objId").val(), "rightCheckedArr":rightCheckedArr, "partObjId":leftPartLastObjId, "BOM_REPORT_OBJID":$("#objId").val(),
|
||||
"leftPartChildObjId":leftPartChildObjId, "leftQtyParObjId":leftQtyParObjId},
|
||||
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());
|
||||
//$(parent.frames['rightFrame'].fn_searchPart());
|
||||
|
||||
$(".partChks", parent.frames['rightFrame'].document).prop("checked", false);
|
||||
|
||||
//좌측에 선택된 정보를 유지하기위해 0.1초간의 딜레이(새로고침시간)을 주고 10번 기존에 선택된 정보를 선택하도록 한다. 10번사이 선택이 된다면 loop break;
|
||||
// for(var i = 0 ; i < 10 ; i++){
|
||||
// var leftPartChkLength = $("input[name='checkecPartNo']:checked", parent.frames['leftFrame'].document).length;
|
||||
// setTimeout(function(){
|
||||
// $("input[name='checkedPartNo']:radio[value='"+leftPartNo+"']", parent.frames['leftFrame'].document).prop("checked", true);
|
||||
// }, 100);
|
||||
// if(leftPartChkLength > 0) break;
|
||||
// }
|
||||
//end for
|
||||
// 오른쪽 프레임 선택 해제 (Tabulator)
|
||||
var rightFrame = parent.frames['rightFrame'];
|
||||
if(rightFrame.clearSelection) {
|
||||
rightFrame.clearSelection();
|
||||
}
|
||||
}
|
||||
}
|
||||
, error: function(jqxhr, status, error){
|
||||
@@ -253,11 +276,19 @@ function fn_changeRelatePartInfo(objId,rightObjId,leftObjId,leftPartNoQty,leftPa
|
||||
async:false,
|
||||
success: function(data) {
|
||||
if(data.result){
|
||||
// 왼쪽 프레임 새로고침
|
||||
$(parent.frames['leftFrame'].document.location.reload());
|
||||
|
||||
$(parent.frames['rightFrame'].fn_searchPart());
|
||||
// 오른쪽 프레임 검색 다시 수행
|
||||
var rightFrame = parent.frames['rightFrame'];
|
||||
if(rightFrame.fn_searchPart) {
|
||||
rightFrame.fn_searchPart();
|
||||
}
|
||||
|
||||
$(".partChks", parent.frames['rightFrame'].document).prop("checked", false);
|
||||
// 오른쪽 프레임 선택 해제 (Tabulator)
|
||||
if(rightFrame.clearSelection) {
|
||||
rightFrame.clearSelection();
|
||||
}
|
||||
}
|
||||
}
|
||||
, error: function(jqxhr, status, error){
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||||
<title><%=Constants.SYSTEM_NAME%></title>
|
||||
<link href="/css/tabulator/tabulator.min.css" rel="stylesheet">
|
||||
<script type="text/javascript" src="/js/tabulator.min.js"></script>
|
||||
<script type="text/javascript" src="/js/tabulator/tabulator.min.js"></script>
|
||||
<style>
|
||||
::-webkit-scrollbar {
|
||||
width: 10px;
|
||||
@@ -297,7 +297,9 @@ function fn_initGrid() {
|
||||
},
|
||||
ajaxURL: "/partMng/getStructureTreeJson.do",
|
||||
ajaxParams: {
|
||||
objId: "${info.OBJID}"
|
||||
objId: "${info.OBJID}",
|
||||
bomReportObjId: "${info.OBJID}",
|
||||
search_type: "working" // adding 상태 포함해서 조회
|
||||
},
|
||||
ajaxResponse: function(url, params, response) {
|
||||
// 서버 응답 데이터 가공
|
||||
|
||||
@@ -102,6 +102,11 @@ $(function(){
|
||||
|
||||
// Tabulator 초기화
|
||||
fn_initRightGrid();
|
||||
|
||||
// 초기 로드 시 자동으로 파트 데이터 조회
|
||||
if($("#bomReportObjId").val()) {
|
||||
fn_searchPart();
|
||||
}
|
||||
});
|
||||
|
||||
var _rightGrid;
|
||||
@@ -169,13 +174,24 @@ function fn_searchPart(){
|
||||
method: 'post',
|
||||
data: $("#form1").serialize(),
|
||||
dataType: 'json',
|
||||
beforeSend: function(){
|
||||
// 로딩 스피너 표시
|
||||
_startLoading("파트 목록 조회 중...");
|
||||
},
|
||||
complete: function(){
|
||||
// 로딩 스피너 숨김 (성공/실패 관계없이 항상 실행)
|
||||
_endLoading();
|
||||
},
|
||||
success: function(data) {
|
||||
console.log('조회 성공:', data.length + '건');
|
||||
|
||||
// Tabulator에 데이터 설정
|
||||
if(_rightGrid){
|
||||
_rightGrid.setData(data);
|
||||
}
|
||||
},
|
||||
error: function(jqxhr, status, error){
|
||||
console.error('Ajax 에러:', status, error);
|
||||
Swal.fire('조회 중 오류가 발생했습니다.');
|
||||
}
|
||||
});
|
||||
@@ -203,6 +219,19 @@ function openPartMngPopup(objId){
|
||||
hiddenForm.submit();
|
||||
}
|
||||
|
||||
// 선택된 행 데이터 반환 (Center 프레임에서 호출)
|
||||
function getSelectedRows() {
|
||||
if(!_rightGrid) return [];
|
||||
return _rightGrid.getSelectedRows();
|
||||
}
|
||||
|
||||
// 선택 해제 함수
|
||||
function clearSelection() {
|
||||
if(_rightGrid) {
|
||||
_rightGrid.deselectRow();
|
||||
}
|
||||
}
|
||||
|
||||
</script>
|
||||
</head>
|
||||
<body class="backcolor">
|
||||
@@ -211,7 +240,7 @@ function openPartMngPopup(objId){
|
||||
<input type="hidden" name="ACTION_TYPE" id="ACTION_TYPE">
|
||||
</form>
|
||||
<form name="form1" id="form1" action="" method="post">
|
||||
<input type="hidden" name="bomReportObjId" id="bomReportObjId" value="${param.OBJID}">
|
||||
<input type="hidden" name="bomReportObjId" id="bomReportObjId" value="${param.objId}">
|
||||
<input type="hidden" name="is_last" id="is_last" value="1">
|
||||
<input type="hidden" name="searchTargetStatus" id="searchTargetStatus" value="${info.STATUS}">
|
||||
<div id="structureName2"></div>
|
||||
|
||||
@@ -615,8 +615,10 @@ public class PartMngController {
|
||||
paramMap.put("IS_LAST","1");
|
||||
//paramMap.put("STATUS", "release");
|
||||
List list = partMngService.getToConnectPartMngList(request, paramMap);
|
||||
//List list = CommonUtils.keyChangeUpperList(partMngService.getPartMngList(request,paramMap));
|
||||
request.setAttribute("RESULT", CommonUtils.getJsonArray(list));
|
||||
|
||||
// Gson을 사용하여 안전하게 JSON 변환 (특수문자, 이스케이프 처리 자동)
|
||||
String jsonResult = JsonUtil.ListToJson(list);
|
||||
request.setAttribute("RESULT", jsonResult);
|
||||
return "/ajax/ajaxResult";
|
||||
}
|
||||
|
||||
@@ -981,6 +983,10 @@ public class PartMngController {
|
||||
|
||||
try{
|
||||
Map info = partMngService.getBOMStructureStandardInfo(request,paramMap);
|
||||
// search_type 파라미터를 info에 복사 (adding 상태 조회를 위해)
|
||||
if(paramMap.containsKey("search_type")) {
|
||||
info.put("search_type", paramMap.get("search_type"));
|
||||
}
|
||||
bomTreeList = partMngService.getBOMPartTreeList(info);
|
||||
}catch(Exception e){
|
||||
e.printStackTrace();
|
||||
|
||||
@@ -1217,10 +1217,15 @@ public class PartMngService extends BaseService {
|
||||
try{
|
||||
System.out.println("standardBOMInfo : "+standardBOMInfo);
|
||||
|
||||
Map sqlParamMap = new HashMap();
|
||||
sqlParamMap.put("bomReportObjId", CommonUtils.checkNull(standardBOMInfo.get("OBJID")));
|
||||
//sqlParamMap.put("search_type", "working"); //bom조회 working조건 231208
|
||||
sqlParamMap.put("search_type", CommonUtils.checkNull(standardBOMInfo.get("actionType")));
|
||||
Map sqlParamMap = new HashMap();
|
||||
sqlParamMap.put("bomReportObjId", CommonUtils.checkNull(standardBOMInfo.get("OBJID")));
|
||||
//sqlParamMap.put("search_type", "working"); //bom조회 working조건 231208
|
||||
// actionType과 search_type 둘 다 체크 (우선순위: search_type > actionType)
|
||||
String searchType = CommonUtils.checkNull(standardBOMInfo.get("search_type"));
|
||||
if(searchType.isEmpty()) {
|
||||
searchType = CommonUtils.checkNull(standardBOMInfo.get("actionType"));
|
||||
}
|
||||
sqlParamMap.put("search_type", searchType);
|
||||
|
||||
resultList = sqlSession.selectList("partMng.getBOMTreeList", sqlParamMap);
|
||||
int maxLevel = 0;
|
||||
|
||||
Reference in New Issue
Block a user