From 142d402bad62a3d232124bb0fd347861eb7d8a52 Mon Sep 17 00:00:00 2001 From: eastargh Date: Mon, 6 Jul 2026 11:25:16 +0900 Subject: [PATCH] =?UTF-8?q?=EB=A0=88=EC=9D=B4=EC=95=84=EC=9B=83=EA=B4=80?= =?UTF-8?q?=EB=A6=AC=20-=20Array=20=EC=95=84=EC=9D=B4=ED=85=9C=EC=9C=A0?= =?UTF-8?q?=ED=98=95=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jsp/onl/admin/rule/layoutManDetail.jsp | 2 +- .../rule/transform2/transform2ManDetail.jsp | 45 +++++++++++-------- .../manage/rule/layout/LayoutManService.java | 7 ++- .../layout/mapper/LayoutItemUIMapper.java | 32 ++++++++++--- .../layout/mapper/LayoutPopupUIMapper.java | 30 ++++++++++--- 5 files changed, 84 insertions(+), 32 deletions(-) diff --git a/WebContent/jsp/onl/admin/rule/layoutManDetail.jsp b/WebContent/jsp/onl/admin/rule/layoutManDetail.jsp index 9fb1e00..5a6de0c 100644 --- a/WebContent/jsp/onl/admin/rule/layoutManDetail.jsp +++ b/WebContent/jsp/onl/admin/rule/layoutManDetail.jsp @@ -71,7 +71,7 @@ $('#grid').children().remove(); - const itemTypes = ['Field', 'Grid', 'Group', 'Attr']; + const itemTypes = ['Field', 'Grid', 'Group', 'Attr', 'Array']; columns = [ // for columnData prop { title: '<%= localeMessage.getString("layoutMan.itmeEn") %>', name: 'loutItemName', type: 'text', width:280, resize:true, minWidth:120 }, diff --git a/WebContent/jsp/onl/admin/rule/transform2/transform2ManDetail.jsp b/WebContent/jsp/onl/admin/rule/transform2/transform2ManDetail.jsp index 08e7907..8fb0a7a 100644 --- a/WebContent/jsp/onl/admin/rule/transform2/transform2ManDetail.jsp +++ b/WebContent/jsp/onl/admin/rule/transform2/transform2ManDetail.jsp @@ -54,6 +54,7 @@ const LAYOUT_ITEM_TYPE_GROUP = "Group"; const LAYOUT_ITEM_TYPE_GRID = "Grid"; const LAYOUT_ITEM_TYPE_FIELD = "Field"; + const LAYOUT_ITEM_TYPE_ARRAY = "Array"; var isDetail = false; @@ -550,6 +551,14 @@ return data; } + // 항목 자신이 Array인 경우, 경로/변환명령 끝에 반복 표시 [*]를 추가 + function addArrayTag(loutItemType, data) { + if (loutItemType == LAYOUT_ITEM_TYPE_ARRAY && !data.endsWith("[*]")) { + data = data + "[*]"; + } + return data; + } + //변환명에 있는 서비스코드와 if서비스 코드 매칭 function validation(){ if ($('input[name=cnvsnName]').val() == '') { @@ -889,10 +898,10 @@ let selectValue = ""; let targetValue = ""; for ( var i = 0; i < sourceData.length; i++) { - if (sourceData[i]['loutItemType'] != "Field" && sourceData[i]['loutItemType'] != "Attr") continue; + if (sourceData[i]['loutItemType'] != "Field" && sourceData[i]['loutItemType'] != "Attr" && sourceData[i]['loutItemType'] != "Array") continue; selectValue = (sourceData[i]['LOUTITEMPATH']).substr(sourceData[i]['loutName'].length+1); for (var j = 0; j '); @@ -936,15 +945,15 @@ var targetValue = ""; var j=tgtIndex-1-1; for ( var i = srcIndex-1; i < sourceData.length; i++) { - if (sourceData[i]['loutItemType'] != LAYOUT_ITEM_TYPE_FIELD) continue; + if (sourceData[i]['loutItemType'] != LAYOUT_ITEM_TYPE_FIELD && sourceData[i]['loutItemType'] != LAYOUT_ITEM_TYPE_ARRAY) continue; j++; - while (targetData.length -1 >= j &&targetData[j]["loutItemType"] != LAYOUT_ITEM_TYPE_FIELD){ + while (targetData.length -1 >= j && targetData[j]["loutItemType"] != LAYOUT_ITEM_TYPE_FIELD && targetData[j]["loutItemType"] != LAYOUT_ITEM_TYPE_ARRAY){ j++; } if (targetData.length -1 < j) break; var targetRowId = targetData[j]['id']; - targetGrid.jqGrid('setCell',targetRowId,'CNVSNCMDNAME',addGroupTag(srcGroup,sourceData[i]['LOUTITEMPATH'])); - targetGrid.jqGrid('setCell',targetRowId,'CNVSNRSULTITEMPATHNAME',addGroupTag(tgtGroup,targetData[j]['LOUTITEMPATH'])); + targetGrid.jqGrid('setCell',targetRowId,'CNVSNCMDNAME',addArrayTag(sourceData[i]['loutItemType'], addGroupTag(srcGroup,sourceData[i]['LOUTITEMPATH']))); + targetGrid.jqGrid('setCell',targetRowId,'CNVSNRSULTITEMPATHNAME',addArrayTag(targetData[j]['loutItemType'], addGroupTag(tgtGroup,targetData[j]['LOUTITEMPATH']))); targetGrid.jqGrid('setCell',targetRowId,'CNVSNITEMSERNO',targetData[j]['loutItemSerno']); const sourceEndpointElementId = sourceGrid.getEndpointElementId(sourceData[i]['id']); @@ -1015,7 +1024,7 @@ var targetData = targetGrid.getRowData(); var gridData = new Array(); for (var i = 0; i "; }else{ return "
"; @@ -1170,7 +1179,7 @@ function tgtformatterFunction(cellvalue,options,rowObject){ var rowId = options["rowId"]; var loutItemType = rowObject["loutItemType"]; - if (loutItemType == 'Field' || loutItemType == 'Attr'){ + if (loutItemType == 'Field' || loutItemType == 'Attr' || loutItemType == 'Array'){ return "
" + "
" + "
"; @@ -1669,8 +1678,8 @@ return; } - if ((sourceRow["loutItemType"] != 'Field' && sourceRow["loutItemType"] != 'Attr') - || (targetRow["loutItemType"] != 'Field' && targetRow["loutItemType"] != 'Attr')) { + if ((sourceRow["loutItemType"] != 'Field' && sourceRow["loutItemType"] != 'Attr' && sourceRow["loutItemType"] != 'Array') + || (targetRow["loutItemType"] != 'Field' && targetRow["loutItemType"] != 'Attr' && targetRow["loutItemType"] != 'Array')) { alert('<%=localeMessage.getString("transformManDetail.alert3")%>'); return ; } @@ -1684,7 +1693,7 @@ if (targetRow['CNVSNCMDNAME'] == '') { // 변환 명령 값이 한번 설정 되면 변경 되지 않게 함. - var cnvsnCmdName = addGroupTag(srcGroup,sourceRow["LOUTITEMPATH"]); + var cnvsnCmdName = addArrayTag(sourceRow["loutItemType"], addGroupTag(srcGroup,sourceRow["LOUTITEMPATH"])); // function까지 처리되도록 수정했으나, parameter가 하나인 경우에만 정상처리됨 if($('#functionCombo').val() != "") { cnvsnCmdName = $('#functionCombo').val() + "(" + cnvsnCmdName + ")"; @@ -1693,7 +1702,7 @@ targetGrid.jqGrid('setCell',tgtRowId,'CNVSNCMDNAME', cnvsnCmdName); } - targetGrid.jqGrid('setCell',tgtRowId,'CNVSNRSULTITEMPATHNAME',addGroupTag(tgtGroup,targetRow["LOUTITEMPATH"])); + targetGrid.jqGrid('setCell',tgtRowId,'CNVSNRSULTITEMPATHNAME',addArrayTag(targetRow["loutItemType"], addGroupTag(tgtGroup,targetRow["LOUTITEMPATH"]))); targetGrid.jqGrid('setCell',tgtRowId,'CNVSNITEMSERNO',targetRow['loutItemSerno']); targetGrid.jqGrid('setCell',tgtRowId,'CNVSNSRCITEMS', cnvsnSrcItems); targetGrid.jqGrid('setCell',tgtRowId,'ISVALIDMAPPING', true); @@ -1885,8 +1894,8 @@ if (loutItemType == LAYOUT_ITEM_TYPE_GRID || loutItemType == LAYOUT_ITEM_TYPE_GROUP) { // group 인 경우 items = createGridGroupContextMenuItems(grid, rowId); - } else if(loutItemType == LAYOUT_ITEM_TYPE_FIELD) { - // field 인 경우 + } else if(loutItemType == LAYOUT_ITEM_TYPE_FIELD || loutItemType == LAYOUT_ITEM_TYPE_ARRAY) { + // field, array 인 경우 items = createFieldContextMenuItems(grid, positionElement.attr('id')); } else { return false; @@ -1989,7 +1998,7 @@ break; } - if (loutItemType == LAYOUT_ITEM_TYPE_FIELD) { + if (loutItemType == LAYOUT_ITEM_TYPE_FIELD || loutItemType == LAYOUT_ITEM_TYPE_ARRAY) { loutItemPath = loutItemPath.replace(new RegExp("^" + prefix), ""); console.debug(grid.getId() + " : loutItemPath : " + loutItemPath); rowData['GROUP_LOUTITEMPATH'] = loutItemPath; diff --git a/src/main/java/com/eactive/eai/rms/onl/manage/rule/layout/LayoutManService.java b/src/main/java/com/eactive/eai/rms/onl/manage/rule/layout/LayoutManService.java index 599eb9d..0c4e6b2 100644 --- a/src/main/java/com/eactive/eai/rms/onl/manage/rule/layout/LayoutManService.java +++ b/src/main/java/com/eactive/eai/rms/onl/manage/rule/layout/LayoutManService.java @@ -352,7 +352,7 @@ public class LayoutManService extends OnlBaseService { } if (max == 0 && min == 0) { - if ("GRID".equalsIgnoreCase(loutItemType)) { + if ("GRID".equalsIgnoreCase(loutItemType) || "ARRAY".equalsIgnoreCase(loutItemType)) { min = 1; max = -1; } else { @@ -371,7 +371,8 @@ public class LayoutManService extends OnlBaseService { } private String determineOccurNoItem(LayoutItemUI layoutItemUI, String loutItemType) { - if ("GRID".equalsIgnoreCase(loutItemType) && NumberUtils.toInt(layoutItemUI.getLoutItemOccCnt()) == 0) { + if (("GRID".equalsIgnoreCase(loutItemType) || "ARRAY".equalsIgnoreCase(loutItemType)) + && NumberUtils.toInt(layoutItemUI.getLoutItemOccCnt()) == 0) { return "*"; } return String.valueOf(layoutItemUI.getLoutItemOccCnt()); @@ -385,6 +386,8 @@ public class LayoutManService extends OnlBaseService { node = Item.NODE_GROUP; } else if ("ATTR".equalsIgnoreCase(el.getLoutItemType())) { node = Item.NODE_ATTR; + } else if ("ARRAY".equalsIgnoreCase(el.getLoutItemType())) { + node = Item.NODE_FIELD; } else { node = Item.NODE_FIELD; } diff --git a/src/main/java/com/eactive/eai/rms/onl/manage/rule/layout/mapper/LayoutItemUIMapper.java b/src/main/java/com/eactive/eai/rms/onl/manage/rule/layout/mapper/LayoutItemUIMapper.java index 8d3b65c..8c8b863 100644 --- a/src/main/java/com/eactive/eai/rms/onl/manage/rule/layout/mapper/LayoutItemUIMapper.java +++ b/src/main/java/com/eactive/eai/rms/onl/manage/rule/layout/mapper/LayoutItemUIMapper.java @@ -71,13 +71,33 @@ public interface LayoutItemUIMapper extends GenericMapper -1 ) { - itemLoopCount = item.getLoutitemoccurptrndstcd(); + if (isGridCondition && StringUtils.isBlank(item.getLoutitemrefinfo2())) { + if ("*".equals(item.getLoutitemoccurptrndstcd())) { + // 반복횟수로 '*'(무제한)이 저장된 경우, 화면 그리드에도 '*'을 그대로 표시 + itemLoopCount = "*"; + } else if (NumberUtils.isCreatable(item.getLoutitemoccurptrndstcd()) + && Integer.parseInt(item.getLoutitemoccurptrndstcd()) > -1) { + itemLoopCount = item.getLoutitemoccurptrndstcd(); + } + } + } else if (ItemNodeType.FIELD.getNumber() == item.getLoutitemnodeptrnidname()) { + // 아이템 발생 포인터 명이 '*'이거나 숫자로 생성 가능한 경우 + boolean isArrayCondition = "*".equals(item.getLoutitemoccurptrndstcd()) || NumberUtils.isCreatable(item.getLoutitemoccurptrndstcd()); + // itemType을 ARRAY 또는 FIELD 로 설정 + itemType = isArrayCondition ? "ARRAY" : "FIELD"; + + // isArrayCondition이 참이고, 참조 정보2가 비어 있는 경우, itemLoopCount 설정 + if (isArrayCondition && StringUtils.isBlank(item.getLoutitemrefinfo2())) { + if ("*".equals(item.getLoutitemoccurptrndstcd())) { + // 반복횟수로 '*'(무제한)이 저장된 경우, 화면 그리드에도 '*'을 그대로 표시 + itemLoopCount = "*"; + } else if (NumberUtils.isCreatable(item.getLoutitemoccurptrndstcd()) + && Integer.parseInt(item.getLoutitemoccurptrndstcd()) > -1) { + itemLoopCount = item.getLoutitemoccurptrndstcd(); + } } } else { - // 아이템 노드 타입이 GROUP이 아닌 경우, 해당 노드 타입으로 itemType 설정 + // 아이템 노드 타입이 GROUP/FIELD가 아닌 경우, 해당 노드 타입으로 itemType 설정 itemType = ItemNodeType.fromNumber(item.getLoutitemnodeptrnidname()).toString(); } @@ -85,7 +105,7 @@ public interface LayoutItemUIMapper extends GenericMapper -1 ) { - itemLoopCount = item.getLoutitemoccurptrndstcd(); + if (isGridCondition && StringUtils.isBlank(item.getLoutitemrefinfo2())) { + if ("*".equals(item.getLoutitemoccurptrndstcd())) { + // 반복횟수로 '*'(무제한)이 저장된 경우, 화면 그리드에도 '*'을 그대로 표시 + itemLoopCount = "*"; + } else if (NumberUtils.isCreatable(item.getLoutitemoccurptrndstcd()) + && Integer.parseInt(item.getLoutitemoccurptrndstcd()) > -1) { + itemLoopCount = item.getLoutitemoccurptrndstcd(); + } + } + } else if (ItemNodeType.FIELD.getNumber() == item.getLoutitemnodeptrnidname()) { + // 아이템 발생 포인터 명이 '*'이거나 숫자로 생성 가능한 경우 + boolean isArrayCondition = "*".equals(item.getLoutitemoccurptrndstcd()) || NumberUtils.isCreatable(item.getLoutitemoccurptrndstcd()); + // itemType을 ARRAY 또는 FIELD 로 설정 + itemType = isArrayCondition ? "ARRAY" : "FIELD"; + + // isArrayCondition이 참이고, 참조 정보2가 비어 있는 경우, itemLoopCount 설정 + if (isArrayCondition && StringUtils.isBlank(item.getLoutitemrefinfo2())) { + if ("*".equals(item.getLoutitemoccurptrndstcd())) { + // 반복횟수로 '*'(무제한)이 저장된 경우, 화면 그리드에도 '*'을 그대로 표시 + itemLoopCount = "*"; + } else if (NumberUtils.isCreatable(item.getLoutitemoccurptrndstcd()) + && Integer.parseInt(item.getLoutitemoccurptrndstcd()) > -1) { + itemLoopCount = item.getLoutitemoccurptrndstcd(); + } } } else { // 아이템 노드 타입이 GROUP이 아닌 경우, 해당 노드 타입으로 itemType 설정 @@ -85,7 +105,7 @@ public interface LayoutPopupUIMapper extends GenericMapper