From a13255b4129ee8a7a7b7e1ecd8e02dd2c78f7c17 Mon Sep 17 00:00:00 2001
From: 田源 <tianyuan@vci-tech.com>
Date: 星期四, 16 一月 2025 16:19:20 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/UIManagerServiceImpl.java | 1037 +++++++++++++++++++++++++++++++++++++++++++++------------
 1 files changed, 818 insertions(+), 219 deletions(-)

diff --git a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/UIManagerServiceImpl.java b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/UIManagerServiceImpl.java
index 40346aa..e6b6c33 100644
--- a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/UIManagerServiceImpl.java
+++ b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/UIManagerServiceImpl.java
@@ -5,6 +5,7 @@
 import com.vci.corba.common.data.UserEntityInfo;
 import com.vci.corba.framework.data.RoleRightInfo;
 import com.vci.corba.omd.btm.BizType;
+import com.vci.corba.omd.ltm.LinkType;
 import com.vci.corba.omd.qtm.QTInfo;
 import com.vci.corba.portal.PortalService;
 import com.vci.corba.portal.data.*;
@@ -16,36 +17,35 @@
 import com.vci.starter.poi.util.ExcelUtil;
 import com.vci.starter.web.exception.VciBaseException;
 import com.vci.starter.web.pagemodel.*;
-import com.vci.starter.web.pagemodel.BaseQueryObject;
-import com.vci.starter.web.pagemodel.BaseResult;
-import com.vci.starter.web.pagemodel.DataGrid;
-import com.vci.starter.web.pagemodel.SessionInfo;
+import com.vci.starter.web.redis.RedisService;
 import com.vci.starter.web.util.*;
-import com.vci.web.redis.RedisService;
+import com.vci.starter.web.util.Lcm.BeanUtil;
+import com.vci.starter.web.util.Lcm.CollectionUtil;
+import com.vci.starter.web.util.Lcm.Func;
 import com.vci.web.service.OsBtmServiceI;
 import com.vci.web.service.UIManagerServiceI;
-import com.vci.web.util.*;
-import com.vci.web.util.BeanUtil;
-import org.apache.commons.lang3.StringUtils;
-import com.vci.web.util.Func;
 import com.vci.web.util.PlatformClientUtil;
+import com.vci.web.util.RightControlUtil;
 import com.vci.web.util.UITools;
+import com.vci.web.utility.UIDataFetcher;
 import lombok.AllArgsConstructor;
 import lombok.NoArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+
 import javax.annotation.Resource;
 import java.io.File;
 import java.util.*;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicInteger;
-import java.util.stream.Collectors;
 import java.util.regex.Pattern;
+import java.util.stream.Collectors;
 
 /**
- * UI瀹氫箟鏈嶅姟鐣岄潰鐩稿叧鎺ュ彛
+ * UI瀹氫箟绠$悊鏈嶅姟鐣岄潰鐩稿叧鎺ュ彛
  * @author ludc
  * @date 2024/8/28 17:05
  */
@@ -87,22 +87,17 @@
     private final String IMPORTUIKEY = "importUIKey:";
 
     /**
+     * ui瀹氫箟鏁版嵁寮曟搸
+     */
+    private UIDataFetcher uiDataFetcher = null;
+
+    /**
      * 鎺掑簭姣旇緝鍣�
      */
     private Comparator<PLUILayout> pageLayoutComparator = new Comparator<PLUILayout>() {
         @Override
         public int compare(PLUILayout o1, PLUILayout o2) {
             return o1.plCode.compareTo(o2.plCode);
-        }
-    };
-
-    /**
-     * 鎺掑簭姣旇緝鍣�
-     */
-    private Comparator<PLDefinationVO> pageDefinationComparator = new Comparator<PLDefinationVO>() {
-        @Override
-        public int compare(PLDefinationVO o1, PLDefinationVO o2) {
-            return new Integer(o1.getSeq()).compareTo(new Integer(o2.getSeq()));
         }
     };
 
@@ -139,7 +134,7 @@
     }
 
     /**
-     * ton閫氳繃涓氬姟绫诲瀷鍜屽悕绉版煡璇�
+     * 閫氳繃涓氬姟绫诲瀷鍜屽悕绉版煡璇�
      * @param btemName
      * @param context
      * @return
@@ -155,7 +150,7 @@
             contextList.add("");
         }
         contextList.stream().forEach(code->{
-            PLUILayout[]  pluiLayouts= new PLUILayout[0];
+            PLUILayout[] pluiLayouts= new PLUILayout[0];
             try {
                 pluiLayouts = platformClientUtil.getUIService().getPLUILayoutEntityByTypeAndCode(btemName,code);
             } catch (PLException e) {
@@ -848,15 +843,17 @@
     }
 
     /**
-     * 鏍规嵁涓婁笅鏂嘔D鍜屽尯鍩熺被鍨嬶紝鎸夐『搴忚幏鍙栧綋鍓嶅尯鍩熺殑tab椤�
+     * 鏍规嵁涓婁笅鏂嘔D鍜屽尯鍩燂紙椤电锛夌被鍨嬶紝鎸夐『搴忚幏鍙栧綋鍓嶅尯鍩熺殑tab椤�
      */
     @Override
     public DataGrid getTabByContextIdAndType(String contextId, int areaType) throws PLException {
         VciBaseUtil.alertNotNull(contextId,"涓婁笅鏂囦富閿�",areaType,"鍖哄煙绫诲瀷");
         PLTabPage[] plTabPages = platformClientUtil.getUIService().getTabPagesByContextIdAndType(contextId, (short) areaType);
+        List<PLTabPage> tabPageList = Arrays.stream(plTabPages).sorted(((o1, o2) -> Math.toIntExact(o1.plSeq - o2.plSeq)))
+                .collect(Collectors.toList());
         DataGrid dataGrid = new DataGrid();
         dataGrid.setTotal(plTabPages.length);
-        dataGrid.setData(Arrays.asList(plTabPages));
+        dataGrid.setData(tabPageList);
         return dataGrid;
     }
 
@@ -879,7 +876,7 @@
     }
 
     /**
-     * 淇敼鍖哄煙鏁版嵁
+     * 淇敼鍖哄煙锛堥〉绛撅級鏁版嵁
      * @param plTabPage
      * @return
      */
@@ -896,7 +893,7 @@
     }
 
     /**
-     * 鍒犻櫎鍖哄煙鏁版嵁
+     * 鍒犻櫎鍖哄煙锛堥〉绛撅級鏁版嵁
      * @param oids
      * @return
      */
@@ -1049,9 +1046,9 @@
                     pdVO.getShowType(),
                     pdVO.getLinkType(),
                     pdVO.getQueryTemplateName(),
-                    pdVO.getShowExpressionRoot(),
-                    pdVO.getShowExpression(),
-                    pdVO.getRefTreeSet(),
+                    pdVO.getRootContent(),
+                    pdVO.getShowAbs(),
+                    pdVO.getShowLinkAbs(),
                     pdVO.getSeparator(),
                     pdVO.getExpandMode()
                 );
@@ -1064,8 +1061,8 @@
             case "6":
                 UILayoutComptCheckInput ulci = new UILayoutComptCheckInput(
                     pdVO.getSearchTarger(),
-                    pdVO.getShowType(),
-                    pdVO.getUiLayout(),
+                    pdVO.getSubUIObjType(),
+                    pdVO.getSubUILayout(),
                     pdVO.getQueryTemplateName(),
                     pdVO.getQryType()
                 );
@@ -1076,6 +1073,7 @@
                 break;
         }
 
+        d.setNavigatorType(pdVO.getNavigatorType());
         d = setEventDataToPLDefination(d,pdVO);
         //杞瑇ml璧嬪�煎埌plDefination涓�
         pd.plDefination = UITools.getPLDefinationText(d);
@@ -1166,9 +1164,9 @@
                         pdVO.getShowType(),
                         pdVO.getLinkType(),
                         pdVO.getQueryTemplateName(),
-                        pdVO.getShowExpressionRoot(),
-                        pdVO.getShowExpression(),
-                        pdVO.getRefTreeSet(),
+                        pdVO.getRootContent(),
+                        pdVO.getShowAbs(),
+                        pdVO.getShowLinkAbs(),
                         pdVO.getSeparator(),
                         pdVO.getExpandMode()
                 );
@@ -1181,8 +1179,8 @@
             case "6":
                 UILayoutComptCheckInput ulci = new UILayoutComptCheckInput(
                         pdVO.getSearchTarger(),
-                        pdVO.getShowType(),
-                        pdVO.getUiLayout(),
+                        pdVO.getSubUIObjType(),
+                        pdVO.getSubUILayout(),
                         pdVO.getQueryTemplateName(),
                         pdVO.getQryType()
                 );
@@ -1192,7 +1190,7 @@
                 d = ulci.getNewPLDefination(d);
                 break;
         }
-
+        d.setNavigatorType(pdVO.getNavigatorType());
         d = setEventDataToPLDefination(d,pdVO);
         pd.plDefination = UITools.getPLDefinationText(d);
 
@@ -1224,15 +1222,17 @@
             PLTabButton[] plTabButtons = platformClientUtil.getUIService().getPLTabButtonsByTableOId(pageDefinationOid);
             buttonList = Arrays.asList(plTabButtons);
             List<PLTabButtonVO> plTabButtonVOList = this.tabButton2TabButtonVOS(buttonList);
+            List<PLTabButtonVO> returnButtonVOList = new ArrayList<>();
             PLTabButtonVO plTabButtonVO = new PLTabButtonVO();
             for(int i = 0; i < plTabButtonVOList.size(); i++){
                 plTabButtonVO = plTabButtonVOList.get(i);
 
                 if(plTabButtonVO.getParentOid().equals("")){
                     plTabButtonVO.setChildren(plTabButtonVO2Children(plTabButtonVOList,plTabButtonVO.getOId()));
+                    returnButtonVOList.add(plTabButtonVO);
                 }
             }
-            return plTabButtonVOList;
+            return returnButtonVOList;
         } catch (Exception e) {
             e.printStackTrace();
             throw new VciBaseException("鍔犺浇椤电鍖哄煙鎸夐挳閰嶇疆淇℃伅寮傚父锛�" + e.getMessage());
@@ -1275,7 +1275,7 @@
         }
         plTabButtonVO.setOId(tabButtonDO.plOId);
         plTabButtonVO.setTableOId(tabButtonDO.plTableOId);
-        plTabButtonVO.setPageOId(tabButtonDO.plPageOId);
+        //plTabButtonVO.setPageOId(tabButtonDO.plPageOId);
         plTabButtonVO.setActionOId(tabButtonDO.plActionOId);
         plTabButtonVO.setLabel(tabButtonDO.plLabel);
         plTabButtonVO.setAreaType(tabButtonDO.plAreaType);
@@ -1303,6 +1303,10 @@
                 ));
             plTabButtonVO.setButtonParams(parameterMap);
         }
+        if(Func.isNotBlank(tabButtonDO.plActionOId)){
+            PLAction actionInfo = platformClientUtil.getUIService().getPLActionById(tabButtonDO.plActionOId);
+            plTabButtonVO.setActionName(Func.isNotEmpty(actionInfo) ? actionInfo.plName:"");
+        }
         return plTabButtonVO;
     }
 
@@ -1319,7 +1323,7 @@
                 continue;
             }
             if(plTabButtonVO.getParentOid().equals(plOid)){
-                plTabButtonVO.setChildren(plTabButtonVO2Children(plTabButtonVOList,plOid));
+                plTabButtonVO.setChildren(plTabButtonVO2Children(plTabButtonVOList,plTabButtonVO.getOId()));
                 plTabButtonVOS.add(plTabButtonVO);
             }
         }
@@ -1335,7 +1339,7 @@
     private PLTabButton tabButtonVO2TabButton(PLTabButton plTabButton,PLTabButtonVO tabButtonVO) {
         plTabButton.plOId = tabButtonVO.getOId();
         plTabButton.plTableOId = tabButtonVO.getTableOId();
-        plTabButton.plPageOId = tabButtonVO.getPageOId();
+        //plTabButton.plPageOId = tabButtonVO.getPageOId();
         plTabButton.plActionOId = tabButtonVO.getActionOId();
         plTabButton.plLabel = tabButtonVO.getLabel();
         plTabButton.plAreaType = tabButtonVO.getAreaType();
@@ -1360,8 +1364,8 @@
      * @return
      */
     @Override
-    public BaseResult addTapButton(PLTabButtonVO tabButtonVO) {
-        boolean res = this.saveOrUpdateTapButton(tabButtonVO, true);
+    public BaseResult addTabButton(PLTabButtonVO tabButtonVO) {
+        boolean res = this.saveOrUpdateTabButton(tabButtonVO, true);
         return res ? BaseResult.success("鎸夐挳閰嶇疆娣诲姞鎴愬姛锛�"):BaseResult.success("鎸夐挳閰嶇疆娣诲姞澶辫触锛�");
     }
 
@@ -1371,8 +1375,8 @@
      * @return
      */
     @Override
-    public BaseResult updateTapButton(PLTabButtonVO tabButtonVO) {
-        boolean res = this.saveOrUpdateTapButton(tabButtonVO, false);
+    public BaseResult updateTabButton(PLTabButtonVO tabButtonVO) {
+        boolean res = this.saveOrUpdateTabButton(tabButtonVO, false);
         return res ? BaseResult.success("鎸夐挳閰嶇疆淇敼鎴愬姛锛�"):BaseResult.success("鎸夐挳閰嶇疆淇敼澶辫触锛�");
     }
 
@@ -1382,11 +1386,10 @@
      * @return
      */
     @Override
-    public boolean saveOrUpdateTapButton(PLTabButtonVO tabButtonVO,boolean isAdd){
-        VciBaseUtil.alertNotNull(tabButtonVO,"鎸夐挳閰嶇疆瀵硅薄",tabButtonVO.getLabel(),"鍙傛暟鍚嶇О");
+    public boolean saveOrUpdateTabButton(PLTabButtonVO tabButtonVO,boolean isAdd){
+        VciBaseUtil.alertNotNull(tabButtonVO,"鎸夐挳閰嶇疆瀵硅薄",tabButtonVO.getLabel(),"鍙傛暟鍚嶇О",tabButtonVO.getTableOId(),"椤甸潰瀹氫箟涓婚敭");
         //妫�鏌ュ綋鍓嶆坊鍔犵殑鍒楄〃鏄惁閲嶅锛屼絾鏄繖鍎垮彧鏀寔鍗曟潯鏁版嵁淇濆瓨锛屾墍鏈夊綋鍓嶅垪琛ㄥ垽閲嶅彲浠ュ墠绔潵鍋�
         //String btnParamValidate = this.geCheckRes();
-
         if (tabButtonVO.getSeq() < 1 || tabButtonVO.getSeq() > 63) {
             throw new VciBaseException("鎸夊簭鍙疯秴鍑鸿寖鍥达紝璇蜂慨鏀癸紝鎸夐挳銆愮紪鍙枫�戝彧鑳藉湪銆�1-63銆戣寖鍥村唴銆�");
         }
@@ -1428,9 +1431,19 @@
                 e.printStackTrace();
             }
         }
+        this.saveButtonParams(tabButtonVO.getButtonParams(),plTabButton.plOId);
+        return true;
+    }
 
-        LinkedHashMap<String, String> buttonParams = tabButtonVO.getButtonParams();
+    /**
+     * 鎸夐挳鍙傛暟淇濆瓨
+     * @param buttonParams
+     * @param tabButtonOid
+     * @return
+     */
+    private void saveButtonParams(LinkedHashMap<String, String> buttonParams,String tabButtonOid) throws VciBaseException{
         if(Func.isNotEmpty(buttonParams)) {
+            SessionInfo sessionInfo = WebThreadLocalUtil.getCurrentUserSessionInfoInThread();
             Iterator<Map.Entry<String, String>> iterator = buttonParams.entrySet().iterator();
             while(iterator.hasNext()){
                 Map.Entry<String, String> next = iterator.next();
@@ -1443,7 +1456,7 @@
                 Map.Entry<String, String> next = kvItor.next();
                 PLCommandParameter plCommandParameter = new PLCommandParameter();
                 plCommandParameter.plOId = ObjectUtility.getNewObjectID36();
-                plCommandParameter.plCommandOId = plTabButton.plOId;
+                plCommandParameter.plCommandOId = tabButtonOid;
                 plCommandParameter.plKey = next.getKey();
                 plCommandParameter.plValue = next.getValue();
                 plCommandParameter.plCreateUser = sessionInfo.getUserId();
@@ -1452,11 +1465,10 @@
                     platformClientUtil.getUIService().savePLCommandParameter(plCommandParameter);
                 } catch (PLException e) {
                     e.printStackTrace();
-                    throw new VciBaseException("淇濆瓨鎸夐挳淇℃伅鏃跺彂鐢熷紓甯革細"+ e.getMessage());
+                    throw new VciBaseException("淇濆瓨鎸夐挳鍙傛暟鏃跺彂鐢熷紓甯革細"+ e.getMessage());
                 }
             }
         }
-        return true;
     }
 
     /**
@@ -1465,7 +1477,7 @@
      * @return
      */
     @Override
-    public boolean deleteTapButton(PLTabButtonVO tabButtonVO) throws PLException {
+    public boolean deleteTabButton(PLTabButtonVO tabButtonVO) throws PLException {
         VciBaseUtil.alertNotNull(tabButtonVO,"鍒犻櫎鐨勬寜閽厤缃璞�");
         boolean success = platformClientUtil.getUIService().deletePLTabButton(this.tabButtonVO2TabButton(new PLTabButton(),tabButtonVO));
         if(success == false){
@@ -1481,7 +1493,7 @@
      */
     @Override
     public BaseResult joinBtn(PLTabButtonVO tabButtonVO) throws PLException {
-        VciBaseUtil.alertNotNull(tabButtonVO,"闇�璋冩暣涓轰笅绾ф寜閽�",tabButtonVO.getTableOId(),"褰撳墠鎸夐挳閰嶇疆鎵�鍦ㄧ殑椤甸潰涓婚敭");
+        VciBaseUtil.alertNotNull(tabButtonVO,"闇�璋冩暣涓轰笅绾ф寜閽殑瀵硅薄",tabButtonVO.getTableOId(),"褰撳墠鎸夐挳閰嶇疆鎵�鍦ㄧ殑椤甸潰涓婚敭");
         //鍚屼竴椤甸潰涓嬬殑鎸夐挳
         List<PLTabButtonVO> plTabButtons = this.getTabButtons(tabButtonVO.getTableOId());
         if(Func.isEmpty(plTabButtons)){
@@ -1506,7 +1518,7 @@
         if(success == false) {
             return BaseResult.fail("淇敼澶辫触锛�");
         }
-        return BaseResult.fail("淇敼鎴愬姛锛�");
+        return BaseResult.success("淇敼鎴愬姛锛�");
     }
 
     /**
@@ -1684,40 +1696,60 @@
         String type = StringUtils.isBlank(conditionMap.get("type")) ? "" : conditionMap.get("type");
         String context = StringUtils.isBlank(conditionMap.get("context")) ? "" : conditionMap.get("context");
         boolean showCheckBox = Boolean.parseBoolean(conditionMap.get("showCheckBox"));
-       Map<String,RoleRightVO> roleRightVOMap=new HashMap<>();
+        Map<String, List<RoleRightVO>> roleRightVOMap = new HashMap<>();
         if(StringUtils.isNotBlank(roleId)){
-          String userName= WebThreadLocalUtil.getCurrentUserSessionInfoInThread().getUserId();
-            RoleRightInfo[] rightInfos= platformClientUtil.getFrameworkService().getRoleRightList(roleId,userName);
-            List<RoleRightVO>  roleRightVOList=roleRightDOO2VOS(Arrays.asList(rightInfos));
-            roleRightVOMap=roleRightVOList.stream().collect(Collectors.toMap(RoleRightVO::getFuncId,roleRightVO ->roleRightVO,(oldValue,newOldValue)->oldValue));
+            roleRightVOMap = this.getRoleRightMap(roleId);
         }
-        BizType[] bizTypes=osBtmServiceI.getBizTypes(type);
+        BizType[] bizTypes = osBtmServiceI.getBizTypes(type);
         List<Tree> treeList=new ArrayList<>();
-        Tree   rootNode =new Tree("root","鍔熻兘妯″潡","root");
+        Tree rootNode =new Tree("root","鍔熻兘妯″潡","root");
         rootNode.setLevel(0);
         rootNode.setShowCheckbox(true);
         rootNode.setExpanded(true);
         List<Tree> childList=new ArrayList<>();
+
+        uiDataFetcher = new UIDataFetcher();
         for (int i = 0; i < bizTypes.length; i++) {
             Tree bizTypeTree = new Tree(bizTypes[i].oid,bizTypes[i].name,bizTypes[i]);//(btmItems[i].label+" ["+ btmItems[i].name+"]", btmItems[i]);
             bizTypeTree.setLevel(1);
             bizTypeTree.setShowCheckbox(true);
             bizTypeTree.setParentId(rootNode.getOid());
             bizTypeTree.setParentName(rootNode.getText());
-            bizTypeTree.setShowCheckbox(true);
             bizTypeTree.setParentBtmName(bizTypes[i].name);
-            childList.add(bizTypeTree);
-            List<PLUILayout>contextList=getUIContextDataByBtName(bizTypes[i].name,context);
-            List<Tree> btmChildList=new ArrayList<>();
+            List<PLUILayout> contextList = uiDataFetcher.getContext(bizTypes[i].name/*+context*/);
+            List<Tree> btmChildList = new ArrayList<>();
             btmChildList.add(bizTypeTree);
             setChildNode(btmChildList,contextList,roleRightVOMap,showCheckBox);
+            childList.add(bizTypeTree);
         }
         rootNode.setChildren(childList);
         treeList.add(rootNode);
         return treeList;
     }
 
-    /***
+    /**
+     * 鏍规嵁瑙掕壊涓婚敭鑾峰彇宸叉巿鏉冪殑淇℃伅
+     * @param roleId 濡傛灉roleId涓嶄紶锛屽氨浼氳幏鍙栧綋鍓嶇櫥褰曠殑鐢ㄦ埛鐨勫悕绉版煡璇㈡潈闄�
+     * @return
+     * @throws PLException
+     */
+    @Override
+    public Map<String, List<RoleRightVO>> getRoleRightMap(String roleId) throws PLException {
+        RoleRightInfo[] rightInfos = null;
+        String userName = WebThreadLocalUtil.getCurrentUserSessionInfoInThread().getUserId();
+        if(Func.isBlank(roleId)){
+            rightInfos = platformClientUtil.getFrameworkService().getRoleRightByUserName(userName);
+        }else{
+            rightInfos = platformClientUtil.getFrameworkService().getRoleRightList(roleId,userName);
+        }
+        List<RoleRightVO> roleRightVOList = roleRightDOO2VOS(Arrays.asList(rightInfos));
+        //鍒嗙粍鎿嶄綔
+        Map<String, List<RoleRightVO>> roleRightVOMap = roleRightVOList.stream().collect(Collectors.groupingBy(RoleRightVO::getFuncId,
+                Collectors.mapping(e ->e, Collectors.toList())));
+        return roleRightVOMap;
+    }
+
+    /**
      * UI鎺堟潈
      * @param uiAuthorDTO
      * @return
@@ -1726,7 +1758,7 @@
     @Override
     public boolean authorizedUI(UIAuthorDTO uiAuthorDTO) throws Exception {
         boolean res=false;
-        if(uiAuthorDTO==null||CollectionUtil.isEmpty(uiAuthorDTO.getSelectTreeList())){
+        if(uiAuthorDTO==null|| CollectionUtil.isEmpty(uiAuthorDTO.getSelectTreeList())){
             throw  new VciBaseException("璇烽�夋嫨鑺傜偣杩涜鎺堟潈!");
         }
         BaseQueryObject treeQueryObject=new BaseQueryObject();
@@ -1736,34 +1768,57 @@
         conditionMap.put("context",uiAuthorDTO.getContext());
         conditionMap.put("showCheckBox","true");
         treeQueryObject.setConditionMap(conditionMap);
-        List<Tree> treeList=this.getUIAuthor(treeQueryObject);
-        HashMap<String,Tree> allTreeMap=new HashMap<>();
-        Map<String,RoleRightDTO> roleRightVOMap=new HashMap<>();
+        List<Tree> treeList = this.getUIAuthor(treeQueryObject);
+        HashMap<String,Tree> allTreeMap = new HashMap<>();
+        //Map<String,RoleRightDTO> roleRightVOMap = new HashMap<>();
         if(!CollectionUtil.isEmpty(treeList)){
-            if(StringUtils.isNotBlank(uiAuthorDTO.getRoleId())){
-                String userName= WebThreadLocalUtil.getCurrentUserSessionInfoInThread().getUserId();
-                RoleRightInfo[] rightInfos= platformClientUtil.getFrameworkService().getRoleRightList(uiAuthorDTO.getRoleId(),userName);
-                List<RoleRightVO>  roleRightVOList=roleRightDOO2VOS(Arrays.asList(rightInfos));
-                roleRightVOMap=roleRightVOList.stream().collect(Collectors.toMap(RoleRightVO::getFuncId,roleRightVO ->roleRightVOO2DTO(roleRightVO),(oldValue,newValue)->oldValue));
-            }
+            /*if(StringUtils.isNotBlank(uiAuthorDTO.getRoleId())){
+                String userName = WebThreadLocalUtil.getCurrentUserSessionInfoInThread().getUserId();
+                RoleRightInfo[] rightInfos = platformClientUtil.getFrameworkService().getRoleRightList(uiAuthorDTO.getRoleId(),userName);
+                List<RoleRightVO> roleRightVOList = roleRightDOO2VOS(Arrays.asList(rightInfos));
+                roleRightVOMap = roleRightVOList.stream().collect(Collectors.toMap(RoleRightVO::getFuncId,roleRightVO ->roleRightVOO2DTO(roleRightVO),(oldValue,newValue)->oldValue));
+            }*/
+
             convertTreeDOO2Map(treeList,allTreeMap);
-            List<RoleRightDTO> roleRightDTOList=new ArrayList<>();
-            List<Tree>  selectTreeList= uiAuthorDTO.getSelectTreeList();
-            getSelectedRoleRightObjs(uiAuthorDTO.getRoleId(),selectTreeList,allTreeMap,roleRightVOMap,roleRightDTOList);
+            List<RoleRightDTO> roleRightDTOList = new ArrayList<>();
+            List<Tree> selectTreeList = uiAuthorDTO.getSelectTreeList();
+            List<Tree> filterSelectTreeList = this.authTreeListConvert(selectTreeList);
+            //杩囨护鍑洪�夋嫨鐨勬寜閽�
+            List<String> checkButtonList = selectTreeList.stream()
+                    .filter(item -> item.getData() instanceof PLTabButton || item.isLeaf())
+                    .map(item -> item.getOid()).collect(Collectors.toList());
+
+            getSelectedRoleRightObjs(uiAuthorDTO.getRoleId(),filterSelectTreeList,checkButtonList,allTreeMap,roleRightDTOList);
             SessionInfo sessionInfo = WebThreadLocalUtil.getCurrentUserSessionInfoInThread();
             String currentUserName = sessionInfo.getUserId();
-            boolean isDeveloper= rightControlUtil.isDeveloper(currentUserName);
-            List<RoleRightInfo>  roleRightInfoList= roleRightDTOO2InfoS(roleRightDTOList);
-            UserEntityInfo info=new UserEntityInfo();
+            //boolean isDeveloper = rightControlUtil.isDeveloper(currentUserName);
+            List<RoleRightInfo> roleRightInfoList = roleRightDTOO2InfoS(roleRightDTOList);
+            UserEntityInfo info = new UserEntityInfo();
             info.modules="UI鎺堟潈";
-            info.userName=currentUserName;
+            info.userName = currentUserName;
             try {
-             res= platformClientUtil.getFrameworkService().saveRoleRight(roleRightInfoList.toArray(new RoleRightInfo[]{}),uiAuthorDTO.getRoleId(),currentUserName,info);
+                res = platformClientUtil.getFrameworkService().saveRoleRight(roleRightInfoList.toArray(new RoleRightInfo[]{}),uiAuthorDTO.getRoleId(),currentUserName,info);
             }catch (PLException e){
-                throw  new Exception("淇濆瓨澶辫触锛�"+e.getMessage());
+                throw  new Exception("淇濆瓨澶辫触锛�" + e.getMessage());
             }
         }
         return res;
+    }
+
+    /**
+     * 鑾峰彇绛涢�夊悗鐨勬暟鎹�
+     * @param selectTreeList
+     */
+    private List<Tree> authTreeListConvert(List<Tree> selectTreeList){
+        // 鍒涘缓涓�涓寘鍚彟涓�涓泦鍚堜腑婊¤冻鏉′欢鐨� oid 鐨勯泦鍚�
+        List<String> validOids = selectTreeList.stream()
+                .filter(Tree::isChecked) // checked 涓� true
+                .map(Tree::getOid)      // 鎻愬彇 oid
+                .collect(Collectors.toList());
+
+        return selectTreeList.stream()
+                .filter(tree -> tree.isChecked() && !validOids.contains(tree.getParentId())) // 杩囨护鏉′欢
+                .collect(Collectors.toList());
     }
 
     /**
@@ -1773,39 +1828,40 @@
      * @param allTreeMap
      * @param roleRightDTOList
      */
-    private void getSelectedRoleRightObjs(String roleOid,List<Tree>  selectTreeList,HashMap<String,Tree> allTreeMap,Map<String,RoleRightDTO> allRoleRightDTOMap,  List<RoleRightDTO> roleRightDTOList){
-        Date date=new Date();
-        Map<String,RoleRightDTO> roleRightDTOMap=new HashMap<>();
+    private void getSelectedRoleRightObjs(String roleOid, List<Tree> selectTreeList, List<String> checkButtonList, HashMap<String,Tree> allTreeMap, List<RoleRightDTO> roleRightDTOList){
+        Map<String,RoleRightDTO> roleRightDTOMap = new HashMap<>();
+
         if(!CollectionUtil.isEmpty(selectTreeList)){
             selectTreeList.stream().forEach(tree -> {
-                String oid=tree.getOid();
+                String oid = tree.getOid();
                 if(allTreeMap.containsKey(oid)){
-                    tree=   allTreeMap.get(oid);
-                   Object data= tree.getData();
+                    tree = allTreeMap.get(oid);
+                    Object data = tree.getData();
                     if (data instanceof String) {
-                        getRightValue(roleOid, tree, allTreeMap, false, roleRightDTOMap);//鍚戜笅鑾峰彇鎵�鏈夋ā鍧楃殑鏉冮檺鍊�
+                        getRightValue(roleOid, tree, allTreeMap, checkButtonList,false, roleRightDTOMap);//鍚戜笅鑾峰彇鎵�鏈夋ā鍧楃殑鏉冮檺鍊�
                     } else if (!(data instanceof PLTabButton)) {//涓氬姟绫诲瀷
-                        getRightValue(roleOid, tree, allTreeMap, true, roleRightDTOMap);//鍚戜笂澶勭悊
-                        getRightValue(roleOid, tree, allTreeMap, false, roleRightDTOMap);//鍚戜笅澶勭悊锛堝寘鍚綋鍓嶈妭鐐癸級
+                        getRightValue(roleOid, tree, allTreeMap, checkButtonList, true, roleRightDTOMap);//鍚戜笂澶勭悊
+                        getRightValue(roleOid, tree, allTreeMap, checkButtonList, false, roleRightDTOMap);//鍚戜笅澶勭悊锛堝寘鍚綋鍓嶈妭鐐癸級
                     } else if (data instanceof PLTabButton) {//鎸夐挳
                         String parrentId=tree.getParentId();
                         if(allTreeMap.containsKey(parrentId)){
                             SessionInfo sessionInfo = WebThreadLocalUtil.getCurrentUserSessionInfoInThread();
                             String currentUserName = sessionInfo.getUserId();
-                            boolean isDeveloper= rightControlUtil.isDeveloper(currentUserName);
+                            boolean isDeveloper = rightControlUtil.isDeveloper(currentUserName);
                             Tree parentNode= allTreeMap.get(parrentId);
                             String funcId = parentNode.getOid();
-                            getRightValue(roleOid,tree, allTreeMap, true, roleRightDTOMap);//鍚戜笂澶勭悊璇ユ搷浣滅埗绾х殑涓婄骇妯″潡鏉冮檺(涓嶅寘鍚埗鑺傜偣)
+                            getRightValue(roleOid, parentNode, allTreeMap, checkButtonList, true, roleRightDTOMap);//鍚戜笂澶勭悊璇ユ搷浣滅埗绾х殑涓婄骇妯″潡鏉冮檺(涓嶅寘鍚埗鑺傜偣)
                             if(!roleRightDTOMap.containsKey(funcId)){
                                 RoleRightDTO roleRightDTO = new RoleRightDTO();
                                 roleRightDTO.setId(ObjectUtility.getNewObjectID36());//涓婚敭
                                 roleRightDTO.setFuncId(funcId);
                                 if(isDeveloper) {
-                                    roleRightDTO.setRightType((short) 1);//鏉冮檺绫诲瀷 鏉冮檺绫诲瀷锛岃秴绾х鐞嗗憳缁欑鐞嗗憳鎺堟潈涓�1锛岀鐞嗗憳缁欐櫘閫氱敤鎴锋巿鏉冧负2
+                                    //鏉冮檺绫诲瀷 鏉冮檺绫诲瀷锛岃秴绾х鐞嗗憳缁欑鐞嗗憳鎺堟潈涓�1锛岀鐞嗗憳缁欐櫘閫氱敤鎴锋巿鏉冧负2
+                                    roleRightDTO.setRightType((short) 1);
                                 }else{
                                     roleRightDTO.setRightType((short) 2);
                                 }
-                                roleRightDTO.setRightValue(1);// 鏉冮檺鍊硷紝娌℃湁鎿嶄綔鐨勬ā鍧楁潈闄愬�煎瓨鍌ㄤ负0
+                                roleRightDTO.setRightValue(countRightValue(parentNode,checkButtonList,false));// 鏉冮檺鍊硷紝娌℃湁鎿嶄綔鐨勬ā鍧楁潈闄愬�煎瓨鍌ㄤ负0
                                 roleRightDTO.setRoleId(roleOid);//瑙掕壊ID
                                 roleRightDTO.setCreateUser(currentUserName);//鍒涘缓鑰�
                                 roleRightDTO.setCreateTime(VciDateUtil.date2Str(new Date(),""));//鍒涘缓鏃堕棿
@@ -1825,7 +1881,7 @@
             });
           /*  allRoleRightDTOMap.putAll(roleRightDTOMap.entrySet().stream()
                     .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::  getValue)));*/
-         List<RoleRightDTO>    newRoleRightDTOList=Optional.ofNullable(roleRightDTOMap).orElseGet(()->new HashMap<String,RoleRightDTO>()).values().stream().collect(Collectors.toList());
+         List<RoleRightDTO> newRoleRightDTOList = Optional.ofNullable(roleRightDTOMap).orElseGet(()->new HashMap<String,RoleRightDTO>()).values().stream().collect(Collectors.toList());
             roleRightDTOList.addAll(newRoleRightDTOList);
         }
     }
@@ -1834,16 +1890,18 @@
      * 鑾峰彇鏉冮檺
      * @param isUp 鏄惁鏄悜涓婅幏鍙栵紝濡傛灉鏄悜涓婅幏鍙栵紝浼犺繘鏉ョ殑蹇呯劧鏄ā鍧楄妭鐐癸紝涓斾笂绾фā鍧楀繀鐒舵槸娌℃湁閫変腑
      */
-    private void getRightValue(String roleId,Tree node,HashMap<String,Tree> allTreeMap,boolean isUp,Map<String,RoleRightDTO> rightMap){
+    private void getRightValue(String roleId,Tree node,Map<String,Tree> allTreeMap,List<String> checkButton,boolean isUp,Map<String,RoleRightDTO> rightMap){
         SessionInfo sessionInfo = WebThreadLocalUtil.getCurrentUserSessionInfoInThread();
         String currentUserName = sessionInfo.getUserId();
         boolean isDeveloper= rightControlUtil.isDeveloper(currentUserName);
         String id=ObjectUtility.getNewObjectID36();
         Object data=node.getData();
         if(isUp) {//鍚戜笂鑾峰彇锛屽瓨鍌ㄦ瘡涓笂绾фā鍧楃殑鏉冮檺鍊�
-            while (!"root".equals(node.getData())){
-                data=node.getData();
-               String oid=node.getOid();
+            String parentId = node.getParentId();
+            Tree parentNode = allTreeMap.get(parentId);
+            while (!"root".equals(parentNode.getData())){
+                data=parentNode.getData();
+                String oid=parentNode.getOid();
                 if(allTreeMap.containsKey(oid)){
                     String funcId = "";
                     if (data instanceof BizType) {
@@ -1880,9 +1938,9 @@
                     if(!rightMap.containsKey(funcId)){
                         rightMap.put(funcId, roleRightDTO);
                     }
-                    oid= node.getParentId();
+                    oid = parentNode.getParentId();
                     if(allTreeMap.containsKey(oid)) {
-                        node=allTreeMap.get(oid);
+                        parentNode = allTreeMap.get(oid);
                     }
                 }
             }
@@ -1926,14 +1984,14 @@
                 }
                 for (int i = 0; i < node.getChildren().size(); i++) {
                     //瀵规瘡涓瓙鍚戜笅閫掑綊閬嶅巻
-                    getRightValue(roleId, node.getChildren().get(i), allTreeMap, false, rightMap);
+                    getRightValue(roleId, node.getChildren().get(i), allTreeMap, checkButton,false, rightMap);
                 }
             } else {
                 if (!rightMap.containsKey(funcId)) {
                     RoleRightDTO roleRightDTO = new RoleRightDTO();
                     roleRightDTO.setFuncId(funcId);
                     roleRightDTO.setRightType((short) 2); // 璁剧疆UI鏉冮檺
-                    roleRightDTO.setRightValue(countRightValue(node, true));//娌℃湁鎿嶄綔鐨勬ā鍧楁潈闄愬�煎瓨鍌ㄤ负0
+                    roleRightDTO.setRightValue(countRightValue(node, checkButton,true));//娌℃湁鎿嶄綔鐨勬ā鍧楁潈闄愬�煎瓨鍌ㄤ负0
                     roleRightDTO.setRoleId(roleId);
 
                     roleRightDTO.setCreateUser(currentUserName);
@@ -1953,12 +2011,13 @@
      * @param isAll 鏄惁瀛愮骇鍏ㄩ儴閫変腑
      * @return
      */
-    private long countRightValue(Tree node,boolean isAll){
+    private long countRightValue(Tree node,List<String> checkButton,boolean isAll){
         long value = 0;
-        for(int i = 0;i < node.getChildren().size();i++){
+        for(int i = 0; i < node.getChildren().size(); i++){
             Tree childNode = (Tree)node.getChildren().get(i);
-            if(isAll && node.getData() instanceof PLTabButton ){
-                PLTabButton obj = (PLTabButton)node.getData();
+            //node.getData() instanceof PLTabButton杩欏効搴旇鎹㈡垚鏄惁鏄�変腑鐨勬寜閽妭鐐�
+            if(isAll || checkButton.contains(node.getOid())){
+                PLTabButton obj = (PLTabButton)childNode.getData();
                 value += (long)Math.pow(2, obj.plSeq);//绱鍔犱笂鍚勪釜鎿嶄綔鐨勬潈闄愬��
             }
         }
@@ -1980,22 +2039,21 @@
         });
     }
 
-    /***
+    /**
      * 閬嶅巻瀛愯妭鐐�
      * @param parentTree
      * @param contextList
      * @param roleRightVOMap
      * @param isShowCheckBox
      */
-    private void setChildNode(List<Tree> parentTree, List<PLUILayout>contextList,Map<String,RoleRightVO> roleRightVOMap,boolean isShowCheckBox){
-        Optional.ofNullable(parentTree).orElseGet(()->new ArrayList<Tree>()).stream().forEach(pTree -> {
-            Object funcObj=  pTree.getData();
-            List<Tree> chiledTreeList=new ArrayList<>();
+    private void setChildNode_old(List<Tree> parentTree, List<PLUILayout>contextList,Map<String,RoleRightVO> roleRightVOMap,boolean isShowCheckBox){
+        Optional.ofNullable(parentTree).orElseGet(()->new ArrayList<>()).stream().forEach(pTree -> {
+            Object funcObj = pTree.getData();
+            List<Tree> chiledTreeList = new ArrayList<>();
             if (funcObj instanceof BizType) {//涓氬姟绫诲瀷
-                BizType bizType = (BizType) funcObj;
                 if(!CollectionUtil.isEmpty(contextList)) {
                     contextList.stream().forEach(context->{
-                        Tree childTree=new Tree(context.plOId,context.plName+"("+context.plCode+")",context);
+                        Tree childTree = new Tree(context.plOId,context.plName+"("+context.plCode+")",context);
                         childTree.setParentName(pTree.getText());
                         childTree.setParentBtmName(pTree.getParentBtmName());
                         childTree.setParentId(pTree.getOid());
@@ -2006,19 +2064,13 @@
                     pTree.setChildren(chiledTreeList);
                 }
                 if(!CollectionUtil.isEmpty(chiledTreeList)) {
-                    setChildNode(chiledTreeList, contextList, roleRightVOMap, isShowCheckBox);
+                    setChildNode_old(chiledTreeList, contextList, roleRightVOMap, isShowCheckBox);
                 }
             }else  if (funcObj instanceof PLUILayout){//UI
                 PLUILayout context = (PLUILayout) funcObj;
-                PLTabPage[] pages = new PLTabPage[0];
-                try {
-                    pages = platformClientUtil.getUIService().getPLTabPagesByPageDefinationOId(context.plOId);
-                } catch (PLException e) {
-                    e.printStackTrace();
-                }
-                if(pages!=null&&pages.length>0){
-                    List<PLTabPage> plTabPageList= Arrays.stream(pages).collect(Collectors.toList());
-                    plTabPageList.stream().forEach(plTabPage -> {
+                List<PLTabPage> pageList = uiDataFetcher.getTabs(context.plOId);
+                if(Func.isNotEmpty(pageList)){
+                    pageList.stream().forEach(plTabPage -> {
                         Tree childTree=new Tree(plTabPage.plOId,plTabPage.plName,plTabPage);
                         childTree.setParentName(pTree.getText());
                         childTree.setParentId(pTree.getOid());
@@ -2027,69 +2079,155 @@
                         childTree.setShowCheckbox(isShowCheckBox);
                         chiledTreeList.add(childTree);
                     });
+                }
+                if(!CollectionUtil.isEmpty(chiledTreeList)) {
+                    setChildNode_old(chiledTreeList, contextList, roleRightVOMap, isShowCheckBox);
+                }
+                pTree.setChildren(chiledTreeList);
+            }else if (funcObj instanceof PLTabPage) {//涓婁笅鏂�
+                PLTabPage plTabPage = (PLTabPage) funcObj;
+                List<PLPageDefination> pageDefinationList = uiDataFetcher.getComopnent(plTabPage.plOId);
+                if(Func.isNotEmpty(pageDefinationList)){
+                    pageDefinationList.stream().forEach(plPageDefination -> {
+                        Tree childTree=new Tree(plPageDefination.plOId,plPageDefination.name,plPageDefination);
+                        childTree.setParentName(pTree.getText());
+                        childTree.setParentId(pTree.getOid());
+                        childTree.setParentBtmName(pTree.getParentBtmName());
+                        childTree.setLevel(pTree.getLevel()+1);
+                        childTree.setShowCheckbox(isShowCheckBox);
+                        chiledTreeList.add(childTree);
+                    });
                     pTree.setChildren(chiledTreeList);
                 }
                 if(!CollectionUtil.isEmpty(chiledTreeList)) {
-                    setChildNode(chiledTreeList, contextList, roleRightVOMap, isShowCheckBox);
+                    setChildNode_old(chiledTreeList, contextList, roleRightVOMap, isShowCheckBox);
                 }
-
-            }else if (funcObj instanceof PLTabPage) {//涓婁笅鏂�
-                PLTabPage plTabPage = (PLTabPage) funcObj;
-                List<PLPageDefination>plPageDefinationList=new ArrayList<>();
-                try {
-                    PLPageDefination[] pLPageDefinations = platformClientUtil.getUIService().getPLPageDefinationsByPageContextOId(plTabPage.plOId);
-                    if(pLPageDefinations!=null&&pLPageDefinations.length>0){
-                        plPageDefinationList= Arrays.stream(pLPageDefinations).collect(Collectors.toList());
-                        plPageDefinationList.stream().forEach(plPageDefination -> {
-                            Tree childTree=new Tree(plPageDefination.plOId,plPageDefination.name,plPageDefination);
-                            childTree.setParentName(pTree.getText());
-                            childTree.setParentId(pTree.getOid());
-                            childTree.setParentBtmName(pTree.getParentBtmName());
-                            childTree.setLevel(pTree.getLevel()+1);
-                            childTree.setShowCheckbox(isShowCheckBox);
-                            chiledTreeList.add(childTree);
-                        });
-                        pTree.setChildren(chiledTreeList);
-                    }
-                    if(!CollectionUtil.isEmpty(chiledTreeList)) {
-                        setChildNode(chiledTreeList, contextList, roleRightVOMap, isShowCheckBox);
-                    }
-                } catch (PLException e) {
-                    e.printStackTrace();
-                }
-
-            }else if (funcObj instanceof PLPageDefination) {//
+            }else if (funcObj instanceof PLPageDefination) {
                 PLPageDefination plPageDefination = (PLPageDefination) funcObj;
-                try {
-                    List<PLTabButton>plTabButtonList=new ArrayList<>();
-                    PLTabButton[] pLTabButtons = platformClientUtil.getUIService().getPLTabButtonsByTableOId(plPageDefination.plOId);
-                    if(pLTabButtons!=null&&pLTabButtons.length>0){
-                        plTabButtonList= Arrays.stream(pLTabButtons).collect(Collectors.toList());
-                        plTabButtonList.stream().forEach(plTabButton -> {
-                            Tree childTree=new Tree(plTabButton.plOId,plTabButton.plLabel,plTabButton);
-                            childTree.setParentName(pTree.getText());
-                            childTree.setParentId(pTree.getOid());
-                            childTree.setParentBtmName(pTree.getParentBtmName());
-                            childTree.setLevel(pTree.getLevel()+1);
-                            childTree.setShowCheckbox(isShowCheckBox);
-                            childTree.setLeaf(true);
-                            chiledTreeList.add(childTree);
-                        });
-                        pTree.setChildren(chiledTreeList);
-                    }
-                    if(!CollectionUtil.isEmpty(chiledTreeList)) {
-                        setChildNode(chiledTreeList, contextList, roleRightVOMap, isShowCheckBox);
-                    }
-                } catch (PLException e) {
-                    e.printStackTrace();
+                List<PLTabButton> pLTabButtonList = uiDataFetcher.getButtons(plPageDefination.plOId);
+                if(Func.isNotEmpty(pLTabButtonList)){
+                    pLTabButtonList.stream().forEach(plTabButton -> {
+                        Tree childTree=new Tree(plTabButton.plOId,plTabButton.plLabel,plTabButton);
+                        childTree.setParentName(pTree.getText());
+                        childTree.setParentId(pTree.getOid());
+                        childTree.setParentBtmName(pTree.getParentBtmName());
+                        childTree.setLevel(pTree.getLevel()+1);
+                        childTree.setShowCheckbox(isShowCheckBox);
+                        childTree.setLeaf(true);
+                        chiledTreeList.add(childTree);
+                    });
+                    pTree.setChildren(chiledTreeList);
                 }
-
+                if(!CollectionUtil.isEmpty(chiledTreeList)) {
+                    setChildNode_old(chiledTreeList, contextList, roleRightVOMap, isShowCheckBox);
+                }
             }else if (funcObj instanceof PLTabButton) {//鎸夐挳
-                PLTabButton plTabButton= (PLTabButton) funcObj;
-                String id =plTabButton.plTableOId;
+                PLTabButton plTabButton = (PLTabButton) funcObj;
+                String id = plTabButton.plTableOId;
                 if(roleRightVOMap.containsKey(id)){
                     RoleRightVO roleRightVO = roleRightVOMap.get(id);
                     Long rightValue =  roleRightVO.getRightValue();
+                    int nodeValue = plTabButton.plSeq;
+                    if (nodeValue >= 0 && nodeValue <= 63) {
+                        long preValue = (rightValue >> nodeValue) & 1;
+                        if (preValue == 1) {
+                            pTree.setChecked(true);
+                        }
+                    }
+                }else{
+                    pTree.setChecked(false);
+                }
+            }
+        });
+    }
+
+    /**
+     * 閬嶅巻瀛愯妭鐐�
+     * @param parentTree
+     * @param contextList
+     * @param isShowCheckBox
+     */
+    private void setChildNode(List<Tree> parentTree, List<PLUILayout>contextList,Map<String, List<RoleRightVO>> roleRightVOMap, boolean isShowCheckBox){
+        Optional.ofNullable(parentTree).orElseGet(()->new ArrayList<>()).stream().forEach(pTree -> {
+            Object funcObj = pTree.getData();
+            List<Tree> chiledTreeList = new ArrayList<>();
+            if (funcObj instanceof BizType) {//涓氬姟绫诲瀷
+                if(!CollectionUtil.isEmpty(contextList)) {
+                    contextList.stream().forEach(context->{
+                        Tree childTree = new Tree(context.plOId,context.plName+"("+context.plCode+")",context);
+                        childTree.setParentName(pTree.getText());
+                        childTree.setParentBtmName(pTree.getParentBtmName());
+                        childTree.setParentId(pTree.getOid());
+                        childTree.setLevel(pTree.getLevel()+1);
+                        childTree.setShowCheckbox(isShowCheckBox);
+                        chiledTreeList.add(childTree);
+                    });
+                    pTree.setChildren(chiledTreeList);
+                }
+                if(!CollectionUtil.isEmpty(chiledTreeList)) {
+                    setChildNode(chiledTreeList, contextList,roleRightVOMap, isShowCheckBox);
+                }
+            }else  if (funcObj instanceof PLUILayout){//UI
+                PLUILayout context = (PLUILayout) funcObj;
+                List<PLTabPage> pageList = uiDataFetcher.getTabs(context.plOId);
+                if(Func.isNotEmpty(pageList)){
+                    pageList.stream().forEach(plTabPage -> {
+                        Tree childTree=new Tree(plTabPage.plOId,plTabPage.plName,plTabPage);
+                        childTree.setParentName(pTree.getText());
+                        childTree.setParentId(pTree.getOid());
+                        childTree.setParentBtmName(pTree.getParentBtmName());
+                        childTree.setLevel(pTree.getLevel()+1);
+                        childTree.setShowCheckbox(isShowCheckBox);
+                        chiledTreeList.add(childTree);
+                    });
+                }
+                if(!CollectionUtil.isEmpty(chiledTreeList)) {
+                    setChildNode(chiledTreeList, contextList,roleRightVOMap, isShowCheckBox);
+                }
+                pTree.setChildren(chiledTreeList);
+            }else if (funcObj instanceof PLTabPage) {//涓婁笅鏂�
+                PLTabPage plTabPage = (PLTabPage) funcObj;
+                List<PLPageDefination> pageDefinationList = uiDataFetcher.getComopnent(plTabPage.plOId);
+                if(Func.isNotEmpty(pageDefinationList)){
+                    pageDefinationList.stream().forEach(plPageDefination -> {
+                        Tree childTree=new Tree(plPageDefination.plOId,plPageDefination.name,plPageDefination);
+                        childTree.setParentName(pTree.getText());
+                        childTree.setParentId(pTree.getOid());
+                        childTree.setParentBtmName(pTree.getParentBtmName());
+                        childTree.setLevel(pTree.getLevel()+1);
+                        childTree.setShowCheckbox(isShowCheckBox);
+                        chiledTreeList.add(childTree);
+                    });
+                    pTree.setChildren(chiledTreeList);
+                }
+                if(!CollectionUtil.isEmpty(chiledTreeList)) {
+                    setChildNode(chiledTreeList, contextList,roleRightVOMap, isShowCheckBox);
+                }
+            }else if (funcObj instanceof PLPageDefination) {
+                PLPageDefination plPageDefination = (PLPageDefination) funcObj;
+                List<PLTabButton> pLTabButtonList = uiDataFetcher.getButtons(plPageDefination.plOId);
+                if(Func.isNotEmpty(pLTabButtonList)){
+                    pLTabButtonList.stream().forEach(plTabButton -> {
+                        Tree childTree=new Tree(plTabButton.plOId,plTabButton.plLabel,plTabButton);
+                        childTree.setParentName(pTree.getText());
+                        childTree.setParentId(pTree.getOid());
+                        childTree.setParentBtmName(pTree.getParentBtmName());
+                        childTree.setLevel(pTree.getLevel()+1);
+                        childTree.setShowCheckbox(isShowCheckBox);
+                        childTree.setLeaf(true);
+                        chiledTreeList.add(childTree);
+                    });
+                    pTree.setChildren(chiledTreeList);
+                }
+                if(!CollectionUtil.isEmpty(chiledTreeList)) {
+                    setChildNode(chiledTreeList, contextList,roleRightVOMap, isShowCheckBox);
+                }
+            }else if (funcObj instanceof PLTabButton) {//鎸夐挳
+                PLTabButton plTabButton = (PLTabButton) funcObj;
+                String id = plTabButton.plTableOId;
+                if(roleRightVOMap.containsKey(id)){
+                    RoleRightVO roleRightVO = roleRightVOMap.get(id).get(0);
+                    Long rightValue = roleRightVO.getRightValue();
                     int nodeValue = plTabButton.plSeq;
                     if (nodeValue >= 0 && nodeValue <= 63) {
                         long preValue = (rightValue >> nodeValue) & 1;
@@ -2179,7 +2317,7 @@
      * @param vo
      * @return
      */
-    private RoleRightDTO  roleRightVOO2DTO(RoleRightVO vo){
+    private RoleRightDTO roleRightVOO2DTO(RoleRightVO vo){
         RoleRightDTO dto=new RoleRightDTO();
         dto.setId(vo.getId());
         dto.setCreateTime(vo.getCreateTime());
@@ -2199,7 +2337,7 @@
      * @param dto
      * @return
      */
-    private RoleRightInfo  roleRightDTOO2Info(RoleRightDTO dto) throws Exception {
+    private RoleRightInfo roleRightDTOO2Info(RoleRightDTO dto) throws Exception {
         RoleRightInfo info=new RoleRightInfo();
         info.id=StringUtils.isBlank(dto.getId())?"":dto.getId();
         info.createTime=StringUtils.isBlank(dto.getCreateTime())?new Date().getTime():VciDateUtil.getTime(VciDateUtil.str2Date(dto.getCreateTime(),""));
@@ -2341,9 +2479,13 @@
      */
     public DataGrid<BizType> getBtmDatasByPage(BaseQueryObject baseQueryObject) throws PLException{
         BizType[] btmNames = null;
-        int start = baseQueryObject.getPage() <= 1 ? 1 : (baseQueryObject.getPage() - 1) * baseQueryObject.getLimit() + 1;
-        int end = baseQueryObject.getPage() <= 1 ? baseQueryObject.getLimit() : (baseQueryObject.getPage() * baseQueryObject.getLimit());
-
+        int start = baseQueryObject.getPage();
+        int end = baseQueryObject.getLimit();
+        //鍏ㄦ煡鐨勬儏鍐�
+        /*if(limit != -1){
+             start = baseQueryObject.getPage() <= 1 ? 1 : (page - 1) * limit + 1;
+             end = baseQueryObject.getPage() <= 1 ? limit : (page * limit);
+        }*/
 
         String where = " 1=1 ";
         String text = "";
@@ -2358,11 +2500,17 @@
 
         String fromWhere = String.format(" from plbtmtype bt where %s ", where);
         String fromWhereOrderBy = String.format(" %s order by bt.name", fromWhere);
-        String sql = String.format("select * from(" +
-                "  select row_.*,rownum rownum_ from( " +
-                "         select bt.name, bt.label %s" +
-                "  ) row_ " +
-                ") where rownum_ >= %d and rownum_ <= %d ", fromWhereOrderBy, start, end);
+        String sql = "";
+        if(end != -1){
+            sql = sql+String.format("select * from(" +
+                    "  select row_.*,rownum rownum_ from( " +
+                    "  select bt.name, bt.label %s" +
+                    "  ) row_ " +
+                    ") where rownum_ >= %d and rownum_ <= %d ", fromWhereOrderBy, start, end);
+        }else{
+            sql = sql+String.format(
+                    "select bt.name, bt.label %s", fromWhereOrderBy);
+        }
         List<BizType> list = new LinkedList<BizType>();
         String[][] kvss = platformClientUtil.getQueryService().queryBySqlWithoutKey(sql);
         for(String[] kvs : kvss){
@@ -2384,6 +2532,50 @@
     }
 
     /**
+     * 鏌ヨ閾炬帴绫诲瀷涓嬫媺
+     * @param baseQueryObject
+     * @return
+     * @throws PLException
+     */
+    public DataGrid<LinkType> getLinkDatasByPage(BaseQueryObject baseQueryObject) throws PLException{
+        List<LinkType> list = new ArrayList<>();
+        Map<String, LinkType> map = new HashMap<>();
+        LinkType[] lts = platformClientUtil.getLinkTypeService().getLinkTypes();
+        for (LinkType lt : lts) {
+            Map<String, String> conditionMap = baseQueryObject.getConditionMap();
+            if(Func.isNotEmpty(conditionMap)){
+                //閫夋嫨鐨勫璞$被鍨�
+                String selectBtmType = conditionMap.get("selectBtmType");
+                if(selectBtmType != null){
+                    boolean existFrom = existInArray(selectBtmType, lt.btmItemsFrom);
+                    boolean existTo = existInArray(selectBtmType, lt.btmItemsTo);
+                    if(existFrom || existTo){
+                        if(!map.containsKey(lt.name)){
+                            map.put(lt.name, lt);
+                            list.add(lt);
+                        }
+                    }
+                }
+            }
+        }
+        DataGrid<LinkType> res = new DataGrid<>();
+        res.setData(list);
+        res.setTotal(list.size());
+        return res;
+    }
+
+    private boolean existInArray(String value, String[] values){
+        boolean res = false;
+        for (String string : values) {
+            if(string.equals(value)){
+                res = true;
+                break;
+            }
+        }
+        return res;
+    }
+
+    /**
      * UI瀹氫箟涓嬫媺鏌ヨ锛坱emplateType涓篣I瀹氫箟鏃剁殑UI瀹氫箟涓嬫媺鏌ヨ锛�
      * @param baseQueryObject selectBtmType 閫夋嫨鐨勬簮瀵硅薄,甯﹀垎椤典俊鎭�
      * @return
@@ -2391,11 +2583,12 @@
      */
     public DataGrid<PLUILayout> getUILayoutDatasByPage(BaseQueryObject baseQueryObject) throws PLException{
         PLUILayout[] datas = null;
-        int start = baseQueryObject.getPage() <= 1 ? 1 : (baseQueryObject.getPage() - 1) * baseQueryObject.getLimit() + 1;
-        int end = baseQueryObject.getPage() <= 1 ? baseQueryObject.getLimit() : (baseQueryObject.getPage() * baseQueryObject.getLimit());
+        int start = baseQueryObject.getPage();
+        int end = baseQueryObject.getLimit();
+        /*int start = baseQueryObject.getPage() <= 1 ? 1 : (baseQueryObject.getPage() - 1) * baseQueryObject.getLimit() + 1;
+        int end = baseQueryObject.getPage() <= 1 ? baseQueryObject.getLimit() : (baseQueryObject.getPage() * baseQueryObject.getLimit());*/
 
         String where = " 1=1 ";
-
         Map<String, String> conditionMap = baseQueryObject.getConditionMap();
         if(Func.isNotEmpty(conditionMap)){
             //閫夋嫨鐨勫璞$被鍨�
@@ -2411,11 +2604,16 @@
         }
         String fromWhere = String.format(" from PLUILAYOUT ui where %s ", where);
         String fromWhereOrderBy = String.format(" %s order by ui.plname", fromWhere);
-        String sql = String.format("select * from(" +
-                "  select row_.*,rownum rownum_ from( " +
-                "         select ui.plname, ui.plcode %s" +
-                "  ) row_ " +
-                ") where rownum_ >= %d and rownum_ <= %d ", fromWhereOrderBy, start, end);
+        String sql = "";
+        if(end != -1){
+            sql = String.format("select * from(" +
+                    "  select row_.*,rownum rownum_ from( " +
+                    "  select ui.plname, ui.plcode %s" +
+                    "  ) row_ " +
+                    ") where rownum_ >= %d and rownum_ <= %d ", fromWhereOrderBy, start, end);
+        }else{
+            sql = String.format("select ui.plname, ui.plcode %s", fromWhereOrderBy);
+        }
         List<PLUILayout> list = new LinkedList<PLUILayout>();
         String[][] kvss = platformClientUtil.getQueryService().queryBySqlWithoutKey(sql);
         for(String[] kvs : kvss){
@@ -2444,8 +2642,11 @@
      */
     public DataGrid<PortalVI> getPortalVIDatasByPage(BaseQueryObject baseQueryObject) throws PLException{
         PortalVI[] datas = null;
-        int start = baseQueryObject.getPage() <= 1 ? 1 : (baseQueryObject.getPage() - 1) * baseQueryObject.getLimit() + 1;
-        int end = baseQueryObject.getPage() <= 1 ? baseQueryObject.getLimit() : (baseQueryObject.getPage() * baseQueryObject.getLimit());
+
+        int start = baseQueryObject.getPage();
+        int end = baseQueryObject.getLimit();
+        /*int start = baseQueryObject.getPage() <= 1 ? 1 : (baseQueryObject.getPage() - 1) * baseQueryObject.getLimit() + 1;
+        int end = baseQueryObject.getPage() <= 1 ? baseQueryObject.getLimit() : (baseQueryObject.getPage() * baseQueryObject.getLimit());*/
 
         String where = " 1=1 ";
 
@@ -2468,11 +2669,16 @@
 
         String fromWhere = String.format(" from plportalvi vi where %s ", where);
         String fromWhereOrderBy = String.format(" %s order by vi.viname", fromWhere);
-        String sql = String.format("select * from(" +
-                "  select row_.*,rownum rownum_ from( " +
-                "         select vi.viname,vi.vitype  %s" +
-                "  ) row_ " +
-                ") where rownum_ >= %d and rownum_ <= %d ", fromWhereOrderBy, start, end);
+        String sql = "";
+        if(end != -1){
+            sql = String.format("select * from(" +
+                    "  select row_.*,rownum rownum_ from( " +
+                    "         select vi.viname,vi.vitype  %s" +
+                    "  ) row_ " +
+                    ") where rownum_ >= %d and rownum_ <= %d ", fromWhereOrderBy, start, end);
+        }else{
+            sql = String.format("select vi.viname,vi.vitype  %s", fromWhereOrderBy);
+        }
         List<PortalVI> list = new LinkedList<>();
         String[][] kvss = platformClientUtil.getQueryService().queryBySqlWithoutKey(sql);
         for(String[] kvs : kvss){
@@ -2501,8 +2707,11 @@
      */
     public DataGrid<QTInfo> getQTInfoDatasByPage(BaseQueryObject baseQueryObject) throws PLException{
         QTInfo[] datas = null;
-        int start = baseQueryObject.getPage() <= 1 ? 1 : (baseQueryObject.getPage() - 1) * baseQueryObject.getLimit() + 1;
-        int end = baseQueryObject.getPage() <= 1 ? baseQueryObject.getLimit() : (baseQueryObject.getPage() * baseQueryObject.getLimit());
+
+        int start = baseQueryObject.getPage();
+        int end = baseQueryObject.getLimit();
+        /*int start = baseQueryObject.getPage() <= 1 ? 1 : (baseQueryObject.getPage() - 1) * baseQueryObject.getLimit() + 1;
+        int end = baseQueryObject.getPage() <= 1 ? baseQueryObject.getLimit() : (baseQueryObject.getPage() * baseQueryObject.getLimit());*/
 
         String where = " 1=1 ";
 
@@ -2522,11 +2731,16 @@
 
         String fromWhere = String.format(" from PL_QTEMPLATE qt where %s ", where);
         String fromWhereOrderBy = String.format(" %s order by qt.qtname ", fromWhere);
-        String sql = String.format("select * from(" +
-                "  select row_.*,rownum rownum_ from( " +
-                "         select qt.qtname,qt.btmname  %s" +
-                "  ) row_ " +
-                ") where rownum_ >= %d and rownum_ <= %d ", fromWhereOrderBy, start, end);
+        String sql = "";
+        if(end != -1){
+            sql = String.format("select * from(" +
+                    "  select row_.*,rownum rownum_ from( " +
+                    "         select qt.qtname,qt.btmname  %s" +
+                    "  ) row_ " +
+                    ") where rownum_ >= %d and rownum_ <= %d ", fromWhereOrderBy, start, end);
+        }else{
+            sql = String.format("select qt.qtname,qt.btmname  %s", fromWhereOrderBy);
+        }
         List<QTInfo> list = new LinkedList<QTInfo>();
         String[][] kvss = platformClientUtil.getQueryService().queryBySqlWithoutKey(sql);
         for(String[] kvs : kvss){
@@ -2545,6 +2759,390 @@
         res.setData(Arrays.asList(datas));
         res.setTotal(total);
         return res;
+    }
+
+    /**
+     * 閫氳繃涓氬姟绫诲瀷鑾峰彇UI涓婁笅鏂囧寘鍚叾涓嬪叧鑱旂殑鍖哄煙瀹氫箟>椤甸潰瀹氫箟绛夋墍鏈夊叧鑱旀暟鎹紝褰掔撼鎴恡ree缁撴瀯
+     * @param btmName 涓氬姟绫诲瀷鍚嶇О
+     * @param level 鏌ヨ鍒伴偅涓眰绾т负姝紙ui銆乼ab銆乸ageDef锛�
+     * @return
+     */
+    public Tree getAllLevelTreeByBtm(String btmName,String level) throws PLException {
+        VciBaseUtil.alertNotNull(btmName,"涓氬姟绫诲瀷缂栧彿",level,"鏌ヨ灞傜骇");
+        Tree resTree = new Tree();
+        resTree.setText("UI涓婁笅鏂囬�夐」");
+        resTree.setId("UILayout");
+        resTree.setLeaf(false);
+        resTree.setLevel(1);
+        String level1Oid = ObjectUtility.getNewObjectID36();
+        resTree.setOid(level1Oid);
+
+        PLUILayout[] pluiLayouts = platformClientUtil.getUIService().getPLUILayoutsByRelatedType(btmName);
+        if(Func.isEmpty(pluiLayouts)){
+            return resTree;
+        }
+        //鏍规嵁鏌ヨ鐨勫眰绾т笉鍚屽喅瀹氭槸鍚﹁繑鍥�
+        List<Tree> uiChildrenTree = new ArrayList<>();
+        
+        Arrays.stream(pluiLayouts).forEach(item->{
+            Tree uiTree = new Tree();
+            uiTree.setLeaf(level.equals("ui"));
+            uiTree.setLevel(2);
+            uiTree.setId(item.plCode);
+            uiTree.setOid(item.plOId);
+            uiTree.setText(item.plCode + "(" + item.plName + ")");
+            uiTree.setParentId(level1Oid);
+            List<Tree> tabChildren = null;
+            if(!level.equalsIgnoreCase("ui")){
+                try {
+                    tabChildren = this.getTabChildren(item.plOId, level);
+                } catch (PLException e) {
+                    e.printStackTrace();
+                    String exceptionMessage = "鏌ヨ椤电鏃跺嚭鐜伴敊璇細"+VciBaseUtil.getExceptionMessage(e);
+                    logger.error(exceptionMessage);
+                    throw new VciBaseException(exceptionMessage);
+                }
+                uiTree.setChildren(tabChildren);
+            }
+            uiChildrenTree.add(uiTree);
+        });
+
+        resTree.setChildren(uiChildrenTree);
+        return resTree;
+    }
+
+    /**
+     * 鍏嬮殕椤电
+     * @param uiCloneVO
+     * @return
+     * @throws Throwable
+     */
+    @Override
+    public BaseResult clonetabPage(UICloneVO uiCloneVO) throws Throwable {
+        VciBaseUtil.alertNotNull(uiCloneVO,"鍏嬮殕瀵硅薄",uiCloneVO.getFromOId(),"婧愬叧鑱旂殑UI瀹氫箟瀵硅薄鐨勪富閿�");
+        //婧愬叧鑱斿璞$殑涓婚敭(UI瀹氫箟鐨勪富閿�)
+        String fromOId = uiCloneVO.getFromOId();
+        //鍏嬮殕鍒伴偅涓猆I瀹氫箟涓�
+        String toOId = uiCloneVO.getToOId();
+        //琚厠闅嗙殑瀵硅薄涓婚敭
+        Map<String, String> cloneParamMap = uiCloneVO.getCloneParam();
+        String sourceOId = cloneParamMap.get("sourceOId");
+        if(Func.isBlank(sourceOId)){
+            return BaseResult.fail("鏈粠璇锋眰鍙傛暟涓幏鍙栧埌锛屾簮瀵硅薄涓婚敭锛侊紒");
+        }
+        //鍒ゆ柇鏄惁鏈夌洰鏍囦富閿紝濡傛灉娌℃湁灏辫鏄庢槸鍏嬮殕鍒板綋鍓嶉〉绛句笅
+        if(Func.isBlank(toOId)){
+            toOId = fromOId;
+        }
+        //鏌ヨ琚厠闅嗙殑椤电瀹氫箟
+        PLTabPage tabPage = this.platformClientUtil.getUIService().getPLTabPageById(sourceOId);
+        if(Func.isEmpty(tabPage) || Func.isBlank(tabPage.plOId)){
+            return BaseResult.fail("鏍规嵁婧愬璞′富閿湭鏌ヨ鍒版簮瀵硅薄锛岃鍒锋柊鍚庨噸璇曪紒锛�");
+        }
+        //鍦ㄥ厠闅嗙殑鐩爣UI瀹氫箟涓嬪悓涓�鍖哄煙杩涜椤电鍚嶇О銆佺紪鍙枫�佸簭鍙锋煡閲嶅鐞�
+        String copyObjName = tabPage.plName;//鍚嶇О
+        String copyObjCode = tabPage.plCode;//缂栧彿
+        String copyObjSeq = String.valueOf(tabPage.plSeq);//搴忓彿
+        PLTabPage[] tabPages = platformClientUtil.getUIService().getTabPagesByContextIdAndType(toOId, tabPage.plAreaType);//鍚屼竴鍖哄煙涓嬬殑
+        if (Func.isNotEmpty(tabPages)) {
+            Map<String, Short> toTabPageDefMap = Arrays.stream(tabPages).collect(Collectors.toMap(item -> item.plName, item -> item.plSeq));
+            //while寰幆鍑簍oPageDefMap涓嶅瓨鍦ㄧ殑澶嶅埗瀵硅薄鍚�
+            int i = 1;
+            int i1 = 1;
+            String name = tabPage.plName;
+            while(true){
+                copyObjName = name + "_copy(" + i++ + ")";
+                if (!toTabPageDefMap.containsValue(copyObjName)) {
+                    break;
+                }
+            }
+            Set<String> tabPageCodes = Arrays.stream(tabPages).map(item -> item.plCode).collect(Collectors.toSet());
+            String code = tabPage.plCode;
+            while(true){
+                copyObjCode = code + "_copy(" + i1++ + ")";
+                if (!tabPageCodes.contains(copyObjCode)) {
+                    break;
+                }
+            }
+            //鑾峰彇鍒皏alues鐨勬渶澶у��
+            Short currentSeq = toTabPageDefMap.values().stream().max(Comparator.naturalOrder()).get();
+            copyObjSeq = String.valueOf(currentSeq+1);
+        }
+        //淇敼鍏宠仈鐨刄I瀹氫箟涓婚敭銆佸悕绉般�佺紪鍙枫�佸簭鍙�
+        tabPage.plContextOId = toOId;
+        //鏂扮殑鍏嬮殕瀵硅薄涓婚敭
+        String newOId = ObjectUtility.getNewObjectID36();
+        tabPage.plOId = newOId;
+        tabPage.plName = copyObjName;
+        tabPage.plCode = copyObjCode;
+        tabPage.plSeq = Short.parseShort(copyObjSeq);
+        SessionInfo sessionInfo = WebThreadLocalUtil.getCurrentUserSessionInfoInThread();
+        tabPage.plCreateUser = sessionInfo.getUserId();
+        tabPage.plModifyUser = sessionInfo.getUserId();
+        long currentTimeMillis = System.currentTimeMillis();
+        tabPage.plCreateTime = currentTimeMillis;
+        tabPage.plModifyTime = currentTimeMillis;
+        boolean resTabPage = this.platformClientUtil.getUIService().savePLTabPage(tabPage);
+        if(!resTabPage){
+            return BaseResult.fail("椤甸潰瀹氫箟淇濆瓨澶辫触锛侊紒");
+        }
+        //淇濆瓨鎴愬姛闇�瑕佽�冭檻鍒颁箣鍓嶄笉瀛樺湪鐨勫尯鍩燂紝鍏嬮殕涔嬪悗瀛樺湪浜嗗氨闇�瑕佹敼鍙樺搴斿尯鍩熺殑鏍囪瘑
+        PLUILayout pluiLayout = this.platformClientUtil.getUIService().getPLUILayoutById(toOId);
+        if(Func.isNotEmpty(pluiLayout)){
+            if(tabPage.plAreaType == 1){
+                //瀵艰埅鍖�
+                pluiLayout.plIsShowNavigator = 1;
+            }else if(tabPage.plAreaType == 2){
+                //鎺у埗鍖�
+                pluiLayout.plIsShowForm = 1;
+            }else {
+                //鎿嶄綔鍖�
+                pluiLayout.plIsShowTab = 1;
+            }
+        }
+        this.platformClientUtil.getUIService().updatePLUILayout(pluiLayout);
+
+        //鏌ヨ椤甸潰瀹氫箟
+        PLPageDefination[] pageDefinations = platformClientUtil.getUIService().getPLPageDefinationsByPageContextOId(sourceOId);
+        if (Func.isEmpty(pageDefinations)) {
+            return BaseResult.success("椤电瀹氫箟鍏嬮殕鎴愬姛锛侊紒");
+        }
+        String oldPageDefOId = "";
+        boolean resPageDef = false;
+        for (int i = 0; i < pageDefinations.length; i++) {
+            PLPageDefination pageDef = pageDefinations[i];
+            pageDef.plTabPageOId = newOId;
+            String newPageDefOId = ObjectUtility.getNewObjectID36();
+            oldPageDefOId = pageDef.plOId;//璁板綍涓嬫棫鐨勪富閿�
+            pageDef.plOId = newPageDefOId;
+            resPageDef = platformClientUtil.getUIService().savePLPageDefination(pageDef);
+            if(!resPageDef){
+                return BaseResult.success("鍏嬮殕椤甸潰瀹氫箟鍑洪敊锛侊紒");
+            }
+            //鏌ヨ鎸夐挳杩涜淇濆瓨
+            List<PLTabButtonVO> tabButtons = this.getTabButtons(oldPageDefOId);
+            if(Func.isNotEmpty(tabButtons)){
+                tabButtons.stream().forEach(buttonVO->{
+                    try {
+                        this.modifyButtonOIdsAndCopy(buttonVO,newPageDefOId,ObjectUtility.getNewObjectID36());
+                    } catch (PLException e) {
+                        e.printStackTrace();
+                        String exceptionMessage = "鍏嬮殕鎸夐挳閰嶇疆鏃跺嚭鐜伴敊璇紝鍘熷洜锛�"+VciBaseUtil.getExceptionMessage(e);
+                        logger.error(exceptionMessage);
+                        throw new VciBaseException(exceptionMessage);
+                    }
+                });
+            }
+        }
+        return BaseResult.success("椤电瀹氫箟鍏嬮殕鎴愬姛锛侊紒");
+    }
+
+    /**
+     * 鍏嬮殕椤甸潰瀹氫箟
+     * @param uiCloneVO
+     * @return
+     * @throws Throwable
+     */
+    @Override
+    public BaseResult clonePageDef(UICloneVO uiCloneVO) throws Throwable {
+        VciBaseUtil.alertNotNull(uiCloneVO,"鍏嬮殕瀵硅薄",uiCloneVO.getFromOId(),"婧愬叧鑱斿璞$殑涓婚敭");
+        //婧愬叧鑱斿璞$殑涓婚敭
+        String fromOId = uiCloneVO.getFromOId();
+        //鍏嬮殕鍒伴偅涓〉绛句笅锛歵abOid
+        String toOId = uiCloneVO.getToOId();
+        //琚厠闅嗙殑瀵硅薄涓婚敭
+        Map<String, String> cloneParamMap = uiCloneVO.getCloneParam();
+        String sourceOId = cloneParamMap.get("sourceOId");
+        if(Func.isBlank(sourceOId)){
+            return BaseResult.fail("鏈粠璇锋眰鍙傛暟涓幏鍙栧埌锛屾簮瀵硅薄涓婚敭锛侊紒");
+        }
+        //鍒ゆ柇鏄惁鏈夌洰鏍囦富閿紝濡傛灉娌℃湁灏辫鏄庢槸鍏嬮殕鍒板綋鍓嶉〉绛句笅
+        if(Func.isBlank(toOId)){
+            toOId = fromOId;
+        }
+        //鏌ヨ琚厠闅嗙殑椤甸潰瀹氫箟瀵硅薄
+        PLPageDefination pageDefination = this.platformClientUtil.getUIService().getPLPageDefinationById(sourceOId);
+        if(Func.isEmpty(pageDefination) || Func.isBlank(pageDefination.plOId)){
+            return BaseResult.fail("鏍规嵁婧愬璞′富閿湭鏌ヨ鍒版簮瀵硅薄锛岃鍒锋柊鍚庨噸璇曪紒锛�");
+        }
+
+        String copyObjName = "";//鍚嶇О
+        String copyObjSeq = "";//缂栧彿
+        //鍏嬮殕涔嬪墠鏌ラ噸鐩爣鍏宠仈瀵硅薄涓嬬殑瀵硅薄鍚嶇О鍜岀紪鍙峰垽閲嶅鐞�
+        PLPageDefination[] pageDefinations = this.platformClientUtil.getUIService().getPLPageDefinationsByPageContextOId(toOId);
+        if (Func.isNotEmpty(pageDefinations)) {
+            Map<String, Short> toPageDefMap = Arrays.stream(pageDefinations).collect(Collectors.toMap(item -> item.name, item -> item.seq));
+            //while寰幆鍑簍oPageDefMap涓嶅瓨鍦ㄧ殑澶嶅埗瀵硅薄鍚�
+            int i = 1;
+            String name = pageDefination.name;
+            while(true){
+                copyObjName = name + "_copy(" + i++ + ")";
+                if (!toPageDefMap.containsValue(copyObjName)) {
+                    break;
+                }
+            }
+
+            //鑾峰彇鍒皏alues鐨勬渶澶у��
+            Short currentSeq = toPageDefMap.values().stream().max(Comparator.naturalOrder()).get();
+            copyObjSeq = String.valueOf(currentSeq+1);
+        }
+        //淇敼鍏宠仈鐨勯〉绛句富閿拰鍚嶇О缂栧彿
+        pageDefination.plTabPageOId = toOId;
+        String newOId = ObjectUtility.getNewObjectID36();
+        pageDefination.plOId = newOId;
+        pageDefination.name = copyObjName;
+        pageDefination.seq = Short.parseShort(copyObjSeq);
+        //淇濆瓨椤甸潰瀹氫箟
+        boolean resPageDef = platformClientUtil.getUIService().savePLPageDefination(pageDefination);
+        if(!resPageDef){
+            return BaseResult.fail("椤电瀹氫箟淇濆瓨澶辫触锛侊紒");
+        }
+        //鏌ヨ椤甸潰涓嬬殑鎸夐挳
+        List<PLTabButtonVO> tabButtonVOS = this.getTabButtons(sourceOId);
+        if(Func.isEmpty(tabButtonVOS)){
+            return BaseResult.success("椤甸潰瀹氫箟鍏嬮殕鎴愬姛锛侊紒");
+        }
+        //鍒濆鍖杝essionInfo灞炴��
+        SessionInfo sessionInfo = WebThreadLocalUtil.getCurrentUserSessionInfoInThread();
+        //寰幆鍏嬮殕鎸夐挳锛堝悓鏃朵細瀵规寜閽殑鐖跺瓙绾у叧绯诲拰鎸夐挳涓嬬殑鍙傛暟杩涜淇濆瓨锛�
+        tabButtonVOS.stream().forEach(buttonVO->{
+            try {
+                this.modifyButtonOIdsAndCopy(buttonVO,newOId,ObjectUtility.getNewObjectID36());
+            } catch (PLException e) {
+                e.printStackTrace();
+                String exceptionMessage = "鍏嬮殕鎸夐挳閰嶇疆鏃跺嚭鐜伴敊璇紝鍘熷洜锛�"+VciBaseUtil.getExceptionMessage(e);
+                logger.error(exceptionMessage);
+                throw new VciBaseException(exceptionMessage);
+            }
+        });
+        return BaseResult.success("椤甸潰瀹氫箟鍏嬮殕鎴愬姛锛侊紒");
+    }
+
+    /**
+     * 鍏嬮殕鎸夐挳锛堝瓨鍦ㄧ埗瀛愮粨鏋勫叧绯汇�佸叧鑱旀暟鎹寜閽弬鏁帮級
+     * @param uiCloneVO
+     * @return
+     * @throws Throwable
+     */
+    @Override
+    public BaseResult cloneTabButton(UICloneVO uiCloneVO) throws Throwable {
+        VciBaseUtil.alertNotNull(uiCloneVO,"鍏嬮殕瀵硅薄",uiCloneVO.getFromOId(),"婧愬叧鑱斿璞′富閿�");
+        String fromOId = uiCloneVO.getFromOId();
+        String toOId = uiCloneVO.getToOId();
+        //鍏堟煡璇㈡簮瀵硅薄
+        //PLTabButton tabButton = platformClientUtil.getUIService().getPLTabButtonById(fromOId);
+        String sourceOId = uiCloneVO.getCloneParam().get("sourceOId");
+        if(Func.isBlank(sourceOId)){
+            return BaseResult.fail("鏈粠璇锋眰鍙傛暟涓幏鍙栧埌锛屾簮瀵硅薄涓婚敭锛侊紒");
+        }
+        //鍒ゆ柇鏄惁鏈夌洰鏍囦富閿紝濡傛灉娌℃湁灏辫鏄庢槸鍏嬮殕鍒板綋鍓嶉〉闈笅
+        if(Func.isBlank(toOId)){
+            toOId = fromOId;
+        }
+        //鍒ゆ柇鍓嶇鏄惁浼犱簡鍏嬮殕鍚嶈繃鏉ワ紙鎸夐挳杩欒竟涓嶉渶瑕佸悕绉般�佺紪鍙峰垽閲嶏紝鎵�浠ヨ繖涓�鍧楀効閫昏緫蹇界暐锛�
+        //鎸夐挳鍏锋湁鐖跺瓙绾у叧绯伙紝鎵�浠ヨ繕闇�瑕佸仛oid鍜宲arentOId澶勭悊
+        List<PLTabButtonVO> tabButtons = this.getTabButtons(fromOId);//TODO:杩欏効娑夊強鍒拌浆VO鎿嶄綔鍜屽瓙鎸夐挳鏌ヨ鐨勬搷浣滄墍浠ュ緢鎱�
+        PLTabButtonVO filterTabButton = tabButtons.stream()
+                .filter(item -> item.getOId().equals(sourceOId)).findFirst().orElse(null);
+        if(Func.isEmpty(filterTabButton)){
+            return BaseResult.fail("鏍规嵁婧愬璞′富閿湭鏌ヨ鍒版簮瀵硅薄锛岃鍒锋柊鍚庨噸璇曪紒锛�");
+        }
+        SessionInfo sessionInfo = WebThreadLocalUtil.getCurrentUserSessionInfoInThread();
+
+        //鏀瑰彉button瀵硅薄鐨刼id鍜宲arentOId
+        this.modifyButtonOIdsAndCopy(filterTabButton,toOId,ObjectUtility.getNewObjectID36());
+
+        return BaseResult.success("鎸夐挳澶嶅埗鎴愬姛锛�");
+    }
+
+    /**
+     * 淇敼oId鍜宲arentOid锛屼笉鏀瑰彉鐖跺瓙绾э紙oid鍙樻崲parentOId涔熼渶瑕佽窡鐫�鍙樻崲锛夌粨鏋勶紝骞朵繚瀛樻寜閽拰鍏跺弬鏁�
+     * @param button 闇�瑕佷慨鏀逛富閿繚瀛樼殑鎸夐挳瀵硅薄
+     * @param toOId 鎸夐挳鍏宠仈鐨勯〉闈㈠畾涔塷id
+     * @param newOId 鏂扮殑鎸夐挳瀵硅薄涓婚敭
+     * @throws PLException
+     */
+    private void modifyButtonOIdsAndCopy(PLTabButtonVO button,String toOId, String newOId) throws PLException {
+        if (button == null) {
+            return;
+        }
+
+        // 淇敼褰撳墠鑺傜偣鐨刼Id
+        button.setOId(newOId);
+        SessionInfo sessionInfo = WebThreadLocalUtil.getCurrentUserSessionInfoInThread();
+        //寮�濮嬩繚瀛樻寜閽拰鍙傛暟
+        button.setCreateUser(sessionInfo.getUserId());
+        button.setModifyUser(sessionInfo.getUserId());
+        button.setTableOId(toOId);
+        PLTabButton plTabButton = this.tabButtonVO2TabButton(new PLTabButton(), button);
+        boolean res = platformClientUtil.getUIService().savePLTabButton(plTabButton);
+        if(!res){
+            throw new PLException("500",new String[]{"鎸夐挳閰嶇疆澶嶅埗澶辫触锛�"});
+        }
+        this.saveButtonParams(button.getButtonParams(),button.getOId());
+
+        // 閫掑綊閬嶅巻瀛愯妭鐐�
+        if (button.getChildren() != null) {
+            for (PLTabButtonVO child : button.getChildren()) {
+                // 瀛愬璞$殑 parentOid 璁剧疆涓哄綋鍓嶈妭鐐圭殑鏂皁id
+                child.setParentOid(button.getOId());  // 纭繚瀛愬璞$殑parentOid鎸囧悜褰撳墠鐨刼id
+                modifyButtonOIdsAndCopy(child,toOId, ObjectUtility.getNewObjectID36());
+            }
+        }
+    }
+
+    /**
+     * 鑾峰彇椤电杩欎竴灞傜殑鍏宠仈鏁版嵁
+     * @return
+     */
+    private List<Tree> getTabChildren(String uiLayoutOid,String level) throws PLException {
+        List<Tree> tabChildren = new ArrayList<>();
+        if(Func.isNotBlank(uiLayoutOid)){
+            PLTabPage[] tabPages = platformClientUtil.getUIService().getPLTabPagesByPageDefinationOId(uiLayoutOid);
+            Arrays.stream(tabPages).forEach(tabPage->{
+                Tree tabTree = new Tree();
+                tabTree.setLeaf(level.equals("tab"));
+                tabTree.setLevel(2);
+                tabTree.setId(tabPage.plCode);
+                tabTree.setOid(tabPage.plOId);
+                tabTree.setText(tabPage.plCode + "(" + tabPage.plName + ")");
+                tabTree.setParentId(uiLayoutOid);
+                if(!level.equalsIgnoreCase("tab")){
+                    try {
+                        tabTree.setChildren(this.getPageDefChildren(tabPage.plOId));
+                    } catch (PLException e) {
+                        e.printStackTrace();
+                        String exceptionMessage = "鏌ヨ椤甸潰瀹氫箟鏃跺嚭鐜伴敊璇細"+VciBaseUtil.getExceptionMessage(e);
+                        logger.error(exceptionMessage);
+                        throw new VciBaseException(exceptionMessage);
+                    }
+                }
+                tabChildren.add(tabTree);
+            });
+        }
+        return tabChildren;
+    }
+
+    /**
+     * 鑾峰彇椤甸潰瀹氫箟杩欎竴灞傜殑鍏宠仈鏁版嵁
+     * @return
+     */
+    private List<Tree> getPageDefChildren(String tabPageOid) throws PLException {
+        List<Tree> pageDefChildren = new ArrayList<>();
+        if(Func.isNotBlank(tabPageOid)){
+            PLPageDefination[] pageDefs = platformClientUtil.getUIService().getPLPageDefinationsByPageContextOId(tabPageOid);
+            Arrays.stream(pageDefs).forEach(pageDef->{
+                Tree tabTree = new Tree();
+                tabTree.setLeaf(true);
+                tabTree.setLevel(2);
+                tabTree.setId(pageDef.name);
+                tabTree.setOid(pageDef.plOId);
+                tabTree.setText(pageDef.name + "(" + pageDef.desc + ")");
+                tabTree.setParentId(tabPageOid);
+                pageDefChildren.add(tabTree);
+            });
+        }
+        return pageDefChildren;
     }
 
     //鍩虹鍏叡妫�鏌ユ帴鍙�
@@ -2745,11 +3343,10 @@
          */
         protected boolean checkQTIsExist(String tip, String txtQTName, String txtType) throws PLException {
             boolean res = false;
-
             String sql = "select count(1) count_ from PL_QTEMPLATE qt " +
                     "where qt.btmname ='" + txtType.trim() + "' " +
                     "and qt.qtname='" + txtQTName.trim() + "'";
-
+            res = checkCountNotEqualZero(sql);
             if(!res){
                 throw new PLException("500",
                         new String[]{String.format("%s %s 鏃犳晥锛�", tip, txtQTName)});
@@ -2934,7 +3531,7 @@
          */
         private boolean checkLinkTypeInputIsOk(String txtVIName/*閫夋嫨鐨勬ā鏉�*/,String txtQTName/*鏌ヨ妯℃澘*/,String btmType) throws PLException {
             boolean res = false;
-            if(!(this.checkBtmTypeTxtIsOk("鐩爣瀵硅薄", linkType,true))){
+            if(!(this.checkLinkTypeTxtIsOk("鐩爣瀵硅薄", linkType,true))){
                 res = false;
             } else if(!(this.checkPortalVITxtIsOk("閫夋嫨妯℃澘", txtVIName, linkType,true))){
                 res = false;
@@ -3007,6 +3604,7 @@
             d.setSearchTarger(searchTarger);
             d.setShowType(btmType);
             d.setTemplateId(txtVIName);
+            d.setOrientation("positive");
             d.setQueryTemplateName(txtQTName);
             d.setExpandCols(expandCols);
             d.setExpandMode(expandMode);
@@ -3104,6 +3702,7 @@
             d.setShowType(btmType);
             d.setLinkType(linkType);
             d.setTemplateId(queryTemplateName);
+            d.setOrientation("positive");
             d.setRootContent(showExpressionRoot.trim());
             d.setShowAbs(showExpression.trim());
             d.setShowLinkAbs(refTreeSet.trim());
@@ -3119,7 +3718,7 @@
                 return res;
             }
             // 閾炬帴绫诲瀷涓嶄负绌烘椂锛岄渶瑕佸悓鏃舵鏌ラ摼鎺ョ被鍨嬪強閾炬帴绫诲瀷涓嬬殑鏌ヨ妯℃澘鏄惁鏈夋晥
-            if(Func.isBlank(linkType)){
+            if(Func.isNotBlank(linkType)){
                 if(!(super.checkLinkTypeTxtIsOk("閾炬帴绫诲瀷", linkType,false))){
                     res = false;
                     return res;

--
Gitblit v1.9.3