From 8f6576fd595f67a3b17ef2e5e8054e8f194078f7 Mon Sep 17 00:00:00 2001
From: wangting <675591594@qq.com>
Date: 星期四, 05 九月 2024 20:35:19 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/UIManagerServiceI.java                                       |   73 +
 Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/OsAttributeServiceI.java                                     |   13 
 Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/dto/QueryTemplateDTO.java                                            |  164 +++
 Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/UIEngineServiceI.java                                        |    3 
 Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/compatibility/ISmFunctionQueryService.java                 |    9 
 Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/HMSysModConfigController.java                             |   19 
 Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/OsBtmServiceI.java                                           |   10 
 Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/OsQueryTemplateController.java                            |   40 
 Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/pagemodel/MenuVO.java                                                |    7 
 Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/OsPortalVIServiceImpl.java                              |   10 
 Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/dto/LeafValueDto.java                                                |   35 
 Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/OsAttributeServiceImpl.java                             |  136 ++
 Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/dto/ConditionItemDTO.java                                            |   57 +
 Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/pagemodel/PLUILayoutCloneVO.java                                     |   38 
 Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/web/pagemodel/Tree.java                                     |   41 
 Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/WebBtmTypeController.java                                 |    1 
 Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/dto/AttributeDefDTO.java                                             |   39 
 Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/dto/QTDDTO.java                                                      |   46 +
 Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/dto/ConditionDTO.java                                                |   59 +
 Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/OsQuereyTemplateServiceI.java                                |   13 
 Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/pagemodel/RoleRightVO.java                                           |  137 +++
 Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/WebPortalVIController.java                                |   12 
 Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/OsBtmServiceImpl.java                                   |   36 
 Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/dto/QTInfoDTO.java                                                   |    2 
 Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/compatibility/impl/SmFunctionQueryServicePlatformImpl.java |  304 ++++++
 Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/UIManagerController.java                                  |  172 +++
 Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/model/RoleRightDO.java                                               |  142 +++
 Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/dto/LeafInfoDTO.java                                                 |   48 +
 Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/OsAttributeController.java                                |   24 
 Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/OsQueryTemplateImpl.java                                |  324 +++++++
 Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/UIManagerServiceImpl.java                               |  591 +++++++++++++
 31 files changed, 2,537 insertions(+), 68 deletions(-)

diff --git a/Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/dto/AttributeDefDTO.java b/Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/dto/AttributeDefDTO.java
new file mode 100644
index 0000000..91427e5
--- /dev/null
+++ b/Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/dto/AttributeDefDTO.java
@@ -0,0 +1,39 @@
+package com.vci.dto;
+
+import com.vci.corba.omd.atm.AttributeDef;
+import lombok.Data;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 灞炴�т紶杈撳璞�
+ * @author yuxc
+ * @date 2024/09/02 10:15
+ */
+@Data
+public class AttributeDefDTO implements java.io.Serializable {
+
+    /**
+     * 绂佹淇敼杩欎釜鍊�
+     */
+    private static final long serialVersionUID = 2492852474710986720L;
+    public String oid;
+    public String name;
+    public String label;
+    public String vtDataType;
+    public String defValue;
+    public String ts;
+    public String creator;
+    public long createTime;
+    public String modifier;
+    public long modifyTime;
+    public String description;
+    public String rage;
+    public String other;
+    /**
+     * 灞傛暟
+     */
+    public int layersNum;
+    public List<AttributeDefDTO> attrs = new ArrayList<>();
+}
diff --git a/Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/dto/ConditionDTO.java b/Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/dto/ConditionDTO.java
new file mode 100644
index 0000000..4d5b98e
--- /dev/null
+++ b/Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/dto/ConditionDTO.java
@@ -0,0 +1,59 @@
+package com.vci.dto;
+
+import com.vci.common.qt.object.ConditionItem;
+import lombok.Data;
+
+import java.util.Iterator;
+import java.util.Map;
+
+/**
+ * 鏉′欢浼犺緭瀵硅薄
+ * @author yuxc
+ * @date 2024/9/4
+ */
+@Data
+public class ConditionDTO {
+    private String rootCIName;
+    private Map<String, ConditionItemDTO> ciMap;
+
+    public ConditionDTO() {
+    }
+
+    public String getRootCIName() {
+        return this.rootCIName;
+    }
+
+    public void setRootCIName(String rootCIName) {
+        this.rootCIName = rootCIName;
+    }
+
+    public String getRootCINameByCIMap(Map<String, ConditionItem> ciMap) {
+        String rootCIName = "";
+        if (ciMap != null) {
+            Iterator<String> i = ciMap.keySet().iterator();
+
+            while(i.hasNext()) {
+                String ciName = (String)i.next();
+                if (rootCIName.equals("")) {
+                    rootCIName = ciName;
+                } else {
+                    int rootInt = Integer.valueOf(rootCIName.substring(2));
+                    int ciInt = Integer.valueOf(ciName.substring(2));
+                    if (ciInt > rootInt) {
+                        rootCIName = ciName;
+                    }
+                }
+            }
+        }
+
+        return rootCIName;
+    }
+
+    public Map<String, ConditionItemDTO> getCIMap() {
+        return this.ciMap;
+    }
+
+    public void setCIMap(Map<String, ConditionItemDTO> cIMap) {
+        this.ciMap = cIMap;
+    }
+}
diff --git a/Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/dto/ConditionItemDTO.java b/Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/dto/ConditionItemDTO.java
new file mode 100644
index 0000000..abe7f32
--- /dev/null
+++ b/Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/dto/ConditionItemDTO.java
@@ -0,0 +1,57 @@
+package com.vci.dto;
+
+import com.vci.common.qt.object.ChildrenInfo;
+import com.vci.common.qt.object.ConditionItem;
+import com.vci.common.qt.object.LeafInfo;
+import lombok.Data;
+
+import java.util.Iterator;
+import java.util.Map;
+
+/**
+ * 鏉′欢鍒楄〃浼犺緭瀵硅薄
+ * @author yuxc
+ * @date 2024/9/4
+ */
+@Data
+public class ConditionItemDTO {
+    private String id;
+    private LeafInfoDTO leafInfo;
+    private ChildrenInfo childrenInfo;
+    private boolean leafFlag;
+
+    public ConditionItemDTO() {
+    }
+
+    public String getId() {
+        return this.id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public LeafInfoDTO getLeafInfo() {
+        return this.leafInfo;
+    }
+
+    public void setLeafInfo(LeafInfoDTO leafInfo) {
+        this.leafInfo = leafInfo;
+    }
+
+    public ChildrenInfo getChildrenInfo() {
+        return this.childrenInfo;
+    }
+
+    public void setChildrenInfo(ChildrenInfo childrenInfo) {
+        this.childrenInfo = childrenInfo;
+    }
+
+    public boolean isLeaf() {
+        return this.leafFlag;
+    }
+
+    public void setLeafFlag(boolean leafFlag) {
+        this.leafFlag = leafFlag;
+    }
+}
diff --git a/Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/dto/LeafInfoDTO.java b/Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/dto/LeafInfoDTO.java
new file mode 100644
index 0000000..5326fb2
--- /dev/null
+++ b/Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/dto/LeafInfoDTO.java
@@ -0,0 +1,48 @@
+package com.vci.dto;
+
+import com.vci.common.qt.object.ConditionItem;
+import com.vci.common.qt.object.LeafValue;
+import lombok.Data;
+
+import java.util.Iterator;
+import java.util.Map;
+
+/**
+ * 鍙跺瓙鏉′欢浼犺緭瀵硅薄
+ * @author yuxc
+ * @date 2024/9/4
+ */
+@Data
+public class LeafInfoDTO {
+    private String clause;
+    private String operator;
+    private String type;
+    private LeafValueDto value;
+
+    public LeafInfoDTO() {
+    }
+
+    public String getClause() {
+        return this.clause;
+    }
+
+    public void setClause(String clause) {
+        this.clause = clause;
+    }
+
+    public String getOperator() {
+        return this.operator;
+    }
+
+    public void setOperator(String operator) {
+        this.operator = operator;
+    }
+
+    public LeafValueDto getValue() {
+        return this.value;
+    }
+
+    public void setValue(LeafValueDto value) {
+        this.value = value;
+    }
+}
diff --git a/Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/dto/LeafValueDto.java b/Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/dto/LeafValueDto.java
new file mode 100644
index 0000000..31e9269
--- /dev/null
+++ b/Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/dto/LeafValueDto.java
@@ -0,0 +1,35 @@
+package com.vci.dto;
+
+import lombok.Data;
+
+/**
+ * 鍙跺瓙鍊间紶杈撳璞�
+ * @author yuxc
+ * @date 2024/9/4
+ */
+@Data
+public class LeafValueDto {
+    private String ordinaryValue;
+    private QueryTemplateDTO queryTemplate;
+
+    public LeafValueDto() {
+    }
+
+    public String getOrdinaryValue() {
+        return this.ordinaryValue;
+    }
+
+    public void setOrdinaryValue(String ordinaryValue) {
+        this.ordinaryValue = ordinaryValue;
+    }
+
+    public QueryTemplateDTO getQueryTemplate() {
+        return this.queryTemplate;
+    }
+
+    public void setQueryTemplate(QueryTemplateDTO queryTemplate) {
+        this.queryTemplate = queryTemplate;
+    }
+
+
+}
diff --git a/Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/dto/QTDDTO.java b/Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/dto/QTDDTO.java
new file mode 100644
index 0000000..397138a
--- /dev/null
+++ b/Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/dto/QTDDTO.java
@@ -0,0 +1,46 @@
+package com.vci.dto;
+
+import com.vci.corba.omd.atm.AttributeDef;
+import lombok.Data;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 鏌ヨ妯℃澘浼犺緭瀵硅薄
+ * @author weidy
+ * @date 2019/10/14 17:50
+ */
+@Data
+public class QTDDTO implements java.io.Serializable {
+
+    /**
+     * 绂佹淇敼杩欎釜鍊�
+     */
+    private static final long serialVersionUID = 2492852474710986720L;
+    /**
+     * 妯℃澘鍚嶇О
+     */
+    public String name;
+    /**
+     * 鍒涘缓浜�
+     */
+    public String creator;
+    /**
+     * 鍒涘缓鏃堕棿
+     */
+    public long createTime;
+    /**
+     * 涓氬姟绫诲瀷
+     */
+    public String btmName;
+    /**
+     * 閾炬帴绫诲瀷
+     */
+    public String linkTypeName;
+    /**
+     * 鎵�閫夋嫨鏌ヨ鐨勫瓧娈靛璞�
+     */
+    public List<AttributeDefDTO> attrs = new ArrayList<>();
+}
diff --git a/Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/dto/QTInfoDTO.java b/Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/dto/QTInfoDTO.java
index 094b3db..485ebeb 100644
--- a/Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/dto/QTInfoDTO.java
+++ b/Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/dto/QTInfoDTO.java
@@ -31,7 +31,7 @@
     //鏌ヨ妯℃澘鍚�
     private String qtText;
     //鏌ヨ妯℃澘淇℃伅
-    private QueryTemplate queryTemplate;
+    private QueryTemplateDTO queryTemplate;
     //鏌ヨ鏉′欢锛屽悗绔繘琛岀浉鍏宠В鏋�
     private List<HashMap<String,String>> condition;
     private HashMap<String,Object> tree = new HashMap<>();
diff --git a/Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/dto/QueryTemplateDTO.java b/Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/dto/QueryTemplateDTO.java
new file mode 100644
index 0000000..e0036a1
--- /dev/null
+++ b/Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/dto/QueryTemplateDTO.java
@@ -0,0 +1,164 @@
+package com.vci.dto;
+
+
+import com.vci.common.qt.object.Condition;
+import com.vci.common.qt.object.OrderInfo;
+import com.vci.common.qt.object.PageInfo;
+import lombok.Data;
+import java.util.List;
+
+/**
+ * 鏌ヨ妯℃澘浼犺緭瀵硅薄
+ * @author yuxc
+ * @date 2024/8/7
+ */
+@Data
+public class QueryTemplateDTO {
+    private String id;
+    private String type;
+    private List<String> clauseList;
+    private String linkType;
+    private String btmType;
+    private boolean queryChildrenFlag = false;
+    private boolean queryISLeaf = false;
+    private boolean rightFlag = true;
+    private boolean secretFlag = true;
+    private String direction = "positive";
+    private ConditionDTO condition;
+    private int version = 0;
+    private PageInfo pageInfo;
+    private List<OrderInfo> orderInfoList;
+    private int level = 1;
+    private int recReturnMode = 1;
+
+    public QueryTemplateDTO() {
+    }
+
+    public String getLinkType() {
+        return this.linkType;
+    }
+
+    public void setLinkType(String linkType) {
+        this.linkType = linkType;
+    }
+
+    public String getBtmType() {
+        return this.btmType;
+    }
+
+    public void setBtmType(String btmType) {
+        this.btmType = btmType;
+    }
+
+    public boolean isQueryChildren() {
+        return this.queryChildrenFlag;
+    }
+
+    public void setQueryChildrenFlag(boolean queryChildrenFlag) {
+        this.queryChildrenFlag = queryChildrenFlag;
+    }
+
+    public String getId() {
+        return this.id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getType() {
+        return this.type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public List<String> getClauseList() {
+        return this.clauseList;
+    }
+
+    public void setClauseList(List<String> clauseList) {
+        this.clauseList = clauseList;
+    }
+
+    public ConditionDTO getCondition() {
+        return this.condition;
+    }
+
+    public void setCondition(ConditionDTO condition) {
+        this.condition = condition;
+    }
+
+    public int getVersion() {
+        return this.version;
+    }
+
+    public void setVersion(int version) {
+        this.version = version;
+    }
+
+    public String getDirection() {
+        return this.direction;
+    }
+
+    public void setDirection(String direction) {
+        this.direction = direction;
+    }
+
+    public PageInfo getPageInfo() {
+        return this.pageInfo;
+    }
+
+    public void setPageInfo(PageInfo pageInfo) {
+        this.pageInfo = pageInfo;
+    }
+
+    public List<OrderInfo> getOrderInfoList() {
+        return this.orderInfoList;
+    }
+
+    public void setOrderInfoList(List<OrderInfo> orderInfoList) {
+        this.orderInfoList = orderInfoList;
+    }
+
+    public int getLevel() {
+        return this.level;
+    }
+
+    public void setLevel(int level) {
+        this.level = level;
+    }
+
+    public int getRecReturnMode() {
+        return this.recReturnMode;
+    }
+
+    public void setRecReturnMode(int recReturnMode) {
+        this.recReturnMode = recReturnMode;
+    }
+
+    public boolean isQueryISLeaf() {
+        return this.queryISLeaf;
+    }
+
+    public void setQueryISLeaf(boolean queryISLeaf) {
+        this.queryISLeaf = queryISLeaf;
+    }
+
+    public boolean isRightFlag() {
+        return this.rightFlag;
+    }
+
+    public void setRightFlag(boolean rightFlag) {
+        this.rightFlag = rightFlag;
+    }
+
+    public boolean isSecretFlag() {
+        return this.secretFlag;
+    }
+
+    public void setSecretFlag(boolean secretFlag) {
+        this.secretFlag = secretFlag;
+    }
+}
diff --git a/Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/model/RoleRightDO.java b/Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/model/RoleRightDO.java
new file mode 100644
index 0000000..6c1fb38
--- /dev/null
+++ b/Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/model/RoleRightDO.java
@@ -0,0 +1,142 @@
+package com.vci.model;
+
+import com.vci.starter.web.annotation.Transient;
+import com.vci.starter.web.annotation.VciBtmType;
+import com.vci.starter.web.constant.FrameWorkLcStatusConstant;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 鐘舵�佹睜
+ * @author weidy
+ * @date 2022-2-15
+ */
+@VciBtmType(name = "UIAuthor",text = "UI鏉冮檺",tableName = "PLROLERIGHT",lifeCycle = FrameWorkLcStatusConstant.EMTYPE_LIFE_CYCLE)
+@Transient
+public class RoleRightDO implements Serializable {
+    private static final long serialVersionUID = -5073244242126466800L;
+    /**
+     * ID
+     */
+    private String id = "";
+    /**
+     *瑙掕壊ID
+     */
+    private String roleId = "";
+    /**
+     * 妯″潡ID
+     */
+    private String funcId = "";
+    /**
+     * 鏉冮檺鍊�
+     */
+    private long rightValue = -1;
+    /**
+     * 鏉冮檺绫诲瀷锛岃秴绾х鐞嗗憳缁欑鐞嗗憳鎺堟潈涓�1锛岀鐞嗗憳缁欐櫘閫氱敤鎴锋巿鏉冧负2
+     */
+    private short rightType = -1;
+
+    /**鏂板鏁版嵁鍒涘缓鑰咃紝淇敼鑰咃紝鍒涘缓鏃堕棿锛屼慨鏀规椂闂达紝鎺堟潈鑰�***/
+    private String createUser = "";
+    private Date createTime = new Date();
+    private String licensor = "";
+    private String modifyUser = "";
+    private Date modifyTime = new Date();
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getRoleId() {
+        return roleId;
+    }
+
+    public void setRoleId(String roleId) {
+        this.roleId = roleId;
+    }
+
+    public String getFuncId() {
+        return funcId;
+    }
+
+    public void setFuncId(String funcId) {
+        this.funcId = funcId;
+    }
+
+    public long getRightValue() {
+        return rightValue;
+    }
+
+    public void setRightValue(long rightValue) {
+        this.rightValue = rightValue;
+    }
+
+    public short getRightType() {
+        return rightType;
+    }
+
+    public void setRightType(short rightType) {
+        this.rightType = rightType;
+    }
+
+    public String getCreateUser() {
+        return createUser;
+    }
+
+    public void setCreateUser(String createUser) {
+        this.createUser = createUser;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    public String getLicensor() {
+        return licensor;
+    }
+
+    public void setLicensor(String licensor) {
+        this.licensor = licensor;
+    }
+
+    public String getModifyUser() {
+        return modifyUser;
+    }
+
+    public void setModifyUser(String modifyUser) {
+        this.modifyUser = modifyUser;
+    }
+
+    public Date getModifyTime() {
+        return modifyTime;
+    }
+
+    public void setModifyTime(Date modifyTime) {
+        this.modifyTime = modifyTime;
+    }
+
+    @Override
+    public String toString() {
+        return "RoleRightDTO{" +
+                "id='" + id + '\'' +
+                ", roleId='" + roleId + '\'' +
+                ", funcId='" + funcId + '\'' +
+                ", rightValue=" + rightValue +
+                ", rightType=" + rightType +
+                ", createUser='" + createUser + '\'' +
+                ", createTime=" + createTime +
+                ", licensor='" + licensor + '\'' +
+                ", modifyUser='" + modifyUser + '\'' +
+                ", modifyTime=" + modifyTime +
+                '}';
+    }
+}
diff --git a/Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/pagemodel/MenuVO.java b/Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/pagemodel/MenuVO.java
index 66328b6..06cda7c 100644
--- a/Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/pagemodel/MenuVO.java
+++ b/Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/pagemodel/MenuVO.java
@@ -3,6 +3,7 @@
 
 
 import java.io.Serializable;
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 
@@ -27,7 +28,7 @@
 	/**
 	 * 瀛愬瓩鑺傜偣
 	 */
-	private List<MenuVO> children;
+	private List<MenuVO> children = new ArrayList<>();
 
 	/**
 	 * 鏄惁鏈夊瓙瀛欒妭鐐�
@@ -143,6 +144,10 @@
 	 * 妯″潡涓嬪叧鑱旂殑鎿嶄綔绫诲瀷id
 	 */
 	private String operId;
+	/**
+	 * 鏄惁鏈夋潈闄愶紝0娌℃湁锛�1鏈�
+	 */
+	private Integer havePermission;
 
 	/**
 	 * 鍓嶇鏄惁闅愯棌
diff --git a/Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/pagemodel/PLUILayoutCloneVO.java b/Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/pagemodel/PLUILayoutCloneVO.java
new file mode 100644
index 0000000..e1c96bc
--- /dev/null
+++ b/Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/pagemodel/PLUILayoutCloneVO.java
@@ -0,0 +1,38 @@
+package com.vci.pagemodel;
+
+import com.vci.corba.portal.data.PLUILayout;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * ui涓婁笅鏂囧厠闅嗗璞�
+ * @author ludc
+ * @date 2024/9/2 12:58
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class PLUILayoutCloneVO {
+
+    /**
+     * 鍏嬮殕鐩爣涓婚敭
+     */
+    private String cloneTargetOid;
+
+    /**
+     * 鍏嬮殕鐨勬簮瀵硅薄鐨勪俊鎭�
+     */
+    private PLUILayout sourcePLUILayout;
+
+    /**
+     * 鍏嬮殕鍚嶇О
+     */
+    private String cloneName;
+
+    /**
+     * 鍏嬮殕涓婁笅鏂囩紪鐮�
+     */
+    private String cloneContextCode;
+
+}
diff --git a/Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/pagemodel/RoleRightVO.java b/Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/pagemodel/RoleRightVO.java
new file mode 100644
index 0000000..3c6ff70
--- /dev/null
+++ b/Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/pagemodel/RoleRightVO.java
@@ -0,0 +1,137 @@
+package com.vci.pagemodel;
+
+import java.io.Serializable;
+import java.util.Date;
+
+public class RoleRightVO implements Serializable {
+
+
+    private static final long serialVersionUID = 2030418807220108229L;
+    /**
+     * ID
+     */
+    private String id = "";
+    /**
+     *瑙掕壊ID
+     */
+    private String roleId = "";
+    /**
+     * 妯″潡ID
+     */
+    private String funcId = "";
+    /**
+     * 鏉冮檺鍊�
+     */
+    private long rightValue = -1;
+    /**
+     * 鏉冮檺绫诲瀷锛岃秴绾х鐞嗗憳缁欑鐞嗗憳鎺堟潈涓�1锛岀鐞嗗憳缁欐櫘閫氱敤鎴锋巿鏉冧负2
+     */
+    private short rightType = -1;
+    /**
+     * 鏉冮檺绫诲瀷
+     */
+    private String rigthTypeText="";
+
+    /**鏂板鏁版嵁鍒涘缓鑰咃紝淇敼鑰咃紝鍒涘缓鏃堕棿锛屼慨鏀规椂闂达紝鎺堟潈鑰�***/
+    private String createUser = "";
+    private String createTime = "";
+    private String licensor = "";
+    private String modifyUser = "";
+    private String modifyTime ="";
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getRoleId() {
+        return roleId;
+    }
+
+    public void setRoleId(String roleId) {
+        this.roleId = roleId;
+    }
+
+    public String getFuncId() {
+        return funcId;
+    }
+
+    public void setFuncId(String funcId) {
+        this.funcId = funcId;
+    }
+
+    public long getRightValue() {
+        return rightValue;
+    }
+
+    public void setRightValue(long rightValue) {
+        this.rightValue = rightValue;
+    }
+
+    public short getRightType() {
+        return rightType;
+    }
+
+    public void setRightType(short rightType) {
+        this.rightType = rightType;
+    }
+
+    public String getCreateUser() {
+        return createUser;
+    }
+
+    public void setCreateUser(String createUser) {
+        this.createUser = createUser;
+    }
+
+    public String getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(String createTime) {
+        this.createTime = createTime;
+    }
+
+    public String getLicensor() {
+        return licensor;
+    }
+
+    public void setLicensor(String licensor) {
+        this.licensor = licensor;
+    }
+
+    public String getModifyUser() {
+        return modifyUser;
+    }
+
+    public void setModifyUser(String modifyUser) {
+        this.modifyUser = modifyUser;
+    }
+
+    public String getModifyTime() {
+        return modifyTime;
+    }
+
+    public void setModifyTime(String modifyTime) {
+        this.modifyTime = modifyTime;
+    }
+
+    @Override
+    public String toString() {
+        return "RoleRightVO{" +
+                "id='" + id + '\'' +
+                ", roleId='" + roleId + '\'' +
+                ", funcId='" + funcId + '\'' +
+                ", rightValue=" + rightValue +
+                ", rightType=" + rightType +
+                ", createUser='" + createUser + '\'' +
+                ", createTime=" + createTime +
+                ", licensor='" + licensor + '\'' +
+                ", modifyUser='" + modifyUser + '\'' +
+                ", modifyTime=" + modifyTime +
+                '}';
+    }
+}
diff --git a/Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/web/pagemodel/Tree.java b/Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/web/pagemodel/Tree.java
index 53a3ae6..809dc3b 100644
--- a/Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/web/pagemodel/Tree.java
+++ b/Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/web/pagemodel/Tree.java
@@ -36,7 +36,19 @@
 		setOid(oid);
 		setText(text);
 	}
-	
+
+	/**
+	 * 鏋勯�犲嚱鏁�
+	 * @param oid 涓婚敭
+	 * @param text 鏍戣妭鐐规枃鏈�
+	 */
+	public Tree(String oid, String text,Object o){
+		setOid(oid);
+		setText(text);
+		setData(o);
+	}
+
+
 	/**
 	 * 涓婚敭
 	 */
@@ -63,6 +75,10 @@
 	 * 瀛愯妭鐐�
 	 */
 	private List<Tree> children = new ArrayList<Tree>();
+	/**
+	 * 灞傜骇
+	 */
+	private  int level;
 	/**
 	 * 鍥炬爣
 	 */
@@ -99,6 +115,10 @@
 	 * 鎺掑簭绱㈠紩
 	 */
 	private String index;//鎺掑簭绱㈠紩
+	/***
+	 * 褰撳墠鏁版嵁瀵硅薄
+	 */
+	private Object data;
 	
 	/**
 	 * 鍏朵粬鐨勫睘鎬�
@@ -383,6 +403,23 @@
 		}
 	}
 
+
+	public Object getData() {
+		return data;
+	}
+
+	public void setData(Object data) {
+		this.data = data;
+	}
+
+	public int getLevel() {
+		return level;
+	}
+
+	public void setLevel(int level) {
+		this.level = level;
+	}
+
 	@Override
 	public String toString() {
 		return "Tree{" +
@@ -392,6 +429,7 @@
 				", showCheckbox=" + showCheckbox +
 				", checked=" + checked +
 				", children=" + children +
+				", level=" + level +
 				", icon='" + icon + '\'' +
 				", iconCls='" + iconCls + '\'' +
 				", parentId='" + parentId + '\'' +
@@ -400,6 +438,7 @@
 				", expanded=" + expanded +
 				", href='" + href + '\'' +
 				", index='" + index + '\'' +
+				", data=" + data +
 				", attributes=" + attributes +
 				'}';
 	}
diff --git a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/compatibility/ISmFunctionQueryService.java b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/compatibility/ISmFunctionQueryService.java
index 1be0596..9f04b2f 100644
--- a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/compatibility/ISmFunctionQueryService.java
+++ b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/compatibility/ISmFunctionQueryService.java
@@ -62,6 +62,15 @@
      * @throws VciBaseException
      */
     List<MenuVO> getSysModelTreeMenuByPID(String parentId,String modeType,boolean isAll) throws VciBaseException;
+    /**
+     * 閫氳繃妯″潡ID鑾峰彇瀛愮骇鍒楄〃
+     * @param parentId
+     * @param modeType 妯″潡绫诲瀷
+     * @param isAll 鏄惁鍖呮嫭鏃犳晥鐨勬ā鍧楋紝true鍒欏寘鎷�
+     * @return
+     * @throws VciBaseException
+     */
+    List<MenuVO> getSysModelAuthTreeMenuByPID(String parentId,String modeType,boolean isAll) throws VciBaseException, PLException;
 
     int checkChildObject(String moduleId) throws VciException;
 
diff --git a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/compatibility/impl/SmFunctionQueryServicePlatformImpl.java b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/compatibility/impl/SmFunctionQueryServicePlatformImpl.java
index 8422fbc..daa7f5c 100644
--- a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/compatibility/impl/SmFunctionQueryServicePlatformImpl.java
+++ b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/compatibility/impl/SmFunctionQueryServicePlatformImpl.java
@@ -4,13 +4,11 @@
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.JSONReader;
 import com.vci.client.ClientSession;
+import com.vci.client.common.objects.RoleObject;
 import com.vci.common.exception.VciException;
 import com.vci.common.locale.LocaleDisplay;
 import com.vci.corba.common.PLException;
-import com.vci.corba.framework.data.FuncOperationInfo;
-import com.vci.corba.framework.data.FunctionInfo;
-import com.vci.corba.framework.data.OperateInfo;
-import com.vci.corba.framework.data.RoleRightInfo;
+import com.vci.corba.framework.data.*;
 import com.vci.corba.omd.data.BusinessObject;
 import com.vci.corba.portal.data.PLUILayout;
 import com.vci.frameworkcore.compatibility.ISmFunctionQueryService;
@@ -510,6 +508,49 @@
         return functionVOList.stream().sorted(Comparator.comparing(s -> s.getSort())).collect(Collectors.toList());
     }
 
+    public void findChildAuthFunctionVO(MenuVO functionVO, boolean isAll) throws PLException {
+        //0琛ㄧず娌℃湁妯″潡涔熸病鏈夋搷浣滐紝1琛ㄧず鏈夋ā鍧楋紝2琛ㄧず鏈夋搷浣�
+        long type = platformClientUtil.getFrameworkService().checkChildObject(functionVO.getId());
+        if(type == 1){
+            FunctionInfo[] funcObjs = platformClientUtil.getFrameworkService().getModuleListByParentId(functionVO.getId(), isAll);
+            for (FunctionInfo funcObj : funcObjs) {
+                MenuVO menuVO = new MenuVO();
+                menuVO.setId(funcObj.id);
+                menuVO.setSource(funcObj.image);
+                menuVO.setPath(funcObj.resourceB);
+                menuVO.setCode(funcObj.aliasName);
+                menuVO.setAlias(funcObj.aliasName);
+                menuVO.setParentId(funcObj.parentId);
+                menuVO.setChildType((int) type);
+                menuVO.setName(funcObj.name);
+                menuVO.getMeta().put("keepAlive",false);
+                menuVO.setSort((int) funcObj.seq);
+                findChildAuthFunctionVO(menuVO, isAll);
+                functionVO.getChildren().add(menuVO);
+            }
+        }else if(type == 2){
+            FuncOperationInfo[] infos = platformClientUtil.getFrameworkService().getFuncOperationByModule(functionVO.getId(), "", true);
+            for (FuncOperationInfo info : infos) {
+                MenuVO menuVO = new MenuVO();
+                menuVO.setChildType((int) type);
+                menuVO.setId(info.id);
+                menuVO.setFuncId(info.funcId);
+                menuVO.setCode(info.operIndentify);
+                menuVO.setOperId(info.operId);
+                menuVO.setName(info.operName);
+                menuVO.setAlias(info.operAlias);
+                menuVO.setRemark(info.operDesc);
+                menuVO.setSort((int) info.number);
+                menuVO.setModeType("FunctionObject");
+                menuVO.setIsValid(info.isValid);
+                menuVO.setHasChildren(false);
+                functionVO.getChildren().add(menuVO);
+            }
+        }else{
+            functionVO.setHasChildren(false);
+        }
+    }
+
     @Override
     public UIContentVO getUIContentByBtmTypeAndId(TreeQueryObject treeQueryObject, ResourceControlTypeEnum resourceControlTypeEnum) throws PLException {
         SessionInfo sessionInfo = WebUtil.getCurrentUserSessionInfoNotException();
@@ -858,4 +899,259 @@
     public void clearCache() {
 
     }
+
+
+    /**
+     * 閫氳繃妯″潡ID鑾峰彇瀛愮骇鍒楄〃
+     * @param parentId
+     * @param modeType 妯″潡绫诲瀷
+     * @param isAll 鏄惁鍖呮嫭鏃犳晥鐨勬ā鍧楋紝true鍒欏寘鎷�
+     * @return
+     * @throws VciBaseException
+     */
+    @Override
+    public List<MenuVO> getSysModelAuthTreeMenuByPID(String parentId,String modeType,boolean isAll) throws VciBaseException, PLException {
+        List<MenuVO> menuVOList = new ArrayList<>();
+//        if(Func.isBlank(parentId)){
+//            return menuVOList;
+//        }
+        SessionInfo sessionInfo = WebUtil.getCurrentUserSessionInfoNotException();
+        boolean adminOrDeveloperOrRoot = rightControlUtil.isAdminOrDeveloperOrRoot(sessionInfo.getUserId());
+        if (adminOrDeveloperOrRoot) {
+            //绯荤粺鑿滃崟
+            parentId = SYSTEMMANAGMENTNODE;
+        } else if (rightControlUtil.isThreeAdminCurUser()) {
+            //涓夊憳杩斿洖绠$悊鍔熻兘妯″潡鐩稿叧鐨勮彍鍗�
+            parentId = SYSTEMMANAGMENTNODE;
+        } else {
+            //鏅�氱敤鎴峰彧杩斿洖涓氬姟鍔熻兘妯″潡鐩稿叧鐨勮彍鍗�
+            parentId = ROOT_MENU_ID;
+        }
+        List<MenuVO> functionVOList = new ArrayList<>();
+        FunctionInfo[] moduleListByParentId = getModuleListByParentId(parentId, false);
+        for (FunctionInfo menu : moduleListByParentId) {
+            if(!menu.isValid){
+                continue;
+            }
+            MenuVO functionVO = new MenuVO();
+            functionVO.setId(menu.id);
+            functionVO.setSource(menu.image);
+            functionVO.setPath(menu.resourceB);
+            functionVO.setParentId(menu.parentId);
+            functionVO.setCode(menu.aliasName);
+            functionVO.setAlias(menu.aliasName);
+            functionVO.setName(menu.name);
+            functionVO.getMeta().put("keepAlive",false);
+            functionVO.setSort((int) menu.seq);
+            findChildAuthFunctionVO(functionVO, isAll);
+//            try {
+//                functionVO.setChildren(findChildAuthFunctionVO(menu.id));
+//            } catch (PLException e) {
+//                e.printStackTrace();
+//                String errorMsg = "鑿滃崟鏌ヨ鏃跺嚭鐜伴敊璇紝鍘熷洜锛�" + VciBaseUtil.getExceptionMessage(e);
+//                logger.error(errorMsg);
+//                throw new VciBaseException(errorMsg);
+//            }
+            if(functionVO.getChildren().size() > 0){
+                functionVO.setHasChildren(true);
+            }else {
+                functionVO.setHasChildren(false);
+            }
+            functionVOList.add(functionVO);
+        }
+        return functionVOList;
+
+
+
+//        RoleRightInfo[] userRoleRights = rightControlUtil.getRoleRightByUserName(sessionInfo.getUserId());
+//        Map<String, List<FunctionInfo>> map = rightControlUtil.getAllChildrenFunctionsByUserName(
+//                parentId, sessionInfo.getUserId(), userRoleRights);
+//
+//        if(Func.isEmpty(map.get(parentId))) {
+//            return functionVOList;
+//        }
+//        for (FunctionInfo menu : map.get(parentId)) {
+//            if(!menu.isValid){
+//                continue;
+//            }
+//            MenuVO functionVO = new MenuVO();
+//            functionVO.setId(menu.id);
+//            functionVO.setSource(menu.image);
+//            //if(StringUtils.isBlank(menu.resourceB)){
+//            //    continue;
+//            //}
+//            functionVO.setPath(menu.resourceB);
+//            functionVO.setParentId(menu.parentId);
+//            functionVO.setCode(menu.aliasName);
+//            functionVO.setAlias(menu.aliasName);
+//            functionVO.setName(menu.name);
+//            functionVO.getMeta().put("keepAlive",false);
+//            functionVO.setSort((int) menu.seq);
+////            try {
+////                functionVO.setChildren(findChildAuthFunctionVO(menu.id, map));
+////            } catch (PLException e) {
+////                e.printStackTrace();
+////                String errorMsg = "鑿滃崟鏌ヨ鏃跺嚭鐜伴敊璇紝鍘熷洜锛�" + VciBaseUtil.getExceptionMessage(e);
+////                logger.error(errorMsg);
+////                throw new VciBaseException(errorMsg);
+////            }
+//            if(functionVO.getChildren().size() > 0){
+//                functionVO.setHasChildren(true);
+//            }else {
+//                functionVO.setHasChildren(false);
+//            }
+//            functionVOList.add(functionVO);
+//        }
+//        //濡傛灉鏄紑鍙戞垨鑰呮祴璇曠敤鎴凤紝闇�鍝熻幏鍙栫郴缁熸ā鍧楅厤缃彍鍗�
+//        if(adminOrDeveloperOrRoot){
+//            //鑾峰彇棣栭〉绯荤粺妯″潡閰嶇疆鑿滃崟
+//            MenuVO menuVO = JsonConfigReader.getSysModuleConf().getSysModuleNode();
+//            if(Func.isNotEmpty(menuVO)){
+//                functionVOList.add(menuVO);
+//            }
+//        }
+//        return functionVOList.stream().sorted(Comparator.comparing(s -> s.getSort())).collect(Collectors.toList());
+
+
+
+
+
+//
+//
+//
+//
+//        boolean isFunctionObject = Func.isNotBlank(modeType) && modeType.equalsIgnoreCase("FunctionObject");
+//        if(parentId.equals("systemManagmentNode") || parentId.equals("modelManagmentNode") || isFunctionObject){
+//            int childType = this.checkChildObject(parentId);
+//            if(isFunctionObject){
+//                try {
+//                    /**鍒ゆ柇璇ユā鍧椾笅瀛愬璞℃槸妯″潡杩樻槸鎿嶄綔锛�0琛ㄧず鏃犲瓙鑺傜偣锛�1琛ㄧず鏄ā鍧楋紝2琛ㄧず鏄搷浣�**/
+//                    if(childType == 2){
+//                        try{
+//                            FuncOperationInfo[] infos = platformClientUtil.getFrameworkService().getFuncOperationByModule(parentId, "", false);
+//                            if(Func.isNotEmpty(infos.length)){
+//                                childType = this.checkChildObject(infos[0].id); //閮芥槸鍚屼竴灞傛墍浠ュ彇绗竴涓嵆鍙煡璇㈡槸浠�涔堢被鍨�
+//                                for(int i = 0;i < infos.length ;i++){
+//                                    FuncOperationInfo info = infos[i];
+//                                    MenuVO menuVO = new MenuVO();
+//                                    menuVO.setChildType(childType);
+//                                    menuVO.setId(info.id);
+//                                    menuVO.setFuncId(info.funcId);
+//                                    menuVO.setCode(info.operIndentify);
+//                                    menuVO.setOperId(info.operId);
+//                                    menuVO.setName(info.operName);
+//                                    menuVO.setAlias(info.operAlias);
+//                                    menuVO.setRemark(info.operDesc);
+//                                    menuVO.setSort((int) info.number);
+//                                    menuVO.setModeType("FunctionObject");
+//                                    menuVO.setIsValid(info.isValid);
+//                                    menuVO.setHasChildren(false);
+//                                    menuVOList.add(menuVO);
+//                                }
+//                            }
+//                        }catch (PLException e) {
+//                            e.printStackTrace();
+//                            throw new VciBaseException(String.valueOf(e.code), e.messages);
+//                        }
+//                    }else if(childType == 1){
+//                        try{
+//                            FunctionInfo[] funcInfos = platformClientUtil.getFrameworkService().getModuleListByParentId(parentId, isAll);
+//                            if(Func.isNotEmpty(funcInfos.length)){
+//                                childType = this.checkChildObject(funcInfos[0].id); //閮芥槸鍚屼竴灞傛墍浠ュ彇绗竴涓嵆鍙煡璇㈡槸浠�涔堢被鍨�
+//                                for(int i = 0;i < funcInfos.length; i++){
+//                                    FunctionInfo funcInfo = funcInfos[i];
+//                                    MenuVO menuVO = this.functionInfoToMenuVO(funcInfo);
+//                                    menuVO.setChildType(childType);
+//                                    menuVO.setModeType("FunctionObject");
+//                                    menuVOList.add(menuVO);
+//                                }
+//                            }
+//                        }catch (PLException e) {
+//                            e.printStackTrace();
+//                            throw new VciBaseException(String.valueOf(e.code),e.messages);
+//                        }
+//                    }
+//                } catch (Exception e) {
+//                    e.printStackTrace();
+//                    throw new VciBaseException("妯″潡鏌ヨ鏃跺嚭鐜伴敊璇紝鍘熷洜锛�"+VciBaseUtil.getExceptionMessage(e));
+//                }
+//            }else{
+//                try{
+//                    MenuVO parentNode = null;
+//                    //灏嗚繑鍥炵殑鑺傜偣澶栧眰濂椾笂褰撳墠鐖惰妭鐐�
+//                    if("systemManagmentNode".equals(parentId)){
+//                        parentNode = JsonConfigReader.getSysModuleConf().getSystemManagmentNode();
+//                    }else if("modelManagmentNode".equals(parentId)){
+//                        parentNode = JsonConfigReader.getSysModuleConf().getModelManagmentNode();
+//                    }
+//                    //濡傛灉鏌ヨ鐨勬槸绗竴灞傝妭鐐瑰氨闇�瑕佺洿鎺ヨ繑鍥瀞ystemManagmentNode鎴杕odelManagmentNode鑺傜偣
+//                    if(Func.isNotBlank(modeType) && modeType.equals("firstNode")){
+//                        menuVOList.add(parentNode);
+//                        return menuVOList;
+//                    }
+//                    //鏌ヨ鐨勪笁绾ц妭鐐�
+//                    FunctionInfo[] funcInfos = platformClientUtil.getFrameworkService().getModuleListByParentId(parentId, isAll);
+//                    for(int i = 0;i < funcInfos.length; i++){
+//                        FunctionInfo funcInfo = funcInfos[i];
+//                        MenuVO menuVO = this.functionInfoToMenuVO(funcInfo);
+//                        menuVO.setModeType("FunctionObject");
+//                        menuVO.setChildType(childType);
+//                        menuVOList.add(menuVO);
+//                    }
+//                    return menuVOList;
+//                }catch (PLException e) {
+//                    e.printStackTrace();
+//                    throw new VciBaseException(String.valueOf(e.code),e.messages);
+//                }
+//            }
+//        }
+//        else if(parentId.equals("operateNode")){
+//            //鍔犺浇鎵�鏈夋搷浣�
+//            try{
+//                //灏嗚繑鍥炵殑鑺傜偣澶栧眰濂椾笂褰撳墠鐖惰妭鐐�
+//                MenuVO parentNode = JsonConfigReader.getSysModuleConf().getOperateNode();
+//                //濡傛灉鏌ヨ鐨勬槸绗竴灞傝妭鐐瑰氨闇�瑕佺洿鎺ヨ繑鍥瀞ysOptionNode鑺傜偣
+//                if(Func.isNotBlank(modeType) && modeType.equals("firstNode")){
+//                    menuVOList.add(parentNode);
+//                    return menuVOList;
+//                }
+//                OperateInfo[] operateInfos = platformClientUtil.getFrameworkService().getOperateTreeList(parentId);
+//                for(int i = 0; i < operateInfos.length;i++ ){
+//                    OperateInfo operateInfo = operateInfos[i];
+//                    MenuVO menuVO = new MenuVO();
+//                    menuVO.setId(operateInfo.id);
+//                    menuVO.setName(operateInfo.name);
+//                    menuVO.setCode(operateInfo.identify);
+//                    menuVO.setAlias(operateInfo.alias);
+//                    menuVO.setCategory(2);
+//                    menuVO.setChildType(0);
+//                    menuVO.setRemark(operateInfo.desc);
+//                    menuVO.getMeta().put("keepAlive",false);
+//                    menuVO.setSort((int) operateInfo.seq);
+//                    menuVO.setModeType("operateObject");
+//                    menuVO.setHasChildren(false);
+//                    menuVOList.add(menuVO);
+//                }
+//            }catch (PLException e) {
+//                e.printStackTrace();
+//                throw new VciBaseException(String.valueOf(e.code),new String[]{VciBaseUtil.getExceptionMessage(e)});
+//            }
+//        }
+//        return null;
+//        return menuVOList.stream().sorted(Comparator.comparing(s -> s.getSort())).collect(Collectors.toList());
+    }
+
+
+    /**
+     * 閫氳繃妯″潡ID鑾峰彇瀛愮骇鍒楄〃
+     * @param parentId
+     * @param isAll 鏄惁鍖呮嫭鏃犳晥鐨勬ā鍧楋紝true鍒欏寘鎷�
+     * @return
+     * @throws VciException
+     */
+    public FunctionInfo[] getModuleListByParentId(String parentId,boolean isAll) throws PLException {
+        FunctionInfo[] funcInfos = null;
+        funcInfos = platformClientUtil.getFrameworkService().getModuleListByParentId(parentId, isAll);
+        return funcInfos;
+    }
 }
diff --git a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/HMSysModConfigController.java b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/HMSysModConfigController.java
index 01f81e0..8f42517 100644
--- a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/HMSysModConfigController.java
+++ b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/HMSysModConfigController.java
@@ -72,6 +72,25 @@
         }
     }
 
+
+    /**
+     * 鑾峰彇褰撳墠妯″潡涓嬬殑瀛愭ā鍧�
+     * @param parentId
+     * @param modeType
+     * @return
+     */
+    @GetMapping("/getSysModelAuthTreeMenuByPID")
+    public BaseResult<List<MenuVO>> getSysModelAuthTreeMenuByPID(String parentId, String modeType) {
+        try {
+            return BaseResult.dataList(functionQueryService.getSysModelAuthTreeMenuByPID(parentId,modeType,true));
+        }catch (Exception e){
+            e.printStackTrace();
+            String errorMsg = "鏌ヨ瀛愭ā鍧楁椂鍑虹幇閿欒锛屽師鍥狅細"+ VciBaseUtil.getExceptionMessage(e);
+            logger.error(errorMsg);
+            throw new VciBaseException(errorMsg);
+        }
+    }
+
     /**
      * 娣诲姞妯″潡
      * @param menuVO
diff --git a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/OsAttributeController.java b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/OsAttributeController.java
index e4a6f13..8b982bd 100644
--- a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/OsAttributeController.java
+++ b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/OsAttributeController.java
@@ -8,6 +8,8 @@
 import com.vci.starter.web.pagemodel.BaseQueryObject;
 import com.vci.starter.web.pagemodel.BaseResult;
 import com.vci.pagemodel.OsAttributeVO;
+import com.vci.starter.web.pagemodel.Tree;
+import com.vci.starter.web.pagemodel.TreeQueryObject;
 import com.vci.starter.web.util.ControllerUtil;
 import com.vci.starter.web.util.LocalFileUtil;
 import com.vci.starter.web.util.VciBaseUtil;
@@ -46,6 +48,28 @@
      */
     private Logger logger = LoggerFactory.getLogger(getClass());
 
+
+
+    /**
+     * 鑾峰彇鎵�鏈変笟鍔$被鍨嬶紙鏍戝舰缁撴瀯锛�
+     * @return 鏌ヨ缁撴灉
+     */
+    @GetMapping( "/getTreeAttributes")
+    @VciBusinessLog(operateName = "鑾峰彇灞炴�э紙鏍戝舰缁撴瀯锛�")
+    public BaseResult<List<Tree>> getTreeAttributesByBtmName(TreeQueryObject treeQueryObject){
+        try {
+            List<Tree>  trees=   attributeService.getTreeAttributesByBtmName(treeQueryObject);
+            return BaseResult.dataList(trees);
+          //  return BaseResult.tree(trees);
+        }catch (Throwable e) {
+            e.printStackTrace();
+            String exceptionMessage = "鏌ヨ涓氬姟绫诲瀷鏃跺嚭鐜伴敊璇紝鍘熷洜锛�" + VciBaseUtil.getExceptionMessage(e);
+            logger.error(exceptionMessage);
+            return BaseResult.fail(exceptionMessage);
+        }
+    }
+
+
     /**
      * 灞炴�у垪琛�
      * @param baseQueryObject 鏌ヨ瀵硅薄
diff --git a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/OsQueryTemplateController.java b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/OsQueryTemplateController.java
index c2032a4..2db280d 100644
--- a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/OsQueryTemplateController.java
+++ b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/OsQueryTemplateController.java
@@ -1,37 +1,23 @@
 package com.vci.web.controller;
 
 import com.vci.corba.common.PLException;
-import com.vci.corba.omd.ltm.LinkType;
 import com.vci.corba.omd.qtm.QTD;
 import com.vci.dto.QTInfoDTO;
-import com.vci.pagemodel.OsBtmTypeAttributeVO;
-import com.vci.pagemodel.OsBtmTypeVO;
-import com.vci.pagemodel.OsLinkTypeAttributeVO;
-import com.vci.pagemodel.OsLinkTypeVO;
-import com.vci.starter.web.annotation.controller.VciUnCheckRight;
-import com.vci.starter.web.annotation.log.VciBusinessLog;
 import com.vci.starter.web.exception.VciBaseException;
-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.util.VciBaseUtil;
-import com.vci.web.service.OsLinkTypeServiceI;
 import com.vci.web.service.OsQuereyTemplateServiceI;
-import org.apache.commons.lang3.StringUtils;
 import org.dom4j.DocumentException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.util.CollectionUtils;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.util.Arrays;
-import java.util.HashMap;
 import java.util.List;
-import java.util.stream.Collectors;
 
 /**
  * 鏌ヨ妯℃澘鐨勬帶鍒跺櫒
@@ -63,6 +49,26 @@
     public BaseResult queryTemplateList(String btmName,Boolean linkFlag){
         try {
             return quereyTemplateServiceI.queryTemplateList(btmName,linkFlag);
+        } catch (PLException e) {
+            BaseResult objectBaseResult = new BaseResult<>();
+            objectBaseResult.setCode(Integer.parseInt(e.code));
+            objectBaseResult.setMsg(Arrays.toString(e.messages));
+            return objectBaseResult;
+        }
+    }
+
+
+    /**
+     * 鏌ヨ妯℃澘鐨勫垪琛ㄦ坊鍔犱簡瀛楁鐨勭浉鍏冲睘鎬�
+     * @param btmName 绫诲瀷
+     * @param linkFlag 鏄惁閾炬帴绫诲瀷 锛歵rue 閾炬帴绫诲瀷 锛宖alse 涓氬姟绫诲瀷
+     * @param direction 姝e弽鏂瑰悜
+     * @return 鏌ヨ妯℃澘鐨勫垪琛�
+     */
+    @GetMapping("/queryTemplateListByAttr")
+    public BaseResult queryTemplateListByAttr(String btmName,Boolean linkFlag, String direction){
+        try {
+            return quereyTemplateServiceI.queryTemplateListByAttr(btmName,linkFlag,direction);
         } catch (PLException e) {
             BaseResult objectBaseResult = new BaseResult<>();
             objectBaseResult.setCode(Integer.parseInt(e.code));
@@ -277,13 +283,13 @@
 
     /**
      * 鏌ヨ鏂规鍒犻櫎
-     * @param templateNames 鏌ヨ鏂规鍚�
+     * @param names 鏌ヨ鏂规鍚�
      * @return 鎿嶄綔缁撴灉
      */
     @DeleteMapping("/deleteLinkTemplate")
-    public BaseResult deleteLinkTemplate(@RequestBody List<String> templateNames){
+    public BaseResult deleteLinkTemplate(String names){
         try {
-            return quereyTemplateServiceI.deleteLinkTemplate(templateNames);
+            return quereyTemplateServiceI.deleteLinkTemplate(names);
         } catch (PLException e) {
             BaseResult objectBaseResult = new BaseResult<>();
             objectBaseResult.setCode(Integer.parseInt(e.code));
diff --git a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/UIManagerController.java b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/UIManagerController.java
new file mode 100644
index 0000000..ad4c627
--- /dev/null
+++ b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/UIManagerController.java
@@ -0,0 +1,172 @@
+package com.vci.web.controller;
+
+import com.vci.corba.common.PLException;
+import com.vci.corba.portal.data.PLUILayout;
+import com.vci.dto.OsBtmTypeDTO;
+import com.vci.pagemodel.PLUILayoutCloneVO;
+import com.vci.starter.web.annotation.log.VciBusinessLog;
+import com.vci.starter.web.pagemodel.BaseQueryObject;
+import com.vci.starter.web.pagemodel.BaseResult;
+import com.vci.starter.web.pagemodel.Tree;
+import com.vci.starter.web.util.VciBaseUtil;
+import com.vci.web.service.OsBtmServiceI;
+import com.vci.web.service.UIManagerServiceI;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * UI瀹氫箟鎺у埗灞�
+ * @author ludc
+ * @date 2024/8/28 17:09
+ */
+@RestController
+@RequestMapping("/uiManagerController")
+public class UIManagerController {
+
+    /**
+     * 鏃ュ織
+     */
+    private Logger logger = LoggerFactory.getLogger(getClass());
+
+    /**
+     * 涓氬姟绫诲瀷鐨勬湇鍔�
+     */
+    @Autowired
+    private OsBtmServiceI btmService;
+
+    /**
+     * UI瀹氫箟鏈嶅姟
+     */
+    @Autowired
+    private UIManagerServiceI uiManagerService;
+
+    /**
+     * 涓氬姟绫诲瀷鍒楄〃鏌ヨ锛岄潪鏍戠粨鏋勶細鐢ㄤ簬UI瀹氫箟宸︿晶涓氬姟绫诲瀷鏌ヨ
+     * @param btmName
+     * @return
+     * @throws PLException
+     */
+    @GetMapping( "/getBizTree")
+    @VciBusinessLog(operateName = "涓氬姟绫诲瀷鍒楄〃(涓昏鐢ㄤ簬UI瀹氫箟涓氬姟绫诲瀷鏍戞煡璇娇鐢�)")
+    public BaseResult getBizTree(String btmName){
+        try {
+            return BaseResult.success(btmService.getBizTree(btmName));
+        }catch (Exception e) {
+            e.printStackTrace();
+            String exceptionMessage = "鑾峰彇UI瀹氫箟涓氬姟绫诲瀷鍒楄〃鏃跺嚭鐜伴敊璇紝鍘熷洜锛�" + VciBaseUtil.getExceptionMessage(e);
+            logger.error(exceptionMessage);
+            return BaseResult.fail(exceptionMessage);
+        }
+    }
+
+    /**
+     * 閫氳繃涓氬姟绫诲瀷name鏌ヨui涓婁笅鏂囷紝鏀寔鍒嗛〉
+     * @param baseQueryObject
+     * @return
+     * @throws PLException
+     */
+    @GetMapping( "/gridUIContextData")
+    @VciBusinessLog(operateName = "閫氳繃涓氬姟绫诲瀷name鏌ヨ鍑簎i涓婁笅鏂�")
+    public BaseResult gridUIContextData(BaseQueryObject baseQueryObject){
+        try {
+            return BaseResult.dataGrid(uiManagerService.gridUIContextData(baseQueryObject));
+        }catch (Exception e) {
+            e.printStackTrace();
+            String exceptionMessage = "閫氳繃涓氬姟绫诲瀷name鏌ヨ鍑簎i涓婁笅鏂囨椂鍑虹幇閿欒锛屽師鍥狅細" + VciBaseUtil.getExceptionMessage(e);
+            logger.error(exceptionMessage);
+            return BaseResult.fail(exceptionMessage);
+        }
+    }
+
+    /**
+     * 鍒涘缓UI涓婁笅鏂�
+     * btmTypeDTO 閾炬帴绫诲瀷鐨勪繚瀛樺璞�
+     * @return 淇濆瓨缁撴灉
+     */
+    @PostMapping("/saveUIContextData")
+    public BaseResult saveUIContextData(@RequestBody PLUILayout pluiLayout){
+        try {
+            return uiManagerService.saveUIContextData(pluiLayout) ? BaseResult.success("UI涓婁笅鏂囧垱寤烘垚鍔燂紒"):BaseResult.fail("UI涓婁笅鏂囧垱寤哄け璐ワ紒");
+        } catch (Exception e) {
+            e.printStackTrace();
+            String exceptionMessage = "鍒涘缓UI涓婁笅鏂囨椂鍑虹幇閿欒锛屽師鍥狅細" + VciBaseUtil.getExceptionMessage(e);
+            logger.error(exceptionMessage);
+            return BaseResult.fail(exceptionMessage);
+        }
+    }
+
+    /**
+     * 淇敼UI涓婁笅鏂�
+     * btmTypeDTO
+     * @return 淇敼缁撴灉
+     */
+    @PutMapping("/updateUIContextData")
+    public BaseResult updateUIContextData(@RequestBody PLUILayout pluiLayout){
+        try {
+            return uiManagerService.updateUIContextData(pluiLayout) ? BaseResult.success("UI涓婁笅鏂囦慨鏀规垚鍔燂紒"):BaseResult.fail("UI涓婁笅鏂囦慨鏀瑰け璐ワ紒");
+        } catch (Exception e) {
+            e.printStackTrace();
+            String exceptionMessage = "淇敼UI涓婁笅鏂囨椂鍑虹幇閿欒锛屽師鍥狅細" + VciBaseUtil.getExceptionMessage(e);
+            logger.error(exceptionMessage);
+            return BaseResult.fail(exceptionMessage);
+        }
+    }
+
+    /**
+     * 鍒犻櫎UI涓婁笅鏂囨暟鎹�
+     * oids 鍒犻櫎鐨刼id淇℃伅
+     * @return 鍒犻櫎缁撴灉
+     */
+    @DeleteMapping("/delUIContextData")
+    public BaseResult delUIContextData(String[] oids){
+        try {
+            return uiManagerService.delUIContextData(oids) ? BaseResult.success("UI涓婁笅鏂囧垹闄ゆ垚鍔燂紒"):BaseResult.fail("UI涓婁笅鏂囧垹闄ゅけ璐ワ紒");
+        } catch (PLException e) {
+            e.printStackTrace();
+            String exceptionMessage = "鍒犻櫎UI涓婁笅鏂囨椂鍑虹幇閿欒锛屽師鍥狅細" + VciBaseUtil.getExceptionMessage(e);
+            logger.error(exceptionMessage);
+            return BaseResult.fail(exceptionMessage);
+        }
+    }
+
+    /**
+     * UI涓婁笅鏂囧厠闅�
+     * pluiLayoutCloneVO 鍏嬮殕鍙傛暟瀵硅薄
+     * @return 鍏嬮殕缁撴瀯
+     */
+    @PostMapping("/cloneUiContextData")
+    public BaseResult cloneUiContextData(@RequestBody PLUILayoutCloneVO pluiLayoutCloneVO){
+        try {
+            return uiManagerService.cloneUiContextData(pluiLayoutCloneVO) ? BaseResult.success("UI涓婁笅鏂囧厠闅嗘垚鍔燂紒"):BaseResult.fail("UI涓婁笅鏂囧厠闅嗗け璐ワ紒");
+        } catch (PLException e) {
+            e.printStackTrace();
+            String exceptionMessage = "UI涓婁笅鏂囧厠闅嗘椂鍑虹幇閿欒锛屽師鍥狅細" + VciBaseUtil.getExceptionMessage(e);
+            logger.error(exceptionMessage);
+            return BaseResult.fail(exceptionMessage);
+        }
+    }
+
+    /**
+     * 鏍规嵁瑙掕壊鑾峰彇UI/琛ㄥ崟/鎸夐挳鐨勬潈闄�.
+     * @param baseQueryObject
+     * @return
+     */
+    @GetMapping( "/getUIAuthor")
+    @VciBusinessLog(operateName = "UI鎺堟潈锛堟爲褰㈢粨鏋勶級")
+    public BaseResult getUIAuthor(BaseQueryObject baseQueryObject){
+        try {
+            return BaseResult.dataList( uiManagerService.getUIAuthor(baseQueryObject));
+        }catch (Throwable e) {
+            e.printStackTrace();
+            String exceptionMessage = "UI鎺堟潈鍔犺浇鍑虹幇閿欒锛屽師鍥狅細" + VciBaseUtil.getExceptionMessage(e);
+            logger.error(exceptionMessage);
+            return BaseResult.fail(exceptionMessage);
+        }
+    }
+
+}
diff --git a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/WebBtmTypeController.java b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/WebBtmTypeController.java
index 10c2d5c..f9490cd 100644
--- a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/WebBtmTypeController.java
+++ b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/WebBtmTypeController.java
@@ -104,7 +104,6 @@
      */
     @GetMapping( "/getBizTypes")
     @VciBusinessLog(operateName = "涓氬姟绫诲瀷鍒楄〃(涓昏鐢ㄤ簬瀵硅瘽妗嗕娇鐢�)")
-    @VciUnCheckRight
     public BaseResult getBizTypes(String btmName){
         try {
             return BaseResult.dataList(Arrays.asList(btmService.getBizTypes(btmName)));
diff --git a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/WebPortalVIController.java b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/WebPortalVIController.java
index c14d6ed..6471de0 100644
--- a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/WebPortalVIController.java
+++ b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/WebPortalVIController.java
@@ -32,10 +32,11 @@
 import java.util.List;
 
 /**
- * 鍏紡鎺у埗鍣�
+ * 琛ㄥ崟/琛ㄦ牸鎺у埗鍣�
  * @author weidy
  * @date 2022-2-11
  */
+@VciBusinessLog(modelName="琛ㄥ崟/琛ㄦ牸鎺у埗鍣�",notStore=true)
 @RestController
 @RequestMapping("/portalVIController")
 public class WebPortalVIController {
@@ -95,7 +96,7 @@
 
     }
     /**
-     * 涓氬姟绫诲瀷鍒犻櫎
+     * 琛ㄥ崟/table鍒犻櫎
      * btmTypeDTO 涓氬姟绫诲瀷瀵硅薄
      * @return 鍒犻櫎缁撴灉
      */
@@ -112,7 +113,7 @@
         }
     }
     /**
-     * 涓氬姟绫诲瀷鍒犻櫎
+     * 琛ㄥ崟/table鍒犻櫎
      * btmTypeDTO 涓氬姟绫诲瀷瀵硅薄
      * @return 鍒犻櫎缁撴灉
      */
@@ -128,8 +129,11 @@
             return BaseResult.fail(exceptionMessage);
         }
     }
+
     /**
-     *
+     * 琛ㄥ崟/table鍏嬮殕
+     * @param portalVIDTOList clong瀵硅薄
+     * @return
      */
     @PostMapping("/clone")
     @VciBusinessLog(operateName = "鍏嬮殕琛ㄥ崟/琛ㄦ牸")
diff --git a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/OsAttributeServiceI.java b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/OsAttributeServiceI.java
index 96ffd58..91400a3 100644
--- a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/OsAttributeServiceI.java
+++ b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/OsAttributeServiceI.java
@@ -3,9 +3,7 @@
 import com.vci.corba.common.PLException;
 import com.vci.corba.omd.atm.AttributeDef;
 import com.vci.dto.OsAttributeDTO;
-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.*;
 import com.vci.pagemodel.OsAttributeVO;
 import org.springframework.web.multipart.MultipartFile;
 
@@ -21,6 +19,12 @@
  */
 public interface OsAttributeServiceI extends OsBaseServiceI{
 
+	/**
+	 * 鑾峰彇鏍戠姸
+	 * @param treeQueryObject
+	 * @return
+	 */
+	List<Tree> getTreeAttributesByBtmName(TreeQueryObject treeQueryObject);
 	/**
 	 * 鑾峰彇榛樿鐨勫睘鎬�
 	 * @return 榛樿鐨勫睘鎬у垪琛�
@@ -182,8 +186,9 @@
 	 * 鏍规嵁涓氬姟绫诲瀷/閾炬帴绫诲瀷鑾峰彇灞炴�т俊鎭�
 	 * @param btName 涓氬姟绫诲瀷/閾炬帴绫诲瀷
 	 * @param typeFlag 0:涓氬姟绫诲瀷,1:閾炬帴绫诲瀷
+	 * @param isDefault 鏄惁鍖呭惈榛樿灞炴�� true锛氬寘鍚紝false 涓嶅寘鍚�
 	 * @return
 	 */
-	List<OsAttributeVO> getOsAttributeVOSByBtName(String btName,int typeFlag)throws Exception;
+	List<OsAttributeVO> getOsAttributeVOSByBtName(String btName,int typeFlag,boolean isDefault)throws Exception;
 
 }
diff --git a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/OsBtmServiceI.java b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/OsBtmServiceI.java
index 2d07b7a..8c21a3c 100644
--- a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/OsBtmServiceI.java
+++ b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/OsBtmServiceI.java
@@ -60,6 +60,14 @@
     BizType[] getBizTypes(String btmName) throws PLException;
 
     /**
+     * 涓氬姟绫诲瀷鍒楄〃鏌ヨ锛岄潪鏍戠粨鏋勶細鐢ㄤ簬UI瀹氫箟宸︿晶涓氬姟绫诲瀷鏌ヨ锛屽彧杩斿洖name鍜宭able
+     * @param btmName
+     * @return
+     * @throws PLException
+     */
+    Tree getBizTree(String btmName) throws PLException;
+
+    /**
      * 鏌ヨ鎵�鏈夌殑涓氬姟绫诲瀷鏄犲皠
      * @return key 鏄笟鍔$殑鑻辨枃鍚嶇О鐨勫皬鍐�
      */
@@ -276,7 +284,7 @@
     /**
      * 瀵煎嚭涓氬姟绫诲瀷
      * oid 涓氬姟绫诲瀷鍚嶇О
-     * @return 鍒涘缓缁撴灉
+     * @return
      */
     void expData(String oid, HttpServletResponse response) throws PLException, IOException;
 
diff --git a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/OsQuereyTemplateServiceI.java b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/OsQuereyTemplateServiceI.java
index 4b2f1fa..7f0b927 100644
--- a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/OsQuereyTemplateServiceI.java
+++ b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/OsQuereyTemplateServiceI.java
@@ -102,10 +102,10 @@
     BaseResult impLinkTemplate(MultipartFile file) throws IOException, ClassNotFoundException;
     /**
      * 鏌ヨ鏂规鍒犻櫎
-     * @param templateNames 鏌ヨ鏂规鍚�
+     * @param names 鏌ヨ鏂规鍚�
      * @return 鎿嶄綔缁撴灉
      */
-    BaseResult deleteLinkTemplate(List<String> templateNames) throws PLException;
+    BaseResult deleteLinkTemplate(String names) throws PLException;
 
     /**
      * 鏌ヨ鏉′欢涓嬬殑鏌ヨ鎸夐挳
@@ -153,5 +153,12 @@
      * @return 瀵煎叆缁撴灉
      */
     BaseResult impBtmTemplate(MultipartFile file) throws IOException, ClassNotFoundException;
-
+    /**
+     * 鏌ヨ妯℃澘鐨勫垪琛ㄦ坊鍔犱簡瀛楁鐨勭浉鍏冲睘鎬�
+     * @param btmName 绫诲瀷
+     * @param linkFlag 鏄惁閾炬帴绫诲瀷 锛歵rue 閾炬帴绫诲瀷 锛宖alse 涓氬姟绫诲瀷
+     * @param direction 姝e弽鏂瑰悜
+     * @return 鏌ヨ妯℃澘鐨勫垪琛�
+     */
+    BaseResult queryTemplateListByAttr(String btmName, Boolean linkFlag, String direction) throws PLException;
 }
diff --git a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/UIEngineServiceI.java b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/UIEngineServiceI.java
index 4e768f8..40b4ec7 100644
--- a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/UIEngineServiceI.java
+++ b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/UIEngineServiceI.java
@@ -134,7 +134,6 @@
 	 */
 	UIActionVO actionDO2VO(PLAction action);
 
-
 	/**
 	 * 鏌ヨ鎵�鏈夌殑UI涓婁笅鏂�
 	 * @return 鏄剧ず瀵硅薄
@@ -209,5 +208,5 @@
 
 //	UIContentVO UIContentDO2VO(PLPageLayoutDefination pageLayoutDefination, boolean queryDetail);
 	UIContentVO UIContentDO2VO(PLUILayout pageLayoutDefination, boolean queryDetail);
-;
+
 }
diff --git a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/UIManagerServiceI.java b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/UIManagerServiceI.java
new file mode 100644
index 0000000..0001abd
--- /dev/null
+++ b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/UIManagerServiceI.java
@@ -0,0 +1,73 @@
+package com.vci.web.service;
+
+import com.vci.corba.common.PLException;
+import com.vci.corba.portal.data.PLUILayout;
+import com.vci.pagemodel.PLUILayoutCloneVO;
+import com.vci.starter.web.exception.VciBaseException;
+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.Tree;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.List;
+
+/**
+ * @author ludc
+ * @date 2024/8/28 17:05
+ */
+public interface UIManagerServiceI {
+
+    /**
+     * 閫氳繃涓氬姟绫诲瀷name鏌ヨui涓婁笅鏂囷紝鏀寔鍒嗛〉
+     * @param baseQueryObject
+     * @return
+     * @throws PLException
+     */
+    DataGrid gridUIContextData(BaseQueryObject baseQueryObject) throws PLException;
+
+    /**
+     * 缁欎笟鍔$被鍨嬩笅娣诲姞ui涓婁笅鏂�
+     * @param pluiLayout
+     * @return
+     * @throws PLException
+     */
+    boolean saveUIContextData(PLUILayout pluiLayout) throws PLException;
+
+    /**
+     * 淇敼涓氬姟绫诲瀷涓嬫坊鍔爑i涓婁笅鏂�
+     * @param pluiLayout
+     * @return
+     * @throws PLException
+     */
+    boolean updateUIContextData(PLUILayout pluiLayout) throws PLException;
+
+    /**
+     * 鏍规嵁涓婚敭鍜屼笟鍔$被鍨媜id鍒犻櫎ui涓婁笅鏂囨暟鎹�
+     * @return
+     */
+    boolean delUIContextData(String[] oids) throws PLException;
+
+    /**
+     * 鍏嬮殕ui涓婁笅鏂�
+     * @param pluiLayoutCloneVO
+     * @return
+     */
+    boolean cloneUiContextData(PLUILayoutCloneVO pluiLayoutCloneVO) throws PLException;
+
+    /**
+     * 瀵煎嚭ui涓婁笅鏂�(鍕鹃�夌殑瑕佸鍑虹殑鎺у埗鍖虹殑鏁版嵁)
+     * oids
+     * @return
+     */
+    void expUiContextData(String[] oids, HttpServletResponse response) throws PLException, IOException;
+
+    /**
+     * 鑾峰彇UI鏉冮檺鏍�
+     * @param baseQueryObject
+     * @return
+     * @throws VciBaseException
+     */
+     List<Tree> getUIAuthor(BaseQueryObject baseQueryObject)throws Exception;
+}
diff --git a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/OsAttributeServiceImpl.java b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/OsAttributeServiceImpl.java
index c8facba..ec96cc5 100644
--- a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/OsAttributeServiceImpl.java
+++ b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/OsAttributeServiceImpl.java
@@ -7,14 +7,14 @@
 import com.vci.client.mw.ClientSessionUtility;
 import com.vci.corba.common.PLException;
 import com.vci.corba.omd.atm.AttributeDef;
+import com.vci.corba.omd.ltm.LinkType;
 import com.vci.corba.omd.vrm.VersionRule;
 import com.vci.dto.OsAttributeDTO;
 import com.vci.dto.OsEnumDTO;
 import com.vci.dto.OsEnumItemDTO;
 import com.vci.omd.dataType.VTDataType;
-import com.vci.pagemodel.OsEnumItemVO;
-import com.vci.pagemodel.OsEnumVO;
-import com.vci.pagemodel.OsUsedAttributeVO;
+import com.vci.omd.objects.OtherInfo;
+import com.vci.pagemodel.*;
 import com.vci.po.OsAttributePO;
 import com.vci.po.OsEnumPO;
 import com.vci.starter.poi.bo.ReadExcelOption;
@@ -25,12 +25,10 @@
 import com.vci.starter.web.annotation.log.VciUnLog;
 import com.vci.starter.web.enumpck.VciFieldTypeEnum;
 import com.vci.starter.web.exception.VciBaseException;
-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.*;
 import com.vci.starter.web.util.*;
 import com.vci.model.OsAttributeDO;
-import com.vci.pagemodel.OsAttributeVO;
+import com.vci.web.enumpck.PortalVITypeFlag;
 import com.vci.web.properties.UsedNames;
 import com.vci.web.service.OsAttributeServiceI;
 import com.vci.web.service.OsBaseServiceI;
@@ -135,6 +133,101 @@
 	 * 榛樿灞炴�х殑鏄犲皠锛宬ey鏄皬鍐�
 	 */
 	private static Map<String,OsAttributeVO> defaultAttributeVOMap = new HashMap<>();
+
+	@Override
+	public List<Tree> getTreeAttributesByBtmName(TreeQueryObject treeQueryObject) {
+		List<Tree> rootTreeList=new ArrayList<>();
+
+		Map<String, String> conditionMap = treeQueryObject.getConditionMap();
+		if (conditionMap == null) {
+			conditionMap = new HashMap<>();
+		}
+		String typeName = StringUtils.isBlank(conditionMap.get("typeName")) ? "" : conditionMap.get("typeName");
+		if (StringUtils.isBlank(typeName)) {
+			VciBaseUtil.alertNotNull(typeName,"涓氬姟绫诲瀷鍚嶇О");
+		}
+		try {
+			String typeFlag=StringUtils.isBlank(conditionMap.get("typeFlag"))?"":conditionMap.get("typeFlag");
+			PortalVITypeFlag portalVITypeFlag= PortalVITypeFlag.getByName(typeFlag);
+			Short viTypeFlag=-1;
+			if(portalVITypeFlag!=null){
+				viTypeFlag=portalVITypeFlag.getIntVal();
+			}
+			boolean isDefault =Boolean.parseBoolean(conditionMap.get("isDefault"));
+			Tree tree = new Tree("root", "銆�" + typeName + "銆戝睘鎬т俊鎭�", "root");
+			tree.setLevel(0);
+			rootTreeList.add(tree);
+			getChildTree(rootTreeList,typeName, viTypeFlag,isDefault);
+		}catch (Throwable e){
+		 e.printStackTrace();
+		}
+		return rootTreeList;
+	}
+
+	/**
+	 * 澶熺潃灞炴�ф爲鑺傜偣
+	 * @param parentTreeList
+	 * @param refTypeName
+	 * @param refFlag
+	 * @param isDefault
+	 * @throws Exception
+	 */
+	private void getChildTree(List<Tree> parentTreeList,String refTypeName,int refFlag,boolean isDefault) throws Exception {
+		for (Tree pTree : parentTreeList) {
+			if (pTree.getLevel()>= 3) {
+				continue;
+			}
+			Object o= pTree.getData();
+			String pName=pTree.getText();
+			boolean isOsAttributeVO=false;
+			if(o instanceof OsAttributeVO){
+				isOsAttributeVO=true;
+				OsAttributeVO osAttributeVO=(OsAttributeVO)o;
+				String other = osAttributeVO.getOther();
+				OtherInfo otherInfo = OtherInfo.getOtherInfoByText(other);
+				refFlag = otherInfo.getRefFlag();
+				refTypeName = otherInfo.getRefTypeName();
+			}
+			List<OsAttributeVO> childOsAttributeVOList=new ArrayList<>();
+			if (refFlag != -1) {
+				// pName: 涓哄弬鐓у睘鎬у悕鍔犱笂璺緞
+				childOsAttributeVOList=getOsAttributeVOSByBtName(refTypeName,refFlag,isDefault);
+				if(!CollectionUtils.isEmpty(childOsAttributeVOList)) {
+					List<Tree> childTreeList= new ArrayList<>();
+					boolean finalIsOsAttributeVO = isOsAttributeVO;
+					childOsAttributeVOList.stream().forEach(childOsAttributeVO->{
+						Tree childTree = new Tree(childOsAttributeVO.getOid(), childOsAttributeVO.getId(), childOsAttributeVO);
+						childTree.setOid(childOsAttributeVO.getOid());
+						childTree.setParentName(pTree.getText());
+						childTree.setParentId(pTree.getOid());
+						childTree.setLevel(pTree.getLevel()+1);
+						childTree.setLeaf(true);
+						if(finalIsOsAttributeVO) {
+							childTree.setText(pName + "." + childOsAttributeVO.getId());
+						}else{
+							childTree.setText(childOsAttributeVO.getId());
+						}
+						if (childTree.getLevel()>= 3) {
+							childTree.setLeaf(true);
+						}
+						childTreeList.add(childTree);
+					});
+					if(childTreeList.size()>0){
+						pTree.setChildren(childTreeList);
+						pTree.setExpanded(false);
+						getChildTree(childTreeList,refTypeName,refFlag,isDefault);
+					}else{
+						pTree.setLeaf(true);
+						pTree.setExpanded(true);
+					}
+
+				}
+			}else{
+				pTree.setExpanded(true);
+			}
+		}
+
+	}
 
 	/**
 	 * 鑾峰彇榛樿鐨勫睘鎬�
@@ -1142,17 +1235,36 @@
 	 * @return
 	 */
 	@Override
-	public List<OsAttributeVO> getOsAttributeVOSByBtName(String btName, int typeFlag) throws Exception{
+	public List<OsAttributeVO> getOsAttributeVOSByBtName(String btName, int typeFlag,boolean isDefault) throws Exception{
 		VciBaseUtil.alertNotNull(btName,"鍙傛暟涓嶅厑璁镐负绌�",typeFlag,"鍙傛暟涓嶅厑璁镐负绌�");
 		List<OsAttributeVO> attributeVOS=new ArrayList<>();
+
 		try {
-			AttributeDef[] attributeDefs=new AttributeDef[]{};
+			List<AttributeDef> attributeDefList=new ArrayList<>();
 			if(typeFlag==0){
-				attributeDefs=	platformClientUtil.getBtmService().getAttributeDefs(btName);
+				AttributeDef [] attributeDefs=	platformClientUtil.getBtmService().getAttributeDefs(btName);
+				if(attributeDefs!=null){
+					attributeDefList.addAll(Arrays.stream(attributeDefs).collect(Collectors.toList()));
+				}
+				if(isDefault){
+					AttributeDef [] sysAttributeDefs=platformClientUtil.getBtmService().getSysAttributeDefs();
+					if(sysAttributeDefs!=null){
+						attributeDefList.addAll(Arrays.stream(sysAttributeDefs).collect(Collectors.toList()));
+					}
+				}
 			}else{
-				attributeDefs=platformClientUtil.getLinkTypeService().getAttributes(btName);
+				AttributeDef []	attributeDefs=platformClientUtil.getLinkTypeService().getAttributes(btName);
+				if(attributeDefs!=null){
+					attributeDefList.addAll(Arrays.stream(attributeDefs).collect(Collectors.toList()));
+				}
+				if(isDefault){
+					AttributeDef[] sysAbItems = platformClientUtil.getLinkTypeService().getSysAttributeDefs();
+					if(sysAbItems!=null){
+						attributeDefList.addAll(Arrays.stream(sysAbItems).collect(Collectors.toList()));
+					}
+				}
 			}
-			attributeVOS=attributeDO2VOs(Arrays.asList(attributeDefs));
+			attributeVOS=attributeDO2VOs(attributeDefList);
 		}catch (PLException e){
 			throw new Exception("鏍规嵁涓氬姟绫诲瀷鑾峰彇灞炴�у紓甯�"+e.getMessage());
 		}
diff --git a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/OsBtmServiceImpl.java b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/OsBtmServiceImpl.java
index e46d9c8..f573031 100644
--- a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/OsBtmServiceImpl.java
+++ b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/OsBtmServiceImpl.java
@@ -493,6 +493,42 @@
     }
 
     /**
+     * 涓氬姟绫诲瀷鍒楄〃鏌ヨ锛岄潪鏍戠粨鏋勶細鐢ㄤ簬UI瀹氫箟宸︿晶涓氬姟绫诲瀷鏌ヨ锛屽彧杩斿洖name鍜宭able
+     * @param btmName
+     * @return
+     * @throws PLException
+     */
+    @Override
+    public Tree getBizTree(String btmName) throws PLException {
+        if(null == btmName){
+            btmName = "";
+        }
+        Tree returnTree = new Tree();
+        BizType[] bizTypes = platformClientUtil.getBtmService().getBizTypes(btmName);
+        if(Func.isEmpty(bizTypes)){
+            return returnTree;
+        }
+        returnTree.setOid("");
+        returnTree.setText("涓氬姟绫诲瀷");
+        returnTree.setLeaf(false);
+        List<Tree> trees = new ArrayList<>();
+        Arrays.stream(bizTypes).forEach(bizType -> {
+            Tree tree = new Tree();
+            tree.setText(bizType.name + " " +bizType.label);
+            tree.setOid(bizType.oid);
+            tree.setLeaf(true);
+            tree.setParentName(bizType.fName);
+            Map<String, String> atrrMap = new HashMap<>();
+            atrrMap.put("name",bizType.name);
+            atrrMap.put("lable",bizType.label);
+            tree.setAttributes(atrrMap);
+            trees.add(tree);
+        });
+        returnTree.setChildren(trees);
+        return returnTree;
+    }
+
+    /**
      * 鍙傜収涓氬姟绫诲瀷
      *
      * @param conditionMap 鏌ヨ鏉′欢
diff --git a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/OsPortalVIServiceImpl.java b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/OsPortalVIServiceImpl.java
index 45abd95..5db621e 100644
--- a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/OsPortalVIServiceImpl.java
+++ b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/OsPortalVIServiceImpl.java
@@ -168,6 +168,9 @@
         }
         PortalVIVO portalVIVO=new PortalVIVO();
         PortalVI portalVI=  platformClientUtil.getPortalService().getPortalVIById(id);
+        if(portalVI==null||StringUtils.isBlank(portalVI.id)){
+            throw new VciBaseException("鏍规嵁涓婚敭鏈煡璇㈠埌鏁版嵁");
+        }
         portalVIVO=portalVIDOO2VO(portalVI);
         return portalVIVO;
     }
@@ -381,7 +384,7 @@
                 }
                 String attributeStr="";
                 try {
-                    List<OsAttributeVO> osAttributeVOList=osAttributeService.getOsAttributeVOSByBtName(portalVIDTO.getTypeName(),portalVIDTO.getTypeFlag());
+                    List<OsAttributeVO> osAttributeVOList=osAttributeService.getOsAttributeVOSByBtName(portalVIDTO.getTypeName(),portalVIDTO.getTypeFlag(),false);
                     if(!CollectionUtils.isEmpty(osAttributeVOList)){
                       List<String> filedList= osAttributeVOList.stream().map(OsAttributeVO::getId).collect(Collectors.toList());
                         attributeStr=VciBaseUtil.array2String(filedList.toArray(new String[]{}));
@@ -521,7 +524,7 @@
                             });
                         }
                         //鏍¢獙灞炴�ф槸鍚︽纭�
-                        List<OsAttributeVO> osAttributeVOList = osAttributeService.getOsAttributeVOSByBtName(portalVI.typeName, portalVI.typeFlag);
+                        List<OsAttributeVO> osAttributeVOList = osAttributeService.getOsAttributeVOSByBtName(portalVI.typeName, portalVI.typeFlag,false);
                         if (!CollectionUtils.isEmpty(osAttributeVOList)) {
                             List<String> filedList = osAttributeVOList.stream().map(OsAttributeVO::getId).collect(Collectors.toList());
                             List<String> attributeList = VciBaseUtil.str2List(portalVIPO.getAttributeKey());
@@ -640,7 +643,7 @@
         boolean flag = false;
         String labelName=PortalVIType.Form.getName();
         try {
-            VciBaseUtil.alertNotNull(portalVIDTO.getViName(),"鍚嶇О涓嶈兘涓虹┖锛�");
+            VciBaseUtil.alertNotNull(portalVIDTO.getViName(),"鍚嶇О");
             if(portalVIDTO.getPrm()==null||portalVIDTO.getPrm().getPrmItemList()==null||portalVIDTO.getPrm().getPrmItemList().size()==0){
                 throw  new Throwable(labelName+"锛屾湭璁剧疆");
             }
@@ -1258,7 +1261,6 @@
     private List<String> getRefFormVIName(String refFormOid){
         List<String> keyList=new ArrayList<>();
         try {
-
             PortalVI refFormVI = UITools.getService().getPortalVIById(refFormOid);
             PortalVIVO portalVIVO= portalVIDOO2VO(refFormVI);
             if(portalVIVO!=null&&portalVIVO.getPrm().getPrmItemList().size()>0){
diff --git a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/OsQueryTemplateImpl.java b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/OsQueryTemplateImpl.java
index 83fd63d..5b993f0 100644
--- a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/OsQueryTemplateImpl.java
+++ b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/OsQueryTemplateImpl.java
@@ -16,7 +16,8 @@
 import com.vci.corba.omd.ltm.LinkType;
 import com.vci.corba.omd.qtm.QTD;
 import com.vci.corba.omd.qtm.QTInfo;
-import com.vci.dto.QTInfoDTO;
+import com.vci.dto.*;
+import com.vci.omd.constants.SystemAttribute;
 import com.vci.omd.objects.OtherInfo;
 import com.vci.po.OsLinkTypePO;
 import com.vci.starter.poi.bo.ReadExcelOption;
@@ -193,6 +194,9 @@
         VciBaseUtil.alertNotNull(btName,"绫诲瀷鍚�");
         QTInfo[] objTypeQTs = platformClientUtil.getQTDService().getObjTypeQTs(btName);
         List<QTInfoDTO> dtos = new ArrayList<>();
+        Map<String, AttributeDef> allSysAttr = Arrays.stream(platformClientUtil.getBtmService().getSysAttributeDefs()).collect(Collectors.toMap(e -> e.name, e -> e));
+        allSysAttr.putAll(Arrays.stream(platformClientUtil.getLinkTypeService().getSysAttributeDefs()).collect(Collectors.toMap(e -> e.name, e -> e)));
+
         for (QTInfo obj : objTypeQTs) {
             QTInfoDTO qtInfoDTO = new QTInfoDTO();
             qtInfoDTO.setCreator(obj.creator);
@@ -203,13 +207,84 @@
             qtInfoDTO.setQtUIText(obj.qtUIText);
             if(StringUtils.isNotBlank(obj.qtUIText)){
                 //灏嗙粰瀹氱殑String鏂囨湰瑙f瀽涓篨ML鏂囨。骞惰繑鍥炴柊鍒涘缓鐨刣ocument
-                qtInfoDTO.setTree(analysisXml(obj));
+                qtInfoDTO.setTree(analysisXml(obj, allSysAttr));
             }
-            qtInfoDTO.setQueryTemplate(OQTool.getQTByDoc(DocumentHelper.parseText(obj.qtText), obj.qtName));
+            QueryTemplate qtByDoc = OQTool.getQTByDoc(DocumentHelper.parseText(obj.qtText), obj.qtName);
+            qtInfoDTO.setQueryTemplate(queryTemplateToDto(qtByDoc, allSysAttr));
             qtInfoDTO.setCreateTimeText(DateFormatUtils.format(new Date(obj.createTime), DateUtil.PATTERN_DATETIME));
             dtos.add(qtInfoDTO);
         }
         return BaseResult.dataList(dtos);
+    }
+
+    /**
+     * 瀵硅薄杞崲
+     * @param qtByDoc 妯℃澘瀵硅薄
+     * @param allSysAttr 鎵�鏈夌郴缁熷睘鎬�
+     * @return 妯℃澘浼犺緭瀵硅薄
+     * @throws PLException
+     */
+    private QueryTemplateDTO queryTemplateToDto(QueryTemplate qtByDoc, Map<String, AttributeDef> allSysAttr) throws PLException {
+        QueryTemplateDTO dto = new QueryTemplateDTO();
+        dto.setId(qtByDoc.getId());
+        dto.setBtmType(qtByDoc.getBtmType());
+        dto.setDirection(qtByDoc.getDirection());
+        dto.setLevel(qtByDoc.getLevel());
+        dto.setQueryChildrenFlag(qtByDoc.isQueryChildren());
+        dto.setQueryISLeaf(qtByDoc.isQueryISLeaf());
+        dto.setClauseList(qtByDoc.getClauseList());
+        dto.setPageInfo(qtByDoc.getPageInfo());
+        dto.setLinkType(qtByDoc.getLinkType());
+        dto.setVersion(qtByDoc.getVersion());
+        dto.setType(qtByDoc.getType());
+        dto.setSecretFlag(qtByDoc.isSecretFlag());
+        dto.setRightFlag(qtByDoc.isRightFlag());
+        dto.setOrderInfoList(qtByDoc.getOrderInfoList());
+        dto.setRecReturnMode(qtByDoc.getRecReturnMode());
+        Condition con = qtByDoc.getCondition();
+        if(con != null){
+            ConditionDTO conDto = new ConditionDTO();
+            conDto.setRootCIName(con.getRootCIName());
+            Map<String, ConditionItem> ciMap = con.getCIMap();
+            Map<String, ConditionItemDTO> ciMapDto = new HashMap<>();
+            for (String key : ciMap.keySet()) {
+                ConditionItem item = ciMap.get(key);
+                LeafInfo leafInfo = item.getLeafInfo();
+                ConditionItemDTO itemDTO = new ConditionItemDTO();
+                itemDTO.setChildrenInfo(item.getChildrenInfo());
+                itemDTO.setId(item.getId());
+                itemDTO.setLeafFlag(item.isLeaf());
+                ciMapDto.put(key, itemDTO);
+                if(leafInfo == null){
+                    continue;
+                }
+                LeafInfoDTO leafInfoDTO = new LeafInfoDTO();
+                itemDTO.setLeafInfo(leafInfoDTO);
+                //澶勭悊鏌ヨ瀛楁绫诲瀷
+                String column = leafInfo.getClause();
+                if(column.contains(".")){
+                    column = StringUtils.substringAfterLast(column, ".");
+                }
+                AttributeDef att = platformClientUtil.getAttributeService().getAttributeDefByName(column);
+                if(att == null || "".equals(att.oid)){
+                    att = allSysAttr.get(column.toLowerCase());
+                }
+                leafInfoDTO.setClause(leafInfo.getClause());
+
+                leafInfoDTO.setOperator(leafInfo.getOperator());
+                leafInfoDTO.setType(att.vtDataType);
+                if(leafInfo.getValue() != null ){
+                    LeafValueDto valueDto = new LeafValueDto();
+                    valueDto.setOrdinaryValue(leafInfo.getValue().getOrdinaryValue());
+                    valueDto.setQueryTemplate(leafInfo.getValue().getQueryTemplate() != null ? queryTemplateToDto(leafInfo.getValue().getQueryTemplate(),allSysAttr) : null);
+                    leafInfoDTO.setValue(valueDto);
+                }
+
+            }
+            conDto.setCIMap(ciMapDto);
+            dto.setCondition(conDto);
+        }
+        return dto;
     }
 
     /**
@@ -218,14 +293,13 @@
      * @return
      * @throws DocumentException
      */
-    private HashMap<String,Object> analysisXml(QTInfo obj) throws DocumentException {
+    private HashMap<String,Object> analysisXml(QTInfo obj, Map<String, AttributeDef> allSysAttr) throws DocumentException, PLException {
         org.dom4j.Document document = DocumentHelper.parseText(obj.qtUIText);
         if(document == null){
             return null;
         }
         //鑾峰彇鏍硅妭鐐�,鍦ㄤ緥瀛愪腑灏辨槸responsedata鑺傜偣
         Element root = document.getRootElement();
-        List<HashMap<String,Object>> treeList = new ArrayList<>();
         HashMap<String,Object> treeMap = new HashMap<>();
         treeMap.put("connector",root.getText());
         List<Element> children = root.elements();
@@ -233,9 +307,20 @@
         for(Iterator<Element> i = children.iterator(); i.hasNext();){
             Element child = i.next();
             if(AND.equals(child.getText()) || OR.equals(child.getText())){
-                childList.add(addDefaultMutableTree(child));
+                childList.add(addDefaultMutableTree(child, allSysAttr));
             }else {
-                childList.add(child.getText().trim());
+                String column = StringUtils.substringBefore(child.getText().trim(), " ");
+
+                if(column.contains(".")){
+                    column = StringUtils.substringAfterLast(column, ".");
+                }
+                AttributeDef att = platformClientUtil.getAttributeService().getAttributeDefByName(column);
+                if(att == null || "".equals(att.oid)){
+                    att = allSysAttr.get(column.toLowerCase());
+                }
+                HashMap<String, String> data = new HashMap<>();
+                data.put("column",child.getText().trim());
+                data.put("type",att.vtDataType);
             }
         }
         treeMap.put("child",childList);
@@ -246,7 +331,7 @@
      * 灏嗗瓙鑺傜偣杞负map缁撴瀯
      * @param element
      */
-    public Map<String, Object> addDefaultMutableTree(Element element){
+    public Map<String, Object> addDefaultMutableTree(Element element, Map<String, AttributeDef> allSysAttr) throws PLException {
         List<Object> childList = new ArrayList<>();
         List<Element> children = element.elements();
         HashMap<String,Object> treeMap = new HashMap<>();
@@ -254,9 +339,21 @@
         for(Iterator<Element> i = children.iterator(); i.hasNext();){
             Element child = i.next();
             if(AND.equals(child.getText()) || OR.equals(child.getText())){
-                childList.add(addDefaultMutableTree(child));
+                childList.add(addDefaultMutableTree(child, allSysAttr));
             }else {
-                childList.add(child.getText().trim());
+                String column = StringUtils.substringBefore(child.getText().trim(), " ");
+
+                if(column.contains(".")){
+                    column = StringUtils.substringAfterLast(column, ".");
+                }
+                AttributeDef att = platformClientUtil.getAttributeService().getAttributeDefByName(column);
+                if(att == null || "".equals(att.oid)){
+                    att = allSysAttr.get(column.toLowerCase());
+                }
+                HashMap<String, String> data = new HashMap<>();
+                data.put("column",child.getText().trim());
+                data.put("type",att.vtDataType);
+                childList.add(data);
             }
         }
         treeMap.put("child",childList);
@@ -1332,12 +1429,16 @@
     }
     /**
      * 鏌ヨ鏂规鍒犻櫎
-     * @param templateNames 鏌ヨ鏂规鍚�
+     * @param names 鏌ヨ鏂规鍚�
      * @return 鎿嶄綔缁撴灉
      */
     @Override
-    public BaseResult deleteLinkTemplate(List<String> templateNames) throws PLException {
-        boolean b = platformClientUtil.getQTDService().deleteQTs(templateNames.toArray(new String[0]));
+    public BaseResult deleteLinkTemplate(String names) throws PLException {
+        if(StringUtils.isBlank(names)){
+            return BaseResult.fail("璇烽�夋嫨鏌ヨ鏂规锛�");
+        }
+        String[] nameSplit = names.split(",");
+        boolean b = platformClientUtil.getQTDService().deleteQTs(nameSplit);
         if(!b){
             return BaseResult.fail("鍒犻櫎澶辫触锛侊紒锛�");
         }
@@ -1564,7 +1665,204 @@
         tree.put("children", childList);
         return BaseResult.success(tree);
     }
+    /**
+     * 鏌ヨ妯℃澘鐨勫垪琛ㄦ坊鍔犱簡瀛楁鐨勭浉鍏冲睘鎬�
+     * @param btmName 绫诲瀷
+     * @param linkFlag 鏄惁閾炬帴绫诲瀷 锛歵rue 閾炬帴绫诲瀷 锛宖alse 涓氬姟绫诲瀷
+     * @param direction 姝e弽鏂瑰悜
+     * @return 鏌ヨ妯℃澘鐨勫垪琛�
+     */
+    @Override
+    public BaseResult queryTemplateListByAttr(String btmName, Boolean linkFlag, String direction) throws PLException {
+        //杩斿洖鐨勭晫闈笅鎷夋鏄剧ず鏍�
+        List<QTDDTO> qtddtos = new ArrayList<>();
+        //灏嗛摼鎺ョ被鍨嬩笌涓氬姟绫诲瀷鐨勬墍鏈夐粯璁ゅ瓧娈垫煡璇㈠嚭鏉ユ斁鍒癿ap閲岄潰鏂逛究鍚庣画璋冪敤
+        Map<String, AttributeDef> allSysAttr = Arrays.stream(platformClientUtil.getBtmService().getSysAttributeDefs()).collect(Collectors.toMap(e -> e.name, e -> e));
+        allSysAttr.putAll(Arrays.stream(platformClientUtil.getLinkTypeService().getSysAttributeDefs()).collect(Collectors.toMap(e -> e.name, e -> e)));
+        QTD[] qtdArray = null;
+        //鏌ヨ鐩稿叧绫诲瀷鐨勬煡璇㈡ā鏉胯繘琛屽鐞�
+        if(linkFlag){
+            qtdArray = platformClientUtil.getQTDService().getLinkTypeQTDs(btmName);
+        }else {
+            qtdArray = platformClientUtil.getQTDService().getBizTypeQTDs(btmName);
+        }
+        for (QTD qtd : qtdArray) {
+            QTDDTO qtddto = new QTDDTO();
+            qtddto.setName(qtd.name);
+            qtddto.setCreateTime(qtd.createTime);
+            qtddto.setLinkTypeName(qtd.linkTypeName);
+            qtddto.setBtmName(qtd.btmName);
+            qtddto.setCreator(qtd.creator);
+            for (String abName : qtd.abNames) {
+                AttributeDef att = platformClientUtil.getAttributeService().getAttributeDefByName(abName);
+                //濡傛灉鍦ㄥ睘鎬ф帴鍙d腑娌℃湁鏌ュ埌鐩稿叧瀛楁搴旇灏卞湪榛樿瀛楁涓�
+                if(att == null || "".equals(att.oid)){
+                    att = allSysAttr.get(abName.toLowerCase());
+                }
+                if(direction != null) {
+                    if (direction.equals(QTConstants.DIRECTION_POSITIVE)) {
+                        if(att == null ){
+                            throw new PLException("500",new String[]{"灞炴�у瓧娈�:"+ abName +"鏈煡璇㈠埌锛岃纭锛�"});
+                        }
+                        att.name = "T_OID." + abName;
+                    } else if (direction.equals(QTConstants.DIRECTION_OPPOSITE)) {
+                        if(att == null ){
+                            throw new PLException("500",new String[]{"灞炴�у瓧娈�:"+ abName +"鏈煡璇㈠埌锛岃纭锛�"});
+                        }
+                        att.name = "F_OID." + abName;
+                    }
+                }else{
+                    att.name = abName;
+                }
+                AttributeDefDTO attrDto = new AttributeDefDTO();
+                attrDto.setDescription(att.description);
+                attrDto.setLabel(att.label);
+                attrDto.setOid(att.oid);
+                attrDto.setCreator(att.creator);
+                attrDto.setName(att.name);
+                attrDto.setDefValue(att.defValue);
+                attrDto.setLayersNum(1);
+                attrDto.setRage(att.rage);
+                attrDto.setVtDataType(att.vtDataType);
+                attrDto.setOther(att.other);
+                qtddto.getAttrs().add(attrDto);
+                addNode(attrDto, allSysAttr);
+            }
+            qtddtos.add(qtddto);
+        }
+        return BaseResult.dataList(qtddtos);
+    }
 
+    /**
+     * 瀛愯妭鐐瑰鐞�
+     * @param attributeDefByName 鐖惰妭鐐圭殑灞炴�т俊鎭�
+     * @param allSysAttr 鎵�鏈夐粯璁ゅ瓧娈�
+     */
+    private void addNode(AttributeDefDTO attributeDefByName, Map<String, AttributeDef> allSysAttr){
+
+        if(attributeDefByName.getLayersNum() >= 3){
+            return;
+        }
+        String abName = attributeDefByName.name;
+        //鍙杗ode涓婄殑鏈�鍚庝竴涓睘鎬у悕
+        if(abName.contains(".")){
+            abName = abName.substring(abName.lastIndexOf(".") + 1);
+        }
+        if(SystemAttribute.sysAttList().contains(abName.toUpperCase())){
+            return;
+        }
+        AttributeDef abItem = null;
+        try {
+            abItem = platformClientUtil.getAttributeService().getAttributeDefByName(abName);
+            String other = abItem.other;
+//			String btmName = ApProvider.getInstance().getOtherValueByType(other, BTM);
+            OtherInfo otherInfo = OtherInfo.getOtherInfoByText(other);
+            int refFlag = otherInfo.getRefFlag();
+            String refTypeName = otherInfo.getRefTypeName();
+            if(refFlag != -1){
+                //鍙傜収涓氬姟绫诲瀷
+                if(refFlag == 0){
+                    //pName: 涓哄弬鐓у睘鎬у悕鍔犱笂璺緞
+                    String pName = attributeDefByName.name + ".";
+                    String[] abNames = platformClientUtil.getBtmService().getAttributeNames(refTypeName);
+                    for(int i = 0; i < abNames.length; i++){
+                        String abName_ = abNames[i];
+                        AttributeDef att = platformClientUtil.getAttributeService().getAttributeDefByName(abName_);
+                        if(att == null || "".equals(att.oid)){
+                            att = allSysAttr.get(abName_.toLowerCase());
+                        }
+                        att.name = pName + abName_ ;
+                        AttributeDefDTO attrDto = new AttributeDefDTO();
+                        attrDto.setDescription(att.description);
+                        attrDto.setLabel(att.label);
+                        attrDto.setOid(att.oid);
+                        attrDto.setLayersNum(attributeDefByName.getLayersNum() + 1);
+                        attrDto.setCreator(att.creator);
+                        attrDto.setName(att.name);
+                        attrDto.setDefValue(att.defValue);
+                        attrDto.setRage(att.rage);
+                        attrDto.setVtDataType(att.vtDataType);
+                        attrDto.setOther(att.other);
+                        attributeDefByName.getAttrs().add(attrDto);
+                        addNode(attrDto, allSysAttr);
+                    }
+                    //绯荤粺灞炴�D,NAME,DESCRIPTION
+                    for (int i = 0; i < SystemAttribute.bosysAttList().size(); i++) {
+                        AttributeDef attributeDef = allSysAttr.get(SystemAttribute.bosysAttList().get(i).toLowerCase());
+                        AttributeDefDTO attrDto = new AttributeDefDTO();
+                        attrDto.setDescription(attributeDef.description);
+                        attrDto.setLabel(attributeDef.label);
+                        attrDto.setOid(attributeDef.oid);
+                        attrDto.setLayersNum(attributeDefByName.getLayersNum() + 1);
+                        attrDto.setCreator(attributeDef.creator);
+                        attrDto.setName(pName + SystemAttribute.bosysAttList().get(i));
+                        attrDto.setDefValue(attributeDef.defValue);
+                        attrDto.setRage(attributeDef.rage);
+                        attrDto.setVtDataType(attributeDef.vtDataType);
+                        attrDto.setOther(attributeDef.other);
+                        attributeDefByName.getAttrs().add(attrDto);
+                        addNode(attrDto, allSysAttr);
+                    }
+                    //鍙傜収閾炬帴绫诲瀷
+                }else if(refFlag == 1){
+                    //pName: 涓哄弬鐓у睘鎬у悕鍔犱笂璺緞
+                    String pName = attributeDefByName.name + ".";
+                    LinkType link = null;
+                    try {
+                        link = platformClientUtil.getLinkTypeService().getLinkType(refTypeName);
+                    } catch (Exception e) {
+                        // TODO Auto-generated catch block
+                        e.printStackTrace();
+                    } catch (Throwable e) {
+                        // TODO Auto-generated catch block
+                        e.printStackTrace();
+                    }
+                    if(link != null){
+                        String[] abNames = link.attributes;
+                        for(int i = 0; i < abNames.length; i++){
+                            String abName_ = abNames[i];
+                            AttributeDef att = platformClientUtil.getAttributeService().getAttributeDefByName(abName_);
+                            if(att == null || att.oid.equals("")){
+                                att = allSysAttr.get(abName_.toLowerCase());
+                            }
+                            AttributeDefDTO attrDto = new AttributeDefDTO();
+                            attrDto.setDescription(att.description);
+                            attrDto.setLabel(att.label);
+                            attrDto.setOid(att.oid);
+                            attrDto.setLayersNum(attributeDefByName.getLayersNum() + 1);
+                            attrDto.setCreator(att.creator);
+                            attrDto.setName(pName + abName_);
+                            attrDto.setDefValue(att.defValue);
+                            attrDto.setRage(att.rage);
+                            attrDto.setVtDataType(att.vtDataType);
+                            attrDto.setOther(att.other);
+                            attributeDefByName.getAttrs().add(attrDto);
+                            addNode(attrDto, allSysAttr);
+                        }
+                        //绯荤粺灞炴�D,NAME,DESCRIPTION
+                        for (int i = 0; i < SystemAttribute.losysAttList().size(); i++) {
+                            AttributeDef sysAttributeDefs = allSysAttr.get(SystemAttribute.losysAttList().get(i).toLowerCase());
+                            AttributeDefDTO attrDto = new AttributeDefDTO();
+                            attrDto.setDescription(sysAttributeDefs.description);
+                            attrDto.setLabel(sysAttributeDefs.label);
+                            attrDto.setOid(sysAttributeDefs.oid);
+                            attrDto.setLayersNum(attributeDefByName.getLayersNum() + 1);
+                            attrDto.setCreator(sysAttributeDefs.creator);
+                            attrDto.setName(pName + SystemAttribute.losysAttList().get(i));
+                            attrDto.setDefValue(sysAttributeDefs.defValue);
+                            attrDto.setRage(sysAttributeDefs.rage);
+                            attrDto.setVtDataType(sysAttributeDefs.vtDataType);
+                            attrDto.setOther(sysAttributeDefs.other);
+                            attributeDefByName.getAttrs().add(attrDto);
+                            addNode(attrDto, allSysAttr);
+                        }
+                    }
+                }
+            }
+        } catch (PLException e) {
+            e.printStackTrace();
+        }
+    }
     // 鏁版嵁杩囨护
     private void addImportBtmData(BtmQTExportData qtExportData, List<BizType> ltsNew, List<QTInfo> qTWrapperNew,
                                Map<String/* 绫诲瀷鍚嶇О */, QTD[]/* 鏌ヨ妯℃澘瀹氫箟 */> norepQTDs) {
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
new file mode 100644
index 0000000..98d2f58
--- /dev/null
+++ b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/UIManagerServiceImpl.java
@@ -0,0 +1,591 @@
+package com.vci.web.service.impl;
+
+import com.sun.jnlp.ApiDialog;
+import com.vci.client.mw.ClientContextVariable;
+import com.vci.common.utility.ObjectUtility;
+import com.vci.corba.common.PLException;
+import com.vci.corba.framework.data.RoleRightInfo;
+import com.vci.corba.omd.btm.BizType;
+import com.vci.corba.portal.PortalService;
+import com.vci.corba.portal.data.*;
+import com.vci.frameworkcore.compatibility.SmRoleQueryServiceI;
+import com.vci.pagemodel.OsBtmTypeVO;
+import com.vci.pagemodel.PLUILayoutCloneVO;
+import com.vci.pagemodel.RoleRightVO;
+import com.vci.starter.web.exception.VciBaseException;
+import com.vci.starter.web.pagemodel.BaseQueryObject;
+import com.vci.starter.web.pagemodel.DataGrid;
+import com.vci.starter.web.pagemodel.SessionInfo;
+import com.vci.starter.web.pagemodel.Tree;
+import com.vci.starter.web.util.VciBaseUtil;
+import com.vci.starter.web.util.VciDateUtil;
+import com.vci.starter.web.util.WebThreadLocalUtil;
+import com.vci.web.service.OsBtmServiceI;
+import com.vci.web.service.UIManagerServiceI;
+import com.vci.web.util.*;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.poi.ss.formula.functions.T;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.*;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+/**
+ * UI瀹氫箟鏈嶅姟鐣岄潰鐩稿叧鎺ュ彛
+ * @author ludc
+ * @date 2024/8/28 17:05
+ */
+@Service
+public class UIManagerServiceImpl implements UIManagerServiceI {
+
+    /**
+     * 骞冲彴鐨勮皟鐢ㄥ伐鍏风被
+     */
+    @Resource
+    private PlatformClientUtil platformClientUtil;
+    /**
+     * 瑙掕壊
+     */
+    @Resource
+    private SmRoleQueryServiceI smRoleQueryServiceI;
+
+    /**
+     * 涓氬姟绫诲瀷
+     */
+    @Resource
+    private OsBtmServiceI osBtmServiceI;
+
+    /**
+     * 鏃ュ織
+     */
+    private Logger logger = LoggerFactory.getLogger(getClass());
+
+    /**
+     * 鎺掑簭姣旇緝鍣�
+     */
+    private Comparator<PLUILayout> pageLayoutComparator = new Comparator<PLUILayout>() {
+        @Override
+        public int compare(PLUILayout o1, PLUILayout o2) {
+            return o1.plCode.compareTo(o2.plCode);
+        }
+    };
+
+    /**
+     * 鏍规嵁涓氬姟绫诲瀷鍚嶆煡璇i涓婁笅鏂囨暟鎹�
+     * @param baseQueryObject
+     * @return
+     * @throws PLException
+     */
+    @Override
+    public DataGrid gridUIContextData(BaseQueryObject baseQueryObject) throws PLException {
+        VciBaseUtil.alertNotNull(baseQueryObject,"鏉′欢瀵硅薄");
+        int page = baseQueryObject.getPage();
+        int limit = baseQueryObject.getLimit();
+        Map<String, String> conditionMap = baseQueryObject.getConditionMap();
+        String btmName = conditionMap.getOrDefault("btmName","");
+        if(Func.isEmpty(conditionMap) || Func.isBlank(btmName)){
+            throw new PLException("500",new String[]{"鏈幏鍙栧埌涓氬姟绫诲瀷鍚嶇О锛�"});
+        }
+        String txtName = conditionMap.getOrDefault("txtName","").trim();
+        String txtCode = conditionMap.getOrDefault("txtCode","").trim();
+        PortalService.GetPLUILayoutsByRelatedTypeAndQueryInfoResult result = platformClientUtil.getUIService()
+                .getPLUILayoutsByRelatedTypeAndQueryInfo(btmName, txtName, txtCode, page, limit);
+        DataGrid<PLUILayout> dataGrid = new DataGrid<>();
+        int total = (int)result.total;
+        dataGrid.setTotal(total);
+        dataGrid.setLimit(limit);
+        dataGrid.setPage(page);
+        PLUILayout[] res = result.returnValue;
+        Arrays.sort(res,pageLayoutComparator);
+        List<PLUILayout> pluiLayouts = Arrays.asList(res);
+        dataGrid.setData(pluiLayouts);
+        return dataGrid;
+    }
+
+    /**
+     * ton閫氳繃涓氬姟绫诲瀷鍜屽悕绉版煡璇�
+     * @param btemName
+     * @param code
+     * @return
+     * @throws PLException
+     */
+    public List<PLUILayout> getUIContextDataByBtName(String btemName,String code) throws PLException {
+        List<PLUILayout> pluiLayoutList=new ArrayList<>();
+        PLUILayout[]  pluiLayouts=   platformClientUtil.getUIService().getPLUILayoutEntityByTypeAndCode(btemName,code);
+        if(pluiLayouts!=null&&pluiLayouts.length>0){
+            pluiLayoutList= Stream.of(pluiLayouts).collect(Collectors.toList());
+        }
+        return pluiLayoutList;
+    }
+
+    /**
+     * 缁欎笟鍔$被鍨嬩笅娣诲姞ui涓婁笅鏂�
+     * @param pluiLayout
+     * @return
+     * @throws PLException
+     */
+    @Override
+    public boolean saveUIContextData(PLUILayout pluiLayout) throws VciBaseException {
+        try {
+            //ui涓婁笅鏂囧璞℃牎楠�
+            canContinue(pluiLayout);
+
+            String code = pluiLayout.plCode;
+            String name = pluiLayout.plName;
+            boolean isExist = nameOrCodeIsExist(pluiLayout, false);
+            //鏄惁瀛樺湪鏍¢獙
+            if (isExist){
+                throw new VciBaseException("涓婁笅鏂囩紪鐮佹垨鍚嶇О宸茬粡瀛樺湪锛岃妫�鏌ワ紒");
+            }
+
+            PLUILayout pld = new PLUILayout();
+            pld.plOId = ObjectUtility.getNewObjectID36();
+            pld.plCode = code;
+            pld.plName = name;
+            pld.plRelatedType = pluiLayout.plRelatedType;
+            pld.plDesc = pluiLayout.plDesc;
+            SessionInfo sessionInfo = WebThreadLocalUtil.getCurrentUserSessionInfoInThread();
+            pld.plCreateUser = sessionInfo.getUserId();
+            pld.plModifyUser = sessionInfo.getUserId();
+            //瀵艰埅鍖�
+            pld.plIsShowForm = pluiLayout.plIsShowForm;
+            //鎺у埗鍖�
+            pld.plIsShowNavigator = pluiLayout.plIsShowNavigator;
+            //鎿嶄綔鍖�
+            pld.plIsShowTab = pluiLayout.plIsShowTab;
+            //鎵ц淇濆瓨
+            return platformClientUtil.getUIService().savePLUILayout(pld);
+        } catch (PLException e) {
+            e.printStackTrace();
+            String exceptionMessage = VciBaseUtil.getExceptionMessage(e);
+            logger.error(exceptionMessage);
+            throw new VciBaseException(exceptionMessage);
+        }
+    }
+
+    /**
+     * 淇敼ui涓婁笅鏂�
+     * @param pluiLayout
+     * @return
+     * @throws PLException
+     */
+    @Override
+    public boolean updateUIContextData(PLUILayout pluiLayout) throws VciBaseException {
+        this.canContinue(pluiLayout);
+        try {
+            String code = pluiLayout.plCode;
+            String name = pluiLayout.plName;
+            boolean isExist = nameOrCodeIsExist(pluiLayout, true);
+            if (isExist){
+                throw new VciBaseException("涓婁笅鏂囩紪鐮佹垨鍚嶇О宸茬粡瀛樺湪锛岃妫�鏌ワ紒");
+            }
+
+            PLUILayout pld = new PLUILayout();
+            pld.plOId = pluiLayout.plOId;
+            pld.plCode = code;
+            pld.plName = name;
+            pld.plRelatedType = pluiLayout.plRelatedType;
+            pld.plDesc = pluiLayout.plDesc;
+            pld.plCreateUser = pluiLayout.plCreateUser;
+            pld.plModifyUser = WebThreadLocalUtil.getCurrentUserSessionInfoInThread().getUserId();
+
+            //瀵艰埅鍖�
+            pld.plIsShowForm = pluiLayout.plIsShowForm;
+            //鎺у埗鍖�
+            pld.plIsShowNavigator = pluiLayout.plIsShowNavigator;
+            //鎿嶄綔鍖�
+            pld.plIsShowTab = pluiLayout.plIsShowTab;
+            //鎵ц淇敼
+            return platformClientUtil.getUIService().updatePLUILayout(pld);
+        } catch (PLException e) {
+            e.printStackTrace();
+            String exceptionMessage = VciBaseUtil.getExceptionMessage(e);
+            logger.error(exceptionMessage);
+            throw new VciBaseException(exceptionMessage);
+        }
+    }
+
+    /**
+     * 鏍规嵁涓婚敭鍜屼笟鍔$被鍨媜id鍒犻櫎ui涓婁笅鏂囨暟鎹�
+     * @return
+     */
+    @Override
+    public boolean delUIContextData(String[] oids) throws PLException {
+        VciBaseUtil.alertNotNull(oids,"寰呭垹闄ょ殑瀵硅薄鍒楄〃");
+        //鍒犻櫎鏂规硶涓湁鍏宠仈鏁版嵁鍒犻櫎鐨勬搷浣滈�昏緫
+        return platformClientUtil.getUIService().deletePLUILayoutByOidsForCascade(oids);
+    }
+
+    /**
+     * 鍏嬮殕ui涓婁笅鏂囷紙鍏峰鍏宠仈鏁版嵁鐨勫厠闅嗭級
+     * @param pluiLayoutCloneVO
+     * @return
+     */
+    @Override
+    public boolean cloneUiContextData(PLUILayoutCloneVO pluiLayoutCloneVO) throws PLException {
+        VciBaseUtil.alertNotNull(
+            pluiLayoutCloneVO,"鍏嬮殕鍙傛暟瀵硅薄",
+            pluiLayoutCloneVO.getSourcePLUILayout(),"鍏嬮殕鐨勬簮瀵硅薄淇℃伅",
+            pluiLayoutCloneVO.getCloneName(),"鍏嬮殕鐨勫璞″悕绉�",
+            pluiLayoutCloneVO.getCloneContextCode(),"鍏嬮殕鐨勫璞′笂涓嬫枃缂栫爜"
+        );
+        PLUILayout pluiLayout = new PLUILayout();
+        PLUILayout sourcePLUILayout = pluiLayoutCloneVO.getSourcePLUILayout();
+        //濡傛灉閫夋嫨鍏嬮殕鐩爣锛屽垯鍏嬮殕鍒伴�夋嫨鐨勭被鍨嬩笅锛屽鏋滄病鏈夐�夋嫨鍏嬮殕鐩爣锛屽垯鍏嬮殕鍒板綋鍓嶇被鍨嬩笅
+        if(Func.isBlank(pluiLayoutCloneVO.getCloneTargetOid())){
+            pluiLayout.plRelatedType = sourcePLUILayout.plRelatedType;
+        }
+        //鍏嬮殕鐨勫悕绉板拰ui涓婁笅鏂囩紪鍙锋煡閲�
+        String cloneName = pluiLayoutCloneVO.getCloneName();
+        String cloneContextCode = pluiLayoutCloneVO.getCloneContextCode();
+        pluiLayout.plOId = ObjectUtility.getNewObjectID36();
+        pluiLayout.plName = cloneName;
+        pluiLayout.plCode = cloneContextCode;
+        pluiLayout.plIsShowTab = sourcePLUILayout.plIsShowTab;
+        pluiLayout.plIsShowNavigator = sourcePLUILayout.plIsShowNavigator;
+        pluiLayout.plIsShowForm = sourcePLUILayout.plIsShowForm;
+        pluiLayout.plDesc = sourcePLUILayout.plDesc;
+        SessionInfo sessionInfo = WebThreadLocalUtil.getCurrentUserSessionInfoInThread();
+        pluiLayout.plCreateUser = sessionInfo.getUserId();
+        pluiLayout.plModifyUser = sessionInfo.getUserId();
+        //鍏嬮殕鐩爣涓媢i鍚嶇О鍜岀紪鍙锋煡閲�
+        this.checkCodeName(pluiLayout);
+        //1銆佸厛淇濆瓨ui涓婁笅鏂�
+        boolean res = platformClientUtil.getUIService().savePLUILayout(pluiLayout);
+        //2銆佸啀鑰冭檻瀛愯妭鐐圭殑鍏嬮殕
+        PLTabPage[] pages = platformClientUtil.getUIService().getPLTabPagesByPageDefinationOId(sourcePLUILayout.plOId); //鎺у埗鍖鸿妭鐐瑰強鍏跺瓙鑺傜偣鐨勫厠闅�
+        if(pages == null){
+            return true;
+        }
+        try {
+            for (PLTabPage page : pages) {
+                savePlpageLayoutDefinationRelation(page,pluiLayout.plOId);
+            }
+            return true;
+        }catch (Exception e){
+            e.printStackTrace();
+            String exceptionMessage = VciBaseUtil.getExceptionMessage(e);
+            logger.error(exceptionMessage);
+            throw new VciBaseException(exceptionMessage);
+        }
+    }
+
+    @Override
+    public void expUiContextData(String[] oids, HttpServletResponse response) throws PLException, IOException {
+
+    }
+
+    /**
+     * 鑾峰彇UI鎺堟潈鏍�
+     * @param treeQueryObject
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public List<Tree> getUIAuthor(BaseQueryObject treeQueryObject) throws Exception {
+
+        Map<String, String> conditionMap = treeQueryObject.getConditionMap();
+        if (conditionMap == null) {
+            conditionMap = new HashMap<>();
+        }
+        String roleId = StringUtils.isBlank(conditionMap.get("roleId")) ? "" : conditionMap.get("roleId");
+        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<>();
+        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));
+        }
+        BizType[] bizTypes=osBtmServiceI.getBizTypes(type);
+        List<Tree> treeList=new ArrayList<>();
+        Tree   rootNode =new Tree("root","鍔熻兘妯″潡","root");
+        rootNode.setLevel(0);
+        rootNode.setShowCheckbox(true);
+        rootNode.setExpanded(true);
+        List<Tree> childList=new ArrayList<>();
+        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);
+            childList.add(bizTypeTree);
+            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;
+    }
+
+    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<>();
+            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);
+                        childTree.setParentName(pTree.getText());
+                        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;
+                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 -> {
+                        Tree childTree=new Tree(plTabPage.plOId,plTabPage.plName,plTabPage);
+                        childTree.setParentName(pTree.getText());
+                        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 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.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) {//
+                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.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();
+                }
+
+            }else if (funcObj instanceof PLTabButton) {//鎸夐挳
+                String id = ((PLTabButton) funcObj).plTableOId;
+                if(roleRightVOMap.containsKey(id)){
+                    pTree.setChecked(true);
+                }else{
+                    pTree.setChecked(false);
+                }
+            }
+        });
+    }
+    /**
+     * UI瑙掕壊瀵硅薄杞崲
+     * @param infos
+     * @return
+     */
+    private List<RoleRightVO> roleRightDOO2VOS(List<RoleRightInfo> infos){
+        List<RoleRightVO> roleRightVOS=new ArrayList<>();
+        Optional.ofNullable(infos).orElseGet(()->new ArrayList<>()).stream().forEach(info -> {
+            RoleRightVO vo=roleRightDOO2VO(info);
+            roleRightVOS.add(vo);
+        });
+
+        return roleRightVOS;
+    }
+
+    /**
+     * UI瑙掕壊瀵硅薄杞崲
+     * @param info
+     * @return
+     */
+    private RoleRightVO roleRightDOO2VO(RoleRightInfo info){
+        RoleRightVO vo=new RoleRightVO();
+        vo.setId(info.id);
+        vo.setCreateTime(VciDateUtil.date2Str(VciDateUtil.long2Date(info.createTime),""));
+        vo.setCreateUser(info.createUser);
+        vo.setRoleId(info.roleId);
+        vo.setRightType(info.rightType);
+        vo.setLicensor(info.licensor);
+        vo.setRightValue(info.rightValue);
+        vo.setFuncId(info.funcId);
+        vo.setModifyTime(VciDateUtil.date2Str(VciDateUtil.long2Date(info.modifyTime),""));
+        vo.setModifyUser(info.modifyUser);
+        return vo;
+    }
+
+    /**
+     * 鎺у埗鍖鸿妭鐐瑰強鍏跺瓙鑺傜偣鐨勫厠闅�
+     * @param obj
+     */
+    private void savePlpageLayoutDefinationRelation(Object obj,String plUILayoutId) {
+        PLTabPage tabPage = (PLTabPage)obj;
+        try {
+
+            PLPageDefination[] pLPageDefinations = platformClientUtil.getUIService().getPLPageDefinationsByPageContextOId(tabPage.plOId);
+
+            tabPage.plOId = ObjectUtility.getNewObjectID36();
+            tabPage.plContextOId = plUILayoutId;
+            //add by caill start 2016.8.15 瀵艰埅鍖恒�佹帶鍒跺尯銆佹搷浣滃尯鍦ㄦ病鏈夊瓙鑺傜偣鐨勬儏鍐典笅鐨勫厠闅�
+            if(pLPageDefinations.length==0){
+                platformClientUtil.getUIService().savePLTabPage(tabPage);
+            }
+            //add by caill end
+            for(int j=0;j<pLPageDefinations.length;j++){
+                PLPageDefination plPageDef = pLPageDefinations[j];
+
+                platformClientUtil.getUIService().savePLTabPage(tabPage);
+                PLTabButton[] pLTabButtons = platformClientUtil.getUIService().getPLTabButtonsByTableOId(plPageDef.plOId);
+
+                plPageDef.plOId = ObjectUtility.getNewObjectID36();
+                plPageDef.plTabPageOId = tabPage.plOId;
+                platformClientUtil.getUIService().savePLPageDefination(plPageDef);
+
+                for(int b=0;b<pLTabButtons.length;b++){
+                    PLTabButton plTabButton = pLTabButtons[b];
+                    PLCommandParameter[] pLCommandParameters = platformClientUtil.getUIService().getPLCommandParametersByCommandOId(plTabButton.plOId);
+
+                    plTabButton.plOId = ObjectUtility.getNewObjectID36();
+                    plTabButton.plTableOId = plPageDef.plOId;
+                    platformClientUtil.getUIService().savePLTabButton(plTabButton);
+
+                    for(int c=0;c<pLCommandParameters.length;c++){
+                        final PLCommandParameter plCommandParameter = pLCommandParameters[c];
+                        plCommandParameter.plOId = ObjectUtility.getNewObjectID36();
+                        plCommandParameter.plCommandOId = plTabButton.plOId;
+                        platformClientUtil.getUIService().savePLCommandParameter(plCommandParameter);
+                    }
+                }
+            }
+        } catch (PLException e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * 鏈仛鍒ょ┖澶勭悊锛岃皟鐢ㄥ墠璇蜂繚璇乷bj涓嶄负绌�
+     * @param obj
+     * @throws PLException
+     */
+    public void checkCodeName(PLUILayout obj) throws PLException {
+        PLUILayout[] plUILayouts = platformClientUtil.getUIService().getPLUILayoutsByRelatedType(obj.plRelatedType);
+        int length = plUILayouts.length;
+        String code = obj.plCode;
+        String name = obj.plName;
+
+        if (Func.isNotBlank(name) || Func.isNotBlank(code)){
+            for (int i =0;i<length;i++){//寰幆鑺傜偣鐨刄I涓婃枃鍜屽悕绉�
+                if (plUILayouts[i].plCode.equalsIgnoreCase(code) || plUILayouts[i].plName.equals(name)){
+                    throw new VciBaseException("涓氬姟绫诲瀷涓婾I鍚嶇О鎴朥I涓婁笅鏂囩紪鐮佸凡瀛樺湪锛�");
+                }
+            }
+        }
+    }
+
+    /**
+     * ui涓婁笅鏂囨柊澧炰慨鏀瑰墠妫�鏌�
+     * @param pluiLayout
+     */
+    private void canContinue(PLUILayout pluiLayout){
+        String code = pluiLayout.plCode;
+        String name = pluiLayout.plName;
+        if(Func.isBlank(code)){
+            throw new VciBaseException("涓婁笅鏂囩紪鐮佷笉鑳戒负绌猴紒");
+        }
+        if(Func.isBlank(name)){
+            throw new VciBaseException("鍚嶇О涓嶈兘涓虹┖锛�");
+        }
+        if((pluiLayout.plIsShowNavigator == 0) && (pluiLayout.plIsShowForm == 0) && (pluiLayout.plIsShowTab == 0)){
+            throw new VciBaseException("涓婁笅鏂囪嚦灏戣鍖呭惈涓�涓尯鍩燂紒");
+        }
+    }
+
+    /**
+     * 妫�鏌ュ悕绉版垨鑰呯紪鐮佹槸鍚﹀凡瀛樺湪
+     * @param pluiLayout
+     * @param isEdit
+     * @return
+     * @throws VciBaseException
+     */
+    private boolean nameOrCodeIsExist(PLUILayout pluiLayout, boolean isEdit) throws PLException {
+        boolean res = false;
+        //鏌ヨ鍚屼竴涓氬姟绫诲瀷涓嬬殑ui涓婁笅鏂囷紝鐒跺悗鏌ラ噸
+        PLUILayout[] plpagelayoutdefinations = platformClientUtil.getUIService().getPLUILayoutsByRelatedType(pluiLayout.plRelatedType);
+        int length = plpagelayoutdefinations.length;
+        for (int i =0;i<length;i++){
+            String code = plpagelayoutdefinations[i].plCode;
+            String name = plpagelayoutdefinations[i].plName;
+            String ids = plpagelayoutdefinations[i].plOId;
+            if(isEdit){
+                if(!ids.equals(pluiLayout.plOId)){
+                    if (pluiLayout.plCode.equalsIgnoreCase(code) || pluiLayout.plName.equals(name)){
+                        res = true;
+                        break;
+                    }
+                }
+            }
+            else {
+                if (code.equalsIgnoreCase(code) || name.equals(name)){
+                    res = true;
+                    break;
+                }
+            }
+        }
+        return res;
+    }
+
+}

--
Gitblit v1.9.3