From 72bab1219cbca2e53adb98dc9113ae1f85298cf8 Mon Sep 17 00:00:00 2001
From: 田源 <lastanimals@163.com>
Date: 星期一, 19 八月 2024 14:06:14 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/WebBtmTypeController.java                                 |    5 
 Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/pagemodel/OsBtmTypeAttributeVO.java                                  |   12 
 Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/dto/OsBtmTypeDTO.java                                                |   77 ---
 Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/OsQuereyTemplateServiceI.java                                |   27 +
 Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/compatibility/ISmFunctionQueryService.java                 |   14 
 Source/plt-web/plt-web-parent/plt-web/src/main/resources/menuConfig.json                                                             |   91 ++++
 Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/util/RightControlUtil.java                                           |    2 
 Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/OsBtmServiceImpl.java                                   |   39 +
 Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/compatibility/impl/SmFunctionQueryServicePlatformImpl.java |  220 +++++++++-
 Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/SmFunctionController.java                                 |   27 +
 Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/OsLinkTypeController.java                                 |    4 
 Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/pagemodel/OsBtmTypeVO.java                                           |   29 
 Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/WebBtmIOServiceImpl.java                                |   21 
 Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/OsQueryTemplateController.java                            |   64 ++
 Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/pagemodel/MenuVO.java                                                |   15 
 Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/util/OsScanAnnotationTool.java                                       |    2 
 Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/OsQueryTemplateImpl.java                                |  423 ++++++++++++++++++-
 Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/properties/JsonConfigReader.java                                     |   36 +
 Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/other/LinkQTExportData.java                                          |   96 ++++
 Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/OsCodeGenSchemaServiceImpl.java                         |    8 
 Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/OsLinkTypeServiceImpl.java                              |    2 
 21 files changed, 1,011 insertions(+), 203 deletions(-)

diff --git a/Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/dto/OsBtmTypeDTO.java b/Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/dto/OsBtmTypeDTO.java
index 4f05d27..0e185a2 100644
--- a/Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/dto/OsBtmTypeDTO.java
+++ b/Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/dto/OsBtmTypeDTO.java
@@ -46,16 +46,6 @@
     private String revisionRuleId;
 
     /**
-     * 鐗堟湰瑙勫垯鐨勫悕绉�
-     */
-    private String revisionRuleName;
-
-    /**
-     * 鍒嗛殧绗�
-     */
-    private String revisionSep;
-
-    /**
      * 鏄惁鎵嬪姩杈撳叆鐗堟湰
      */
     private boolean inputRevisionFlag;
@@ -96,11 +86,6 @@
     private String lifeCycleId;
 
     /**
-     * 鐢熷懡鍛ㄦ湡鐨勪腑鏂囧悕绉�
-     */
-    private String lifeCycleName;
-
-    /**
      * 鐗堟瑙勫垯
      */
     private String versionRule;
@@ -114,11 +99,6 @@
      * 澶囩敤鐢熷懡鍛ㄦ湡鑻辨枃鍚嶇О
      */
     private String subLifeCycleId;
-
-    /**
-     * 澶囩敤鐢熷懡鍛ㄦ湡涓枃鍚嶇О
-     */
-    private String subLifeCycleName;
 
     /**
      * 鏄惁涓鸿鍥�
@@ -146,14 +126,9 @@
     private String delimiter;
 
     /**
-     * 娣诲姞鎴栬�呯Щ闄ょ殑灞炴�т俊鎭�
-     */
-    private List<OsBtmTypeLinkAttributesDTO> attributesDTOList;
-
-    /**
      * 娣诲姞鎴栫Щ闄ょ殑灞炴��
      */
-    private String[] apNameArray;
+    private String apNameArray;
 
     /**
      * 鏃堕棿鎴筹紝鐢ㄤ簬鏍¢獙鏄惁鏈�鏂版暟鎹�
@@ -180,11 +155,11 @@
      */
     private Date lastModifyTime;
 
-    public void setApNameArray(String[] apNameArray) {
+    public void setApNameArray(String apNameArray) {
         this.apNameArray = apNameArray;
     }
 
-    public String[] getApNameArray() {
+    public String getApNameArray() {
         return apNameArray;
     }
 
@@ -284,22 +259,6 @@
         this.revisionRuleId = revisionRuleId;
     }
 
-    public String getRevisionRuleName() {
-        return revisionRuleName;
-    }
-
-    public void setRevisionRuleName(String revisionRuleName) {
-        this.revisionRuleName = revisionRuleName;
-    }
-
-    public String getRevisionSep() {
-        return revisionSep;
-    }
-
-    public void setRevisionSep(String revisionSep) {
-        this.revisionSep = revisionSep;
-    }
-
     public boolean isInputRevisionFlag() {
         return inputRevisionFlag;
     }
@@ -364,14 +323,6 @@
         this.versionRule = versionRule;
     }
 
-    public List<OsBtmTypeLinkAttributesDTO> getAttributesDTOList() {
-        return attributesDTOList;
-    }
-
-    public void setAttributesDTOList(List<OsBtmTypeLinkAttributesDTO> attributesDTOList) {
-        this.attributesDTOList = attributesDTOList;
-    }
-
     public Date getTs() {
         return ts;
     }
@@ -412,28 +363,12 @@
         this.lifeCycleId = lifeCycleId;
     }
 
-    public String getLifeCycleName() {
-        return lifeCycleName;
-    }
-
-    public void setLifeCycleName(String lifeCycleName) {
-        this.lifeCycleName = lifeCycleName;
-    }
-
     public String getSubLifeCycleId() {
         return subLifeCycleId;
     }
 
     public void setSubLifeCycleId(String subLifeCycleId) {
         this.subLifeCycleId = subLifeCycleId;
-    }
-
-    public String getSubLifeCycleName() {
-        return subLifeCycleName;
-    }
-
-    public void setSubLifeCycleName(String subLifeCycleName) {
-        this.subLifeCycleName = subLifeCycleName;
     }
 
     public String getClassFullName() {
@@ -453,8 +388,7 @@
                 ", tableName='" + tableName + '\'' +
                 ", description='" + description + '\'' +
                 ", revisionRuleId='" + revisionRuleId + '\'' +
-                ", revisionRuleName='" + revisionRuleName + '\'' +
-                ", revisionSep='" + revisionSep + '\'' +
+                ", delimiter='" + delimiter + '\'' +
                 ", inputRevisionFlag=" + inputRevisionFlag +
                 ", abstractFlag=" + abstractFlag +
                 ", revisionFlag=" + revisionFlag +
@@ -463,14 +397,11 @@
                 ", implClass='" + implClass + '\'' +
                 ", shape='" + shape + '\'' +
                 ", lifeCycleId='" + lifeCycleId + '\'' +
-                ", lifeCycleName='" + lifeCycleName + '\'' +
                 ", versionRule='" + versionRule + '\'' +
                 ", subLifeCycleId='" + subLifeCycleId + '\'' +
-                ", subLifeCycleName='" + subLifeCycleName + '\'' +
                 ", viewFlag=" + viewFlag +
                 ", viewCreateSql='" + viewCreateSql + '\'' +
                 ", classFullName='" + classFullName + '\'' +
-                ", attributesDTOList=" + attributesDTOList +
                 ", ts=" + ts +
                 '}';
     }
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 48769fb..473c411 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
@@ -33,7 +33,6 @@
 	 */
 	private Boolean hasChildren;
 
-
 	/**
 	 * 鑿滃崟缂栧彿
 	 */
@@ -103,11 +102,25 @@
 	 * 鏄惁鏂扮獥鍙f墦寮�
 	 */
 	private String isOpenName;
+
+	/**
+	 * 鍙拡瀵逛簬棣栭〉绯荤粺妯″潡閰嶇疆浣跨敤锛岀敤浜庡尯鍒嗙偣鍑讳笉鍚岀殑鑺傜偣锛屽睍寮�鐨勪笉鍚屾煡璇㈤�昏緫
+	 */
+	private String modeType;
+
 	/**
 	 * 鍓嶇鏄惁闅愯棌
 	 */
 	private HashMap<String,Boolean> meta = new HashMap<>();
 
+	public String getModeType() {
+		return modeType;
+	}
+
+	public void setModeType(String modeType) {
+		this.modeType = modeType;
+	}
+
 	public String getId() {
 		return id;
 	}
diff --git a/Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/pagemodel/OsBtmTypeAttributeVO.java b/Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/pagemodel/OsBtmTypeAttributeVO.java
index b03a021..f2cf29e 100644
--- a/Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/pagemodel/OsBtmTypeAttributeVO.java
+++ b/Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/pagemodel/OsBtmTypeAttributeVO.java
@@ -53,7 +53,7 @@
     /**
      * 鏁版嵁绫诲瀷
      */
-    private String attrDataType;
+    private String attributeDataType;
 
     /**
      * 鏄惁鍙互涓虹┖
@@ -191,12 +191,12 @@
         this.description = description;
     }
 
-    public String getAttrDataType() {
-        return attrDataType;
+    public String getAttributeDataType() {
+        return attributeDataType;
     }
 
-    public void setAttrDataType(String attrDataType) {
-        this.attrDataType = attrDataType;
+    public void setAttributeDataType(String attributeDataType) {
+        this.attributeDataType = attributeDataType;
     }
 
     public boolean isReferFlag() {
@@ -379,7 +379,7 @@
                 ", name='" + name + '\'' +
                 ", attributeLength=" + attributeLength +
                 ", description='" + description + '\'' +
-                ", attrDataType='" + attrDataType + '\'' +
+                ", attributeDataType='" + attributeDataType + '\'' +
                 ", nullableFlag=" + nullableFlag +
                 ", defaultValue='" + defaultValue + '\'' +
                 ", precisionLength=" + precisionLength +
diff --git a/Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/pagemodel/OsBtmTypeVO.java b/Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/pagemodel/OsBtmTypeVO.java
index 94ff8ad..8ba5e9e 100644
--- a/Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/pagemodel/OsBtmTypeVO.java
+++ b/Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/pagemodel/OsBtmTypeVO.java
@@ -1,5 +1,7 @@
 package com.vci.pagemodel;
 
+import com.vci.starter.web.pagemodel.Tree;
+
 import java.util.Date;
 import java.util.List;
 
@@ -54,11 +56,6 @@
      * 鐗堟湰瑙勫垯鐨勫悕绉�
      */
     private String revisionRuleName;
-
-    /**
-     * 鍒嗛殧绗�
-     */
-    private String revisionSep;
 
     /**
      * 鏄惁鎵嬪姩杈撳叆鐗堟湰
@@ -123,7 +120,7 @@
     /**
      * 澶囩敤鐢熷懡鍛ㄦ湡鑻辨枃鍚嶇О
      */
-    private String subLifeCycleId;
+    private String lifeCycleIds;
 
     /**
      * 澶囩敤鐢熷懡鍛ㄦ湡涓枃鍚嶇О
@@ -268,14 +265,6 @@
 
     public void setRevisionRuleName(String revisionRuleName) {
         this.revisionRuleName = revisionRuleName;
-    }
-
-    public String getRevisionSep() {
-        return revisionSep;
-    }
-
-    public void setRevisionSep(String revisionSep) {
-        this.revisionSep = revisionSep;
     }
 
     public boolean isInputRevisionFlag() {
@@ -423,12 +412,12 @@
         this.lifeCycleName = lifeCycleName;
     }
 
-    public String getSubLifeCycleId() {
-        return subLifeCycleId;
+    public String getLifeCycleIds() {
+        return lifeCycleIds;
     }
 
-    public void setSubLifeCycleId(String subLifeCycleId) {
-        this.subLifeCycleId = subLifeCycleId;
+    public void setLifeCycleIds(String lifeCycleIds) {
+        this.lifeCycleIds = lifeCycleIds;
     }
 
     public String getSubLifeCycleName() {
@@ -481,7 +470,7 @@
                 ", description='" + description + '\'' +
                 ", revisionRuleId='" + revisionRuleId + '\'' +
                 ", revisionRuleName='" + revisionRuleName + '\'' +
-                ", revisionSep='" + revisionSep + '\'' +
+                ", delimiter='" + delimiter + '\'' +
                 ", inputRevisionFlag=" + inputRevisionFlag +
                 ", revisionRuleVO=" + revisionRuleVO +
                 ", abstractFlag=" + abstractFlag +
@@ -493,7 +482,7 @@
                 ", lifeCycleId='" + lifeCycleId + '\'' +
                 ", lifeCycleName='" + lifeCycleName + '\'' +
                 ", versionRule='" + versionRule + '\'' +
-                ", subLifeCycleId='" + subLifeCycleId + '\'' +
+                ", lifeCycleIds='" + lifeCycleIds + '\'' +
                 ", subLifeCycleName='" + subLifeCycleName + '\'' +
                 ", viewFlag=" + viewFlag +
                 ", viewCreateSql='" + viewCreateSql + '\'' +
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 dcf7cc8..8106ccf 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
@@ -1,9 +1,11 @@
 package com.vci.frameworkcore.compatibility;
 
+import com.vci.common.exception.VciException;
 import com.vci.corba.common.PLException;
 import com.vci.frameworkcore.enumpck.ResourceControlTypeEnum;
 import com.vci.pagemodel.MenuVO;
 import com.vci.pagemodel.SmFunctionVO;
+import com.vci.starter.web.exception.VciBaseException;
 import com.vci.starter.web.pagemodel.DataGrid;
 import com.vci.starter.web.pagemodel.PageHelper;
 import com.vci.starter.web.pagemodel.Tree;
@@ -52,13 +54,23 @@
     List<MenuVO> treeCurrentUserMenu(TreeQueryObject treeQueryObject, ResourceControlTypeEnum resourceControlTypeEnum) throws PLException;
 
     /**
+     * 閫氳繃妯″潡ID鑾峰彇瀛愮骇鍒楄〃
+     * @param parentId
+     * @param isAll 鏄惁鍖呮嫭鏃犳晥鐨勬ā鍧楋紝true鍒欏寘鎷�
+     * @return
+     * @throws VciBaseException
+     */
+    List<MenuVO> getSysModelTreeMenuByPID(String parentId,boolean isAll) throws VciBaseException;
+
+    int checkChildObject(String moduleId) throws VciException;
+
+    /**
      * 鑾峰彇鎵�鏈夌殑鍔熻兘鑿滃崟
      * @param treeQueryObject 鏍戞煡璇㈠璞�
      * @param resourceControlTypeEnum 瑙掕壊鎺у埗鍖哄煙锛屼篃鏄姛鑳芥帶鍒剁殑鍖哄煙
      * @return  鏍戣妭鐐癸紝鍑虹幇閿欒浼氬湪寮傚父澶勭悊鍣ㄤ腑缁熶竴杩斿洖Json
      */
      List<Tree> treeAllMenu(TreeQueryObject treeQueryObject, ResourceControlTypeEnum resourceControlTypeEnum);
-
 
     /**
      * 閫氳繃涓婄骇鑺傜偣鑾峰彇涓嬬骇鐨勬墍鏈夌殑鑿滃崟鑺傜偣
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 1414528..1f6c4de 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
@@ -1,8 +1,14 @@
 package com.vci.frameworkcore.compatibility.impl;
 
+import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
+import com.vci.client.ClientSession;
+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.omd.data.BusinessObject;
 import com.vci.corba.portal.data.PLUILayout;
@@ -13,14 +19,16 @@
 import com.vci.pagemodel.MenuVO;
 import com.vci.pagemodel.SmFunctionVO;
 import com.vci.omd.utils.ObjectTool;
-import com.vci.pagemodel.SmFunctionVO;
 import com.vci.starter.web.constant.QueryOptionConstant;
 import com.vci.starter.web.exception.VciBaseException;
 import com.vci.starter.web.pagemodel.*;
+import com.vci.starter.web.util.VciBaseUtil;
 import com.vci.starter.web.wrapper.VciQueryWrapperForDO;
 import com.vci.pagemodel.UIContentVO;
+import com.vci.web.properties.JsonConfigReader;
 import com.vci.web.service.UIEngineServiceI;
 import com.vci.web.service.WebBoServiceI;
+import com.vci.web.util.Func;
 import com.vci.web.util.PlatformClientUtil;
 import com.vci.web.util.RightControlUtil;
 import com.vci.web.util.WebUtil;
@@ -51,9 +59,17 @@
     /**
      * 鑿滃崟鐨勬牴鑺傜偣涓婚敭锛岃繖涓槸骞冲彴瀹氫箟鐨�
      */
-	private final String ROOT_MENU_Id  = "modelManagmentNode";
+	private final String ROOT_MENU_ID  = "modelManagmentNode";
 
+    /**
+     * 绠$悊鍔熻兘妯″潡鑿滃崟鏍硅妭鐐�
+     */
+    private final String SYSTEMMANAGMENTNODE = "systemManagmentNode";
 
+    /**
+     * 鎿嶄綔绫诲瀷绠$悊鑿滃崟鏍硅妭鐐�
+     */
+    private final String OPERATENODE = "operateNode";
 
     /**
      * 浣跨敤鐢ㄦ埛鏌ヨ
@@ -81,6 +97,7 @@
 
     @Autowired
     RightControlUtil rightControlUtil;
+
     /**
      * 鏌ヨ鎵�鏈夌殑鍔熻兘
      *
@@ -199,7 +216,7 @@
                 functionVO.setDescription(functionForPlatform1.getPldesc());
             }
         }
-        
+
         functionVO.setBtmname("function");
         //鑰佺殑鏁版嵁閲屽垱寤轰汉锛屾渶鍚庝慨鏀逛汉绛夐兘娌℃湁
         return functionVO;
@@ -216,20 +233,23 @@
     public List<MenuVO> treeCurrentUserMenu(TreeQueryObject treeQueryObject, ResourceControlTypeEnum resourceControlTypeEnum) throws PLException {
         SessionInfo sessionInfo = WebUtil.getCurrentUserSessionInfoNotException();
         String parentId;
-
-        if (rightControlUtil.isAdminOrDeveloperOrRoot(sessionInfo.getUserId())) {
-            // 绯荤粺鑿滃崟
-            parentId = "systemManagmentNode" ;
+        boolean adminOrDeveloperOrRoot = rightControlUtil.isAdminOrDeveloperOrRoot(sessionInfo.getUserId());
+        if (adminOrDeveloperOrRoot) {
+            //绯荤粺鑿滃崟
+            parentId = SYSTEMMANAGMENTNODE;
         } else if (rightControlUtil.isThreeAdminCurUser()) {
-            parentId = "systemManagmentNode" ;
+            //涓夊憳杩斿洖绠$悊鍔熻兘妯″潡鐩稿叧鐨勮彍鍗�
+            parentId = SYSTEMMANAGMENTNODE;
         } else {
-            parentId = "modelManagmentNode" ;
+            //鏅�氱敤鎴峰彧杩斿洖涓氬姟鍔熻兘妯″潡鐩稿叧鐨勮彍鍗�
+            parentId = ROOT_MENU_ID;
         }
         RoleRightInfo[] userRoleRights = rightControlUtil.getRoleRightByUserName(sessionInfo.getUserId());
         Map<String, List<FunctionInfo>> map = rightControlUtil.getAllChildrenFunctionsByUserName(
                 parentId, sessionInfo.getUserId(), userRoleRights);
+
         List<MenuVO> functionVOList = new ArrayList<>();
-        if(CollectionUtils.isEmpty(map.get(parentId))){
+        if(Func.isEmpty(map.get(parentId))) {
             return functionVOList;
         }
         for (FunctionInfo menu : map.get(parentId)) {
@@ -239,9 +259,9 @@
             MenuVO functionVO = new MenuVO();
             functionVO.setId(menu.id);
             functionVO.setSource(menu.image);
-//            if(StringUtils.isBlank(menu.resourceB)){
-//                continue;
-//            }
+            //if(StringUtils.isBlank(menu.resourceB)){
+            //    continue;
+            //}
             functionVO.setPath(menu.resourceB);
             functionVO.setParentId(menu.parentId);
             functionVO.setCode(menu.aliasName);
@@ -249,7 +269,14 @@
             functionVO.setName(menu.name);
             functionVO.getMeta().put("keepAlive",false);
             functionVO.setSort((int) menu.seq);
-            functionVO.setChildren(findChildFunctionVO(menu.id, map));
+            try {
+                functionVO.setChildren(findChildFunctionVO(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 {
@@ -257,7 +284,156 @@
             }
             functionVOList.add(functionVO);
         }
+        //濡傛灉鏄紑鍙戞垨鑰呮祴璇曠敤鎴凤紝闇�鍝熻幏鍙栫郴缁熸ā鍧楅厤缃彍鍗�
+        if(adminOrDeveloperOrRoot){
+            //鑾峰彇棣栭〉绯荤粺妯″潡閰嶇疆鑿滃崟
+            MenuVO menuVO = JsonConfigReader.getMenuVO();
+            functionVOList.add(menuVO);
+        }
         return functionVOList.stream().sorted(Comparator.comparing(s -> s.getSort())).collect(Collectors.toList());
+    }
+
+    /**
+     * 閫氳繃妯″潡ID鑾峰彇瀛愮骇鍒楄〃
+     * @param parentId
+     * @param isAll 鏄惁鍖呮嫭鏃犳晥鐨勬ā鍧楋紝true鍒欏寘鎷�
+     * @return
+     * @throws VciBaseException
+     */
+    @Override
+    public List<MenuVO> getSysModelTreeMenuByPID(String parentId,boolean isAll) throws VciBaseException{
+        List<MenuVO> menuVOList = new ArrayList<>();
+        if(Func.isBlank(parentId)){
+            return menuVOList;
+        }
+        if(parentId.equals("mangeModel") || parentId.equals("businessModel")){
+            if(parentId.equalsIgnoreCase("FunctionObject")){
+                try {
+                    /**鍒ゆ柇璇ユā鍧椾笅瀛愬璞℃槸妯″潡杩樻槸鎿嶄綔锛�0琛ㄧず鏃犲瓙鑺傜偣锛�1琛ㄧず鏄ā鍧楋紝2琛ㄧず鏄搷浣�**/
+                    int childType = this.checkChildObject(parentId);
+                    if(childType == 2){
+                        try{
+                            FuncOperationInfo[] infos = platformClientUtil.getFrameworkService().getFuncOperationByModule(parentId, "", false);
+                            for(int i = 0;i < infos.length ;i++){
+                                FuncOperationInfo info = infos[i];
+                                MenuVO menuVO = new MenuVO();
+                                menuVO.setId(info.id);
+                                menuVO.setCode(info.funcId);
+                                menuVO.setId(info.operId);
+                                menuVO.setName(info.operName);
+                                //menuVO.setOperIndentify(info.operIndentify);
+                                menuVO.setAlias(info.operAlias);
+                                menuVO.setRemark(info.operDesc);
+                                menuVO.setSort((int) info.number);
+                                //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);
+                            for(int i = 0;i < funcInfos.length; i++){
+                                FunctionInfo funcInfo = funcInfos[i];
+                                MenuVO menuVO = this.functionInfoToMenuVO(funcInfo);
+                                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{
+                    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");
+                        menuVOList.add(menuVO);
+                    }
+                }catch (PLException e) {
+                    e.printStackTrace();
+                    throw new VciBaseException(String.valueOf(e.code),e.messages);
+                }
+            }
+        }else if(parentId.equals("operateType")){
+            //鍔犺浇鎵�鏈夋搷浣�
+            try{
+                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.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 menuVOList;
+    }
+
+    /**
+     * functionInfo杞琕O瀵硅薄
+     * @param funcInfo
+     * @return
+     */
+    private MenuVO functionInfoToMenuVO(FunctionInfo funcInfo){
+        MenuVO menuVO = new MenuVO();
+        menuVO.setId(funcInfo.id);
+        menuVO.setSource(funcInfo.image);
+        //if(StringUtils.isBlank(menu.resourceB)){
+        //    continue;
+        //}
+        menuVO.setPath(funcInfo.resourceB);
+        menuVO.setParentId(funcInfo.parentId);
+        menuVO.setCode(funcInfo.aliasName);
+        menuVO.setAlias(funcInfo.aliasName);
+        menuVO.setName(funcInfo.name);
+        menuVO.getMeta().put("keepAlive",false);
+        menuVO.setSort((int) funcInfo.seq);
+        if(this.checkChildObject(menuVO.getId()) == 0){
+            menuVO.setHasChildren(false);
+        }else{
+            menuVO.setHasChildren(true);
+        }
+        return menuVO;
+    }
+
+    /**
+     * 閫氳繃妯″潡ID妫�鏌ヨ妯″潡瀛愮骇瀵硅薄鏄ā鍧楄繕鏄搷浣�
+     * @param moduleId
+     * @return 0琛ㄧず娌℃湁妯″潡涔熸病鏈夋搷浣滐紝1琛ㄧず鏈夋ā鍧楋紝2琛ㄧず鏈夋搷浣�
+     * @throws VciException
+     */
+    @Override
+    public int checkChildObject(String moduleId) throws VciBaseException {
+        long res = 0;
+        try{
+            res = ClientSession.getFrameworkService().checkChildObject(moduleId);
+        }catch (PLException e) {
+            e.printStackTrace();
+            throw new VciBaseException(String.valueOf(e.code),e.messages);
+        }
+        return (int)res;
     }
 
     public List<MenuVO> findChildFunctionVO(String parentOid,Map<String, List<FunctionInfo>> map) throws PLException {
@@ -294,7 +470,6 @@
         return functionVOList.stream().sorted(Comparator.comparing(s -> s.getSort())).collect(Collectors.toList());
     }
 
-
     @Override
     public UIContentVO getUIContentByBtmTypeAndId(TreeQueryObject treeQueryObject, ResourceControlTypeEnum resourceControlTypeEnum) throws PLException {
         SessionInfo sessionInfo = WebUtil.getCurrentUserSessionInfoNotException();
@@ -310,9 +485,6 @@
         return null;
     }
 
-
-
-
     /**
      * 鑾峰彇鎵�鏈夌殑鍔熻兘鑿滃崟
      *
@@ -324,7 +496,7 @@
     public List<Tree> treeAllMenu(TreeQueryObject treeQueryObject, ResourceControlTypeEnum resourceControlTypeEnum) {
         List<SmFunctionVO> functionVOList = self.selectAllFunction().stream().filter(s -> s.isDisplayFlag() && resourceControlTypeEnum.getValue().equalsIgnoreCase(s.getResourceControlType())).collect(Collectors.toList());
         if(!treeQueryObject.isQueryAllLevel() && StringUtils.isNotBlank(treeQueryObject.getParentOid())){
-        	functionVOList = functionVOList.stream().filter(s->treeQueryObject.getParentOid().equalsIgnoreCase(s.getParentFunctionId())).collect(Collectors.toList());  
+        	functionVOList = functionVOList.stream().filter(s->treeQueryObject.getParentOid().equalsIgnoreCase(s.getParentFunctionId())).collect(Collectors.toList());
         }
         return dos2Trees(functionVOList.stream().sorted(Comparator.comparing(s -> s.getOrderNum())).collect(Collectors.toList()),treeQueryObject == null?null:treeQueryObject.getParentOid());
     }
@@ -341,7 +513,7 @@
             List<Tree> childList = new ArrayList<>();
             functionVOList.stream().forEach(s -> {
                 Tree tree = DO2Tree(s);
-                if (tree.getParentId() == null || tree.getParentId().equals(rootId) || ROOT_MENU_Id.equalsIgnoreCase(tree.getParentId())) {
+                if (tree.getParentId() == null || tree.getParentId().equals(rootId) || ROOT_MENU_ID.equalsIgnoreCase(tree.getParentId())) {
                     rootList.add(tree);
                 } else {
                     childList.add(tree);
@@ -385,7 +557,7 @@
     public List<Tree> treeFunctionByParent(TreeQueryObject treeQueryObject, ResourceControlTypeEnum resourceControlTypeEnum) {
     	 List<SmFunctionVO> functionVOList = self.selectAllFunction().stream().filter(s -> s.isDisplayFlag() && resourceControlTypeEnum.getValue().equalsIgnoreCase(s.getResourceControlType())).collect(Collectors.toList());
          if(!treeQueryObject.isQueryAllLevel() && StringUtils.isNotBlank(treeQueryObject.getParentOid())){
-         	functionVOList = functionVOList.stream().filter(s->treeQueryObject.getParentOid().equalsIgnoreCase(s.getParentFunctionId())).collect(Collectors.toList());  
+         	functionVOList = functionVOList.stream().filter(s->treeQueryObject.getParentOid().equalsIgnoreCase(s.getParentFunctionId())).collect(Collectors.toList());
          }
          return dos2Trees(functionVOList,treeQueryObject == null?null:treeQueryObject.getParentOid());
     }
@@ -401,12 +573,12 @@
     public List<Tree> treeCurrentFunctionByParent(TreeQueryObject treeQueryObject, ResourceControlTypeEnum resourceControlTypeEnum) {
     	SessionInfo sessionInfo = WebUtil.getCurrentUserSessionInfo();
     	 List<SmFunctionVO> functionVOList =self.selectAllFunction().stream().filter(s -> s.isDisplayFlag()
-    			 && resourceControlTypeEnum.getValue().equalsIgnoreCase(s.getResourceControlType()) 
+    			 && resourceControlTypeEnum.getValue().equalsIgnoreCase(s.getResourceControlType())
     			 && !CollectionUtils.isEmpty(sessionInfo.getFunctionOids())
     			 && sessionInfo.getFunctionOids().contains(s.getOid())
     			 ).collect(Collectors.toList());
          if(!treeQueryObject.isQueryAllLevel() && StringUtils.isNotBlank(treeQueryObject.getParentOid())){
-         	functionVOList = functionVOList.stream().filter(s->treeQueryObject.getParentOid().equalsIgnoreCase(s.getParentFunctionId())).collect(Collectors.toList());  
+         	functionVOList = functionVOList.stream().filter(s->treeQueryObject.getParentOid().equalsIgnoreCase(s.getParentFunctionId())).collect(Collectors.toList());
          }
          return dos2Trees(functionVOList,treeQueryObject == null?null:treeQueryObject.getParentOid());
     }
@@ -605,6 +777,7 @@
         }
         return dataGrid(queryMap,pageHelper);
     }
+
     /**
      * 鎵归噺鏍规嵁瑙掕壊鐨勪富閿幏鍙栧叧鑱旂殑鏉冮檺
      *
@@ -637,7 +810,6 @@
         }
         return gridFunctionByRoleOid(roleOidCollection.stream().collect(Collectors.joining(",")), queryMap,pageHelper,resourceControlTypeEnum,false);
     }
-
 
     /**
      * 娓呴櫎缂撳瓨
diff --git a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/OsLinkTypeController.java b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/OsLinkTypeController.java
index 044c644..cb3bc49 100644
--- a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/OsLinkTypeController.java
+++ b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/OsLinkTypeController.java
@@ -272,8 +272,8 @@
      * @return
      */
     @PostMapping("/impData")
-    @VciUnCheckRight
-    public BaseResult impData(MultipartFile file){try {
+    public BaseResult impData(MultipartFile file){
+        try {
              return linkTypeService.impData(file);
         }catch (Throwable e) {
             throw new VciBaseException(VciBaseUtil.getExceptionMessage(e),new String[0],e);
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 7eaabfb..0313038 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
@@ -124,7 +124,7 @@
 
     /**
      * 鏌ヨ鏉′欢鐨勬煡璇㈡寜閽煡璇is鍒楄〃
-     * @param dataMap 浼犺緭鐨勬暟鎹璞★細
+     * @param qtInfoDTO 浼犺緭鐨勬暟鎹璞★細
      *                linkTypeName 閾炬帴绫诲瀷鍚嶇О銆�
      *                rdPositive 鏂瑰悜锛宼rue姝e悜锛宖alse鍙嶅悜
      *                btmName 涓氬姟绫诲瀷鍚嶇О
@@ -134,10 +134,10 @@
      *                level 瀛愯妭鐐瑰眰鏁�
      * @return 鏌ヨ缁撴灉
      */
-    @GetMapping("/getCriteria")
-    public BaseResult getCriteria(@RequestBody HashMap<String,Object> dataMap){
+    @PostMapping("/getCriteria")
+    public BaseResult getCriteria(@RequestBody QTInfoDTO qtInfoDTO){
         try {
-            return quereyTemplateServiceI.getCriteria(dataMap);
+            return quereyTemplateServiceI.getCriteria(qtInfoDTO);
         } catch (PLException e) {
             BaseResult objectBaseResult = new BaseResult<>();
             objectBaseResult.setCode(Integer.parseInt(e.code));
@@ -202,4 +202,60 @@
             return objectBaseResult;
         }
     }
+
+    /**
+     * 閾炬帴绫诲瀷鏌ヨ妯℃澘鏍戞煡璇紝鐢ㄤ簬鐣岄潰鐨勫鍑哄姛鑳�
+     * @return 鏌ヨ缁撴灉
+     */
+    @GetMapping("/getLinkTree")
+    public BaseResult getLinkTree(){
+        try {
+            return quereyTemplateServiceI.getLinkTree();
+        } catch (PLException e) {
+            BaseResult objectBaseResult = new BaseResult<>();
+            objectBaseResult.setCode(Integer.parseInt(e.code));
+            objectBaseResult.setMsg(Arrays.toString(e.messages));
+            return objectBaseResult;
+        }
+    }
+    /**
+     * 瀵煎嚭閾炬帴绫诲瀷鏌ヨ妯℃澘
+     * names 鏌ヨ妯℃澘鍚�
+     * @return
+     */
+    @PostMapping("/expLinkTemplate")
+    public void expLinkTemplate(@RequestBody List<String> names,HttpServletResponse response) throws PLException, IOException {
+        quereyTemplateServiceI.expLinkTemplate(names, response);
+    }
+
+    /**
+     * 瀵煎叆閾炬帴绫诲瀷鏌ヨ妯℃澘
+     * @param file 涓婁紶鐨勬枃浠�
+     * @return 瀵煎叆缁撴灉
+     */
+    @PostMapping("/impLinkTemplate")
+    public BaseResult impLinkTemplate(MultipartFile file){
+        try {
+            return quereyTemplateServiceI.impLinkTemplate(file);
+        }catch (Throwable e) {
+            throw new VciBaseException(VciBaseUtil.getExceptionMessage(e),new String[0],e);
+        }
+    }
+
+    /**
+     * 鏌ヨ鏂规鍒犻櫎
+     * @param templateNames 鏌ヨ鏂规鍚�
+     * @return 鎿嶄綔缁撴灉
+     */
+    @DeleteMapping("/deleteLinkTemplate")
+    public BaseResult deleteLinkTemplate(@RequestBody List<String> templateNames){
+        try {
+            return quereyTemplateServiceI.deleteLinkTemplate(templateNames);
+        } catch (PLException e) {
+            BaseResult objectBaseResult = new BaseResult<>();
+            objectBaseResult.setCode(Integer.parseInt(e.code));
+            objectBaseResult.setMsg(Arrays.toString(e.messages));
+            return objectBaseResult;
+        }
+    }
 }
diff --git a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/SmFunctionController.java b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/SmFunctionController.java
index 87f6987..7e9968d 100644
--- a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/SmFunctionController.java
+++ b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/SmFunctionController.java
@@ -6,8 +6,12 @@
 import com.vci.pagemodel.MenuVO;
 import com.vci.pagemodel.SmFunctionVO;
 import com.vci.starter.web.annotation.controller.VciUnCheckRight;
+import com.vci.starter.web.exception.VciBaseException;
 import com.vci.starter.web.pagemodel.*;
 import com.vci.pagemodel.UIContentVO;
+import com.vci.starter.web.util.VciBaseUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
@@ -29,6 +33,10 @@
 	@Autowired
 	private ISmFunctionQueryService functionQueryService;
 
+	/**
+	 * 鏃ュ織
+	 */
+	private Logger logger = LoggerFactory.getLogger(getClass());
 
    /**
     * 鑾峰彇褰撳墠鐢ㄦ埛鐨勮彍鍗�
@@ -41,6 +49,25 @@
 	}
 
 	/**
+	 * 鑾峰彇褰撳墠妯″潡涓嬬殑瀛愭ā鍧�
+	 * @param parentId
+	 * @return
+	 * @throws PLException
+	 */
+	@GetMapping("/getSysModelTreeMenuByPID")
+	@VciUnCheckRight
+	public List<MenuVO> getSysModelTreeMenuByPID(String parentId) {
+		try {
+			return functionQueryService.getSysModelTreeMenuByPID(parentId,true);
+		}catch (Exception e){
+			e.printStackTrace();
+			String errorMsg = "鏌ヨ瀛愭ā鍧楁椂鍑虹幇閿欒锛屽師鍥狅細"+VciBaseUtil.getExceptionMessage(e);
+			logger.error(errorMsg);
+			throw new VciBaseException(errorMsg);
+		}
+	}
+
+	/**
 	 * 鑾峰彇褰撳墠鐢ㄦ埛鐨勮彍鍗�
 	 * @param treeQueryObject 鏍戞煡璇㈠璞�
 	 * @return  鏍戣妭鐐癸紝鍑虹幇閿欒浼氬湪寮傚父澶勭悊鍣ㄤ腑缁熶竴杩斿洖Json
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 5e6f1f0..270d46a 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
@@ -54,7 +54,6 @@
 @RequestMapping("/btmTypeController")
 @VciBusinessLog(modelName="涓氬姟绫诲瀷")
 @RestController
-@VciUnCheckRight
 public class WebBtmTypeController {
 
     /**
@@ -191,7 +190,7 @@
      * btmTypeDTO 閾炬帴绫诲瀷淇敼鐨勫璞�
      * @return 淇濆瓨缁撴灉
      */
-    @PostMapping("/updateBtmType")
+    @PutMapping("/updateBtmType")
     public BaseResult updateBtmType(@RequestBody OsBtmTypeDTO btmTypeDTO){
         try {
             return btmService.updateBtmType(btmTypeDTO) ? BaseResult.success("涓氬姟绫诲瀷淇敼鎴愬姛锛�"):BaseResult.fail("涓氬姟绫诲瀷淇敼澶辫触锛�");
@@ -469,7 +468,7 @@
                 OsBtmTypeAttributeVO attributeVO = new OsBtmTypeAttributeVO();
                 BeanUtil.convert(attr,attributeVO);
                 attributeVO.setAttributeLength(attr.getAttrLength());
-                attributeVO.setAttrDataType(attr.getAttributeDataType());
+                attributeVO.setAttributeDataType(attr.getAttributeDataType());
                 attributeVO.setReferBtmTypeId(attr.getBtmTypeId());
                 attributeVO.setReferBtmTypeName(attr.getBtmTypeName());
                 finalBoAttrs.add(attributeVO);
diff --git a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/other/LinkQTExportData.java b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/other/LinkQTExportData.java
new file mode 100644
index 0000000..d2fe2f7
--- /dev/null
+++ b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/other/LinkQTExportData.java
@@ -0,0 +1,96 @@
+package com.vci.web.other;
+
+import java.io.Serializable;
+import java.util.HashMap;
+import java.util.Map;
+
+import com.vci.corba.omd.ltm.LinkType;
+import com.vci.corba.omd.qtm.QTD;
+import com.vci.corba.omd.qtm.QTInfo;
+import com.vci.corba.common.PLException;
+import com.vci.web.util.PlatformClientUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+
+/**
+ * 鏌ヨ妯℃澘瀵煎嚭鏁版嵁绫伙細鍙簭鍒楀寲涓烘ā鏉挎枃浠�,鍚屾椂涔熷吋瀵煎嚭鏁版嵁鎺у埗绫�
+ * @Title		:QTExportData.java
+ * @Description	: 
+ * @Copyright	:瀹忓崥杩滆揪绉戞妧鏈夐檺鍏徃
+ * @Author		:骞冲彴涓庤鍒掗儴/ZhongGY/E-mail:zhonggy@vci-tech.com
+ * @Date		:2015-6-8
+ * @Version		:1
+ * @Other		:浜х敓娉ㄩ噴:Alt+Shift+J
+ */
+public class LinkQTExportData implements Serializable{
+
+	private static final long serialVersionUID = 1L;
+
+	
+	/**
+	 * 闇�瑕佸簭鍒楀寲鐨勬ā鏉挎暟鎹�
+	 */
+	//
+	private Map<String/*绫诲瀷鍚嶇О*/, LinkType/*绫诲瀷瀵硅薄*/> selectedBtmItems = new HashMap<String, LinkType>();
+	private Map<String/*绫诲瀷鍚嶇О*/,String[]/*绫诲瀷鎵�灞炲睘鎬�*/> selectedBtmAttrs = new HashMap<String, String[]>();
+	private Map<String/*鏌ヨ妯℃澘鍚嶇О*/, QTInfo/*鏌ヨ妯℃澘瀵硅薄*/> allSelectedQTs = new HashMap<String, QTInfo>();
+	private Map<String/*绫诲瀷鍚嶇О*/, QTD[]/*鏌ヨ妯℃澘瀹氫箟*/> allQTDs = new HashMap<String, QTD[]>();
+
+
+	public Map<String, LinkType> getSelectedBtmItems() {
+		return selectedBtmItems;
+	}
+
+	public void setSelectedBtmItems(Map<String, LinkType> selectedBtmItems) {
+		this.selectedBtmItems = selectedBtmItems;
+	}
+
+	public Map<String, String[]> getSelectedBtmAttrs() {
+		return selectedBtmAttrs;
+	}
+
+	public void setSelectedBtmAttrs(Map<String, String[]> selectedBtmAttrs) {
+		this.selectedBtmAttrs = selectedBtmAttrs;
+	}
+
+	public Map<String, QTD[]> getAllQTDs() {
+		return allQTDs;
+	}
+
+	public void setAllQTDs(Map<String, QTD[]> allQTDs) {
+		this.allQTDs = allQTDs;
+	}
+
+	public Map<String, QTInfo> getAllQTs() {
+		return allSelectedQTs;
+	}
+
+//	public void setAllQTs(Map<String, QTInfo> allQTs) {
+//		this.allSelectedQTs = allQTs;
+////		try {
+////			BizType[] btmArray = BtmClient.getService().getAllBtmItem("");
+////			for (int i = 0; i < btmArray.length; i++) {
+////				allBtmItems.put(btmArray[i].name, btmArray[i]);
+////			}
+////		} catch (PLException e) {
+////		}
+//		for (Map.Entry<String, QTInfo> item : allQTs.entrySet()) {
+////			BizType bizType = allBtmItems.get(item.getValue().btmName);
+//			LinkType linkType;
+//			try {
+//				linkType = LinkTypeStart.getService().getLinkType(item.getValue().btmName);
+//				if(linkType != null && !linkType.oid.equals("")){
+//					selectedBtmItems.put(linkType.name, linkType);
+////					selectedBtmAttrs.put(linkType.name, BtmProvider.getInstance().getAbNames(linkType.name));
+//					selectedBtmAttrs.put(linkType.name, linkType.attributes);
+//					allQTDs.put(linkType.name, .getQTDService().getLinkTypeQTDs(linkType.name));
+//				}
+//			} catch (PLException e1) {
+//				// TODO Auto-generated catch block
+//				e1.printStackTrace();
+//			}
+//		}
+//		//selectedBtmAttrs?
+//		//allQTDs?
+//	}
+
+}
diff --git a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/properties/JsonConfigReader.java b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/properties/JsonConfigReader.java
new file mode 100644
index 0000000..840d4f0
--- /dev/null
+++ b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/properties/JsonConfigReader.java
@@ -0,0 +1,36 @@
+package com.vci.web.properties;
+
+import com.alibaba.fastjson.JSON;
+import com.vci.pagemodel.MenuVO;
+import org.apache.commons.io.FileUtils;
+import org.springframework.util.ResourceUtils;
+
+import java.io.*;
+
+/**
+ * 璇诲彇json閰嶇疆鏂囦欢锛岃彍鍗曠瓑
+ * @author ludc
+ * @date 2024/8/16 10:09
+ */
+public class JsonConfigReader {
+
+    /**
+     * 鑿滃崟json閰嶇疆鏂囦欢锛屽鏈夊叾浠栭渶瑕佽鍙栫殑锛屽彲浠ヤ豢鐓у綋鍓嶉�昏緫缂栧啓
+     */
+    private static MenuVO menuVO;
+
+    static{
+        try {
+            File file = ResourceUtils.getFile("classpath:menuConfig.json");
+            String json = FileUtils.readFileToString(file, "UTF-8");
+            menuVO = JSON.parseObject(json, MenuVO.class);
+        }catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+    public static MenuVO getMenuVO() {
+        return menuVO;
+    }
+
+}
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 4cd367d..c4fbb99 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
@@ -53,7 +53,7 @@
     BaseResult deleteTemplate(String name) throws PLException;
     /**
      *
-     * @param dataMap 浼犺緭鐨勬暟鎹璞★細
+     * @param qtInfoDTO 浼犺緭鐨勬暟鎹璞★細
      *                linkTypeName 閾炬帴绫诲瀷銆�
      *                rdPositive 鏂瑰悜锛宼rue姝e悜锛宖alse鍙嶅悜
      *                btmName 涓氬姟绫诲瀷鍚嶇О
@@ -63,7 +63,7 @@
      *                level 瀛愯妭鐐瑰眰鏁�
      * @return 鏌ヨ缁撴灉
      */
-    BaseResult getCriteria(HashMap<String,Object> dataMap) throws PLException;
+    BaseResult getCriteria(QTInfoDTO qtInfoDTO) throws PLException;
     /**
      * 鏌ヨ妯℃澘鍒楄〃
      * @param btName 绫诲瀷鍚嶇О
@@ -83,4 +83,27 @@
      * @return 淇濆瓨缁撴灉
      */
     BaseResult linkSave(QTInfoDTO qtInfoDTO) throws PLException;
+    /**
+     * 閾炬帴绫诲瀷鏌ヨ妯℃澘鏍戞煡璇紝鐢ㄤ簬鐣岄潰鐨勫鍑哄姛鑳�
+     * @return 鏌ヨ缁撴灉
+     */
+    BaseResult getLinkTree()  throws PLException ;
+    /**
+     * 瀵煎嚭閾炬帴绫诲瀷鏌ヨ妯℃澘
+     * names 鏌ヨ妯℃澘鍚�
+     * @return
+     */
+    void expLinkTemplate(List<String> names, HttpServletResponse response) throws PLException, IOException ;
+    /**
+     * 瀵煎叆閾炬帴绫诲瀷鏌ヨ妯℃澘
+     * @param file 涓婁紶鐨勬枃浠�
+     * @return 瀵煎叆缁撴灉
+     */
+    BaseResult impLinkTemplate(MultipartFile file) throws IOException, ClassNotFoundException;
+    /**
+     * 鏌ヨ鏂规鍒犻櫎
+     * @param templateNames 鏌ヨ鏂规鍚�
+     * @return 鎿嶄綔缁撴灉
+     */
+    BaseResult deleteLinkTemplate(List<String> templateNames) throws PLException;
 }
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 aace24a..3f0f4d3 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
@@ -202,7 +202,7 @@
                 //vo.setCreateTime(VciDateUtil.str2Date(String.valueOf(btmItem.createTime),VciDateUtil.DateTimeFormat));
                 vo.setCreateTime(Func.parse(btmItem.createTime, ConcurrentDateFormat.of(VciDateUtil.DateTimeFormat)));
                 vo.setLastModifyTime( Func.parse(btmItem.modifyTime, ConcurrentDateFormat.of(VciDateUtil.DateTimeFormat)));
-                vo.setTs(Func.parse(btmItem.ts, ConcurrentDateFormat.of(VciDateUtil.DateTimeFormat)));
+                vo.setTs(Func.parse(btmItem.ts, ConcurrentDateFormat.of(VciDateUtil.DateTimeMillFormat)));
             } catch (Exception e) {
                 e.printStackTrace();
             }
@@ -219,11 +219,11 @@
             vo.setInputRevisionFlag(btmItem.revInput);
             vo.setDelimiter(btmItem.delimiter);
             vo.setfName(btmItem.fName);
-            if(StringUtils.isNotBlank(vo.getRevisionRuleId()) || vo.isInputRevisionFlag()){
+            vo.setVersionRule(String.valueOf(btmItem.verRuleName));
+            if(StringUtils.isNotBlank(vo.getRevisionRuleName()) || vo.isInputRevisionFlag()){
                 vo.setRevisionFlag(true);
             }
-            vo.setVersionRule(String.valueOf(btmItem.verRuleName));
-            vo.setSubLifeCycleId(Arrays.stream(btmItem.lifeCycles).collect(Collectors.joining(",")));
+            vo.setLifeCycleIds(Arrays.stream(btmItem.lifeCycles).collect(Collectors.joining(",")));
             vo.setApNameArray(btmItem.apNameArray);
             List<OsAttributeVO> attributeVOS = attributeService.listAttrByIds(Arrays.stream(btmItem.apNameArray).collect(Collectors.toList()));
             List<OsBtmTypeAttributeVO> btmTypeAttributeVOS = new ArrayList<>();
@@ -232,7 +232,7 @@
                 BeanUtil.convert(attributeVO,btmTypeAttributeVO);
                 btmTypeAttributeVO.setPkBtmType(vo.getOid());
                 btmTypeAttributeVO.setBtmTypeId(vo.getId());
-                btmTypeAttributeVO.setAttrDataType(attributeVO.getAttributeDataType());
+                btmTypeAttributeVO.setAttributeDataType(attributeVO.getAttributeDataType());
                 btmTypeAttributeVO.setAttributeLength(attributeVO.getAttrLength());
                 btmTypeAttributeVO.setDefaultValue(attributeVO.getDefaultValue());
                 if("secretgrade".equalsIgnoreCase(attributeVO.getId())){
@@ -385,7 +385,7 @@
             attributeService.getDefaultAttributeVOs().stream().forEach(attr->{
                 OsBtmTypeAttributeVO attributeVO = new OsBtmTypeAttributeVO();
                 BeanUtil.convert(attr, attributeVO);
-                attributeVO.setAttrDataType(attr.getAttributeDataType());
+                attributeVO.setAttributeDataType(attr.getAttributeDataType());
                 attributeVO.setAttributeLength(attr.getAttrLength());
                 attributeVO.setReferBtmTypeId(attr.getBtmTypeId());
                 attributeVO.setReferBtmTypeName(attr.getBtmTypeName());
@@ -648,7 +648,7 @@
             AttributeDef sysAttributeDef = collect.get(attrName.toLowerCase());
             OsBtmTypeAttributeVO vo = new OsBtmTypeAttributeVO();
             vo.setOid(sysAttributeDef.oid);
-            vo.setAttrDataType(sysAttributeDef.vtDataType);
+            vo.setAttributeDataType(sysAttributeDef.vtDataType);
             vo.setPkBtmType(btmName);
             vo.setCreateTime(new Date(sysAttributeDef.createTime));
             vo.setCreator(sysAttributeDef.creator);
@@ -667,7 +667,7 @@
         for (AttributeDef attribute : attributeDefs) {
             OsBtmTypeAttributeVO vo = new OsBtmTypeAttributeVO();
             vo.setOid(attribute.oid);
-            vo.setAttrDataType(attribute.vtDataType);
+            vo.setAttributeDataType(attribute.vtDataType);
             vo.setPkBtmType(btmName);
             vo.setCreateTime(new Date(attribute.createTime));
             vo.setCreator(attribute.creator);
@@ -695,6 +695,7 @@
      */
     private BizType dto2BizType(OsBtmTypeDTO dto){
         BizType bizType = new BizType();
+        bizType.oid = dto.getOid();
         bizType.name =dto.getId();
         bizType.isAbstract = dto.isAbstractFlag();
         bizType.label = dto.getName();
@@ -710,24 +711,24 @@
         }
         bizType.description = dto.getDescription();
         bizType.revLevel = dto.getRevLevel();
-
-        bizType.revRuleName = dto.getRevisionRuleName();
+        bizType.revRuleName = dto.getRevisionRuleId();
         bizType.revInput = dto.isInputRevisionFlag();
 
         bizType.delimiter = (dto.getDelimiter() == null ? "" : dto.getDelimiter());
 
-        bizType.verRuleName = Short.parseShort(dto.getRevisionRuleName());
+        bizType.verRuleName = Func.isBlank(dto.getVersionRule()) ? 0:Short.parseShort(dto.getVersionRule());
 
         //bizType.imageName = dto.get;
         //List<String> attrIdList = dto.getAttributesDTOList().stream().map(OsBtmTypeLinkAttributesDTO::getId).collect(Collectors.toList());
 
-        bizType.apNameArray = dto.getApNameArray();//attrIdList.toArray(new String[attrIdList.size()]);
+        bizType.apNameArray = dto.getApNameArray().split(",");//attrIdList.toArray(new String[attrIdList.size()]);
         String userId = WebThreadLocalUtil.getCurrentUserSessionInfoInThread().getUserId();
         long timeMillis = System.currentTimeMillis();
         bizType.creator = Func.isBlank(dto.getCreator()) ? userId:dto.getCreator();
         bizType.createTime = Func.isEmpty(dto.getCreateTime()) ? timeMillis:dto.getCreateTime().getTime();
         bizType.modifier = userId;
         bizType.modifyTime = timeMillis;
+        bizType.ts = Func.isEmpty(dto.getTs())? timeMillis:dto.getTs().getTime();
         return bizType;
     }
 
@@ -811,9 +812,11 @@
      * @return
      */
     private void checkVersionInfo(OsBtmTypeDTO dto) throws PLException {
-        //闇�瑕佹墜鍔ㄨ緭鍏ョ増鏈椂revisionRuleName涓嶈兘涓虹┖
-        if (dto.isInputRevisionFlag() && Func.isBlank(dto.getRevisionRuleName())) {
-            throw new PLException("500",new String[]{"鐗堟湰鍙疯鍒欎笉鑳戒负绌�"});
+        //闇�瑕佹墜鍔ㄨ緭鍏ョ増鏈椂revisionRuleId涓嶈兘涓虹┖
+        if (dto.getRevLevel() == 1 || dto.getRevLevel() == 2) {
+            if (Func.isBlank(dto.getRevisionRuleId()) && !dto.isInputRevisionFlag()) {
+                throw new PLException("500",new String[]{"鐗堟湰鍙疯鍒欎笉鑳戒负绌�"});
+            }
         }
     }
 
@@ -854,14 +857,14 @@
         checkRevLevel(dbBizType,btmTypeDTO);
         checkVersionInfo(btmTypeDTO);
         //澶勭悊涓氬姟绫诲瀷涓嬬殑灞炴��
-        List<String> lastAttrList = new ArrayList<>(Arrays.asList(btmTypeDTO.getApNameArray()));
+        List<String> lastAttrList = new ArrayList<>(Arrays.asList(btmTypeDTO.getApNameArray().split(",")));
         //涓嶈兘绉婚櫎鐨勫睘鎬�
         String[] unRemovableFields = null;
         List<String> unRemovableFields_ = null;
         //闇�瑕佺Щ闄ょ殑灞炴��
         List<String> removableFields = null;
         //淇敼鍓嶄笟鍔$被鍨嬪湪鏁版嵁搴撲腑宸插瓨鍦ㄧ殑鎵�鏈夊睘鎬�
-        String[] apNameArray = btmTypeDTO.getApNameArray();
+        String[] apNameArray = btmTypeDTO.getApNameArray().split(",");
         Set<String> dbApNameArray = Arrays.stream(dbBizType.apNameArray)
                 .collect(Collectors.toSet());
         //杩囨护鍑洪渶瑕佺Щ闄ょ殑灞炴��
@@ -1479,7 +1482,7 @@
             if(StringUtils.isBlank(bizType.getfName())){
                 continue;
             }
-            if(bizType.getfName().equals(parentBIzType.getName())){
+            if(bizType.getfName().equals(parentBIzType.getId())){
                 Tree tree = new Tree();
                 tree.setOid(bizType.getOid());
                 tree.setParentName(parentBIzType.getfName());
diff --git a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/OsCodeGenSchemaServiceImpl.java b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/OsCodeGenSchemaServiceImpl.java
index 70e4ff8..2bbb45b 100644
--- a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/OsCodeGenSchemaServiceImpl.java
+++ b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/OsCodeGenSchemaServiceImpl.java
@@ -412,7 +412,7 @@
             if(StringUtils.isBlank(idAttr.getName())){
                 idAttr.setName("缂栧彿");
             }
-            idAttr.setAttrDataType(VciFieldTypeEnum.VTString.name());
+            idAttr.setAttributeDataType(VciFieldTypeEnum.VTString.name());
             if(idAttr.getAttributeLength() == null || idAttr.getAttributeLength() <= 0){
                 idAttr.setAttributeLength(50);
             }
@@ -426,7 +426,7 @@
             if(StringUtils.isBlank(nameAttr.getName())){
                 nameAttr.setName("鍚嶇О");
             }
-            nameAttr.setAttrDataType(VciFieldTypeEnum.VTString.name());
+            nameAttr.setAttributeDataType(VciFieldTypeEnum.VTString.name());
             if(nameAttr.getAttributeLength() == null || nameAttr.getAttributeLength() <= 0){
                 nameAttr.setAttributeLength(150);
             }
@@ -440,7 +440,7 @@
             if(StringUtils.isBlank(descAttr.getName())){
                 descAttr.setName("鎻忚堪");
             }
-            descAttr.setAttrDataType(VciFieldTypeEnum.VTString.name());
+            descAttr.setAttributeDataType(VciFieldTypeEnum.VTString.name());
             if(descAttr.getAttributeLength() == null || descAttr.getAttributeLength() <= 0){
                 descAttr.setAttributeLength(250);
             }
@@ -455,7 +455,7 @@
                 if(VciQueryWrapperForDO.LC_STATUS_FIELD.equalsIgnoreCase(attributeBO.getId())){
                     attributeBO.setName("鐘舵��");
                 }
-                attributeBO.setVciAttrDataType(attr.getAttrDataType());
+                attributeBO.setVciAttrDataType(attr.getAttributeDataType());
                 attributeBO.setNullable(String.valueOf(attr.isNullableFlag()));
                 attributeBO.setAttrDataType(getAttrDateTypeFromVci(attributeBO.getVciAttrDataType()));
                 attributeBO.setJdbcType(getJdbcTypeFromVci(attributeBO.getVciAttrDataType()));
diff --git a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/OsLinkTypeServiceImpl.java b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/OsLinkTypeServiceImpl.java
index c9cf8d5..f69df86 100644
--- a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/OsLinkTypeServiceImpl.java
+++ b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/OsLinkTypeServiceImpl.java
@@ -319,7 +319,7 @@
                     }
                     OsBtmTypeAttributeVO attributeVO = attributeVOMap.getOrDefault(attrId.toLowerCase(Locale.ROOT), null);
                     if(attributeVO!=null){
-                        String vtType = attributeVO.getAttrDataType();
+                        String vtType = attributeVO.getAttributeDataType();
                         String attrType = "";
                         VciFieldTypeEnum fieldTypeEnum = VciFieldTypeEnum.forValue(vtType);
                         if(fieldTypeEnum == null) {
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 44d39ff..8f49da8 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
@@ -1,19 +1,33 @@
 package com.vci.web.service.impl;
 
+import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.util.ZipUtil;
 import com.alibaba.fastjson.JSONObject;
 import com.vci.client.common.oq.OQTool;
 import com.vci.common.qt.object.*;
+import com.vci.constant.FrameWorkLangCodeConstant;
 import com.vci.corba.common.PLException;
 import com.vci.corba.omd.atm.AttributeDef;
 import com.vci.corba.omd.data.LinkObject;
+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.omd.objects.OtherInfo;
+import com.vci.po.OsLinkTypePO;
+import com.vci.starter.poi.bo.ReadExcelOption;
+import com.vci.starter.poi.bo.WriteExcelData;
+import com.vci.starter.poi.bo.WriteExcelOption;
+import com.vci.starter.poi.constant.ExcelLangCodeConstant;
+import com.vci.starter.poi.util.ExcelUtil;
+import com.vci.starter.web.exception.VciBaseException;
 import com.vci.starter.web.pagemodel.BaseResult;
+import com.vci.starter.web.pagemodel.Tree;
 import com.vci.starter.web.util.*;
+import com.vci.web.other.LinkQTExportData;
 import com.vci.web.service.*;
 import com.vci.web.util.DateUtil;
+import com.vci.web.util.Func;
 import com.vci.web.util.PlatformClientUtil;
 import com.vci.web.util.WebUtil;
 import org.apache.commons.lang3.StringUtils;
@@ -23,7 +37,13 @@
 import org.dom4j.Element;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.*;
 import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * 鏌ヨ妯℃澘鏈嶅姟
@@ -142,8 +162,8 @@
      * @return 鏌ヨ缁撴灉
      */
     @Override
-    public BaseResult getCriteria(HashMap<String,Object> dataMap) throws PLException {
-        QueryTemplate qt = getQT(dataMap);
+    public BaseResult getCriteria(QTInfoDTO qtInfoDTO) throws PLException {
+        QueryTemplate qt = getQT(qtInfoDTO);
         String checkInfo = OQTool.checkQT(qt);
         if(!checkInfo.equals("OK")){
             throw new PLException("500", new String[]{checkInfo});
@@ -279,6 +299,71 @@
         }
     }
 
+    /**
+     * 閾炬帴绫诲瀷鏌ヨ妯℃澘鏍戞煡璇紝鐢ㄤ簬鐣岄潰鐨勫鍑哄姛鑳�
+     * @return 鏌ヨ缁撴灉
+     */
+    @Override
+    public BaseResult getLinkTree() throws PLException {
+        LinkType[] linkTypes= null;
+        QTInfo[] qts = null;
+        HashMap<String,Object> tree = new HashMap();
+        tree.put("text","涓氬姟绫诲瀷");
+        if (linkTypes == null) {
+            List<LinkType> es = new ArrayList<LinkType>();
+            linkTypes = platformClientUtil.getLinkTypeService().getLinkTypes();
+            for (LinkType lt : linkTypes) {
+                QTInfo[] qtWrappers = platformClientUtil.getQTDService().getObjTypeQTs(lt.name);
+                if (qtWrappers.length!=0) {
+                    es.add(lt);
+                }
+            }
+            linkTypes = es.toArray(new LinkType[es.size()]);
+            //TODO:闇�淇娌℃湁鍏宠仈鏌ヨ妯℃澘涓氬姟绫诲瀷鍘绘帀
+            qts = platformClientUtil.getQTDService().getAllQTs();//鑾峰彇鎵�鏈夋煡璇㈡ā鏉�
+        }
+        List<HashMap<String,Object>> childList = new ArrayList<>();
+        //娣诲姞涓氬姟绫诲瀷鏍硅妭鐐�
+        for (LinkType plAction : linkTypes) {
+            HashMap<String,Object> childTree = new HashMap();
+            childTree.put("text", plAction.tag + "/" +plAction.name);
+            childTree.put("oid", plAction.oid);
+//            tree.put("children", childTree);
+            addExportTreeNode(plAction, qts, childTree);
+            childList.add(childTree);
+        }
+        tree.put("children", childList);
+        return BaseResult.success(tree);
+    }
+
+    /**
+     * 鐢熸垚瀵煎嚭鏍戦�夋嫨浠ュ強瀵煎叆鏍戞樉绀�
+     * @param linkType
+     * @param qts
+     * @param tree
+     */
+    private void addExportTreeNode(LinkType linkType/*涓氬姟绫诲瀷*/,QTInfo[] qts/*鏌ヨ妯℃澘瀵硅薄*/,HashMap<String,Object> tree) {
+        List<String> childList = new ArrayList<>();
+        // 娣诲姞鏌ヨ妯℃澘瀵硅薄瀛愯妭鐐�
+        for (QTInfo qtItem : qts) {
+            //澶勭悊瀵煎叆鏃舵棤娉曡繘琛岀被鍨嬪垽鏂�
+            int splitLength = linkType.name.indexOf("銆�");
+            if(splitLength == -1){
+                splitLength = linkType.name.length();
+            }
+            if (qtItem.btmName.equals(linkType.name.substring(0,
+                    splitLength))) {
+                childList.add(qtItem.qtName);
+            }
+        }
+        tree.put("children",childList);
+    }
+
+    /**
+     * 灏嗛珮绾ф潯浠舵暟鎹浆涓簒ml
+     * @param qtInfoDTO 鏌ヨ妯℃澘鍒楄〃浼犺緭瀵硅薄
+     * @return xml鏁版嵁
+     */
     private String getSeniorXML(QTInfoDTO qtInfoDTO){
         HashMap<String, Object> tree = qtInfoDTO.getTree();
         if(tree.isEmpty()){
@@ -300,6 +385,12 @@
         return xmlStr.append("</root>").toString();
 
     }
+
+    /**
+     * 灏嗛珮绾ф潯浠舵暟鎹浆涓簒ml
+     * @param childs 楂樼骇鏉′欢鏁版嵁
+     * @return xml鏁版嵁
+     */
     private String getSeniorChildXML(JSONObject childs){
 
         StringBuilder xmlStr = new StringBuilder("<child>" + childs.get("connector"));
@@ -498,8 +589,6 @@
             //楂樼骇鏌ヨ鏉′欢
         }else if(qtInfoDTO.getLevelFlag() == 1){
             ciMap = getCIMapForSeniorTree(qtInfoDTO);
-
-//            OQTool.parseTreeToDoc(seniorTree);
         }
         return ciMap;
     }
@@ -797,34 +886,34 @@
         return qt;
     }
 
-    /**
-     * 缁勮鏌ヨ妯℃澘
-     * @return
-     */
-    public QueryTemplate getQT(HashMap<String,Object> dataMap){
-        QueryTemplate qt = new QueryTemplate();
-        qt.setType(QTConstants.TYPE_LINK);
-        //TODO String qtId =
-        qt.setLinkType((String) dataMap.get("linkTypeName"));
-        qt.setDirection( (Boolean)dataMap.get("rdPositive") ? QTConstants.DIRECTION_POSITIVE : QTConstants.DIRECTION_OPPOSITE);
-        qt.setBtmType((String) dataMap.get("btmName"));
-        if("鎵�鏈夌被鍨�".equals(dataMap.get("combRelaType"))){
-            qt.setBtmType("*");
-        }
-        qt.setVersion(getVersion((String) dataMap.get("versionValue")));
-        qt.setQueryISLeaf((Boolean) dataMap.get("isQueryIsLeaf"));
-        qt.setLevel(StringUtils.isBlank((CharSequence) dataMap.get("level")) ? 1 : Integer.valueOf(String.valueOf(dataMap.get("level"))));
-        List<String> clauseList = new ArrayList<String>();
-        //TODO 鏌ヨ鍒� 鏄剧ず鍒�
-        clauseList.add("*");
-        qt.setClauseList(clauseList);
+//    /**
+//     * 缁勮鏌ヨ妯℃澘
+//     * @return
+//     */
+//    public QueryTemplate getQT(HashMap<String,Object> dataMap){
+//        QueryTemplate qt = new QueryTemplate();
+//        qt.setType(QTConstants.TYPE_LINK);
+//        //TODO String qtId =
+//        qt.setLinkType((String) dataMap.get("linkTypeName"));
+//        qt.setDirection( (Boolean)dataMap.get("rdPositive") ? QTConstants.DIRECTION_POSITIVE : QTConstants.DIRECTION_OPPOSITE);
+//        qt.setBtmType((String) dataMap.get("btmName"));
+//        if("鎵�鏈夌被鍨�".equals(dataMap.get("combRelaType"))){
+//            qt.setBtmType("*");
+//        }
+//        qt.setVersion(getVersion((String) dataMap.get("versionValue")));
+//        qt.setQueryISLeaf((Boolean) dataMap.get("isQueryIsLeaf"));
+//        qt.setLevel(StringUtils.isBlank((CharSequence) dataMap.get("level")) ? 1 : Integer.valueOf(String.valueOf(dataMap.get("level"))));
+//        List<String> clauseList = new ArrayList<String>();
+//        //TODO 鏌ヨ鍒� 鏄剧ず鍒�
+//        clauseList.add("*");
+//        qt.setClauseList(clauseList);
 //        Condition con = new Condition();
 //        qt.setCondition(con);
 //        HashMap<String, ConditionItem> ciMap = getCIMap();
 //        con.setCIMap(ciMap);
 //        con.setRootCIName(con.getRootCINameByCIMap(ciMap));
-        return qt;
-    }
+//        return qt;
+//    }
 
 
     /**
@@ -868,4 +957,284 @@
             throw new PLException("500", new String[]{"璇ユā鏉垮畾涔夊悕宸茬粡琚娇鐢�, 璇锋洿鎹�"});
         }
     }
+
+
+    /**
+     * 瀵煎嚭閾炬帴绫诲瀷鏌ヨ妯℃澘
+     * names 鏌ヨ妯℃澘鍚�
+     * @return
+     */
+    @Override
+    public void expLinkTemplate(List<String> names, HttpServletResponse response) throws PLException, IOException {
+        String defaultTempFolder = LocalFileUtil.getDefaultTempFolder();
+        String vciqtmfFileName = defaultTempFolder + File.separator + "LinkTemplateExp" + new Date().getTime() + ".vciqtf";
+        LinkQTExportData exportData = new LinkQTExportData();
+        for (String name : names) {
+            QTInfo qt = platformClientUtil.getQTDService().getQT(name);
+            exportData.getAllQTs().put(qt.qtName,qt);
+            LinkType linkType = platformClientUtil.getLinkTypeService().getLinkType(qt.btmName);
+            if(linkType != null && !linkType.oid.equals("")){
+                exportData.getSelectedBtmItems().put(linkType.name, linkType);
+                exportData.getSelectedBtmAttrs().put(linkType.name, linkType.attributes);
+                exportData.getAllQTDs().put(linkType.name, platformClientUtil.getQTDService().getLinkTypeQTDs(linkType.name));
+            }
+        }
+        ObjectOutputStream vciamfFileStream = null;
+        try {
+            File vciqtmfFile = new File(vciqtmfFileName);
+            vciamfFileStream = new ObjectOutputStream(new FileOutputStream(vciqtmfFile));
+            vciamfFileStream.writeObject(exportData);
+        }finally {
+            try {
+                if (vciamfFileStream != null) {
+                    vciamfFileStream.flush();
+                    vciamfFileStream.close();
+                }
+            } catch (Exception e) {
+                throw new PLException("500",new String[]{"瀵煎嚭娴佸叧闂紓甯革紒"});
+            }
+        }
+        ControllerUtil.writeFileToResponse(response,vciqtmfFileName);
+        FileUtil.del(defaultTempFolder + File.separator);
+    }
+    /**
+     * 瀵煎叆閾炬帴绫诲瀷鏌ヨ妯℃澘
+     * @param file 涓婁紶鐨勬枃浠�
+     * @return 瀵煎叆缁撴灉
+     */
+    @Override
+    public BaseResult impLinkTemplate(MultipartFile file) throws IOException, ClassNotFoundException {
+
+        if (file == null) {
+            return BaseResult.fail(FrameWorkLangCodeConstant.IMPORT_FAIL, new String[]{"鏃犲鍏ョ殑鏂囦欢"});
+        }
+        if (!file.getOriginalFilename().endsWith(".vciqtf")) {
+            throw new VciBaseException("浠呰兘涓婁紶.vciqtf鏍煎紡鏂囦欢锛岃閲嶆柊涓婁紶锛�");
+        }
+        ObjectInputStream obj = new ObjectInputStream(
+                file.getInputStream());
+        LinkQTExportData qtExportData = (LinkQTExportData) obj.readObject();
+        List<LinkType> ltsNew = new ArrayList<>();
+        List<QTInfo> qTWrapperNew = new ArrayList<>();
+        Map<String/* 绫诲瀷鍚嶇О */, QTD[]/* 鏌ヨ妯℃澘瀹氫箟 */> norepQTDs = new HashMap<String, QTD[]>();
+        addImportData(qtExportData, ltsNew, qTWrapperNew, norepQTDs);
+        QTInfo[] qts = qTWrapperNew
+                .toArray(new QTInfo[qTWrapperNew.size()]);
+        //澶勭悊鏍戠殑杩斿洖
+        HashMap<String,Object> tree = new HashMap();
+        tree.put("text","閾炬帴绫诲瀷");
+        List<HashMap<String,Object>> childList = new ArrayList<>();
+        //娣诲姞涓氬姟绫诲瀷鏍硅妭鐐�
+        for (LinkType plAction : ltsNew) {
+            HashMap<String,Object> childTree = new HashMap();
+            childTree.put("text", plAction.tag + "/" +plAction.name);
+            childTree.put("oid", plAction.oid);
+            addExportTreeNode(plAction, qts, childTree);
+            childList.add(childTree);
+        }
+        tree.put("children", childList);
+        return BaseResult.success(tree);
+    }
+
+    // 鏁版嵁杩囨护
+    private void addImportData(LinkQTExportData qtExportData, List<LinkType> ltsNew, List<QTInfo> qTWrapperNew,
+                               Map<String/* 绫诲瀷鍚嶇О */, QTD[]/* 鏌ヨ妯℃澘瀹氫箟 */> norepQTDs) {
+        Map<String/* 绫诲瀷鍚嶇О */, QTD[]/* 鏌ヨ妯℃澘瀹氫箟 */> allQTDs = qtExportData
+                .getAllQTDs();
+        Map<String/* 绫诲瀷鍚嶇О */, LinkType/* 绫诲瀷瀵硅薄 */> selectedBtmItems = qtExportData
+                .getSelectedBtmItems();
+        Map<String/* 绫诲瀷鍚嶇О */, String[]/* 绫诲瀷鎵�灞炲睘鎬� */> selectedBtmAttrs = qtExportData
+                .getSelectedBtmAttrs();
+        Map<String/* 鏌ヨ妯℃澘鍚嶇О */, QTInfo/* 鏌ヨ妯℃澘瀵硅薄 */> allSelectedQTs = qtExportData
+                .getAllQTs();
+        if (allQTDs.size() == 0 || allQTDs == null
+                || selectedBtmItems.size() == 0 || selectedBtmItems == null
+                || selectedBtmAttrs.size() == 0 || selectedBtmAttrs == null
+                || allSelectedQTs.size() == 0 || allSelectedQTs == null) {
+            throw new VciBaseException("瀵煎叆鐨勬ā鏉挎暟鎹湁璇�!!!");
+        }
+        Set<Map.Entry<String, QTD[]>> pLActions = allQTDs.entrySet();
+        Set<Map.Entry<String, QTInfo>> pLQts = allSelectedQTs.entrySet();
+        Set<Map.Entry<String, LinkType>> LinkpLQts = selectedBtmItems.entrySet();
+        for (Map.Entry<String, QTD[]> entry : pLActions) {
+            String string = entry.getKey();
+            QTD[] qtds = entry.getValue();
+            getPLQtIsInDB(string, qtds, norepQTDs);
+        }
+        for (Map.Entry<String, LinkType> entry : LinkpLQts) {
+            String string = entry.getKey();
+            LinkType LinkType = entry.getValue();
+            getPLQtBtmItem(string, LinkType, ltsNew);
+        }
+        Map<String/*绫诲瀷鍚嶇О*/, QTD[]/*鏌ヨ妯℃澘瀹氫箟*/> newNorepQTDs = getnewNorepQTDs(norepQTDs,allSelectedQTs);
+        for (Map.Entry<String, QTInfo> entry : pLQts) {
+            String string = entry.getKey();
+            QTInfo qtWrapper = entry.getValue();
+            getPLQtWrapper(string, qtWrapper, ltsNew, qTWrapperNew, newNorepQTDs);
+        }
+
+    }
+
+    /**
+     * 鏌ヨ妯℃澘瀹氫箟鐨勫鐞�
+     * @param string
+     * @param qtds
+     */
+    private void getPLQtIsInDB(String string, QTD[] qtds, Map<String/* 绫诲瀷鍚嶇О */, QTD[]/* 鏌ヨ妯℃澘瀹氫箟 */> norepQTDs) {
+        // TODO Auto-generated method stub
+        try {
+            QTD[] qtds2 = platformClientUtil.getQTDService().getBizTypeQTDs(string);
+            QTD[] qtdsNewQtds = null;
+            List<QTD> es = new ArrayList<>();
+            for (QTD qtd : qtds) {
+                boolean isleat = true;
+                for (int i = 0; i < qtds2.length; i++) {
+                    if (qtd.name.equals(qtds2[i].name)) {
+                        isleat = false;
+                        break;
+                    }
+                }
+                if (isleat) {
+                    es.add(qtd);
+                }
+            }
+            if (es.size() != 0) {
+                qtdsNewQtds = es.toArray(new QTD[es.size()]);
+                norepQTDs.put(string, qtdsNewQtds);
+            }
+        } catch (PLException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+    }
+
+    private void getPLQtBtmItem(String string, LinkType linkType, List<LinkType> ltsNew) {
+        // TODO Auto-generated method stub
+        try {
+            LinkType queryLinkType = platformClientUtil.getLinkTypeService().getLinkType(string);
+            LinkType[] btmArray = platformClientUtil.getLinkTypeService().getLinkTypes();
+            String[] strings = queryLinkType.attributes;
+            String[] stringsFrom = queryLinkType.btmItemsFrom;
+            String[] stringsTo = queryLinkType.btmItemsTo;
+            boolean b = true;
+            for (int i = 0; i < btmArray.length; i++) {
+                if (btmArray[i].name.equals(string)) {
+                    b = false;
+                    if (Arrays.equals(linkType.attributes, strings)
+                            && Arrays
+                            .equals(linkType.btmItemsFrom, stringsFrom)
+                            && Arrays.equals(linkType.btmItemsTo, stringsTo)) {
+                        btmArray[i].name += "銆愰摼鎺ョ被鍨嬪凡瀛樺湪銆�";
+                        /* this.btmArray[i] = btmArray[i]; */
+                        ltsNew.add(btmArray[i]);
+                    } else {
+                        btmArray[i].name += "銆愰摼鎺ョ被鍨嬪瓨鍦ㄤ絾灞炴�т笉涓�鑷淬��";
+                        ltsNew.add(btmArray[i]);
+                    }
+                }
+            }
+            if (b) {
+                linkType.name += "銆愰摼鎺ョ被鍨嬩笉瀛樺湪銆�";
+                ltsNew.add(linkType);
+            }
+        } catch (PLException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+    }
+
+    private void getPLQtWrapper(String string, QTInfo qtWrapper, List<LinkType> ltsNew, List<QTInfo> qTWrapperNew, Map<String/*绫诲瀷鍚嶇О*/, QTD[]/*鏌ヨ妯℃澘瀹氫箟*/> newNorepQTDs) {
+        try {
+            QTInfo[] qtws = platformClientUtil.getQTDService().getAllQTs();
+            boolean islaet = true;
+            for (int i = 0; i < qtws.length; i++) {
+                if (string.equals(qtws[i].qtName)) {
+                    islaet = false;
+                    for (LinkType lt : ltsNew) {
+                        if (qtWrapper.btmName.equals(lt.name.substring(0,
+                                lt.name.indexOf("銆�")))) {
+                            if (lt.name.endsWith("銆愰摼鎺ョ被鍨嬪凡瀛樺湪銆�")) {
+                                qtWrapper.qtName += "銆愭煡璇㈡ā鏉垮凡瀛樺湪锛屼笉瀵煎叆銆�";
+                                qTWrapperNew.add(qtWrapper);
+                            }else if(lt.name.endsWith("銆愰摼鎺ョ被鍨嬪瓨鍦ㄤ絾灞炴�т笉涓�鑷淬��")){
+                                qtWrapper.qtName += "銆愭煡璇㈡ā鏉挎墍灞為摼鎺ョ被鍨嬪睘鎬т笉涓�鑷达紝涓嶅鍏ャ��";
+                                qTWrapperNew.add(qtWrapper);
+                            }else{
+                                qtWrapper.qtName += "銆愭煡璇㈡ā鏉挎墍灞為摼鎺ョ被鍨嬩笉瀛樺湪锛屼笉瀵煎叆銆�";
+                                qTWrapperNew.add(qtWrapper);
+                            }
+                        }
+                    }
+                }
+            }
+            if (islaet) {
+                for (LinkType btmItem : ltsNew) {
+                    if (qtWrapper.btmName.equals(btmItem.name.substring(0,
+                            btmItem.name.indexOf("銆�")))) {
+                        if (btmItem.name.endsWith("銆愰摼鎺ョ被鍨嬪凡瀛樺湪銆�")) {
+                            //鍒ゆ柇鏌ヨ妯℃澘瀹氫箟鏄惁瀛樺湪锛岃繘琛屼繚瀛�
+                            QTD[] qtds = newNorepQTDs.get(qtWrapper.btmName);
+                            if(qtds != null){
+                                for (QTD qtd : qtds) {
+                                    QTD qtdByName = platformClientUtil.getQTDService().getQTDByName(qtd.name);
+                                    if(!(qtdByName != null && StringUtils.isNotBlank(qtdByName.name))){
+                                        boolean b = platformClientUtil.getQTDService().addQTD(qtd);
+                                        if(!b){
+                                            qtWrapper.qtName += qtWrapper.qtName+"瀵煎叆鏌ヨ妯℃澘瀹氫箟銆�" + qtdByName.name + "銆戝け璐ワ紒";
+                                        }
+                                    }
+                                }
+                                newNorepQTDs.remove(qtWrapper.btmName);
+                            }
+                            boolean success = platformClientUtil.getQTDService().saveQT(qtWrapper);
+                            if(!success){
+                                qtWrapper.qtName += qtWrapper.qtName+"瀵煎叆澶辫触锛�";
+                            }else {
+                                qtWrapper.qtName += "銆愭煡璇㈡ā鏉垮鍏ユ垚鍔燂紒銆�";
+                            }
+                            qTWrapperNew.add(qtWrapper);
+                        }else if(btmItem.name.endsWith("銆愰摼鎺ョ被鍨嬪瓨鍦ㄤ絾灞炴�т笉涓�鑷淬��")){
+                            qtWrapper.qtName += "銆愭煡璇㈡ā鏉挎墍灞為摼鎺ョ被鍨嬪睘鎬т笉涓�鑷达紝涓嶅鍏ャ��";
+                            qTWrapperNew.add(qtWrapper);
+                        }else{
+                            qtWrapper.qtName += "銆愭煡璇㈡ā鏉挎墍灞為摼鎺ョ被鍨嬩笉瀛樺湪锛屼笉瀵煎叆銆�";
+                            qTWrapperNew.add(qtWrapper);
+                        }
+                    }
+                }
+            }
+        } catch (PLException e) {
+            e.printStackTrace();
+        }
+    }
+
+    //鏍规嵁閫夋嫨鐨勬煡璇㈡ā鏉胯繃婊ゆā鏉垮畾涔�
+    private Map<String, QTD[]> getnewNorepQTDs(Map<String, QTD[]> norepQTDs,
+                                               Map<String, QTInfo> allQTs) {
+        // TODO Auto-generated method stub
+        Map<String, QTD[]> map = new HashMap<String, QTD[]>();
+        Set<Map.Entry<String, QTInfo>> pLQts = allQTs.entrySet();
+        Set<Map.Entry<String, QTD[]>> pLActions = norepQTDs.entrySet();
+        for (Map.Entry<String, QTD[]> entrys : pLActions) {
+            for (Map.Entry<String, QTInfo> entry : pLQts) {
+                if(entry.getValue().btmName.equals(entrys.getKey())){
+                    map.put(entrys.getKey(), entrys.getValue());
+                }
+            }
+        }
+        return map;
+    }
+    /**
+     * 鏌ヨ鏂规鍒犻櫎
+     * @param templateNames 鏌ヨ鏂规鍚�
+     * @return 鎿嶄綔缁撴灉
+     */
+    @Override
+    public BaseResult deleteLinkTemplate(List<String> templateNames) throws PLException {
+        boolean b = platformClientUtil.getQTDService().deleteQTs(templateNames.toArray(new String[0]));
+        if(!b){
+            return BaseResult.fail("鍒犻櫎澶辫触锛侊紒锛�");
+        }
+        return BaseResult.success();
+    }
 }
diff --git a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/WebBtmIOServiceImpl.java b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/WebBtmIOServiceImpl.java
index 6119c1e..b8724f9 100644
--- a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/WebBtmIOServiceImpl.java
+++ b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/WebBtmIOServiceImpl.java
@@ -735,7 +735,7 @@
                 OsBtmTypeAttributeVO idAttrVO = new OsBtmTypeAttributeVO();
                 idAttrVO.setId("id");
                 idAttrVO.setName("缂栧彿");
-                idAttrVO.setAttrDataType(VciFieldTypeEnum.VTString.name());
+                idAttrVO.setAttributeDataType(VciFieldTypeEnum.VTString.name());
                 idAttrVO.setAttributeLength(50);
                 idAttrVO.setNullableFlag(true);
                 attributes.add(idAttrVO);
@@ -743,7 +743,7 @@
                 OsBtmTypeAttributeVO nameAttrVO = new OsBtmTypeAttributeVO();
                 nameAttrVO.setId("name");
                 nameAttrVO.setName("鍚嶇О");
-                nameAttrVO.setAttrDataType(VciFieldTypeEnum.VTString.name());
+                nameAttrVO.setAttributeDataType(VciFieldTypeEnum.VTString.name());
                 nameAttrVO.setAttributeLength(50);
                 nameAttrVO.setNullableFlag(true);
                 attributes.add(nameAttrVO);
@@ -751,7 +751,7 @@
                 OsBtmTypeAttributeVO descAttrVO = new OsBtmTypeAttributeVO();
                 descAttrVO.setId("description");
                 descAttrVO.setName("鎻忚堪");
-                descAttrVO.setAttrDataType(VciFieldTypeEnum.VTString.name());
+                descAttrVO.setAttributeDataType(VciFieldTypeEnum.VTString.name());
                 descAttrVO.setAttributeLength(150);
                 descAttrVO.setNullableFlag(true);
                 attributes.add(descAttrVO);
@@ -894,7 +894,7 @@
                     //鐒跺悗灞炴�х殑涓枃鍚嶇О
                     rowDataList.add(new WriteExcelData(rowIndex, 3, attributeVO.getName()));
                     //灞炴�х殑绫诲瀷
-                    rowDataList.add(new WriteExcelData(rowIndex, 4, VciFieldTypeEnum.getTextByValue(attributeVO.getAttrDataType())));
+                    rowDataList.add(new WriteExcelData(rowIndex, 4, VciFieldTypeEnum.getTextByValue(attributeVO.getAttributeDataType())));
                     //鏄惁鍙互涓虹┖
                     rowDataList.add(new WriteExcelData(rowIndex, 5, attributeVO.isNullableFlag() ? "鏄�" : "鍚�"));
                     //灞炴�ч暱搴�
@@ -1064,7 +1064,7 @@
         }
         columnData.put(wordFieldProperties.getColumnId(),btmTypeAttributeVO.getId().toLowerCase());
         columnData.put(wordFieldProperties.getColumnName(),btmTypeAttributeVO.getName());
-        String attrDataType = btmTypeAttributeVO.getAttrDataType();
+        String attrDataType = btmTypeAttributeVO.getAttributeDataType();
         String columnType = VciFieldTypeEnum.getTextByValue(attrDataType);
         if(StringUtils.isBlank(columnType)){
             columnType = "瀛楃涓�";
@@ -1194,15 +1194,8 @@
         } else {
             btmItem.verRuleName = 0;
         }
-        //鍖呭惈鐨勫睘鎬х殑鏁扮粍
-        List<OsBtmTypeLinkAttributesDTO> attributesDTOList = btmTypeDTO.getAttributesDTOList();
-        List<String> attrIdList = new ArrayList<String>();
-        if (!CollectionUtils.isEmpty(attributesDTOList)) {
-            for (OsBtmTypeLinkAttributesDTO attr : attributesDTOList) {
-                attrIdList.add(attr.getId().toLowerCase());
-            }
-        }
-        btmItem.apNameArray = attrIdList.toArray(new String[0]);
+        //鍖呭惈鐨勫睘鎬у悕绉�
+        btmItem.apNameArray = btmTypeDTO.getApNameArray().split(",");
     }
 
     /**
diff --git a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/util/OsScanAnnotationTool.java b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/util/OsScanAnnotationTool.java
index a623bd4..64041e6 100644
--- a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/util/OsScanAnnotationTool.java
+++ b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/util/OsScanAnnotationTool.java
@@ -465,7 +465,7 @@
         Collections.addAll(fields,btmTypeClass.getDeclaredFields());
         List<OsBtmTypeLinkAttributesDTO> btmTypeLinkAttributesDTOList = new ArrayList<OsBtmTypeLinkAttributesDTO>();
         scanAttributes(fields,attributeDTOMap,btmTypeLinkAttributesDTOList,processAttributeInfo);
-        btmTypeDTO.setAttributesDTOList(btmTypeLinkAttributesDTOList);
+        btmTypeDTO.setApNameArray(btmTypeLinkAttributesDTOList.stream().map(OsBtmTypeLinkAttributesDTO::getId).collect(Collectors.joining(",")));
         btmTypeDTOMap.put(btmTypeDTO.getId().toLowerCase().trim(),btmTypeDTO);
     }
 
diff --git a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/util/RightControlUtil.java b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/util/RightControlUtil.java
index e011cd6..154b35b 100644
--- a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/util/RightControlUtil.java
+++ b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/util/RightControlUtil.java
@@ -153,7 +153,6 @@
         return roleRightByUserName;
     }
 
-
     /**
      * 鑾峰彇褰撳墠鐢ㄦ埛鍏锋湁鏉冮檺鐨勬墍鏈夋ā鍧�
      * @param parentId, 鐖舵ā鍧梚d
@@ -231,7 +230,6 @@
 
 
     public FunctionInfo[] getFunctionsByParentId(String parentId, String userName) {
-
         FunctionInfo[] funcObjs =  null;
         try {
             if(isDeveloper(userName)){
diff --git a/Source/plt-web/plt-web-parent/plt-web/src/main/resources/menuConfig.json b/Source/plt-web/plt-web-parent/plt-web/src/main/resources/menuConfig.json
new file mode 100644
index 0000000..ff3052b
--- /dev/null
+++ b/Source/plt-web/plt-web-parent/plt-web/src/main/resources/menuConfig.json
@@ -0,0 +1,91 @@
+{
+  "hasChildren": true,
+  "children": [
+    {
+      "hasChildren": true,
+      "children": [],
+      "id": "systemManagmentNode",
+      "name": "绠$悊鍔熻兘妯″潡",
+      "parentId": "VCIBaseTreeNode",
+      "code": "systemManagmentNode",
+      "alias": "system",
+      "meta": {
+        "keepAlive": false
+      },
+      "sort": 2,
+      "soruce": "",
+      "path": "views/systemModel/mangeModel/index"
+    },
+    {
+      "hasChildren": true,
+      "children": [],
+      "id": "modelManagmentNode",
+      "name": "涓氬姟鍔熻兘妯″潡",
+      "parentId": "VCIBaseTreeNode",
+      "code": "modelManagmentNode",
+      "alias": "model",
+      "meta": {
+        "keepAlive": false
+      },
+      "sort": 3,
+      "soruce": "",
+      "path": "views/systemModel/businessModel/index"
+    },
+    {
+      "hasChildren": true,
+      "children": [],
+      "id": "operateNode",
+      "name": "鎿嶄綔绫诲瀷绠$悊",
+      "parentId": "VCIBaseTreeNode",
+      "code": "operateNode",
+      "alias": "operate",
+      "meta": {
+        "keepAlive": false
+      },
+      "sort": 4,
+      "soruce": "",
+      "path": "views/systemModel/operateType/index"
+    },
+    {
+      "hasChildren": false,
+      "children": [],
+      "id": "sysOptionNode",
+      "name": "绯荤粺閰嶇疆",
+      "parentId": "VCIBaseTreeNode",
+      "code": "sysOptionNode",
+      "alias": "sysOption",
+      "meta": {
+        "keepAlive": false
+      },
+      "sort": 5,
+      "soruce": "",
+      "path": "views/systemModel/systemConfig/index"
+    },
+    {
+      "hasChildren": false,
+      "children": [],
+      "id": "sysMonitorNode",
+      "name": "绯荤粺杩愯鐩戞帶",
+      "parentId": "VCIBaseTreeNode",
+      "code": "sysMonitorNode",
+      "alias": "sysMonitor",
+      "meta": {
+        "keepAlive": false
+      },
+      "sort": 5,
+      "soruce": "",
+      "path": "views/systemModel/systemMonitor/index"
+    }
+  ],
+  "id": "VCIBaseTreeNode",
+  "name": "绯荤粺妯″潡閰嶇疆",
+  "parentId": "systemManagmentNode",
+  "code": "rootNode",
+  "alias": "root",
+  "meta": {
+    "keepAlive": false
+  },
+  "sort": 0,
+  "soruce": "",
+  "path": ""
+}
\ No newline at end of file

--
Gitblit v1.9.3