From 19ec0269a9ce3a57ccfcd1d36585bb1c31977b60 Mon Sep 17 00:00:00 2001
From: ludc <ludc@vci-tech.com>
Date: 星期五, 10 一月 2025 10:25:22 +0800
Subject: [PATCH] ui定义为树或树表时默认设置orientation为positive

---
 Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/UIManagerServiceImpl.java | 1817 +++++++++++++++++++++++++++++++++++++++++++++++++--------
 1 files changed, 1,547 insertions(+), 270 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 0faef25..572c517 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
@@ -1,50 +1,51 @@
 package com.vci.web.service.impl;
 
-import com.alibaba.fastjson.JSON;
 import com.vci.common.utility.ObjectUtility;
 import com.vci.corba.common.PLException;
+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.*;
 import com.vci.dto.RoleRightDTO;
 import com.vci.dto.UIAuthorDTO;
 import com.vci.model.PLDefination;
 import com.vci.pagemodel.*;
-import com.vci.starter.poi.bo.WriteExcelData;
-import com.vci.starter.poi.bo.WriteExcelOption;
+import com.vci.starter.poi.bo.*;
 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.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 org.springframework.web.multipart.MultipartFile;
+
 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
  */
@@ -56,6 +57,12 @@
      */
     @Resource
     private PlatformClientUtil platformClientUtil;
+
+    /**
+     * 缂撳瓨宸ュ叿
+     */
+    @Resource
+    private RedisService redisService;
 
     /***
      * 鏄惁鏄鐞嗗憳
@@ -75,22 +82,22 @@
     private Logger logger = LoggerFactory.getLogger(getClass());
 
     /**
+     * 瀵煎叆鏁版嵁鐨剆heet闆嗗悎
+     */
+    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()));
         }
     };
 
@@ -127,7 +134,7 @@
     }
 
     /**
-     * ton閫氳繃涓氬姟绫诲瀷鍜屽悕绉版煡璇�
+     * 閫氳繃涓氬姟绫诲瀷鍜屽悕绉版煡璇�
      * @param btemName
      * @param context
      * @return
@@ -136,14 +143,14 @@
     public List<PLUILayout> getUIContextDataByBtName(String btemName,String context) throws PLException {
         VciBaseUtil.alertNotNull(btemName,"涓氬姟绫诲瀷");
         List<PLUILayout> pluiLayoutList=new ArrayList<>();
-        List<String> contextList= VciBaseUtil.str2List(context);
+        List<String> contextList= new ArrayList<>();
         if(StringUtils.isNotBlank(context)){
             contextList=VciBaseUtil.str2List(context);
         }else{
             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) {
@@ -423,14 +430,17 @@
                         //鍖哄煙瀹氫箟
                         tpDataList.add(new WriteExcelData(tpRow.get(),0, tabPage.plOId));
                         tpDataList.add(new WriteExcelData(tpRow.get(),1, tabPage.plSeq));
-                        tpDataList.add(new WriteExcelData(tpRow.get(),2, tabPage.plLabel));
-                        tpDataList.add(new WriteExcelData(tpRow.get(),3, tabPage.plName));
-                        tpDataList.add(new WriteExcelData(tpRow.get(),4, tabPage.plContextOId));
-                        tpDataList.add(new WriteExcelData(tpRow.get(),5, tabPage.plIsOpen));
-                        tpDataList.add(new WriteExcelData(tpRow.get(),6, tabPage.plOpenExpression));
-                        tpDataList.add(new WriteExcelData(tpRow.get(),7, tabPage.plUIParser));
-                        tpDataList.add(new WriteExcelData(tpRow.get(),8, tabPage.plExtAttr));
-                        tpDataList.add(new WriteExcelData(tpRow.get(),9, tabPage.plDesc));
+                        tpDataList.add(new WriteExcelData(tpRow.get(),2, tabPage.plCode));
+                        tpDataList.add(new WriteExcelData(tpRow.get(),3, tabPage.plLabel));
+                        tpDataList.add(new WriteExcelData(tpRow.get(),4, tabPage.plName));
+                        tpDataList.add(new WriteExcelData(tpRow.get(),5, tabPage.plContextOId));
+                        tpDataList.add(new WriteExcelData(tpRow.get(),6, tabPage.plAreaType));
+                        tpDataList.add(new WriteExcelData(tpRow.get(),7, tabPage.plIsOpen));
+                        tpDataList.add(new WriteExcelData(tpRow.get(),8, tabPage.plOpenExpression));
+                        tpDataList.add(new WriteExcelData(tpRow.get(),9, tabPage.plUIParser));
+                        tpDataList.add(new WriteExcelData(tpRow.get(),10, tabPage.plExtAttr));
+                        tpDataList.add(new WriteExcelData(tpRow.get(),11, tabPage.plDesc));
+                        tpDataList.add(new WriteExcelData(tpRow.get(),12, tabPage.plLicensOrs));
                         tpRow.getAndIncrement();
                         try {
                             PLPageDefination[] plPageDefinations = platformClientUtil.getUIService().getPLPageDefinationsByPageContextOId(tabPage.plOId);
@@ -501,27 +511,349 @@
     /**
      * 瀵煎叆UI涓婁笅鏂�
      * @param file
+     * @param isCovered 鏄惁瑕嗙洊
+     * @param selectBtm 閫夋嫨鐨勪笟鍔$被鍨�
      * @return
      */
     @Override
-    public BaseResult impUIContextData(MultipartFile file) {
+    public BaseResult impUIContextData(File file,boolean isCovered,String selectBtm) {
+        if(!isCovered){
+            VciBaseUtil.alertNotNull(file,"excel鏂囦欢");
+            if(!file.exists()){
+                throw new VciBaseException("瀵煎叆鐨別xcel鏂囦欢涓嶅瓨鍦�,{0}",new String[]{file.getPath()});
+            }
+        }
 
+        try {
+            List<SheetDataSet> sheetDataSets = null;
+            SessionInfo sessionInfo = WebThreadLocalUtil.getCurrentUserSessionInfoInThread();
+            //鏄鐩栨搷浣滐紝鎵�浠ョ洿鎺ヨ鍙�
+            if(isCovered){
+                sheetDataSets = redisService.getCacheList(IMPORTUIKEY + sessionInfo.getUserId());
+                if(Func.isEmpty(sheetDataSets)){
+                    throw new VciBaseException("浠庣紦瀛樹腑鏈幏鍙栧埌瀵煎叆鐨勬暟鎹紝璇峰埛鏂板悗閲嶈瘯锛侊紒");
+                }
+            }else{
+                //璇诲彇excel琛�
+                ReadExcelOption readExcelOption = new ReadExcelOption();
+                readExcelOption.setReadAllSheet(true); //璇诲彇鍏ㄩ儴鐨剆heet
+                sheetDataSets = ExcelUtil.readDataObjectFromExcel(file,SheetDataSet.class,readExcelOption);
+            }
 
+            PLUILayout[] plpagelayoutdefinations = null;
 
+            SheetDataSet plpagelayoutdefnationsheet = sheetDataSets.get(0);
+            SheetDataSet pltabpagesheet = sheetDataSets.get(1);
+            SheetDataSet plpagedefinationsheet = sheetDataSets.get(2);
+            SheetDataSet pltabbuttonsheet = sheetDataSets.get(3);
+            SheetDataSet plcommondparamsheet = sheetDataSets.get(4);
 
-        return null;
+            Map<PLUILayout,List<PLTabPage>> pdMap = new HashMap<>();
+            Map<PLTabPage,List<PLPageDefination>> tdMap = new HashMap<>();
+            Map<PLPageDefination,List<PLTabButton>> dbMap = new HashMap<>();
+            Map<PLTabButton,List<PLCommandParameter>> bcMap = new HashMap<>();
+
+            List<PLUILayout> plpagelayoutdefinationList = new ArrayList<>();
+            List<PLTabPage> pltabpagelist = new ArrayList<>();
+            List<PLPageDefination> plpagedefinationlist = new ArrayList<>();
+            List<PLTabButton> pltabbuttonlist = new ArrayList<>();
+            List<PLCommandParameter> plcommandparameterlist = new ArrayList<>();
+
+            /*StringBuffer checkplpagelayoutdefination = new StringBuffer();
+            StringBuffer checkplpagelayoutdefinationPlcode = new StringBuffer();*/
+            StringBuffer plActionIDNulls = new StringBuffer();
+
+            //add by caill start 鍒濆鍖栨爣璁�
+            int count=0;
+            int preCount=0;
+            String preOID="";
+            String doublePreOID="";
+            String plpageLayoutDefinationId="";
+            String plPageContextOId="";
+            String plCommandOId="";
+            String plTableOId="";
+
+            //add by caill end
+            PLAction[] allPLAction = platformClientUtil.getUIService().getAllPLAction();
+            Map<String,String> relation = null;
+            List<SheetRowData> rowData = plpagelayoutdefnationsheet.getRowData();
+            for(int i=0; i<rowData.size(); i++){
+                pltabpagelist = new ArrayList<PLTabPage>();
+                PLUILayout p = new PLUILayout();
+                //HSSFRow readrow = plpagelayoutdefnationsheet.getRowData();
+                Map<Integer, String> dataMap = rowData.get(i).getData();
+                if(Func.isEmpty(dataMap)){
+                    break;
+                }
+                //鏍规嵁涓氬姟绫诲瀷鏌ヨui涓婁笅鏂�
+                plpagelayoutdefinations = platformClientUtil.getUIService().getPLUILayoutsByRelatedType(selectBtm);
+
+                p.plOId = ObjectUtility.getNewObjectID36();
+                p.plCode = dataMap.get(1);
+                p.plName = dataMap.get(2);
+                //add by caill start
+                //閬嶅巻UI鍚嶇О
+                for(PLUILayout pd : plpagelayoutdefinations){
+                    if(pd.plName.equals(p.plName) && !isCovered){
+                        //濡傛灉鐢ㄦ埛閫夋嫨瑕嗙洊锛岀浜屾璋冪敤灏变笉浼氫紶瀵煎叆鏂囦欢锛屾墍浠ヨ繖閲屽瓨鍏ョ紦瀛�
+                        redisService.setCacheList(IMPORTUIKEY+sessionInfo.getUserId(),sheetDataSets);
+                        //璁剧疆杩囨湡鏃堕棿涓�5鍒嗛挓锛屽洜涓轰竴鑸儏鍐典笅涓嶄細璇存槸绛夊お涔�
+                        redisService.expire(IMPORTUIKEY+sessionInfo.getUserId(),5, TimeUnit.MINUTES);
+                        throw new VciBaseException(pd.plName+"鍚嶇О宸茬粡瀛樺湪,鏄惁瑕嗙洊?");
+                    }
+                    //鏍规嵁UI涓婁笅鏂囧仛鍒ゆ柇
+                    if(pd.plCode.equals(p.plCode)){
+                        count=1;
+                        preOID=pd.plOId;  //濡傛灉UI涓婁笅鏂囩浉鍚岋紝灏辨妸绯荤粺涓殑id璧嬪�肩粰鏂板鍏ョ殑id
+                        p.plOId=pd.plOId;
+                    }
+                }
+                //add by caill end
+                plpageLayoutDefinationId = dataMap.get(0);
+                String name = dataMap.get(3);
+                p.plRelatedType = dataMap.get(3);
+                p.plIsShowNavigator = Short.parseShort(dataMap.get(4));
+                p.plIsShowTab = Short.parseShort(dataMap.get(5));
+                p.plIsShowForm = Short.parseShort(dataMap.get(6));
+                //閫夋嫨鐨勫拰瀵煎叆鐨勪笟鍔$被鍨嬭妭鐐逛笉涓�鑷�
+                if(!selectBtm.equals(name)){
+                    throw new VciBaseException("璇烽�夋嫨瑕佸鍏ョ殑绫诲瀷鑺傜偣鍚嶇О锛�");
+                }
+
+                plpagelayoutdefinationList.add(p);
+
+                //鍖哄煙瀹氫箟sheet澶勭悊
+                List<SheetRowData> tabPageRowData = pltabpagesheet.getRowData();
+                if(Func.isNotEmpty(tabPageRowData)){
+                    for(int j=0; j<tabPageRowData.size(); j++){
+                        plpagedefinationlist = new ArrayList<PLPageDefination>();
+                        PLTabPage pt = new PLTabPage();
+                        Map<Integer, String> tabPageDataMap = tabPageRowData.get(j).getData();
+                        if(Func.isEmpty(tabPageDataMap)){
+                            break;
+                        }
+                        pt.plOId = ObjectUtility.getNewObjectID36();
+                        pt.plCode = tabPageDataMap.get(2);
+                        pt.plName = tabPageDataMap.get(4);
+                        //add by caill start
+                        if(count==1) {
+                            PLTabPage[] PLTabPages = platformClientUtil.getUIService().getPLTabPagesByPageDefinationOId(preOID);
+                            //閬嶅巻鎺у埗鍖鸿〃鏍�
+                            for(PLTabPage pl : PLTabPages){
+                                if(pl.plCode.equals(pt.plCode)){
+                                    pt.plOId=pl.plOId; //濡傛灉鎺у埗鍖鸿〃鏍肩殑缂栫爜鍜屽鍏ョ殑缂栫爜涓�鏍凤紝灏辨妸鎺у埗鍖篿d璧嬪�肩粰鏂板鍏ョ殑id
+                                    preCount=1;
+                                    doublePreOID=pl.plOId;
+                                }
+                            }
+                        }
+                        //add by caill end
+                        pt.plSeq = Short.parseShort(tabPageDataMap.get(1));
+                        pt.plLabel = tabPageDataMap.get(3);
+                        pt.plContextOId = tabPageDataMap.get(5);
+                        pt.plAreaType = Short.parseShort(tabPageDataMap.get(6));
+                        pt.plIsOpen = Short.parseShort(tabPageDataMap.get(7));
+                        pt.plOpenExpression = tabPageDataMap.get(8);
+                        pt.plUIParser = tabPageDataMap.get(9);
+                        pt.plExtAttr = tabPageDataMap.get(10);
+                        pt.plDesc = tabPageDataMap.get(11);
+                        pt.plLicensOrs = tabPageDataMap.get(12);
+                        plPageContextOId = tabPageDataMap.get(5);
+                        if(pt.plContextOId.equals(plpageLayoutDefinationId)){
+                            pt.plContextOId = p.plOId;
+                            pltabpagelist.add(pt);
+                            //椤甸潰璁捐澶勭悊
+                            List<SheetRowData> pagedefinationRowData = plpagedefinationsheet.getRowData();
+                            if(Func.isNotEmpty(pagedefinationRowData)){
+                                for(int k=0;k<pagedefinationRowData.size();k++){
+                                    pltabbuttonlist = new ArrayList<>();
+                                    PLPageDefination plpagedefination  = new PLPageDefination();
+                                    Map<Integer, String> pagedefinationDataMap = pagedefinationRowData.get(k).getData();
+
+                                    if(Func.isEmpty(pagedefinationDataMap)){
+                                        break;
+                                    }
+                                    plpagedefination.plOId = ObjectUtility.getNewObjectID36();
+                                    plpagedefination.name = pagedefinationDataMap.get(3);
+                                    //add by caill start
+                                    //鏈�鍚庝竴绾х殑鍒ゆ柇
+                                    if(preCount==1) {
+                                        PLPageDefination[] PLPageDefinations = platformClientUtil.getUIService().getPLPageDefinationsByPageContextOId(doublePreOID);
+                                        for(PLPageDefination plp : PLPageDefinations) {
+                                            if(plp.name.equals(plpagedefination.name)) {
+                                                plpagedefination.plOId=plp.plOId;
+
+                                            }
+
+                                        }
+                                    }
+                                    //add by caill end
+                                    plpagedefination.plDefination = pagedefinationDataMap.get(6);
+                                    plpagedefination.seq = Short.parseShort(pagedefinationDataMap.get(5));
+                                    plpagedefination.plTabPageOId = pagedefinationDataMap.get(1);
+                                    plpagedefination.desc = pagedefinationDataMap.get(4);
+                                    plpagedefination.plType = Short.parseShort(pagedefinationDataMap.get(2));
+                                    plTableOId = pagedefinationDataMap.get(1);
+                                    if(plpagedefination.plTabPageOId.equals(plPageContextOId)){
+                                        plpagedefination.plTabPageOId = pt.plOId;
+                                        plpagedefinationlist.add(plpagedefination);
+                                        //淇濆瓨鏂版棫oid鐨勫叧绯伙紝鍦ㄧ‘瀹氬眰绾у叧绯绘椂浣跨敤
+                                        relation = new HashMap<String,String>();
+                                        List<SheetRowData> tabbuttonRowData = pltabbuttonsheet.getRowData();
+                                        if(Func.isNotEmpty(tabbuttonRowData)){
+                                            for(int a=0;a<tabbuttonRowData.size();a++){
+                                                Map<Integer, String> tabbuttonDataMap = tabbuttonRowData.get(a).getData();
+                                                if(Func.isNotEmpty(tabbuttonDataMap)){
+                                                    plCommandOId = tabbuttonDataMap.get(1);
+                                                    String newOId = ObjectUtility.getNewObjectID36();
+                                                    relation.put(plCommandOId, newOId);
+                                                }
+                                            }
+                                            for(int a=0;a<tabbuttonRowData.size();a++){
+                                                plcommandparameterlist = new ArrayList<PLCommandParameter>();
+                                                PLTabButton plTabButton = new PLTabButton();
+                                                Map<Integer, String> tabbuttonDataMap = tabbuttonRowData.get(a).getData();
+                                                if(Func.isEmpty(tabbuttonDataMap)){
+                                                    break;
+                                                }
+                                                plTabButton.plOId = ObjectUtility.getNewObjectID36();
+                                                plTabButton.plLabel = tabbuttonDataMap.get(4);
+                                                plTabButton.plAreaType = tabbuttonDataMap.get(5);
+                                                plTabButton.plTableOId = tabbuttonDataMap.get(1);
+                                                plTabButton.plSeq = Short.parseShort(tabbuttonDataMap.get(7));
+                                                String plActionId = "";
+                                                //PLAction[] allPLAction = Tool.getService().getAllPLAction();
+                                                for(PLAction action : allPLAction){
+                                                    if((tabbuttonDataMap.get(3)!=null&&!"".equals(tabbuttonDataMap.get(3))
+                                                    )&&(tabbuttonDataMap.get(3).trim().equals(action.plCode.trim()))
+                                                    ){
+                                                        plActionId = action.plOId;
+                                                        break;
+                                                    }
+                                                }
+                                                if(plActionId==null||"".equals(plActionId)){
+                                                    if(!plActionIDNulls.toString().contains(tabbuttonDataMap.get(3))){
+                                                        plActionIDNulls.append("\n\tAction缂栧彿:"+tabbuttonDataMap.get(3));
+                                                    }
+                                                }
+                                                plTabButton.plActionOId = plActionId;
+                                                plTabButton.plAreaType = tabbuttonDataMap.get(5);
+                                                plTabButton.plDesc = tabbuttonDataMap.get(6);
+                                                String parentOid = tabbuttonDataMap.get(8);//鐖秓id
+                                                plCommandOId = tabbuttonDataMap.get(1);
+                                                plTabButton.displayMode = tabbuttonDataMap.get(9);
+                                                plTabButton.iconPath = tabbuttonDataMap.get(10);
+                                                plTabButton.authorization = tabbuttonDataMap.get(11);
+                                                plTabButton.show = tabbuttonDataMap.get(12);
+
+                                                //璧嬩簣淇濆瓨濂界殑鍊硷紝鏉ヤ繚璇佸眰绾у叧绯讳笉浼氫涪澶�
+                                                plTabButton.plOId = relation.get(plCommandOId);
+                                                if(parentOid != null && parentOid.length() > 0) {
+                                                    plTabButton.plParentOid =
+                                                            relation.get(parentOid) == null ? "" : relation.get(parentOid);
+                                                }
+                                                if(plTabButton.plTableOId.equals(plTableOId)){
+                                                    plTabButton.plTableOId = plpagedefination.plOId;
+                                                    pltabbuttonlist.add(plTabButton);
+                                                    List<SheetRowData> commondparamsRowData = plcommondparamsheet.getRowData();
+                                                    if(Func.isNotEmpty(commondparamsRowData)){
+                                                        for(int b=0;b<commondparamsRowData.size();b++){
+                                                            PLCommandParameter plCommandParameter = new PLCommandParameter();
+                                                            Map<Integer, String> commandParameterDataMap = commondparamsRowData.get(b).getData();
+                                                            if(Func.isEmpty(commandParameterDataMap)){
+                                                                break;
+                                                            }
+                                                            plCommandParameter.plOId = ObjectUtility.getNewObjectID36();
+                                                            plCommandParameter.plCommandOId = commandParameterDataMap.get(1);
+                                                            plCommandParameter.plKey = commandParameterDataMap.get(2);
+                                                            plCommandParameter.plValue = commandParameterDataMap.get(3);
+                                                            if(plCommandParameter.plCommandOId.equals(plCommandOId)){
+                                                                plCommandParameter.plCommandOId = plTabButton.plOId;
+                                                                plcommandparameterlist.add(plCommandParameter);
+                                                            }
+                                                        }
+                                                        bcMap.put(plTabButton, plcommandparameterlist);
+                                                    }
+                                                }
+                                            }
+                                            dbMap.put(plpagedefination, pltabbuttonlist);
+                                        }
+                                    }
+                                }
+                                tdMap.put(pt, plpagedefinationlist);
+                            }
+                        }
+                    }
+                    pdMap.put(p, pltabpagelist);
+                }
+            }
+
+            if(plActionIDNulls.length()>0){
+                throw new VciBaseException(plActionIDNulls.toString()+"涓嶅瓨鍦紒");
+            }
+
+            //鍒犻櫎鍘熸湁button鏁版嵁
+            if(tdMap.size() > 0) {
+                for(List<PLPageDefination> list : tdMap.values()) {
+                    for(PLPageDefination ppd : list) {
+                        if(ppd.plOId != null && ppd.plOId.length() > 0) {
+                            PLTabButton[] buttons = platformClientUtil.getUIService().getPLTabButtonsByTableOId(ppd.plOId);
+                            if(buttons != null && buttons.length > 0) {
+                                for(PLTabButton ptb : buttons) {
+                                    platformClientUtil.getUIService().deletePLTabButtonByID(ptb.plOId);
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+
+            for(PLUILayout plPageLayoutDefination : plpagelayoutdefinationList){
+                List<PLTabPage> pltabpagelists = pdMap.get(plPageLayoutDefination);
+                for(PLTabPage pltabpage:pltabpagelists){
+                    List<PLPageDefination> plpagedefinationlists = tdMap.get(pltabpage);
+                    for(PLPageDefination plpagedefination : plpagedefinationlists){
+                        List<PLTabButton> pltabbuttons = dbMap.get(plpagedefination);
+                        for(PLTabButton pltabbutton : pltabbuttons){
+                            List<PLCommandParameter> plcommandParams = bcMap.get(pltabbutton);
+                            for(PLCommandParameter plcommandparameter : plcommandParams){
+                                plcommandparameter.plCreateUser = sessionInfo.getUserId();
+                                plcommandparameter.plModifyUser = sessionInfo.getUserId();
+                                platformClientUtil.getUIService().savePLCommandParameter(plcommandparameter);
+                            }
+                            pltabbutton.plCreateUser = sessionInfo.getUserId();
+                            pltabbutton.plModifyUser = sessionInfo.getUserId();
+                            platformClientUtil.getUIService().savePLTabButton(pltabbutton);
+                        }
+                        platformClientUtil.getUIService().savePLPageDefination(plpagedefination);
+                    }
+                    pltabpage.plCreateUser = sessionInfo.getUserId();
+                    pltabpage.plModifyUser = sessionInfo.getUserId();
+                    platformClientUtil.getUIService().savePLTabPage(pltabpage);
+                }
+                plPageLayoutDefination.plCreateUser = sessionInfo.getUserId();
+                plPageLayoutDefination.plModifyUser = sessionInfo.getUserId();
+                platformClientUtil.getUIService().savePLUILayout(plPageLayoutDefination);
+            }
+            return BaseResult.success("UI涓婁笅鏂囧鍏ユ垚鍔燂紒");
+        } catch (PLException e) {
+            e.printStackTrace();
+            return BaseResult.success("UI涓婁笅鏂囧鍏ュけ璐�,鍘熷洜锛�"+VciBaseUtil.getExceptionMessage(e));
+        }
     }
 
     /**
-     * 鏍规嵁涓婁笅鏂嘔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;
     }
 
@@ -544,7 +876,7 @@
     }
 
     /**
-     * 淇敼鍖哄煙鏁版嵁
+     * 淇敼鍖哄煙锛堥〉绛撅級鏁版嵁
      * @param plTabPage
      * @return
      */
@@ -561,7 +893,7 @@
     }
 
     /**
-     * 鍒犻櫎鍖哄煙鏁版嵁
+     * 鍒犻櫎鍖哄煙锛堥〉绛撅級鏁版嵁
      * @param oids
      * @return
      */
@@ -714,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()
                 );
@@ -729,8 +1061,8 @@
             case "6":
                 UILayoutComptCheckInput ulci = new UILayoutComptCheckInput(
                     pdVO.getSearchTarger(),
-                    pdVO.getShowType(),
-                    pdVO.getUiLayout(),
+                    pdVO.getSubUIObjType(),
+                    pdVO.getSubUILayout(),
                     pdVO.getQueryTemplateName(),
                     pdVO.getQryType()
                 );
@@ -741,6 +1073,7 @@
                 break;
         }
 
+        d.setNavigatorType(pdVO.getNavigatorType());
         d = setEventDataToPLDefination(d,pdVO);
         //杞瑇ml璧嬪�煎埌plDefination涓�
         pd.plDefination = UITools.getPLDefinationText(d);
@@ -831,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()
                 );
@@ -846,8 +1179,8 @@
             case "6":
                 UILayoutComptCheckInput ulci = new UILayoutComptCheckInput(
                         pdVO.getSearchTarger(),
-                        pdVO.getShowType(),
-                        pdVO.getUiLayout(),
+                        pdVO.getSubUIObjType(),
+                        pdVO.getSubUILayout(),
                         pdVO.getQueryTemplateName(),
                         pdVO.getQryType()
                 );
@@ -857,7 +1190,7 @@
                 d = ulci.getNewPLDefination(d);
                 break;
         }
-
+        d.setNavigatorType(pdVO.getNavigatorType());
         d = setEventDataToPLDefination(d,pdVO);
         pd.plDefination = UITools.getPLDefinationText(d);
 
@@ -889,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());
@@ -940,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);
@@ -968,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;
     }
 
@@ -984,7 +1323,7 @@
                 continue;
             }
             if(plTabButtonVO.getParentOid().equals(plOid)){
-                plTabButtonVO.setChildren(plTabButtonVO2Children(plTabButtonVOList,plOid));
+                plTabButtonVO.setChildren(plTabButtonVO2Children(plTabButtonVOList,plTabButtonVO.getOId()));
                 plTabButtonVOS.add(plTabButtonVO);
             }
         }
@@ -1000,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();
@@ -1025,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("鎸夐挳閰嶇疆娣诲姞澶辫触锛�");
     }
 
@@ -1036,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("鎸夐挳閰嶇疆淇敼澶辫触锛�");
     }
 
@@ -1047,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銆戣寖鍥村唴銆�");
         }
@@ -1093,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();
@@ -1108,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();
@@ -1117,11 +1465,10 @@
                     platformClientUtil.getUIService().savePLCommandParameter(plCommandParameter);
                 } catch (PLException e) {
                     e.printStackTrace();
-                    throw new VciBaseException("淇濆瓨鎸夐挳淇℃伅鏃跺彂鐢熷紓甯革細"+ e.getMessage());
+                    throw new VciBaseException("淇濆瓨鎸夐挳鍙傛暟鏃跺彂鐢熷紓甯革細"+ e.getMessage());
                 }
             }
         }
-        return true;
     }
 
     /**
@@ -1130,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){
@@ -1146,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)){
@@ -1171,7 +1518,7 @@
         if(success == false) {
             return BaseResult.fail("淇敼澶辫触锛�");
         }
-        return BaseResult.fail("淇敼鎴愬姛锛�");
+        return BaseResult.success("淇敼鎴愬姛锛�");
     }
 
     /**
@@ -1349,42 +1696,58 @@
         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,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));
+            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);
+            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);
-            if(roleRightVOMap.containsKey(bizTypes[i].oid)){
-                List<PLUILayout>contextList=getUIContextDataByBtName(bizTypes[i].name,context);
-                List<Tree> btmChildList=new ArrayList<>();
-                btmChildList.add(bizTypeTree);
-                setChildNode(btmChildList,contextList,roleRightVOMap,showCheckBox);
-            }
         }
         rootNode.setChildren(childList);
         treeList.add(rootNode);
         return treeList;
     }
 
-    /***
+    /**
+     * 鏍规嵁瑙掕壊涓婚敭鑾峰彇宸叉巿鏉冪殑淇℃伅
+     * @param roleId 濡傛灉roleId涓嶄紶锛屽氨浼氳幏鍙栧綋鍓嶇櫥褰曠殑鐢ㄦ埛鐨勫悕绉版煡璇㈡潈闄�
+     * @return
+     * @throws PLException
+     */
+    @Override
+    public Map<String,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,RoleRightVO> roleRightVOMap = roleRightVOList.stream().collect(Collectors.toMap(RoleRightVO::getFuncId,roleRightVO ->roleRightVO,(oldValue,newOldValue)->oldValue));
+        return roleRightVOMap;
+    }
+
+    /**
      * UI鎺堟潈
      * @param uiAuthorDTO
      * @return
@@ -1393,7 +1756,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();
@@ -1403,82 +1766,156 @@
         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,RoleRightVO> 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 ->roleRightVO));
-            }
+            /*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,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();
+            info.modules="UI鎺堟潈";
+            info.userName = currentUserName;
+            try {
+                res = platformClientUtil.getFrameworkService().saveRoleRight(roleRightInfoList.toArray(new RoleRightInfo[]{}),uiAuthorDTO.getRoleId(),currentUserName,info);
+            }catch (PLException e){
+                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());
+    }
+
+    /**
+     *鏍规嵁鏉冮檺璁$畻涓婁笅鏉冮檺
      * @param roleOid
      * @param selectTreeList
      * @param allTreeMap
      * @param roleRightDTOList
      */
-    private void getSelectedRoleRightObjs(String roleOid,List<Tree>  selectTreeList,HashMap<String,Tree> allTreeMap,  List<RoleRightDTO> roleRightDTOList){
-        Date date=new Date();
-        Map<String,RoleRightDTO> roleRightDTOMap=new HashMap<>();
-        selectTreeList.stream().forEach(tree -> {
-            RoleRightDTO roleRightDTO=new RoleRightDTO();
-            String id=ObjectUtility.getNewObjectID36();
-            Object data=  tree.getData();
-            if(data instanceof String){
-                getRightValue(roleOid,tree,allTreeMap,false,roleRightDTOMap);//鍚戜笅鑾峰彇鎵�鏈夋ā鍧楃殑鏉冮檺鍊�
-            }else if (!(data instanceof PLTabButton)) {//涓氬姟绫诲瀷
-                getRightValue(roleOid,tree,allTreeMap,true,roleRightDTOMap);//鍚戜笂澶勭悊
-                getRightValue(roleOid,tree,allTreeMap,false,roleRightDTOMap);//鍚戜笅澶勭悊锛堝寘鍚綋鍓嶈妭鐐癸級
-            }else if (data instanceof PLTabButton) {//鎸夐挳
+    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();
+                if(allTreeMap.containsKey(oid)){
+                    tree = allTreeMap.get(oid);
+                    Object data = tree.getData();
+                    if (data instanceof String) {
+                        getRightValue(roleOid, tree, allTreeMap, checkButtonList,false, roleRightDTOMap);//鍚戜笅鑾峰彇鎵�鏈夋ā鍧楃殑鏉冮檺鍊�
+                    } else if (!(data instanceof PLTabButton)) {//涓氬姟绫诲瀷
+                        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);
+                            Tree parentNode= allTreeMap.get(parrentId);
+                            String funcId = parentNode.getOid();
+                            getRightValue(roleOid, parentNode, allTreeMap, checkButtonList, true, roleRightDTOMap);//鍚戜笂澶勭悊璇ユ搷浣滅埗绾х殑涓婄骇妯″潡鏉冮檺(涓嶅寘鍚埗鑺傜偣)
+                            if(!roleRightDTOMap.containsKey(funcId)){
+                                RoleRightDTO roleRightDTO = new RoleRightDTO();
+                                roleRightDTO.setId(ObjectUtility.getNewObjectID36());//涓婚敭
+                                roleRightDTO.setFuncId(funcId);
+                                if(isDeveloper) {
+                                    //鏉冮檺绫诲瀷 鏉冮檺绫诲瀷锛岃秴绾х鐞嗗憳缁欑鐞嗗憳鎺堟潈涓�1锛岀鐞嗗憳缁欐櫘閫氱敤鎴锋巿鏉冧负2
+                                    roleRightDTO.setRightType((short) 1);
+                                }else{
+                                    roleRightDTO.setRightType((short) 2);
+                                }
+                                roleRightDTO.setRightValue(countRightValue(parentNode,checkButtonList,false));// 鏉冮檺鍊硷紝娌℃湁鎿嶄綔鐨勬ā鍧楁潈闄愬�煎瓨鍌ㄤ负0
+                                roleRightDTO.setRoleId(roleOid);//瑙掕壊ID
+                                roleRightDTO.setCreateUser(currentUserName);//鍒涘缓鑰�
+                                roleRightDTO.setCreateTime(VciDateUtil.date2Str(new Date(),""));//鍒涘缓鏃堕棿
+                                roleRightDTO.setModifyUser(currentUserName);//淇敼鑰�
+                                roleRightDTO.setModifyTime(VciDateUtil.date2Str(new Date(),""));//淇敼鏃堕棿
+                                roleRightDTO.setLicensor("");
+                                if(!roleRightDTOMap.containsKey(funcId)){
+                                    roleRightDTOMap.put(funcId, roleRightDTO);
+                                }
+                                roleRightDTOMap.put(funcId, roleRightDTO);
+                            }
+                        }
 
+                    }
 
-
+                }
+            });
+          /*  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());
+            roleRightDTOList.addAll(newRoleRightDTOList);
+        }
     }
 
     /**
      * 鑾峰彇鏉冮檺
      * @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 parentOid=node.getParentId();
-        if(allTreeMap.containsKey(parentOid)){
-            String id=ObjectUtility.getNewObjectID36();
-            Tree parentNode =allTreeMap.get(parentOid);
-            Object parentData=  parentNode.getData();
-            if(isUp) {//鍚戜笂鑾峰彇锛屽瓨鍌ㄦ瘡涓笂绾фā鍧楃殑鏉冮檺鍊�
-                while (!"root".equals(parentNode.getData())){
+        String id=ObjectUtility.getNewObjectID36();
+        Object data=node.getData();
+        if(isUp) {//鍚戜笂鑾峰彇锛屽瓨鍌ㄦ瘡涓笂绾фā鍧楃殑鏉冮檺鍊�
+            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 (parentData instanceof BizType) {
-                        BizType bizType = (BizType) parentData;
+                    if (data instanceof BizType) {
+                        BizType bizType = (BizType) data;
                         funcId = bizType.name;
-                    } else if (parentData instanceof PLUILayout) {
-                        PLUILayout context = (PLUILayout)parentData;
+                    } else if (data instanceof PLUILayout) {
+                        PLUILayout context = (PLUILayout)data;
                         funcId = context.plOId;
-                    } else if (parentData instanceof PLTabPage) {
-                        PLTabPage tab = (PLTabPage) parentData;
+                    } else if (data instanceof PLTabPage) {
+                        PLTabPage tab = (PLTabPage) data;
                         funcId = tab.plOId;
-                    } else if (parentData instanceof PLPageDefination){
-                        PLPageDefination pageDef = (PLPageDefination) parentData;
+                    } else if (data instanceof PLPageDefination){
+                        PLPageDefination pageDef = (PLPageDefination) data;
                         funcId = pageDef.plOId;
-                    } else if (parentData instanceof PLTabButton) {
-                        PLTabButton but = (PLTabButton)parentData;
+                    } else if (data instanceof PLTabButton) {
+                        PLTabButton but = (PLTabButton)data;
                         funcId = but.plOId;
                     }
                     RoleRightDTO roleRightDTO = new RoleRightDTO();
@@ -1492,74 +1929,77 @@
                     roleRightDTO.setRightValue(1);// 鏉冮檺鍊硷紝娌℃湁鎿嶄綔鐨勬ā鍧楁潈闄愬�煎瓨鍌ㄤ负0
                     roleRightDTO.setRoleId(roleId);//瑙掕壊ID
                     roleRightDTO.setCreateUser(currentUserName);//鍒涘缓鑰�
-                    roleRightDTO.setCreateTime(new Date());//鍒涘缓鏃堕棿
+                    roleRightDTO.setCreateTime(VciDateUtil.date2Str(new Date(),""));//鍒涘缓鏃堕棿
                     roleRightDTO.setModifyUser(currentUserName);//淇敼鑰�
-                    roleRightDTO.setModifyTime(new Date());//淇敼鏃堕棿
+                    roleRightDTO.setModifyTime(VciDateUtil.date2Str(new Date(),""));//淇敼鏃堕棿
                     roleRightDTO.setLicensor("");
                     if(!rightMap.containsKey(funcId)){
                         rightMap.put(funcId, roleRightDTO);
                     }
-                }
-            }else{
-                String funcId = "";
-                if(parentData instanceof String){
-                    funcId = (String)parentData;
-                } else if (parentData instanceof BizType) {
-                    BizType bizType = (BizType)parentData;
-                    funcId = bizType.name;
-                } else if (parentData instanceof PLUILayout) {
-                    PLUILayout context = (PLUILayout)parentData;
-                    funcId = context.plOId;
-                } else if (parentData instanceof PLTabPage) {
-                    PLTabPage tab = (PLTabPage) parentData;
-                    funcId = tab.plOId;
-                } else if (parentData instanceof PLPageDefination){
-                    PLPageDefination pageDef = (PLPageDefination) parentData;
-                    funcId = pageDef.plOId;
-                } else if (parentData instanceof PLTabButton) {
-                    PLTabButton but = (PLTabButton)parentData;
-                    funcId = but.plOId;
-                }
-                if(!(parentData instanceof PLPageDefination)) {//瀛愯妭鐐逛笉鏄搷浣�
-                    if(!rightMap.containsKey(funcId)&&!funcId.equals("root")){
-                        RoleRightDTO roleRightDTO = new RoleRightDTO();
-                        roleRightDTO.setFuncId(funcId);
-                        if(isDeveloper) {
-                            roleRightDTO.setRightType((short) 1);//鏉冮檺绫诲瀷 鏉冮檺绫诲瀷锛岃秴绾х鐞嗗憳缁欑鐞嗗憳鎺堟潈涓�1锛岀鐞嗗憳缁欐櫘閫氱敤鎴锋巿鏉冧负2
-                        }else{
-                            roleRightDTO.setRightType((short) 2);
-                        }
-                        roleRightDTO.setRightValue(0);//娌℃湁鎿嶄綔鐨勬ā鍧楁潈闄愬�煎瓨鍌ㄤ负0
-                        roleRightDTO.setRoleId(roleId);
-                        roleRightDTO.setCreateUser(currentUserName);
-                        roleRightDTO.setCreateTime(new Date());
-                        roleRightDTO.setModifyUser(currentUserName);
-                        roleRightDTO.setModifyTime(new Date());
-                        roleRightDTO.setLicensor("");
-                        rightMap.put(funcId, roleRightDTO);
-                    }
-                    for(int i = 0;i < parentNode.getChildren().size();i++){
-                        //瀵规瘡涓瓙鍚戜笅閫掑綊閬嶅巻
-                        getRightValue(roleId,parentNode.getChildren().get(i),allTreeMap,false,rightMap);
-                    }
-                }else {
-                    if(!rightMap.containsKey(funcId)){
-                        RoleRightDTO roleRightDTO = new RoleRightDTO();
-                        roleRightDTO.setFuncId(funcId);
-                        roleRightDTO.setRightType((short)2); // 璁剧疆UI鏉冮檺
-                        roleRightDTO.setRightValue(countRightValue(parentNode,true));//娌℃湁鎿嶄綔鐨勬ā鍧楁潈闄愬�煎瓨鍌ㄤ负0
-                        roleRightDTO.setRoleId(roleId);
-
-                        roleRightDTO.setCreateUser(currentUserName);
-                        roleRightDTO.setCreateTime(new Date());
-                        roleRightDTO.setModifyUser(currentUserName);
-                        roleRightDTO.setModifyTime(new Date());
-                        roleRightDTO.setLicensor("");
-                        rightMap.put(funcId, roleRightDTO);
+                    oid = parentNode.getParentId();
+                    if(allTreeMap.containsKey(oid)) {
+                        parentNode = allTreeMap.get(oid);
                     }
                 }
             }
+        }else {
+            String funcId = "";
+            if (data instanceof String) {
+                funcId = (String) data;
+            } else if (data instanceof BizType) {
+                BizType bizType = (BizType) data;
+                funcId = bizType.name;
+            } else if (data instanceof PLUILayout) {
+                PLUILayout context = (PLUILayout) data;
+                funcId = context.plOId;
+            } else if (data instanceof PLTabPage) {
+                PLTabPage tab = (PLTabPage) data;
+                funcId = tab.plOId;
+            } else if (data instanceof PLPageDefination) {
+                PLPageDefination pageDef = (PLPageDefination) data;
+                funcId = pageDef.plOId;
+            } else if (data instanceof PLTabButton) {
+                PLTabButton but = (PLTabButton) data;
+                funcId = but.plOId;
+            }
+            if (!(data instanceof PLPageDefination)) {//瀛愯妭鐐逛笉鏄搷浣�
+                if (!rightMap.containsKey(funcId) && !funcId.equals("root")) {
+                    RoleRightDTO roleRightDTO = new RoleRightDTO();
+                    roleRightDTO.setFuncId(funcId);
+                    if (isDeveloper) {
+                        roleRightDTO.setRightType((short) 1);//鏉冮檺绫诲瀷 鏉冮檺绫诲瀷锛岃秴绾х鐞嗗憳缁欑鐞嗗憳鎺堟潈涓�1锛岀鐞嗗憳缁欐櫘閫氱敤鎴锋巿鏉冧负2
+                    } else {
+                        roleRightDTO.setRightType((short) 2);
+                    }
+                    roleRightDTO.setRightValue(0);//娌℃湁鎿嶄綔鐨勬ā鍧楁潈闄愬�煎瓨鍌ㄤ负0
+                    roleRightDTO.setRoleId(roleId);
+                    roleRightDTO.setCreateUser(currentUserName);
+                    roleRightDTO.setCreateTime(VciDateUtil.date2Str(new Date(),""));
+                    roleRightDTO.setModifyUser(currentUserName);
+                    roleRightDTO.setModifyTime(VciDateUtil.date2Str(new Date(),""));
+                    roleRightDTO.setLicensor("");
+                    rightMap.put(funcId, roleRightDTO);
+                }
+                for (int i = 0; i < node.getChildren().size(); i++) {
+                    //瀵规瘡涓瓙鍚戜笅閫掑綊閬嶅巻
+                    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, checkButton,true));//娌℃湁鎿嶄綔鐨勬ā鍧楁潈闄愬�煎瓨鍌ㄤ负0
+                    roleRightDTO.setRoleId(roleId);
 
+                    roleRightDTO.setCreateUser(currentUserName);
+                    roleRightDTO.setCreateTime(VciDateUtil.date2Str(new Date(),""));
+                    roleRightDTO.setModifyUser(currentUserName);
+                    roleRightDTO.setModifyTime(VciDateUtil.date2Str(new Date(),""));
+                    roleRightDTO.setLicensor("");
+                    rightMap.put(funcId, roleRightDTO);
+                }
+            }
         }
     }
 
@@ -1569,12 +2009,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);//绱鍔犱笂鍚勪釜鎿嶄綔鐨勬潈闄愬��
             }
         }
@@ -1596,15 +2037,21 @@
         });
     }
 
-    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<>();
+    /**
+     * 閬嶅巻瀛愯妭鐐�
+     * @param parentTree
+     * @param contextList
+     * @param roleRightVOMap
+     * @param isShowCheckBox
+     */
+    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());
@@ -1615,19 +2062,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());
@@ -1636,66 +2077,51 @@
                         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();
@@ -1714,6 +2140,122 @@
     }
 
     /**
+     * 閬嶅巻瀛愯妭鐐�
+     * @param parentTree
+     * @param contextList
+     * @param isShowCheckBox
+     */
+    private void setChildNode(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) {//涓氬姟绫诲瀷
+                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);
+                    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);
+                }
+            }
+        });
+    }
+
+    /**
+     * UI瑙掕壊瀵硅薄杞崲
+     * @param vos
+     * @return
+     */
+    private List<RoleRightDTO> roleRightVOO2DTOS(List<RoleRightVO> vos){
+        List<RoleRightDTO> roleRightVOS=new ArrayList<>();
+        Optional.ofNullable(vos).orElseGet(()->new ArrayList<>()).stream().forEach(vo -> {
+            RoleRightDTO dto=roleRightVOO2DTO(vo);
+            roleRightVOS.add(dto);
+        });
+
+        return roleRightVOS;
+    }
+
+    /**
      * UI瑙掕壊瀵硅薄杞崲
      * @param infos
      * @return
@@ -1726,6 +2268,26 @@
         });
 
         return roleRightVOS;
+    }
+
+    /**
+     * UI瑙掕壊瀵硅薄杞崲
+     * @param dtos
+     * @return
+     */
+    private List<RoleRightInfo> roleRightDTOO2InfoS(List<RoleRightDTO> dtos){
+        List<RoleRightInfo> roleRightInfoList=new ArrayList<>();
+        Optional.ofNullable(dtos).orElseGet(()->new ArrayList<>()).stream().forEach(dto -> {
+            RoleRightInfo info= null;
+            try {
+                info = roleRightDTOO2Info(dto);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+            roleRightInfoList.add(info);
+        });
+
+        return roleRightInfoList;
     }
 
     /**
@@ -1746,6 +2308,46 @@
         vo.setModifyTime(VciDateUtil.date2Str(VciDateUtil.long2Date(info.modifyTime),""));
         vo.setModifyUser(info.modifyUser);
         return vo;
+    }
+
+    /**
+     * UI瑙掕壊瀵硅薄杞崲
+     * @param vo
+     * @return
+     */
+    private RoleRightDTO roleRightVOO2DTO(RoleRightVO vo){
+        RoleRightDTO dto=new RoleRightDTO();
+        dto.setId(vo.getId());
+        dto.setCreateTime(vo.getCreateTime());
+        dto.setCreateUser(vo.getCreateUser());
+        dto.setRoleId(vo.getRoleId());
+        dto.setRightType(vo.getRightType());
+        dto.setLicensor(vo.getLicensor());
+        dto.setRightValue(vo.getRightValue());
+        dto.setFuncId(vo.getFuncId());
+        dto.setModifyTime(vo.getModifyTime());
+        dto.setModifyUser(vo.getModifyUser());
+        return dto;
+    }
+
+    /**
+     * UI瑙掕壊瀵硅薄杞崲
+     * @param dto
+     * @return
+     */
+    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(),""));
+        info.createUser=StringUtils.isBlank(dto.getCreateUser())?"":dto.getCreateUser();
+        info.roleId=StringUtils.isBlank(dto.getRoleId())?"":dto.getRoleId();
+        info.rightType=dto.getRightType();
+        info.licensor =StringUtils.isBlank(dto.getLicensor())?"":dto.getLicensor();
+        info.rightValue=dto.getRightValue();
+        info.funcId=StringUtils.isBlank(dto.getFuncId())?"":dto.getFuncId();
+        info.modifyTime=StringUtils.isBlank(dto.getModifyTime())? new Date().getTime() :VciDateUtil.getTime(VciDateUtil.str2Date(dto.getModifyTime(),""));
+        info.modifyUser=StringUtils.isBlank(dto.getModifyUser())?"":dto.getModifyUser();
+        return info;
     }
 
     /**
@@ -1801,7 +2403,7 @@
      * @param obj
      * @throws PLException
      */
-    public void checkCodeName(PLUILayout obj) throws PLException {
+    private void checkCodeName(PLUILayout obj) throws PLException {
         PLUILayout[] plUILayouts = platformClientUtil.getUIService().getPLUILayoutsByRelatedType(obj.plRelatedType);
         int length = plUILayouts.length;
         String code = obj.plCode;
@@ -1865,6 +2467,680 @@
             }
         }
         return res;
+    }
+
+    /**
+     * 涓氬姟绫诲瀷銆佹簮瀵硅薄绫诲瀷銆侀《灞傝妭鐐规樉绀虹被鍨嬬瓑閮借皟鐢ㄨ繖涓帴鍙f煡璇�
+     * @param baseQueryObject
+     * @return
+     * @throws PLException
+     */
+    public DataGrid<BizType> getBtmDatasByPage(BaseQueryObject baseQueryObject) throws PLException{
+        BizType[] btmNames = null;
+        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 = "";
+        Map<String, String> conditionMap = baseQueryObject.getConditionMap();
+        if(Func.isNotEmpty(conditionMap)){
+            //杩囨护鏉′欢
+            String filterInputValue = conditionMap.get("filterInputValue");
+            if(Func.isNotBlank(filterInputValue)){
+                where += String.format(" and (bt.name like '%%%s%%' or bt.label like '%%%s%%')", text, text);
+            }
+        }
+
+        String fromWhere = String.format(" from plbtmtype bt where %s ", where);
+        String fromWhereOrderBy = String.format(" %s order by bt.name", fromWhere);
+        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){
+            BizType bi = new BizType();
+            bi.name = kvs[0];
+            bi.label = kvs[1];
+            list.add(bi);
+        }
+        btmNames = list.toArray(new BizType[]{});
+
+        sql = String.format("select count(1) count_ %s", fromWhere);
+        kvss = platformClientUtil.getQueryService().queryBySqlWithoutKey(sql);
+        int total = Integer.valueOf(kvss[0][0]);
+
+        DataGrid<BizType> res = new DataGrid<>();
+        res.setData(Arrays.asList(btmNames));
+        res.setTotal(total);
+        return res;
+    }
+
+    /**
+     * 鏌ヨ閾炬帴绫诲瀷涓嬫媺
+     * @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
+     * @throws PLException
+     */
+    public DataGrid<PLUILayout> getUILayoutDatasByPage(BaseQueryObject baseQueryObject) throws PLException{
+        PLUILayout[] datas = null;
+        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)){
+            //閫夋嫨鐨勫璞$被鍨�
+            String selectBtmType = conditionMap.get("selectBtmType");
+            if(selectBtmType != null){
+                where += String.format(" and ui.PLRELATEDTYPE = '%s' ", selectBtmType);
+            }
+            //杩囨护鏉′欢
+            String filterInputValue = conditionMap.get("filterInputValue");
+            if(Func.isNotBlank(filterInputValue)){
+                where += String.format(" and (ui.plname like '%%%s%%') ", filterInputValue, filterInputValue);
+            }
+        }
+        String fromWhere = String.format(" from PLUILAYOUT ui where %s ", where);
+        String fromWhereOrderBy = String.format(" %s order by ui.plname", fromWhere);
+        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){
+            PLUILayout bi = new PLUILayout();
+            bi.plName = kvs[0];
+            bi.plCode = kvs[1];
+            list.add(bi);
+        }
+        datas = list.toArray(new PLUILayout[0]);
+
+        sql = String.format("select count(1) count_ %s", fromWhere);
+        kvss = platformClientUtil.getQueryService().queryBySqlWithoutKey(sql);
+        int total = Integer.valueOf(kvss[0][0]);
+
+        DataGrid<PLUILayout> res = new DataGrid<PLUILayout>();
+        res.setData(Arrays.asList(datas));
+        res.setTotal(total);
+        return res;
+    }
+
+    /**
+     * 閫夋嫨妯℃澘涓嬫媺鏌ヨ锛坱emplateType涓鸿〃鏍笺�佽〃鍗曘�佹爲琛ㄦ椂鐨勯�夋嫨瀵硅薄涓嬫媺鏌ヨ锛�
+     * @param baseQueryObject
+     * @return
+     * @throws PLException
+     */
+    public DataGrid<PortalVI> getPortalVIDatasByPage(BaseQueryObject baseQueryObject) throws PLException{
+        PortalVI[] datas = null;
+
+        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)){
+            //閫夋嫨鐨勬簮瀵硅薄鎴栬�呮槸閫夋嫨鐨勭埗鑺傜偣鏄剧ず绫诲瀷
+            String selectBtmType = conditionMap.get("selectBtmType");
+            if(selectBtmType != null){
+                where += String.format(" and vi.typename = '%s' ", selectBtmType);
+            }
+            /*if(getPopupDialog().getPortalVIType() != null){
+                where += String.format(" and vi.vitype = %d ", getPopupDialog().getPortalVIType().getIntVal());
+            }*/
+            //杩囨护鏉′欢
+            String filterInputValue = conditionMap.get("filterInputValue");
+            if(Func.isNotBlank(filterInputValue)){
+                where += String.format(" and (vi.viname like '%%%s%%') ", filterInputValue, filterInputValue);
+            }
+        }
+
+        String fromWhere = String.format(" from plportalvi vi where %s ", where);
+        String fromWhereOrderBy = String.format(" %s order by vi.viname", fromWhere);
+        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){
+            PortalVI bi = new PortalVI();
+            bi.viName = kvs[0];
+            bi.viType = Short.valueOf(kvs[1]);
+            list.add(bi);
+        }
+        datas = list.toArray(new PortalVI[]{});
+
+        sql = String.format("select count(1) count_ %s", fromWhere);
+        kvss = platformClientUtil.getQueryService().queryBySqlWithoutKey(sql);
+        int total = Integer.valueOf(kvss[0][0]);
+
+        DataGrid<PortalVI> res = new DataGrid<>();
+        res.setData(Arrays.asList(datas));
+        res.setTotal(total);
+        return res;
+    }
+
+    /**
+     * 鏌ヨ妯℃澘涓嬫媺鏌ヨ
+     * @param baseQueryObject
+     * @return
+     * @throws PLException
+     */
+    public DataGrid<QTInfo> getQTInfoDatasByPage(BaseQueryObject baseQueryObject) throws PLException{
+        QTInfo[] datas = null;
+
+        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)){
+            //閫夋嫨鐨勬簮瀵硅薄鎴栬�呮槸閫夋嫨鐨勭埗鑺傜偣鏄剧ず绫诲瀷
+            String selectBtmType = conditionMap.get("selectBtmType");
+            if(selectBtmType != null){
+                where += String.format(" and qt.btmname = '%s' ", selectBtmType);
+            }
+            //杩囨护鏉′欢
+            String filterInputValue = conditionMap.get("filterInputValue");
+            if(Func.isNotBlank(filterInputValue)){
+                where += String.format(" and (qt.qtname like '%%%s%%') ", filterInputValue, filterInputValue);
+            }
+        }
+
+        String fromWhere = String.format(" from PL_QTEMPLATE qt where %s ", where);
+        String fromWhereOrderBy = String.format(" %s order by qt.qtname ", fromWhere);
+        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){
+            QTInfo bi = new QTInfo();
+            bi.qtName = kvs[0];
+            bi.btmName = kvs[1];
+            list.add(bi);
+        }
+        datas = list.toArray(new QTInfo[]{});
+
+        sql = String.format("select count(1) count_ %s", fromWhere);
+        kvss = platformClientUtil.getQueryService().queryBySqlWithoutKey(sql);
+        int total = Integer.valueOf(kvss[0][0]);
+
+        DataGrid<QTInfo> res = new DataGrid<QTInfo>();
+        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;
     }
 
     //鍩虹鍏叡妫�鏌ユ帴鍙�
@@ -2065,11 +3341,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)});
@@ -2254,7 +3529,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;
@@ -2327,6 +3602,7 @@
             d.setSearchTarger(searchTarger);
             d.setShowType(btmType);
             d.setTemplateId(txtVIName);
+            d.setOrientation("positive");
             d.setQueryTemplateName(txtQTName);
             d.setExpandCols(expandCols);
             d.setExpandMode(expandMode);
@@ -2424,6 +3700,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());
@@ -2439,7 +3716,7 @@
                 return res;
             }
             // 閾炬帴绫诲瀷涓嶄负绌烘椂锛岄渶瑕佸悓鏃舵鏌ラ摼鎺ョ被鍨嬪強閾炬帴绫诲瀷涓嬬殑鏌ヨ妯℃澘鏄惁鏈夋晥
-            if(Func.isBlank(linkType)){
+            if(Func.isNotBlank(linkType)){
                 if(!(super.checkLinkTypeTxtIsOk("閾炬帴绫诲瀷", linkType,false))){
                     res = false;
                     return res;

--
Gitblit v1.9.3