From 9e20b9fb77a41cb5b4a6eb6213fc51cab1f0bb91 Mon Sep 17 00:00:00 2001
From: 田源 <lastanimals@163.com>
Date: 星期五, 23 八月 2024 18:00:25 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 Bin/lib/service/VciServiceMain.jar                                                                                                   |    0 
 Bin/web/lib/accessors-smart-1.2.jar                                                                                                  |    0 
 Bin/web/lib/commons-fileupload-1.4.jar                                                                                               |    0 
 Bin/web/lib/jgoodies-common-1.8.1.jar                                                                                                |    0 
 Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/dto/PRMItemDTO.java                                                  |  764 +++++
 Bin/web/lib/swingx-1.6.1.jar                                                                                                         |    0 
 Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/dto/PLActionQueryDTO.java                                            |   45 
 Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/compatibility/ISmFunctionQueryService.java                 |    3 
 Source/plt-web/plt-web-ui/src/views/modelingMenu/queryTemplate/queryDefine/index.vue                                                 |  338 ++
 Bin/web/lib/protege35-1.0.jar                                                                                                        |    0 
 Bin/lib/thrid/jbpm-4.3.2.jar                                                                                                         |    0 
 Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/pagemodel/MenuVO.java                                                |   78 
 Bin/lib/service/UIService.jar                                                                                                        |    0 
 Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/enumpck/ItemDblEnum.java                                             |  125 
 Bin/web/lib/commons-compress-1.18.jar                                                                                                |    0 
 Bin/web/lib/mockito-core-2.23.4.jar                                                                                                  |    0 
 Bin/properties/hibernate-master.cfg.xml                                                                                              |   48 
 Bin/web/lib/plt-slice-1.0.RELEASE.jar                                                                                                |    0 
 Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/pagemodel/PRMVO.java                                                 |   44 
 Bin/lib/client/plt-clientbase.jar                                                                                                    |    0 
 Bin/lib/common/plt-slice.jar                                                                                                         |    0 
 Bin/web/lib/json-smart-2.3.jar                                                                                                       |    0 
 Bin/web/lib/plt-common-1.0.RELEASE.jar                                                                                               |    0 
 Bin/lib/service/WFService.jar                                                                                                        |    0 
 Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/enumpck/PortalVITypeFlag.java                                        |   85 
 Source/plt-web/plt-web-ui/src/views/modelingMenu/queryTemplate/linkTypeQuery/index.vue                                               |  212 +
 Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/OsActionServiceI.java                                        |   68 
 Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/compatibility/impl/SmFunctionQueryServicePlatformImpl.java |   58 
 Bin/web/lib/pinyin4j-2.5.0.jar                                                                                                       |    0 
 Bin/lib/service/LogService.jar                                                                                                       |    0 
 Bin/web/lib/xmlunit-core-2.6.2.jar                                                                                                   |    0 
 Bin/web/lib/swing-worker-1.1.jar                                                                                                     |    0 
 Bin/lib/common/plt-common.jar                                                                                                        |    0 
 Bin/web/lib/assertj-core-3.11.1.jar                                                                                                  |    0 
 Bin/web/lib/json-path-2.4.0.jar                                                                                                      |    0 
 Bin/lib/service/CacheService.jar                                                                                                     |    0 
 Bin/web/lib/byte-buddy-1.9.3.jar                                                                                                     |    0 
 Bin/properties/hibernate-slave.cfg.xml                                                                                               |   47 
 Source/plt-web/plt-web-ui/src/api/queryTemplate/businessTypeQuery.js                                                                 |   12 
 Bin/properties/VolumnLog4j2.xml                                                                                                      |   25 
 Bin/properties/menuConfig.json                                                                                                       |   91 
 Bin/web/lib/spring-boot-test-autoconfigure-2.1.3.RELEASE.jar                                                                         |    0 
 Bin/web/vci-platform-web.jar                                                                                                         |    0 
 Bin/web/lib/filters-2.0.235.jar                                                                                                      |    0 
 Bin/web/lib/uitheme-1.3.1.jar                                                                                                        |    0 
 Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/model/PRMDO.java                                                     |   45 
 Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/OsPortalVIServiceI.java                                      |   79 
 Bin/web/lib/ice-3.7.10.jar                                                                                                           |    0 
 Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/OsBtmServiceImpl.java                                   |    2 
 Bin/web/lib/plt-web-api-2024.1-SNAPSHOT.jar                                                                                          |    0 
 Source/plt-web/plt-web-ui/src/api/queryTemplate/queryDefine.js                                                                       |   50 
 Bin/web/lib/asm-5.0.4.jar                                                                                                            |    0 
 Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/dto/PortalVIDTO.java                                                 |   96 
 Bin/web/lib/plt-web-base-2024.1-SNAPSHOT.jar                                                                                         |    0 
 Bin/web/lib/poi-scratchpad-3.9.jar                                                                                                   |    0 
 Bin/web/lib/jgraph-3.1.0.0.jar                                                                                                       |    0 
 Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/enumpck/ItemTypeEnum.java                                            |  144 
 Bin/lib/client/plt-client.jar                                                                                                        |    0 
 Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/bo/ItemSeniorQueryBO.java                                            |   61 
 Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/util/PinyinCommon.java                                               |   89 
 Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/util/UITools.java                                                    |  707 ++++
 Bin/web/lib/hamcrest-library-1.3.jar                                                                                                 |    0 
 Source/plt-web/plt-web-ui/src/views/modelingMenu/queryTemplate/businessTypeQuery/index.vue                                           |  210 +
 Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/HMSysModConfigController.java                             |  259 +
 Bin/web/lib/plt-clientbase-1.0.RELEASE.jar                                                                                           |    0 
 Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/OsBtmServiceI.java                                           |    2 
 Bin/web/lib/skinlf-6.7.jar                                                                                                           |    0 
 Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/properties/JsonConfigReader.java                                     |   63 
 Bin/lib/service/OQService.jar                                                                                                        |    0 
 Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/enumpck/PortalVIType.java                                            |   85 
 Source/plt-web/plt-web-ui/src/api/modeling/businessType/api.js                                                                       |   10 
 Bin/web/lib/android-json-0.0.20131108.vaadin1.jar                                                                                    |    0 
 Bin/web/lib/spring-boot-test-2.1.3.RELEASE.jar                                                                                       |    0 
 Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/OsActionServiceImpl.java                                |  405 ++
 Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/dto/PLActionClsDTO.java                                              |   57 
 Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/model/PRMItemDO.java                                                 |  725 +++++
 Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/compatibility/SmHMSysModConfigServiceI.java                |  123 
 Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/SmFunctionController.java                                 |   19 
 Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/dto/PRMDTO.java                                                      |   50 
 Bin/web/lib/jackson-databind-2.9.6.jar                                                                                               |    0 
 Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/compatibility/impl/SmHMSysModConfigServiceImpl.java        | 1028 +++++++
 Bin/web/lib/flatlaf-2.3.jar                                                                                                          |    0 
 Bin/web/lib/nativeskin-1.0.jar                                                                                                       |    0 
 Source/plt-web/plt-web-ui/src/api/modeling/linkType/api.js                                                                           |    8 
 Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/other/IExportLogBean.java                                            |   19 
 Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/pagemodel/PRMItemVO.java                                             |  767 +++++
 Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/pagemodel/PortalVIVO.java                                            |   96 
 Bin/lib/service/BOFService.jar                                                                                                       |    0 
 Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/OsActionController.java                                   |  160 +
 Bin/web/lib/spring-boot-starter-test-2.1.3.RELEASE.jar                                                                               |    0 
 Bin/web/lib/spring-test-5.1.5.RELEASE.jar                                                                                            |    0 
 Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/web/util/VciBaseUtil.java                                   |   56 
 Bin/web/lib/byte-buddy-agent-1.9.3.jar                                                                                               |    0 
 Bin/web/lib/jsonassert-1.5.0.jar                                                                                                     |    0 
 Bin/lib/service/MsgService.jar                                                                                                       |    0 
 Bin/lib/service/WFPlugins.jar                                                                                                        |    0 
 Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/OsBaseServiceI.java                                          |    4 
 Bin/lib/service/VolumeService.jar                                                                                                    |    0 
 Bin/web/lib/plt-poi-2024.1-SNAPSHOT.jar                                                                                              |    0 
 Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/OsPortalVIServiceImpl.java                              |  627 ++++
 Bin/web/lib/objenesis-2.6.jar                                                                                                        |    0 
 Source/plt-web/plt-web-ui/src/api/queryTemplate/linkTypeQuery.js                                                                     |   10 
 Bin/web/lib/swixml-2.0.jar                                                                                                           |    0 
 Bin/lib/service/FrameService.jar                                                                                                     |    0 
 Bin/web/lib/jgraphx-3.1.0.0.jar                                                                                                      |    0 
 Bin/web/lib/junit-4.8.jar                                                                                                            |    0 
 Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/model/SmFunctionForPlatform1.java                                    |   10 
 Bin/lib/service/ServiceBase.jar                                                                                                      |    0 
 Source/plt-web/plt-web-ui/src/views/modelingMenu/modeling/versioning/index.vue                                                       |    2 
 Bin/lib/service/OMDService.jar                                                                                                       |    0 
 Bin/web/lib/icebox-3.7.10.jar                                                                                                        |    0 
 Bin/web/lib/jgoodies-looks-2.5.3.jar                                                                                                 |    0 
 Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/WebPortalVIController.java                                |   72 
 Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/model/PortalVIDO.java                                                |  101 
 Bin/web/lib/transmittable-thread-local-2.12.6.jar                                                                                    |    0 
 Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/dto/PLActionDTO.java                                                 |   70 
 Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/other/ExportBeans.java                                               |  153 +
 Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/other/ExportActionLogBean.java                                       |  156 +
 Bin/web/lib/hamcrest-core-1.3.jar                                                                                                    |    0 
 Bin/web/lib/plt-starter-2024.1-SNAPSHOT.jar                                                                                          |    0 
 Bin/web/lib/spring-boot-configuration-processor-2.1.3.RELEASE.jar                                                                    |    0 
 121 files changed, 8,559 insertions(+), 104 deletions(-)

diff --git a/Bin/lib/client/plt-client.jar b/Bin/lib/client/plt-client.jar
index aa88cc6..915c4c6 100644
--- a/Bin/lib/client/plt-client.jar
+++ b/Bin/lib/client/plt-client.jar
Binary files differ
diff --git a/Bin/lib/client/plt-clientbase.jar b/Bin/lib/client/plt-clientbase.jar
index c05e09c..5f4462c 100644
--- a/Bin/lib/client/plt-clientbase.jar
+++ b/Bin/lib/client/plt-clientbase.jar
Binary files differ
diff --git a/Bin/lib/common/plt-common.jar b/Bin/lib/common/plt-common.jar
index c584d57..c48fa29 100644
--- a/Bin/lib/common/plt-common.jar
+++ b/Bin/lib/common/plt-common.jar
Binary files differ
diff --git a/Bin/lib/common/plt-slice.jar b/Bin/lib/common/plt-slice.jar
index 216f0f4..6468ff3 100644
--- a/Bin/lib/common/plt-slice.jar
+++ b/Bin/lib/common/plt-slice.jar
Binary files differ
diff --git a/Bin/lib/service/BOFService.jar b/Bin/lib/service/BOFService.jar
index 3fc1d7a..129963c 100644
--- a/Bin/lib/service/BOFService.jar
+++ b/Bin/lib/service/BOFService.jar
Binary files differ
diff --git a/Bin/lib/service/CacheService.jar b/Bin/lib/service/CacheService.jar
index 16becd4..acb49a9 100644
--- a/Bin/lib/service/CacheService.jar
+++ b/Bin/lib/service/CacheService.jar
Binary files differ
diff --git a/Bin/lib/service/FrameService.jar b/Bin/lib/service/FrameService.jar
index 41e6872..45b254b 100644
--- a/Bin/lib/service/FrameService.jar
+++ b/Bin/lib/service/FrameService.jar
Binary files differ
diff --git a/Bin/lib/service/LogService.jar b/Bin/lib/service/LogService.jar
index 1a65ead..d2e5841 100644
--- a/Bin/lib/service/LogService.jar
+++ b/Bin/lib/service/LogService.jar
Binary files differ
diff --git a/Bin/lib/service/MsgService.jar b/Bin/lib/service/MsgService.jar
new file mode 100644
index 0000000..5dd90e6
--- /dev/null
+++ b/Bin/lib/service/MsgService.jar
Binary files differ
diff --git a/Bin/lib/service/OMDService.jar b/Bin/lib/service/OMDService.jar
index c2e3ca8..e77decb 100644
--- a/Bin/lib/service/OMDService.jar
+++ b/Bin/lib/service/OMDService.jar
Binary files differ
diff --git a/Bin/lib/service/OQService.jar b/Bin/lib/service/OQService.jar
index b21a6c3..3d8f673 100644
--- a/Bin/lib/service/OQService.jar
+++ b/Bin/lib/service/OQService.jar
Binary files differ
diff --git a/Bin/lib/service/ServiceBase.jar b/Bin/lib/service/ServiceBase.jar
index be2a063..8a2ab48 100644
--- a/Bin/lib/service/ServiceBase.jar
+++ b/Bin/lib/service/ServiceBase.jar
Binary files differ
diff --git a/Bin/lib/service/UIService.jar b/Bin/lib/service/UIService.jar
index 90eac7b..845bbd9 100644
--- a/Bin/lib/service/UIService.jar
+++ b/Bin/lib/service/UIService.jar
Binary files differ
diff --git a/Bin/lib/service/VciServiceMain.jar b/Bin/lib/service/VciServiceMain.jar
index 1115661..03229dc 100644
--- a/Bin/lib/service/VciServiceMain.jar
+++ b/Bin/lib/service/VciServiceMain.jar
Binary files differ
diff --git a/Bin/lib/service/VolumeService.jar b/Bin/lib/service/VolumeService.jar
index adae0a8..52dd1dd 100644
--- a/Bin/lib/service/VolumeService.jar
+++ b/Bin/lib/service/VolumeService.jar
Binary files differ
diff --git a/Bin/lib/service/WFPlugins.jar b/Bin/lib/service/WFPlugins.jar
index f216a6a..08ac518 100644
--- a/Bin/lib/service/WFPlugins.jar
+++ b/Bin/lib/service/WFPlugins.jar
Binary files differ
diff --git a/Bin/lib/service/WFService.jar b/Bin/lib/service/WFService.jar
index e24eefc..6146f02 100644
--- a/Bin/lib/service/WFService.jar
+++ b/Bin/lib/service/WFService.jar
Binary files differ
diff --git a/Bin/lib/thrid/jbpm-4.3.2.jar b/Bin/lib/thrid/jbpm-4.3.2.jar
index 21ccd58..49959a6 100644
--- a/Bin/lib/thrid/jbpm-4.3.2.jar
+++ b/Bin/lib/thrid/jbpm-4.3.2.jar
Binary files differ
diff --git a/Bin/properties/VolumnLog4j2.xml b/Bin/properties/VolumnLog4j2.xml
new file mode 100644
index 0000000..a5bfc4d
--- /dev/null
+++ b/Bin/properties/VolumnLog4j2.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Configuration status="WARN">
+    <Appenders>
+        <Console name="Console" target="SYSTEM_OUT">
+            <PatternLayout pattern="[%-5p] %d{YYYY-MM-dd HH:mm:ss} [%t] %C{1}:%L - %msg%n" />
+        </Console>
+ 
+        <RollingFile name="RollingFile" filename="./logs/volume_log.log" filepattern="${logPath}/volume_%d{YYYYMMddHHmmss}.log">
+            <PatternLayout pattern="[%-5p] %d{YYYY-MM-dd HH:mm:ss} [%t] %C{1}:%L - %msg%n" />
+            <Policies>
+                <SizeBasedTriggeringPolicy size="10 MB" />
+            </Policies>
+            <DefaultRolloverStrategy max="20" />
+        </RollingFile>
+ 
+    </Appenders>
+    <Loggers>
+        <Logger name="VolumeLog" level="DEBUG" additivity="true">
+            <AppenderRef ref="RollingFile" />
+        </Logger>
+        <Root level="DEBUG">
+            <AppenderRef ref="Console" />
+        </Root>
+    </Loggers>
+</Configuration>
diff --git a/Bin/properties/hibernate-master.cfg.xml b/Bin/properties/hibernate-master.cfg.xml
new file mode 100644
index 0000000..f1269c1
--- /dev/null
+++ b/Bin/properties/hibernate-master.cfg.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
+<hibernate-configuration>
+	<session-factory>
+		<property name="show_sql">true</property>
+		<property name="dialect">org.hibernate.dialect.OracleDialect</property>
+		<property name="connection.driver_class">oracle.jdbc.OracleDriver</property>
+		
+		<!--<property name="connection.url">jdbc:oracle:thin:@172.16.0.243:1521:orcl</property>
+		<property name="connection.username">vcimes</property>
+		<property name="connection.password">vcimes</property>-->
+
+		<!-- <property name="connection.url">jdbc:oracle:thin:@dev.yunkeruida.top:1521:orcl</property> -->
+		<property name="connection.url">jdbc:oracle:thin:@192.168.0.66:1521:orcl</property>
+		<!-- <property name="connection.username">NMPM112</property> -->
+		<property name="connection.username">PLT2024</property>
+		<property name="connection.password">vcitest</property>
+		<!--<property name="connection.username">mpm112</property>
+		<property name="connection.password">vcitest</property>-->
+
+		<!--property name="hibernate.connection.release_mode">auto</property -->
+
+		<!-- 璁剧疆C3P0 -->
+		<property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
+		<property name="hibernate.c3p0.acquireRetryAttempts">30</property>
+		<property name="hibernate.c3p0.acquireIncrement">2</property>
+		<property name="hibernate.c3p0.checkoutTimeout">30000</property>
+		<property name="hibernate.c3p0.idleConnectionTestPeriod">120</property>
+		<property name="hibernate.c3p0.maxIdleTime">180</property>
+		<property name="hibernate.c3p0.initialPoolSize">3</property>
+		<property name="hibernate.c3p0.maxPoolSize">100</property>
+		<property name="hibernate.c3p0.minPoolSize">1</property>
+		<property name="hibernate.c3p0.maxStatements">100</property>
+		<property name="maxStatementsPerConnection">100</property>
+		<property name="hibernate.current_session_context_class">com.vci.server.mw.SessionContext4JBPM</property>
+		<property name="hibernate.connection.isolation">2</property>
+
+ 	
+		<!-- 鏆傛椂绂佺敤Hibernate鐨勪簨浠剁洃鍚�
+		<listener type="post-insert"
+			class="com.vci.base.server.persistence.history.HistoryListener" />
+		<listener type="post-update"
+			class="com.vci.base.server.persistence.history.HistoryListener" />
+		<listener type="post-delete"
+			class="com.vci.base.server.persistence.history.HistoryListener" />
+			 -->
+	</session-factory>
+</hibernate-configuration>
\ No newline at end of file
diff --git a/Bin/properties/hibernate-slave.cfg.xml b/Bin/properties/hibernate-slave.cfg.xml
new file mode 100644
index 0000000..96c62d7
--- /dev/null
+++ b/Bin/properties/hibernate-slave.cfg.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
+<hibernate-configuration>
+	<session-factory>
+		<property name="show_sql">true</property>
+		<property name="dialect">org.hibernate.dialect.OracleDialect</property>
+		<property name="connection.driver_class">oracle.jdbc.OracleDriver</property>
+		
+		<!--<property name="connection.url">jdbc:oracle:thin:@172.16.0.243:1521:orcl</property>
+		<property name="connection.username">vcimes</property>
+		<property name="connection.password">vcimes</property>-->
+
+		<property name="connection.url">jdbc:oracle:thin:@192.168.0.66:1521:orcl</property>
+		<!-- <property name="connection.url">jdbc:oracle:thin:@dev.yunkeruida.top:1521:orcl</property> -->
+		<!-- <property name="connection.username">NMPM112</property> -->
+		<property name="connection.username">PLT2024</property>
+		<property name="connection.password">vcitest</property>
+		<!--<property name="connection.username">mpm112</property>
+		<property name="connection.password">vcitest</property>-->
+
+		<!--property name="hibernate.connection.release_mode">auto</property -->
+
+		<!-- 璁剧疆C3P0 -->
+		<property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
+		<property name="hibernate.c3p0.acquireRetryAttempts">30</property>
+		<property name="hibernate.c3p0.acquireIncrement">2</property>
+		<property name="hibernate.c3p0.checkoutTimeout">30000</property>
+		<property name="hibernate.c3p0.idleConnectionTestPeriod">120</property>
+		<property name="hibernate.c3p0.maxIdleTime">180</property>
+		<property name="hibernate.c3p0.initialPoolSize">3</property>
+		<property name="hibernate.c3p0.maxPoolSize">100</property>
+		<property name="hibernate.c3p0.minPoolSize">1</property>
+		<property name="hibernate.c3p0.maxStatements">100</property>
+		<property name="maxStatementsPerConnection">100</property>
+		<property name="hibernate.current_session_context_class">com.vci.server.mw.SessionContext4JBPM</property>
+		<property name="hibernate.connection.isolation">2</property>
+
+ 	
+		<!-- 鏆傛椂绂佺敤Hibernate鐨勪簨浠剁洃鍚�
+		<listener type="post-insert"
+			class="com.vci.base.server.persistence.history.HistoryListener" />
+		<listener type="post-update"
+			class="com.vci.base.server.persistence.history.HistoryListener" />
+		<listener type="post-delete"
+			class="com.vci.base.server.persistence.history.HistoryListener" />
+			 -->
+	</session-factory>
+</hibernate-configuration>
\ No newline at end of file
diff --git a/Bin/properties/menuConfig.json b/Bin/properties/menuConfig.json
new file mode 100644
index 0000000..ff3052b
--- /dev/null
+++ b/Bin/properties/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
diff --git a/Bin/web/lib/accessors-smart-1.2.jar b/Bin/web/lib/accessors-smart-1.2.jar
new file mode 100644
index 0000000..f4505e9
--- /dev/null
+++ b/Bin/web/lib/accessors-smart-1.2.jar
Binary files differ
diff --git a/Bin/web/lib/android-json-0.0.20131108.vaadin1.jar b/Bin/web/lib/android-json-0.0.20131108.vaadin1.jar
new file mode 100644
index 0000000..add495f
--- /dev/null
+++ b/Bin/web/lib/android-json-0.0.20131108.vaadin1.jar
Binary files differ
diff --git a/Bin/web/lib/asm-5.0.4.jar b/Bin/web/lib/asm-5.0.4.jar
new file mode 100644
index 0000000..cdb283d
--- /dev/null
+++ b/Bin/web/lib/asm-5.0.4.jar
Binary files differ
diff --git a/Bin/web/lib/assertj-core-3.11.1.jar b/Bin/web/lib/assertj-core-3.11.1.jar
new file mode 100644
index 0000000..87e5ee3
--- /dev/null
+++ b/Bin/web/lib/assertj-core-3.11.1.jar
Binary files differ
diff --git a/Bin/web/lib/byte-buddy-1.9.3.jar b/Bin/web/lib/byte-buddy-1.9.3.jar
new file mode 100644
index 0000000..c1c2b07
--- /dev/null
+++ b/Bin/web/lib/byte-buddy-1.9.3.jar
Binary files differ
diff --git a/Bin/web/lib/byte-buddy-agent-1.9.3.jar b/Bin/web/lib/byte-buddy-agent-1.9.3.jar
new file mode 100644
index 0000000..51a0bd4
--- /dev/null
+++ b/Bin/web/lib/byte-buddy-agent-1.9.3.jar
Binary files differ
diff --git a/Bin/web/lib/commons-compress-1.18.jar b/Bin/web/lib/commons-compress-1.18.jar
new file mode 100644
index 0000000..e401046
--- /dev/null
+++ b/Bin/web/lib/commons-compress-1.18.jar
Binary files differ
diff --git a/Bin/web/lib/commons-fileupload-1.4.jar b/Bin/web/lib/commons-fileupload-1.4.jar
new file mode 100644
index 0000000..e25a6bc
--- /dev/null
+++ b/Bin/web/lib/commons-fileupload-1.4.jar
Binary files differ
diff --git a/Bin/web/lib/filters-2.0.235.jar b/Bin/web/lib/filters-2.0.235.jar
new file mode 100644
index 0000000..39e4dd5
--- /dev/null
+++ b/Bin/web/lib/filters-2.0.235.jar
Binary files differ
diff --git a/Bin/web/lib/flatlaf-2.3.jar b/Bin/web/lib/flatlaf-2.3.jar
new file mode 100644
index 0000000..9f292d2
--- /dev/null
+++ b/Bin/web/lib/flatlaf-2.3.jar
Binary files differ
diff --git a/Bin/web/lib/hamcrest-core-1.3.jar b/Bin/web/lib/hamcrest-core-1.3.jar
new file mode 100644
index 0000000..9d5fe16
--- /dev/null
+++ b/Bin/web/lib/hamcrest-core-1.3.jar
Binary files differ
diff --git a/Bin/web/lib/hamcrest-library-1.3.jar b/Bin/web/lib/hamcrest-library-1.3.jar
new file mode 100644
index 0000000..9eac80d
--- /dev/null
+++ b/Bin/web/lib/hamcrest-library-1.3.jar
Binary files differ
diff --git a/Bin/web/lib/ice-3.7.10.jar b/Bin/web/lib/ice-3.7.10.jar
new file mode 100644
index 0000000..768c926
--- /dev/null
+++ b/Bin/web/lib/ice-3.7.10.jar
Binary files differ
diff --git a/Bin/web/lib/icebox-3.7.10.jar b/Bin/web/lib/icebox-3.7.10.jar
new file mode 100644
index 0000000..45e41b3
--- /dev/null
+++ b/Bin/web/lib/icebox-3.7.10.jar
Binary files differ
diff --git a/Bin/web/lib/jackson-databind-2.9.6.jar b/Bin/web/lib/jackson-databind-2.9.6.jar
new file mode 100644
index 0000000..e8eb658
--- /dev/null
+++ b/Bin/web/lib/jackson-databind-2.9.6.jar
Binary files differ
diff --git a/Bin/web/lib/jgoodies-common-1.8.1.jar b/Bin/web/lib/jgoodies-common-1.8.1.jar
new file mode 100644
index 0000000..f6a256e
--- /dev/null
+++ b/Bin/web/lib/jgoodies-common-1.8.1.jar
Binary files differ
diff --git a/Bin/web/lib/jgoodies-looks-2.5.3.jar b/Bin/web/lib/jgoodies-looks-2.5.3.jar
new file mode 100644
index 0000000..3339053
--- /dev/null
+++ b/Bin/web/lib/jgoodies-looks-2.5.3.jar
Binary files differ
diff --git a/Bin/web/lib/jgraph-3.1.0.0.jar b/Bin/web/lib/jgraph-3.1.0.0.jar
new file mode 100644
index 0000000..9af266c
--- /dev/null
+++ b/Bin/web/lib/jgraph-3.1.0.0.jar
Binary files differ
diff --git a/Bin/web/lib/jgraphx-3.1.0.0.jar b/Bin/web/lib/jgraphx-3.1.0.0.jar
new file mode 100644
index 0000000..6637aac
--- /dev/null
+++ b/Bin/web/lib/jgraphx-3.1.0.0.jar
Binary files differ
diff --git a/Bin/web/lib/json-path-2.4.0.jar b/Bin/web/lib/json-path-2.4.0.jar
new file mode 100644
index 0000000..6229306
--- /dev/null
+++ b/Bin/web/lib/json-path-2.4.0.jar
Binary files differ
diff --git a/Bin/web/lib/json-smart-2.3.jar b/Bin/web/lib/json-smart-2.3.jar
new file mode 100644
index 0000000..0cd52ea
--- /dev/null
+++ b/Bin/web/lib/json-smart-2.3.jar
Binary files differ
diff --git a/Bin/web/lib/jsonassert-1.5.0.jar b/Bin/web/lib/jsonassert-1.5.0.jar
new file mode 100644
index 0000000..aec04c5
--- /dev/null
+++ b/Bin/web/lib/jsonassert-1.5.0.jar
Binary files differ
diff --git a/Bin/web/lib/junit-4.8.jar b/Bin/web/lib/junit-4.8.jar
new file mode 100644
index 0000000..efdaa58
--- /dev/null
+++ b/Bin/web/lib/junit-4.8.jar
Binary files differ
diff --git a/Bin/web/lib/mockito-core-2.23.4.jar b/Bin/web/lib/mockito-core-2.23.4.jar
new file mode 100644
index 0000000..b259c8c
--- /dev/null
+++ b/Bin/web/lib/mockito-core-2.23.4.jar
Binary files differ
diff --git a/Bin/web/lib/nativeskin-1.0.jar b/Bin/web/lib/nativeskin-1.0.jar
new file mode 100644
index 0000000..acacc56
--- /dev/null
+++ b/Bin/web/lib/nativeskin-1.0.jar
Binary files differ
diff --git a/Bin/web/lib/objenesis-2.6.jar b/Bin/web/lib/objenesis-2.6.jar
new file mode 100644
index 0000000..b4b29d5
--- /dev/null
+++ b/Bin/web/lib/objenesis-2.6.jar
Binary files differ
diff --git a/Bin/web/lib/pinyin4j-2.5.0.jar b/Bin/web/lib/pinyin4j-2.5.0.jar
new file mode 100644
index 0000000..2e1d819
--- /dev/null
+++ b/Bin/web/lib/pinyin4j-2.5.0.jar
Binary files differ
diff --git a/Bin/web/lib/plt-clientbase-1.0.RELEASE.jar b/Bin/web/lib/plt-clientbase-1.0.RELEASE.jar
index 88b1396..19cfc6d 100644
--- a/Bin/web/lib/plt-clientbase-1.0.RELEASE.jar
+++ b/Bin/web/lib/plt-clientbase-1.0.RELEASE.jar
Binary files differ
diff --git a/Bin/web/lib/plt-common-1.0.RELEASE.jar b/Bin/web/lib/plt-common-1.0.RELEASE.jar
index ec5d9d9..079294b 100644
--- a/Bin/web/lib/plt-common-1.0.RELEASE.jar
+++ b/Bin/web/lib/plt-common-1.0.RELEASE.jar
Binary files differ
diff --git a/Bin/web/lib/plt-poi-2024.1-SNAPSHOT.jar b/Bin/web/lib/plt-poi-2024.1-SNAPSHOT.jar
new file mode 100644
index 0000000..0b9e0b2
--- /dev/null
+++ b/Bin/web/lib/plt-poi-2024.1-SNAPSHOT.jar
Binary files differ
diff --git a/Bin/web/lib/plt-slice-1.0.RELEASE.jar b/Bin/web/lib/plt-slice-1.0.RELEASE.jar
index e0d1317..b6c28d5 100644
--- a/Bin/web/lib/plt-slice-1.0.RELEASE.jar
+++ b/Bin/web/lib/plt-slice-1.0.RELEASE.jar
Binary files differ
diff --git a/Bin/web/lib/plt-starter-2024.1-SNAPSHOT.jar b/Bin/web/lib/plt-starter-2024.1-SNAPSHOT.jar
new file mode 100644
index 0000000..b1b79dd
--- /dev/null
+++ b/Bin/web/lib/plt-starter-2024.1-SNAPSHOT.jar
Binary files differ
diff --git a/Bin/web/lib/plt-web-api-2024.1-SNAPSHOT.jar b/Bin/web/lib/plt-web-api-2024.1-SNAPSHOT.jar
new file mode 100644
index 0000000..9f5cc1b
--- /dev/null
+++ b/Bin/web/lib/plt-web-api-2024.1-SNAPSHOT.jar
Binary files differ
diff --git a/Bin/web/lib/plt-web-base-2024.1-SNAPSHOT.jar b/Bin/web/lib/plt-web-base-2024.1-SNAPSHOT.jar
new file mode 100644
index 0000000..f14632f
--- /dev/null
+++ b/Bin/web/lib/plt-web-base-2024.1-SNAPSHOT.jar
Binary files differ
diff --git a/Bin/web/lib/poi-scratchpad-3.9.jar b/Bin/web/lib/poi-scratchpad-3.9.jar
new file mode 100644
index 0000000..1520855
--- /dev/null
+++ b/Bin/web/lib/poi-scratchpad-3.9.jar
Binary files differ
diff --git a/Bin/web/lib/protege35-1.0.jar b/Bin/web/lib/protege35-1.0.jar
new file mode 100644
index 0000000..8e99a2e
--- /dev/null
+++ b/Bin/web/lib/protege35-1.0.jar
Binary files differ
diff --git a/Bin/web/lib/skinlf-6.7.jar b/Bin/web/lib/skinlf-6.7.jar
new file mode 100644
index 0000000..9bdb00f
--- /dev/null
+++ b/Bin/web/lib/skinlf-6.7.jar
Binary files differ
diff --git a/Bin/web/lib/spring-boot-configuration-processor-2.1.3.RELEASE.jar b/Bin/web/lib/spring-boot-configuration-processor-2.1.3.RELEASE.jar
new file mode 100644
index 0000000..2f63fdf
--- /dev/null
+++ b/Bin/web/lib/spring-boot-configuration-processor-2.1.3.RELEASE.jar
Binary files differ
diff --git a/Bin/web/lib/spring-boot-starter-test-2.1.3.RELEASE.jar b/Bin/web/lib/spring-boot-starter-test-2.1.3.RELEASE.jar
new file mode 100644
index 0000000..7df4790
--- /dev/null
+++ b/Bin/web/lib/spring-boot-starter-test-2.1.3.RELEASE.jar
Binary files differ
diff --git a/Bin/web/lib/spring-boot-test-2.1.3.RELEASE.jar b/Bin/web/lib/spring-boot-test-2.1.3.RELEASE.jar
new file mode 100644
index 0000000..253c3f1
--- /dev/null
+++ b/Bin/web/lib/spring-boot-test-2.1.3.RELEASE.jar
Binary files differ
diff --git a/Bin/web/lib/spring-boot-test-autoconfigure-2.1.3.RELEASE.jar b/Bin/web/lib/spring-boot-test-autoconfigure-2.1.3.RELEASE.jar
new file mode 100644
index 0000000..98622ad
--- /dev/null
+++ b/Bin/web/lib/spring-boot-test-autoconfigure-2.1.3.RELEASE.jar
Binary files differ
diff --git a/Bin/web/lib/spring-test-5.1.5.RELEASE.jar b/Bin/web/lib/spring-test-5.1.5.RELEASE.jar
new file mode 100644
index 0000000..340a276
--- /dev/null
+++ b/Bin/web/lib/spring-test-5.1.5.RELEASE.jar
Binary files differ
diff --git a/Bin/web/lib/swing-worker-1.1.jar b/Bin/web/lib/swing-worker-1.1.jar
new file mode 100644
index 0000000..3935611
--- /dev/null
+++ b/Bin/web/lib/swing-worker-1.1.jar
Binary files differ
diff --git a/Bin/web/lib/swingx-1.6.1.jar b/Bin/web/lib/swingx-1.6.1.jar
new file mode 100644
index 0000000..b0bcc87
--- /dev/null
+++ b/Bin/web/lib/swingx-1.6.1.jar
Binary files differ
diff --git a/Bin/web/lib/swixml-2.0.jar b/Bin/web/lib/swixml-2.0.jar
new file mode 100644
index 0000000..2f0fa2b
--- /dev/null
+++ b/Bin/web/lib/swixml-2.0.jar
Binary files differ
diff --git a/Bin/web/lib/transmittable-thread-local-2.12.6.jar b/Bin/web/lib/transmittable-thread-local-2.12.6.jar
new file mode 100644
index 0000000..bc6ca55
--- /dev/null
+++ b/Bin/web/lib/transmittable-thread-local-2.12.6.jar
Binary files differ
diff --git a/Bin/web/lib/uitheme-1.3.1.jar b/Bin/web/lib/uitheme-1.3.1.jar
new file mode 100644
index 0000000..caacb71
--- /dev/null
+++ b/Bin/web/lib/uitheme-1.3.1.jar
Binary files differ
diff --git a/Bin/web/lib/xmlunit-core-2.6.2.jar b/Bin/web/lib/xmlunit-core-2.6.2.jar
new file mode 100644
index 0000000..dec8eb5
--- /dev/null
+++ b/Bin/web/lib/xmlunit-core-2.6.2.jar
Binary files differ
diff --git a/Bin/web/vci-platform-web.jar b/Bin/web/vci-platform-web.jar
index 6e62cbc..02524dd 100644
--- a/Bin/web/vci-platform-web.jar
+++ b/Bin/web/vci-platform-web.jar
Binary files differ
diff --git a/Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/bo/ItemSeniorQueryBO.java b/Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/bo/ItemSeniorQueryBO.java
new file mode 100644
index 0000000..c5d8765
--- /dev/null
+++ b/Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/bo/ItemSeniorQueryBO.java
@@ -0,0 +1,61 @@
+package com.vci.bo;
+
+public class ItemSeniorQueryBO implements java.io.Serializable{
+
+
+    private static final long serialVersionUID = 6935763791493916908L;
+
+    /**
+     * 楂樼骇鏌ヨ鍒�
+     */
+    private String itemSeniorQueryCols = "";
+    /**
+     * 楂樼骇鏌ヨ鍚勫垪浣跨敤娆℃暟
+     */
+    private String itemSeniorQueryColsCounts = "";
+
+    /**
+     *楂樼骇鏌ヨsql
+     */
+    private String itemQuerySql = "";
+
+    public ItemSeniorQueryBO(String itemSeniorQueryCols, String itemSeniorQueryColsCounts, String itemQuerySql) {
+        this.itemSeniorQueryCols = itemSeniorQueryCols;
+        this.itemSeniorQueryColsCounts = itemSeniorQueryColsCounts;
+        this.itemQuerySql = itemQuerySql;
+    }
+
+    public String getItemSeniorQueryCols() {
+        return itemSeniorQueryCols;
+    }
+
+    public void setItemSeniorQueryCols(String itemSeniorQueryCols) {
+        this.itemSeniorQueryCols = itemSeniorQueryCols;
+    }
+
+    public String getItemSeniorQueryColsCounts() {
+        return itemSeniorQueryColsCounts;
+    }
+
+    public void setItemSeniorQueryColsCounts(String itemSeniorQueryColsCounts) {
+        this.itemSeniorQueryColsCounts = itemSeniorQueryColsCounts;
+    }
+
+    public String getItemQuerySql() {
+        return itemQuerySql;
+    }
+
+    public void setItemQuerySql(String itemQuerySql) {
+        this.itemQuerySql = itemQuerySql;
+    }
+
+    @Override
+    public String
+    toString() {
+        return "ItemSeniorQueryBO{" +
+                "itemSeniorQueryCols='" + itemSeniorQueryCols + '\'' +
+                ", itemSeniorQueryColsCounts='" + itemSeniorQueryColsCounts + '\'' +
+                ", itemQuerySql='" + itemQuerySql + '\'' +
+                '}';
+    }
+}
diff --git a/Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/dto/PLActionClsDTO.java b/Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/dto/PLActionClsDTO.java
new file mode 100644
index 0000000..529491a
--- /dev/null
+++ b/Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/dto/PLActionClsDTO.java
@@ -0,0 +1,57 @@
+package com.vci.dto;
+
+import lombok.Data;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Action鍒嗙被浼犺緭瀵硅薄
+ * @author yuxc
+ * @date 2024/8/16 15:50
+ */
+@Data
+public class PLActionClsDTO implements java.io.Serializable{
+
+    /**
+     * 绂佹淇敼杩欎釜鍊�
+     */
+    private static final long serialVersionUID = 2009350578651813260L;
+    /**
+     *涓婚敭
+     */
+    public String id;
+    /**
+     *鍒嗙被鍚嶇О
+     */
+    public String name;
+    /**
+     *鐖朵富閿�
+     */
+    public String pid;
+    /**
+     *澶囨敞
+     */
+    public String description;
+    /**
+     *鍒涘缓浜�
+     */
+    public String creator;
+    /**
+     *鍒涘缓鏃堕棿
+     */
+    public long createTime;
+    /**
+     *鍒嗙被搴忓彿
+     */
+    public short serialno;
+    /**
+     * 瀛愯妭鐐�
+     */
+    public List<PLActionClsDTO> childs = new ArrayList<>();
+
+    /**
+     * 褰撳墠鍒嗙被涓嬬殑鎵�鏈塧ction
+     */
+    public List<PLActionDTO> actionChilds = new ArrayList<>();
+}
diff --git a/Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/dto/PLActionDTO.java b/Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/dto/PLActionDTO.java
new file mode 100644
index 0000000..a631dd8
--- /dev/null
+++ b/Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/dto/PLActionDTO.java
@@ -0,0 +1,70 @@
+package com.vci.dto;
+
+import lombok.Data;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Action浼犺緭瀵硅薄
+ * @author yuxc
+ * @date 2024/8/20 16:47
+ */
+@Data
+public class PLActionDTO implements java.io.Serializable{
+
+    /**
+     * 绂佹淇敼杩欎釜鍊�
+     */
+    private static final long serialVersionUID = 2009350578651813260L;
+    /**
+     * 涓婚敭
+     */
+    private String plOId;
+    /**
+     * 缂栧彿
+     */
+    private String plCode;
+    /**
+     * 鍚嶇О
+     */
+    private String plName;
+    /**
+     * B/S鍦板潃锛岀晫闈㈢被璺緞
+     */
+    private String plBSUrl;
+    /**
+     * c/s绫昏矾寰� 鐣岄潰閾炬帴鍦板潃
+     */
+    private String plCSClass;
+    /**
+     * 鎻忚堪
+     */
+    private String plDesc;
+    /**
+     * 绫诲瀷
+     */
+    private String plTypeType;
+    /**
+     * 鍒涘缓鏃堕棿
+     */
+    private long plCreateTime;
+    /**
+     * 鍒涘缓浜�
+     */
+    private String plCreateUser;
+    /**
+     * 淇敼鏃堕棿
+     */
+    private long plModifyTime;
+    /**
+     * 淇敼浜�
+     */
+    private String plModifyUser;
+
+    private String plLicensOrs;
+    /**
+     * 鐖惰妭鐐筰d
+     */
+    private String plActionCls;
+}
diff --git a/Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/dto/PLActionQueryDTO.java b/Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/dto/PLActionQueryDTO.java
new file mode 100644
index 0000000..aa6032b
--- /dev/null
+++ b/Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/dto/PLActionQueryDTO.java
@@ -0,0 +1,45 @@
+package com.vci.dto;
+
+import lombok.Data;
+/**
+ * Action鏌ヨ浼犺緭瀵硅薄
+ * @author yuxc
+ * @date 2024/8/20 14:45
+ */
+@Data
+public class PLActionQueryDTO implements java.io.Serializable{
+
+    /**
+     * 绂佹淇敼杩欎釜鍊�
+     */
+    private static final long serialVersionUID = 2009350578651813260L;
+    /**
+     *缂栧彿
+     */
+    private String plcode;
+    /**
+     *鍚嶇О
+     */
+    private String plname;
+    /**
+     *B/S绫昏矾寰�
+     */
+    private String plbsurl;
+    /**
+     *C/S绫昏矾寰�
+     */
+    private String plcsclass;
+    /**
+     *涓氬姟绫诲瀷
+     */
+    private String pltypetype;
+    /**
+     *鎻忚堪
+     */
+    private String pldesc;
+    /**
+     *鍒嗙被ID
+     */
+    private String plactioncls;
+
+}
diff --git a/Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/dto/PRMDTO.java b/Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/dto/PRMDTO.java
new file mode 100644
index 0000000..edca04d
--- /dev/null
+++ b/Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/dto/PRMDTO.java
@@ -0,0 +1,50 @@
+package com.vci.dto;
+
+import java.util.List;
+
+public class PRMDTO implements   java.io.Serializable {
+
+    private static final long serialVersionUID = -9069714336905186990L;
+    /**
+     * 鏄剧ず澶氬皯鍒�,榛樿涓�3鍒�
+     */
+    private String showCols = "3";
+    /**
+     * 琛ㄥ崟鍚嶇О
+     */
+    private String formQtName = "";
+    private List<PRMItemDTO> prmItemList;
+
+    public String getShowCols() {
+        return showCols;
+    }
+
+    public void setShowCols(String showCols) {
+        this.showCols = showCols;
+    }
+
+    public String getFormQtName() {
+        return formQtName;
+    }
+
+    public void setFormQtName(String formQtName) {
+        this.formQtName = formQtName;
+    }
+
+    public List<PRMItemDTO> getPrmItemList() {
+        return prmItemList;
+    }
+
+    public void setPrmItemList(List<PRMItemDTO> prmItemList) {
+        this.prmItemList = prmItemList;
+    }
+
+    @Override
+    public String toString() {
+        return "PRMVO{" +
+                "showCols='" + showCols + '\'' +
+                ", formQtName='" + formQtName + '\'' +
+                ", prmItemList=" + prmItemList +
+                '}';
+    }
+}
diff --git a/Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/dto/PRMItemDTO.java b/Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/dto/PRMItemDTO.java
new file mode 100644
index 0000000..4747ade
--- /dev/null
+++ b/Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/dto/PRMItemDTO.java
@@ -0,0 +1,764 @@
+package com.vci.dto;
+
+import com.vci.bo.ItemSeniorQueryBO;
+import com.vci.pagemodel.KeyValue;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class PRMItemDTO implements java.io.Serializable {
+    private static final long serialVersionUID = 2773419329512304674L;
+    /**
+     * 浣跨敤瀛楁
+     */
+    private String itemField = "";
+    //list
+    private String itemOR = "";
+    private String itemEQ = "";
+    private String itemTrim = "";
+    /**
+     * 蹇界暐
+     */
+    private String itemDbl = "";
+    /**
+     * 瀛楃涓叉埅鍙�
+     */
+    private String itemCut = "";
+    /**
+     *缁戝畾琛ㄥ崟
+     */
+    private String itemInObj = "";
+    /**
+     * form锛氬瓧娈佃〃杈惧紡  table锛氶檮鍔犳煡璇㈡潯浠�
+     */
+    private String itemAddFilter = "";
+    /**
+     *
+     */
+    private String itemOutType = "";
+    /**
+     * table 姣忛〉鍙樉绀鸿鏁�
+     */
+    private String itemPageSize = "";
+    /**
+     * 鍥剧墖瀹介珮锛�0,0
+     */
+    private String itemImgWH = "";
+    /**
+     * 闇�瑕佷娇鐢ㄧ殑瀛楁
+     */
+    private String itemOutFields = "";
+    /**
+     * 寰呴�夋嫨鐨勫睘鎬у瓧娈�
+     */
+    private List<String[]> itemSelectoutFields=new ArrayList<>();
+
+
+    /**
+     * 闇�瑕佷娇鐢ㄧ殑闆嗗悎
+     */
+    private List<String> itemOutFieldList=new ArrayList<>();
+    /**
+     * 闇�瑕佹悳绱㈢殑瀛楁
+     */
+    private String itemKeyFields = "";
+    /**
+     *寰呮悳绱㈠瓧娈�
+     */
+    private List<String> itemSearchFieldList=new ArrayList<>();
+    /**
+     * 闇�瑕佹悳绱㈢殑瀛楁
+     */
+    private List<String> itemKeyFieldList=new ArrayList<>();
+
+    private String itemBat = "";
+    /**
+     * 瀹藉害
+     */
+    private String itemFieldWidth = "";
+    /**
+     * 鍒楁樉绀哄娈� itemOutFieldList 鐩稿尮閰�
+     */
+    private List<KeyValue> itemFieldWidthList=new ArrayList<>();
+
+    //form
+    private String itemTxf = "";
+    /**
+     * 鏄剧ず鍚嶇О
+     */
+    private String itemName = "";
+    /**
+     * 灞炴�х被鍨�
+     *      text:鍗曡鏂囨湰妗�
+     * 		textbtn:鏂囨湰鎸夐挳妗�:
+     * 		textarea:澶氳鏂囨湰妗�:
+     * 		richtext:瀵屾枃鏈:
+     * 		number:鏁板瓧杈撳叆妗�:
+     * 		password:瀵嗙爜妗�:
+     * 		radio:鍗曢�夋寜閽�:
+     * 		checkbox:澶氶�夋寜閽�:
+     * 		select:涓嬫媺鑿滃崟:
+     * 		multiselect:澶氶�変笅鎷夎彍鍗�:
+     * 		date:鏃ユ湡杈撳叆妗�:
+     * 		time:鏃堕棿杈撳叆妗�:
+     * 		datetime:鏃ユ湡鏃堕棿杈撳叆妗�:
+     * 		file:鏂囦欢涓婁紶:
+     * 		multiFile:澶氭枃浠朵笂浼�:
+     * 		custom:鑷畾涔�:
+     * 		customform:鑷畾涔夎〃鍗�:
+     * 		hidden:闅愯棌鎴栨櫘閫氭枃瀛�:
+     * 		webeditor:Web缂栬緫鍣�:
+     * 		specialCharacter:鐗规畩瀛楃:
+     */
+    private String itemType = "";
+    /**
+     * 灞炴�х被鍨嬫樉绀哄��
+     */
+    private String itemTypeText = "";
+    /**
+     * 榛樿鍊�
+     */
+    private String itemValue = "";
+    /**
+     *鍗犱綅鏂瑰紡 1:鏄剧ず锛�2:涓嶆樉绀�
+     */
+    private String itemCols = "";
+    /**
+     *
+     */
+    private String itemRows = "";
+    /**
+     * 闄勫姞灞炴�э紙鏍峰紡锛�
+     */
+    private String itemStyle = "";
+    /**
+     *鑴氭湰楠岃瘉
+     */
+    private String itemScript = "";
+    /**
+     * 鎻愮ず鏂囧瓧
+     */
+    private String itemTips = "";
+    /**
+     * 鏋氫妇鍊�
+     */
+    private List<String> itemValueList = null;
+    /**
+     *涓�绾у弬鐓�
+     */
+    private String itemListTable = "";
+    /**
+     *浜岀骇鍙傜収
+     */
+    private String itemListTxt = "";
+    /**
+     *鍙傜収鍊�
+     */
+    private String itemListVal = "";
+    /**
+     * 鏄惁鍙互缂栬緫0:缂栬緫锛�1锛氬彧璇�
+     */
+    private String itemIsEditable = "";
+    /**
+     * 鍙閫夋嫨鏉′欢
+     */
+    private String itemEditableProgram = "";
+
+    /**
+     *
+     */
+    private String itemEditCondition = "";
+    /**
+     * 鏄惁鏄剧ず瀛楁 0锛涗笉鏄剧ず锛�1锛氭樉绀�
+     */
+    private String itemIsHidden = "";
+    /**
+     * 鏌ヨ妯℃澘鍚嶇О
+     */
+    private String itemQtName = "";
+    /**
+     * 鏄惁蹇呭~ 0:鍚︼紝1锛氭槸
+     */
+    private String itemIsRequired = "";
+    /**
+     *http瀛樺偍寮�鍏�  0锛氬惁锛�1锛氭槸
+     */
+    private String itemIsHttpSave = "";
+    /**
+     * 瀛樺偍璺緞
+     */
+    private String itemHttpVolumnPath = "";
+    /**
+     * 瀛樺偍璺緞瀛楁
+     */
+    private String itemHttpPathField = "";
+    /**
+     * 鏉冮檺鎺у埗
+     */
+    private String itemRight = "";
+    /**
+     * 楂樼骇鏌ヨ鍒�
+     */
+    private String itemSeniorQueryCols = "";
+    /**
+     * 楂樼骇鏌ヨ鍚勫垪浣跨敤娆℃暟
+     */
+    private String itemSeniorQueryColsCounts = "";
+
+    /**
+     *楂樼骇鏌ヨsql
+     */
+    private String itemQuerySql = "";
+    /***
+     * 楂樼骇鏌ヨ瀵硅薄
+     */
+    private  List<ItemSeniorQueryBO> itemSeniorQueryBOS=new ArrayList<>();
+
+    /**
+     * 瓒呴摼鎺ュ瓧娈�
+     */
+    private String itemHrefFields = "";
+    /**
+     * 瓒呴摼鎺ラ厤缃�
+     */
+    private String itemHrefConf = "";
+    /**
+     * 鏌ヨ鍏宠仈鍒�
+     */
+    private String itemQueryRefFields = "";
+    /***
+     * 鑷畾涔夌被璺緞
+     */
+    private String itemCustomClass = "";
+    /**
+     * 鎺у埗鏄剧ず鍒�
+     */
+    private String itemCtrlDisplyCol = "";
+    /**
+     * 鎺у埗鏄剧ず鏉′欢
+     */
+    private String itemCtrlDisplyCondition = "";
+    /**
+     * 鏌ヨ鍖哄煙鏄剧ず鎺у埗 true锛氭樉绀猴紝false 涓嶆樉绀�
+     */
+    private String itemIsNavigatorExpand = "";
+    /**
+     * 鏄惁鏄剧ず鏂囦欢澶� true锛氭樉绀猴紝false 涓嶆樉绀�
+     */
+    private String itemIsShowFolder = "";
+    /**
+     * 鐖舵枃浠跺す鍚嶇О
+     */
+    private String itemParentFolderName = "";
+    /**
+     *   鏄剧ず琛ㄨ揪寮� ${aa}-${bb}
+     */
+    private String itemShowExpression = "";
+    /**
+     * 鏁版嵁涓烘棩鏈熺被鍨嬫椂鐨勬牸寮忓寲瀛楃涓� 濡� yyyy-MM-dd HH:mm:ss
+     */
+    private String itemDateFormat = "";
+
+    public String getItemRight() {
+        return itemRight;
+    }
+    public void setItemRight(String itemRight) {
+        this.itemRight = itemRight;
+    }
+    public String getItemQuerySql() {
+        return itemQuerySql;
+    }
+    public void setItemQuerySql(String itemQuerySql) {
+        this.itemQuerySql = itemQuerySql;
+    }
+    public String getItemFieldWidth() {
+        return itemFieldWidth;
+    }
+    public void setItemFieldWidth(String itemFieldWidth) {
+        this.itemFieldWidth = itemFieldWidth;
+    }
+    public String getItemParentFolderName() {
+        return itemParentFolderName;
+    }
+    public void setItemParentFolderName(String itemParentFolderName) {
+        this.itemParentFolderName = itemParentFolderName;
+    }
+    public String getItemIsShowFolder() {
+        return itemIsShowFolder;
+    }
+    public void setItemIsShowFolder(String itemIsShowFolder) {
+        this.itemIsShowFolder = itemIsShowFolder;
+    }
+    public String getItemIsNavigatorExpand() {
+        return itemIsNavigatorExpand;
+    }
+    public void setItemIsNavigatorExpand(String itemIsNavigatorExpand) {
+        this.itemIsNavigatorExpand = itemIsNavigatorExpand;
+    }
+    public String getItemField() {
+        return itemField;
+    }
+    public void setItemField(String itemField) {
+        this.itemField = itemField;
+    }
+    public String getItemOR() {
+        return itemOR;
+    }
+    public void setItemOR(String itemOR) {
+        this.itemOR = itemOR;
+    }
+    public String getItemEQ() {
+        return itemEQ;
+    }
+    public void setItemEQ(String itemEQ) {
+        this.itemEQ = itemEQ;
+    }
+    public String getItemTrim() {
+        return itemTrim;
+    }
+    public void setItemTrim(String itemTrim) {
+        this.itemTrim = itemTrim;
+    }
+    public String getItemDbl() {
+        return itemDbl;
+    }
+    public void setItemDbl(String itemDbl) {
+        this.itemDbl = itemDbl;
+    }
+    public String getItemCut() {
+        return itemCut;
+    }
+    public void setItemCut(String itemCut) {
+        this.itemCut = itemCut;
+    }
+    public String getItemInObj() {
+        return itemInObj;
+    }
+    public void setItemInObj(String itemInObj) {
+        this.itemInObj = itemInObj;
+    }
+    public String getItemOutType() {
+        return itemOutType;
+    }
+    public void setItemOutType(String itemOutType) {
+        this.itemOutType = itemOutType;
+    }
+    public String getItemPageSize() {
+        return itemPageSize;
+    }
+    public void setItemPageSize(String itemPageSize) {
+        this.itemPageSize = itemPageSize;
+    }
+    public String getItemImgWH() {
+        return itemImgWH;
+    }
+    public void setItemImgWH(String itemImgWH) {
+        this.itemImgWH = itemImgWH;
+    }
+    public String getItemOutFields() {
+        return itemOutFields;
+    }
+    public void setItemOutFields(String itemOutFields) {
+        this.itemOutFields = itemOutFields;
+    }
+    public String getItemKeyFields() {
+        return itemKeyFields;
+    }
+    public void setItemKeyFields(String itemKeyFields) {
+        this.itemKeyFields = itemKeyFields;
+    }
+    public String getItemBat() {
+        return itemBat;
+    }
+    public void setItemBat(String itemBat) {
+        this.itemBat = itemBat;
+    }
+    public String getItemTxf() {
+        return itemTxf;
+    }
+    public void setItemTxf(String itemTxf) {
+        this.itemTxf = itemTxf;
+    }
+    public String getItemName() {
+        return itemName;
+    }
+    public void setItemName(String itemName) {
+        this.itemName = itemName;
+    }
+    public String getItemType() {
+        return itemType;
+    }
+    public void setItemType(String itemType) {
+        this.itemType = itemType;
+    }
+    public String getItemValue() {
+        return itemValue;
+    }
+    public void setItemValue(String itemValue) {
+        this.itemValue = itemValue;
+    }
+    public String getItemCols() {
+        return itemCols;
+    }
+    public void setItemCols(String itemCols) {
+        this.itemCols = itemCols;
+    }
+    public String getItemRows() {
+        return itemRows;
+    }
+    public void setItemRows(String itemRows) {
+        this.itemRows = itemRows;
+    }
+    public List<String> getItemValueList() {
+        return itemValueList;
+    }
+    public void setItemValueList(List<String> itemValueList) {
+        this.itemValueList = itemValueList;
+    }
+    public String getItemListTable() {
+        return itemListTable;
+    }
+    public void setItemListTable(String itemListTable) {
+        this.itemListTable = itemListTable;
+    }
+
+    public String getItemListTxt() {
+        return itemListTxt;
+    }
+    public void setItemListTxt(String itemListTxt) {
+        this.itemListTxt = itemListTxt;
+    }
+    public String getItemListVal() {
+        return itemListVal;
+    }
+    public void setItemListVal(String itemListVal) {
+        this.itemListVal = itemListVal;
+    }
+    public String getItemAddFilter() {
+        return itemAddFilter;
+    }
+    public void setItemAddFilter(String itemAddFilter) {
+        this.itemAddFilter = itemAddFilter;
+    }
+    public String getItemStyle() {
+        return itemStyle;
+    }
+    public void setItemStyle(String itemStyle) {
+        this.itemStyle = itemStyle;
+    }
+    public String getItemScript() {
+        return itemScript;
+    }
+    public void setItemScript(String itemScript) {
+        this.itemScript = itemScript;
+    }
+    public String getItemTips() {
+        return itemTips;
+    }
+    public void setItemTips(String itemTips) {
+        this.itemTips = itemTips;
+    }
+    public String getItemIsEditable() {
+        return itemIsEditable;
+    }
+    public void setItemIsEditable(String itemIsEditable) {
+        this.itemIsEditable = itemIsEditable;
+    }
+    public String getItemIsHidden() {
+        return itemIsHidden;
+    }
+    public void setItemIsHidden(String itemIsHidden) {
+        this.itemIsHidden = itemIsHidden;
+    }
+    public String getItemQtName() {
+        return itemQtName;
+    }
+    public void setItemQtName(String itemQtName) {
+        this.itemQtName = itemQtName;
+    }
+    public String getItemIsRequired() {
+        return itemIsRequired;
+    }
+    public void setItemIsRequired(String itemIsRequired) {
+        this.itemIsRequired = itemIsRequired;
+    }
+    public String getItemSeniorQueryCols() {
+        return itemSeniorQueryCols;
+    }
+    public void setItemSeniorQueryCols(String itemSeniorQueryCols) {
+        this.itemSeniorQueryCols = itemSeniorQueryCols;
+    }
+    public String getItemSeniorQueryColsCounts() {
+        return itemSeniorQueryColsCounts;
+    }
+    public void setItemSeniorQueryColsCounts(String itemSeniorQueryColsCounts) {
+        this.itemSeniorQueryColsCounts = itemSeniorQueryColsCounts;
+    }
+    public String getItemHrefFields() {
+        return itemHrefFields;
+    }
+    public void setItemHrefFields(String itemHrefFields) {
+        this.itemHrefFields = itemHrefFields;
+    }
+    public String getItemHrefConf() {
+        return itemHrefConf;
+    }
+    public void setItemHrefConf(String itemHrefConf) {
+        this.itemHrefConf = itemHrefConf;
+    }
+    public String getItemQueryRefFields() {
+        return itemQueryRefFields;
+    }
+    public void setItemQueryRefFields(String itemQueryRefFields) {
+        this.itemQueryRefFields = itemQueryRefFields;
+    }
+    public String getItemCustomClass() {
+        return itemCustomClass;
+    }
+    public void setItemCustomClass(String itemCustomClass) {
+        this.itemCustomClass = itemCustomClass;
+    }
+    public String getItemCtrlDisplyCol() {
+        return itemCtrlDisplyCol;
+    }
+    public void setItemCtrlDisplyCol(String itemCtrlDisplyCol) {
+        this.itemCtrlDisplyCol = itemCtrlDisplyCol;
+    }
+    public String getItemCtrlDisplyCondition() {
+        return itemCtrlDisplyCondition;
+    }
+    public void setItemCtrlDisplyCondition(String itemCtrlDisplyCondition) {
+        this.itemCtrlDisplyCondition = itemCtrlDisplyCondition;
+    }
+    public String getItemIsHttpSave() {
+        return itemIsHttpSave;
+    }
+    public void setItemIsHttpSave(String itemIsHttpSave) {
+        this.itemIsHttpSave = itemIsHttpSave;
+    }
+    public String getItemHttpVolumnPath() {
+        return itemHttpVolumnPath;
+    }
+    public void setItemHttpVolumnPath(String itemHttpVolumnPath) {
+        this.itemHttpVolumnPath = itemHttpVolumnPath;
+    }
+    public String getItemHttpPathField() {
+        return itemHttpPathField;
+    }
+    public void setItemHttpPathField(String itemHttpPathField) {
+        this.itemHttpPathField = itemHttpPathField;
+    }
+    public String getItemEditCondition() {
+        return itemEditCondition;
+    }
+    public void setItemEditCondition(String itemEditCondition) {
+        this.itemEditCondition = itemEditCondition;
+    }
+    public String getItemEditableProgram() {
+        return itemEditableProgram;
+    }
+    public void setItemEditableProgram(String itemEditableProgram) {
+        this.itemEditableProgram = itemEditableProgram;
+    }
+
+    public String getItemShowExpression() {
+        return itemShowExpression;
+    }
+    public void setItemShowExpression(String itemShowExpression) {
+        this.itemShowExpression = itemShowExpression;
+    }
+    public String getItemDateFormat() {
+        return itemDateFormat;
+    }
+    public void setItemDateFormat(String itemDateFormat) {
+        this.itemDateFormat = itemDateFormat;
+    }
+
+    public List<String> getItemOutFieldList() {
+        return itemOutFieldList;
+    }
+
+    public void setItemOutFieldList(List<String> itemOutFieldList) {
+        this.itemOutFieldList = itemOutFieldList;
+    }
+
+    public List<String> getItemKeyFieldList() {
+        return itemKeyFieldList;
+    }
+
+    public void setItemKeyFieldList(List<String> itemKeyFieldList) {
+        this.itemKeyFieldList = itemKeyFieldList;
+    }
+
+    public List<KeyValue> getItemFieldWidthList() {
+        return itemFieldWidthList;
+    }
+
+    public void setItemFieldWidthList(List<KeyValue> itemFieldWidthList) {
+        this.itemFieldWidthList = itemFieldWidthList;
+    }
+
+    public String getItemTypeText() {
+        return itemTypeText;
+    }
+
+    public void setItemTypeText(String itemTypeText) {
+        this.itemTypeText = itemTypeText;
+    }
+
+    public List<ItemSeniorQueryBO> getItemSeniorQueryBOS() {
+        return itemSeniorQueryBOS;
+    }
+
+    public void setItemSeniorQueryBOS(List<ItemSeniorQueryBO> itemSeniorQueryBOS) {
+        this.itemSeniorQueryBOS = itemSeniorQueryBOS;
+    }
+
+    public List<String[]> getItemSelectoutFields() {
+        return itemSelectoutFields;
+    }
+
+    public void setItemSelectoutFields(List<String[]> itemSelectoutFields) {
+        this.itemSelectoutFields = itemSelectoutFields;
+    }
+
+    public List<String> getItemSearchFieldList() {
+        return itemSearchFieldList;
+    }
+
+    public void setItemSearchFieldList(List<String> itemSearchFieldList) {
+        this.itemSearchFieldList = itemSearchFieldList;
+    }
+    //    /**
+//     * 楂樼骇鏌ヨ鍒椾笌浣跨敤娆℃暟
+//     */
+//    public Map<String, Integer> getColAndUseCountMap() {
+//        if(this.itemSeniorQueryCols == null || this.itemSeniorQueryColsCounts == null
+//                || this.itemSeniorQueryCols.equals("") || this.itemSeniorQueryColsCounts.equals("")){
+//            return null;
+//        }
+//        Map<String, Integer> map = new LinkedHashMap<String, Integer>();
+//        String[] cols = this.itemSeniorQueryCols.split(",");
+//        String[] counts = this.itemSeniorQueryColsCounts.split(",");
+//        for(int i = 0; i < cols.length; i++){
+//            int count = Integer.valueOf(counts[i]);
+//            map.put(cols[i], count);
+//        }
+//        return map;
+//    }
+//
+//    /**
+//     * 楂樼骇鏌ヨ鑷畾涔夊垪涓庢煡璇ql
+//     */
+//    public Map<String, String> getCustomerColAndSql() {
+//        if(this.itemSeniorQueryCols == null || this.itemQuerySql == null
+//                || this.itemSeniorQueryCols.equals("") || this.itemQuerySql.equals("")){
+//            return null;
+//        }
+//        Map<String, String> map = new LinkedHashMap<String, String>();
+//        String[] cols = this.itemSeniorQueryCols.split(",");
+//        String[] sqls = this.itemQuerySql.split(";");
+//        for(int i = 0; i < cols.length; i++){
+//            String sql = sqls[i];
+//            if(sql != null && !sql.equalsIgnoreCase("NULL")){
+//                map.put(cols[i], sql);
+//            }
+//        }
+//        return map;
+//    }
+//
+//    /**
+//     * 杩斿洖 PRMItem 瀵硅薄鏄惁鏄剧ず
+//     * @return 瀵硅薄鏄惁鏄剧ず  (瀵瑰簲琛ㄥ崟灞炴�у畾涔夌殑鍗犱綅鏂瑰紡鐨勬樉绀恒�佷笉鏄剧ず锛�<p>true:鏄剧ず false:涓嶆樉绀�</p>
+//     */
+//    public boolean isShow(){
+//        return ("1".equalsIgnoreCase(this.getItemCols().trim()));
+//    }
+//    /**
+//     * 杩斿洖 PRMItem 瀵硅薄鏄惁鏄繀濉」
+//     * @return 瀵硅薄鏄惁鏄繀濉�<p>true:鏄惧繀濉」 false:涓嶆槸蹇呭~椤�</p>
+//     */
+//    public boolean isRequired(){
+//        return ("1".equalsIgnoreCase(this.getItemIsRequired().trim()));
+//    }
+//    /**
+//     * 杩斿洖 PRMItem 瀵硅薄 鏄惁鍙互缂栬緫
+//     * @return 瀵硅薄鏄惁鍙紪杈� <p>true: 鍙紪杈�(闈炲彧璇�) false: 涓嶅彲缂栬緫(鍙)</p>
+//     */
+//    public boolean isEditable(){
+//        return ("0".equalsIgnoreCase(this.getItemIsEditable().trim()));
+//    }
+//    /**
+//     * 杩斿洖 PRMItem 瀵硅薄 鏄惁鍙槸鍙
+//     * @return 瀵硅薄鏄惁鍙紪杈� <p>true: 鍙(涓嶅彲缂栬緫) false: 闈炲彧璇�(鍙紪杈�)</p>
+//     */
+//    public boolean isReadonly(){
+//        return !(isEditable());
+//    }
+
+
+    @Override
+    public String toString() {
+        return "PRMItemDTO{" +
+                "itemField='" + itemField + '\'' +
+                ", itemOR='" + itemOR + '\'' +
+                ", itemEQ='" + itemEQ + '\'' +
+                ", itemTrim='" + itemTrim + '\'' +
+                ", itemDbl='" + itemDbl + '\'' +
+                ", itemCut='" + itemCut + '\'' +
+                ", itemInObj='" + itemInObj + '\'' +
+                ", itemAddFilter='" + itemAddFilter + '\'' +
+                ", itemOutType='" + itemOutType + '\'' +
+                ", itemPageSize='" + itemPageSize + '\'' +
+                ", itemImgWH='" + itemImgWH + '\'' +
+                ", itemOutFields='" + itemOutFields + '\'' +
+                ", itemSelectoutFields=" + itemSelectoutFields +
+                ", itemOutFieldList=" + itemOutFieldList +
+                ", itemKeyFields='" + itemKeyFields + '\'' +
+                ", itemSearchFieldList=" + itemSearchFieldList +
+                ", itemKeyFieldList=" + itemKeyFieldList +
+                ", itemBat='" + itemBat + '\'' +
+                ", itemFieldWidth='" + itemFieldWidth + '\'' +
+                ", itemFieldWidthList=" + itemFieldWidthList +
+                ", itemTxf='" + itemTxf + '\'' +
+                ", itemName='" + itemName + '\'' +
+                ", itemType='" + itemType + '\'' +
+                ", itemTypeText='" + itemTypeText + '\'' +
+                ", itemValue='" + itemValue + '\'' +
+                ", itemCols='" + itemCols + '\'' +
+                ", itemRows='" + itemRows + '\'' +
+                ", itemStyle='" + itemStyle + '\'' +
+                ", itemScript='" + itemScript + '\'' +
+                ", itemTips='" + itemTips + '\'' +
+                ", itemValueList=" + itemValueList +
+                ", itemListTable='" + itemListTable + '\'' +
+                ", itemListTxt='" + itemListTxt + '\'' +
+                ", itemListVal='" + itemListVal + '\'' +
+                ", itemIsEditable='" + itemIsEditable + '\'' +
+                ", itemEditableProgram='" + itemEditableProgram + '\'' +
+                ", itemEditCondition='" + itemEditCondition + '\'' +
+                ", itemIsHidden='" + itemIsHidden + '\'' +
+                ", itemQtName='" + itemQtName + '\'' +
+                ", itemIsRequired='" + itemIsRequired + '\'' +
+                ", itemIsHttpSave='" + itemIsHttpSave + '\'' +
+                ", itemHttpVolumnPath='" + itemHttpVolumnPath + '\'' +
+                ", itemHttpPathField='" + itemHttpPathField + '\'' +
+                ", itemRight='" + itemRight + '\'' +
+                ", itemSeniorQueryCols='" + itemSeniorQueryCols + '\'' +
+                ", itemSeniorQueryColsCounts='" + itemSeniorQueryColsCounts + '\'' +
+                ", itemQuerySql='" + itemQuerySql + '\'' +
+                ", itemSeniorQueryBOS=" + itemSeniorQueryBOS +
+                ", itemHrefFields='" + itemHrefFields + '\'' +
+                ", itemHrefConf='" + itemHrefConf + '\'' +
+                ", itemQueryRefFields='" + itemQueryRefFields + '\'' +
+                ", itemCustomClass='" + itemCustomClass + '\'' +
+                ", itemCtrlDisplyCol='" + itemCtrlDisplyCol + '\'' +
+                ", itemCtrlDisplyCondition='" + itemCtrlDisplyCondition + '\'' +
+                ", itemIsNavigatorExpand='" + itemIsNavigatorExpand + '\'' +
+                ", itemIsShowFolder='" + itemIsShowFolder + '\'' +
+                ", itemParentFolderName='" + itemParentFolderName + '\'' +
+                ", itemShowExpression='" + itemShowExpression + '\'' +
+                ", itemDateFormat='" + itemDateFormat + '\'' +
+                '}';
+    }
+}
diff --git a/Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/dto/PortalVIDTO.java b/Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/dto/PortalVIDTO.java
new file mode 100644
index 0000000..be2d3bd
--- /dev/null
+++ b/Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/dto/PortalVIDTO.java
@@ -0,0 +1,96 @@
+package com.vci.dto;
+
+/**
+ *
+ * 琛ㄥ崟鏄剧ず瀵硅薄
+ * @author xiej
+ * @date 2024/08/14 6:04 PM
+ */
+public class PortalVIDTO implements  java.io.Serializable{
+
+    private static final long serialVersionUID = 3676954583670971638L;
+    /**
+     * 涓婚敭
+     */
+    private String id;
+    /**
+     * 0: 涓氬姟绫诲瀷; 1: 閾炬帴绫诲瀷. 榛樿0
+     */
+    private short typeFlag;
+    /**
+     * 绫诲瀷鍚�
+     */
+    private String typeName;
+    /**
+     * 瑙嗗浘鍚�
+     */
+    private String viName;
+    /**
+     * 瑙嗗浘绫诲瀷: 杈撳叆琛ㄥ崟鎴栧垎椤靛垪琛�
+     */
+    private short viType;
+    /**
+     * 瀹氫箟璇︽儏
+     */
+    private PRMDTO prm;
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public short getTypeFlag() {
+        return typeFlag;
+    }
+
+    public void setTypeFlag(short typeFlag) {
+        this.typeFlag = typeFlag;
+    }
+
+    public String getTypeName() {
+        return typeName;
+    }
+
+    public void setTypeName(String typeName) {
+        this.typeName = typeName;
+    }
+
+    public String getViName() {
+        return viName;
+    }
+
+    public void setViName(String viName) {
+        this.viName = viName;
+    }
+
+    public short getViType() {
+        return viType;
+    }
+
+    public void setViType(short viType) {
+        this.viType = viType;
+    }
+
+    public PRMDTO getPrm() {
+        return prm;
+    }
+
+    public void setPrm(PRMDTO prm) {
+        this.prm = prm;
+    }
+
+    @Override
+    public String toString() {
+        return "PortalVIVO{" +
+                "id='" + id + '\'' +
+                ", typeFlag=" + typeFlag +
+                ", typeName='" + typeName + '\'' +
+                ", viName='" + viName + '\'' +
+                ", viType=" + viType +
+                ", prm=" + prm +
+                '}';
+    }
+}
diff --git a/Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/model/PRMDO.java b/Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/model/PRMDO.java
new file mode 100644
index 0000000..9da856f
--- /dev/null
+++ b/Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/model/PRMDO.java
@@ -0,0 +1,45 @@
+package com.vci.model;
+
+import java.util.List;
+
+public class PRMDO implements   java.io.Serializable {
+
+
+    private static final long serialVersionUID = -5898872445810489324L;
+    private String showCols = "3";
+    private String formQtName = "";
+    private List<PRMItemDO> prmItemList;
+
+    public String getShowCols() {
+        return showCols;
+    }
+
+    public void setShowCols(String showCols) {
+        this.showCols = showCols;
+    }
+
+    public String getFormQtName() {
+        return formQtName;
+    }
+
+    public void setFormQtName(String formQtName) {
+        this.formQtName = formQtName;
+    }
+
+    public List<PRMItemDO> getPrmItemList() {
+        return prmItemList;
+    }
+
+    public void setPrmItemList(List<PRMItemDO> prmItemList) {
+        this.prmItemList = prmItemList;
+    }
+
+    @Override
+    public String toString() {
+        return "PRMVO{" +
+                "showCols='" + showCols + '\'' +
+                ", formQtName='" + formQtName + '\'' +
+                ", prmItemList=" + prmItemList +
+                '}';
+    }
+}
diff --git a/Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/model/PRMItemDO.java b/Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/model/PRMItemDO.java
new file mode 100644
index 0000000..c758bb8
--- /dev/null
+++ b/Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/model/PRMItemDO.java
@@ -0,0 +1,725 @@
+package com.vci.model;
+
+import com.vci.bo.ItemSeniorQueryBO;
+import com.vci.pagemodel.KeyValue;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class PRMItemDO implements java.io.Serializable {
+
+    private static final long serialVersionUID = 4168551730739914307L;
+    /**
+     * 浣跨敤瀛楁
+     */
+    private String itemField = "";
+    //list
+    private String itemOR = "";
+    private String itemEQ = "";
+    private String itemTrim = "";
+    /**
+     * 蹇界暐
+     */
+    private String itemDbl = "";
+    /**
+     * 瀛楃涓叉埅鍙�
+     */
+    private String itemCut = "";
+    /**
+     *缁戝畾琛ㄥ崟
+     */
+    private String itemInObj = "";
+    /**
+     * form锛氬瓧娈佃〃杈惧紡  table锛氶檮鍔犳煡璇㈡潯浠�
+     */
+    private String itemAddFilter = "";
+    /**
+     *
+     */
+    private String itemOutType = "";
+    /**
+     * table 姣忛〉鍙樉绀鸿鏁�
+     */
+    private String itemPageSize = "";
+    /**
+     * 鍥剧墖瀹介珮锛�0,0
+     */
+    private String itemImgWH = "";
+    /**
+     * 闇�瑕佷娇鐢ㄧ殑瀛楁
+     */
+    private String itemOutFields = "";
+
+
+
+
+    /**
+     * 闇�瑕佹悳绱㈢殑瀛楁
+     */
+    private String itemKeyFields = "";
+
+
+    private String itemBat = "";
+    /**
+     * 瀹藉害
+     */
+    private String itemFieldWidth = "";
+
+    //form
+    private String itemTxf = "";
+    /**
+     * 鏄剧ず鍚嶇О
+     */
+    private String itemName = "";
+    /**
+     * 灞炴�х被鍨�
+     *      text:鍗曡鏂囨湰妗�
+     * 		textbtn:鏂囨湰鎸夐挳妗�:
+     * 		textarea:澶氳鏂囨湰妗�:
+     * 		richtext:瀵屾枃鏈:
+     * 		number:鏁板瓧杈撳叆妗�:
+     * 		password:瀵嗙爜妗�:
+     * 		radio:鍗曢�夋寜閽�:
+     * 		checkbox:澶氶�夋寜閽�:
+     * 		select:涓嬫媺鑿滃崟:
+     * 		multiselect:澶氶�変笅鎷夎彍鍗�:
+     * 		date:鏃ユ湡杈撳叆妗�:
+     * 		time:鏃堕棿杈撳叆妗�:
+     * 		datetime:鏃ユ湡鏃堕棿杈撳叆妗�:
+     * 		file:鏂囦欢涓婁紶:
+     * 		multiFile:澶氭枃浠朵笂浼�:
+     * 		custom:鑷畾涔�:
+     * 		customform:鑷畾涔夎〃鍗�:
+     * 		hidden:闅愯棌鎴栨櫘閫氭枃瀛�:
+     * 		webeditor:Web缂栬緫鍣�:
+     * 		specialCharacter:鐗规畩瀛楃:
+     */
+    private String itemType = "";
+    /**
+     * 灞炴�х被鍨嬫樉绀哄��
+     */
+    private String itemTypeText = "";
+    /**
+     * 榛樿鍊�
+     */
+    private String itemValue = "";
+    /**
+     *鍗犱綅鏂瑰紡 1:鏄剧ず锛�2:涓嶆樉绀�
+     */
+    private String itemCols = "";
+    /**
+     *
+     */
+    private String itemRows = "";
+    /**
+     * 闄勫姞灞炴�э紙鏍峰紡锛�
+     */
+    private String itemStyle = "";
+    /**
+     *鑴氭湰楠岃瘉
+     */
+    private String itemScript = "";
+    /**
+     * 鎻愮ず鏂囧瓧
+     */
+    private String itemTips = "";
+    /**
+     * 鏋氫妇鍊�
+     */
+    private List<String> itemValueList = null;
+
+    /**
+     *涓�绾у弬鐓�
+     */
+    private String itemListTable = "";
+    /**
+     *浜岀骇鍙傜収
+     */
+    private String itemListTxt = "";
+    /**
+     *鍙傜収鍊�
+     */
+    private String itemListVal = "";
+    /**
+     * 鏄惁鍙互缂栬緫0:缂栬緫锛�1锛氬彧璇�
+     */
+    private String itemIsEditable = "";
+    /**
+     * 鍙閫夋嫨鏉′欢
+     */
+    private String itemEditableProgram = "";
+
+    /**
+     *
+     */
+    private String itemEditCondition = "";
+    /**
+     * 鏄惁鏄剧ず瀛楁 0锛涗笉鏄剧ず锛�1锛氭樉绀�
+     */
+    private String itemIsHidden = "";
+    /**
+     * 鏌ヨ妯℃澘鍚嶇О
+     */
+    private String itemQtName = "";
+    /**
+     * 鏄惁蹇呭~ 0:鍚︼紝1锛氭槸
+     */
+    private String itemIsRequired = "";
+    /**
+     *http瀛樺偍寮�鍏�  0锛氬惁锛�1锛氭槸
+     */
+    private String itemIsHttpSave = "";
+    /**
+     * 瀛樺偍璺緞
+     */
+    private String itemHttpVolumnPath = "";
+    /**
+     * 瀛樺偍璺緞瀛楁
+     */
+    private String itemHttpPathField = "";
+    /**
+     * 鏉冮檺鎺у埗
+     */
+    private String itemRight = "";
+    /**
+     * 楂樼骇鏌ヨ鍒�
+     */
+    private String itemSeniorQueryCols = "";
+    /**
+     * 楂樼骇鏌ヨ鍚勫垪浣跨敤娆℃暟
+     */
+    private String itemSeniorQueryColsCounts = "";
+
+    /**
+     *楂樼骇鏌ヨsql
+     */
+    private String itemQuerySql = "";
+
+    /**
+     * 瓒呴摼鎺ュ瓧娈�
+     */
+    private String itemHrefFields = "";
+    /**
+     * 瓒呴摼鎺ラ厤缃�
+     */
+    private String itemHrefConf = "";
+    /**
+     * 鏌ヨ鍏宠仈鍒�
+     */
+    private String itemQueryRefFields = "";
+    /***
+     * 鑷畾涔夌被璺緞
+     */
+    private String itemCustomClass = "";
+    /**
+     * 鎺у埗鏄剧ず鍒�
+     */
+    private String itemCtrlDisplyCol = "";
+    /**
+     * 鎺у埗鏄剧ず鏉′欢
+     */
+    private String itemCtrlDisplyCondition = "";
+    /**
+     * 鏌ヨ鍖哄煙鏄剧ず鎺у埗 true锛氭樉绀猴紝false 涓嶆樉绀�
+     */
+    private String itemIsNavigatorExpand = "";
+    /**
+     * 鏄惁鏄剧ず鏂囦欢澶� true锛氭樉绀猴紝false 涓嶆樉绀�
+     */
+    private String itemIsShowFolder = "";
+    /**
+     * 鐖舵枃浠跺す鍚嶇О
+     */
+    private String itemParentFolderName = "";
+    /**
+     *   鏄剧ず琛ㄨ揪寮� ${aa}-${bb}
+     */
+    private String itemShowExpression = "";
+    /**
+     * 鏁版嵁涓烘棩鏈熺被鍨嬫椂鐨勬牸寮忓寲瀛楃涓� 濡� yyyy-MM-dd HH:mm:ss
+     */
+    private String itemDateFormat = "";
+
+    public String getItemField() {
+        return itemField;
+    }
+
+    public void setItemField(String itemField) {
+        this.itemField = itemField;
+    }
+
+    public String getItemOR() {
+        return itemOR;
+    }
+
+    public void setItemOR(String itemOR) {
+        this.itemOR = itemOR;
+    }
+
+    public String getItemEQ() {
+        return itemEQ;
+    }
+
+    public void setItemEQ(String itemEQ) {
+        this.itemEQ = itemEQ;
+    }
+
+    public String getItemTrim() {
+        return itemTrim;
+    }
+
+    public void setItemTrim(String itemTrim) {
+        this.itemTrim = itemTrim;
+    }
+
+    public String getItemDbl() {
+        return itemDbl;
+    }
+
+    public void setItemDbl(String itemDbl) {
+        this.itemDbl = itemDbl;
+    }
+
+    public String getItemCut() {
+        return itemCut;
+    }
+
+    public void setItemCut(String itemCut) {
+        this.itemCut = itemCut;
+    }
+
+    public String getItemInObj() {
+        return itemInObj;
+    }
+
+    public void setItemInObj(String itemInObj) {
+        this.itemInObj = itemInObj;
+    }
+
+    public String getItemAddFilter() {
+        return itemAddFilter;
+    }
+
+    public void setItemAddFilter(String itemAddFilter) {
+        this.itemAddFilter = itemAddFilter;
+    }
+
+    public String getItemOutType() {
+        return itemOutType;
+    }
+
+    public void setItemOutType(String itemOutType) {
+        this.itemOutType = itemOutType;
+    }
+
+    public String getItemPageSize() {
+        return itemPageSize;
+    }
+
+    public void setItemPageSize(String itemPageSize) {
+        this.itemPageSize = itemPageSize;
+    }
+
+    public String getItemImgWH() {
+        return itemImgWH;
+    }
+
+    public void setItemImgWH(String itemImgWH) {
+        this.itemImgWH = itemImgWH;
+    }
+
+    public String getItemOutFields() {
+        return itemOutFields;
+    }
+
+    public void setItemOutFields(String itemOutFields) {
+        this.itemOutFields = itemOutFields;
+    }
+    public String getItemKeyFields() {
+        return itemKeyFields;
+    }
+
+    public void setItemKeyFields(String itemKeyFields) {
+        this.itemKeyFields = itemKeyFields;
+    }
+
+    public String getItemBat() {
+        return itemBat;
+    }
+
+    public void setItemBat(String itemBat) {
+        this.itemBat = itemBat;
+    }
+
+    public String getItemFieldWidth() {
+        return itemFieldWidth;
+    }
+
+    public void setItemFieldWidth(String itemFieldWidth) {
+        this.itemFieldWidth = itemFieldWidth;
+    }
+
+
+    public String getItemTxf() {
+        return itemTxf;
+    }
+
+    public void setItemTxf(String itemTxf) {
+        this.itemTxf = itemTxf;
+    }
+
+    public String getItemName() {
+        return itemName;
+    }
+
+    public void setItemName(String itemName) {
+        this.itemName = itemName;
+    }
+
+    public String getItemType() {
+        return itemType;
+    }
+
+    public void setItemType(String itemType) {
+        this.itemType = itemType;
+    }
+
+    public String getItemTypeText() {
+        return itemTypeText;
+    }
+
+    public void setItemTypeText(String itemTypeText) {
+        this.itemTypeText = itemTypeText;
+    }
+
+    public String getItemValue() {
+        return itemValue;
+    }
+
+    public void setItemValue(String itemValue) {
+        this.itemValue = itemValue;
+    }
+
+    public String getItemCols() {
+        return itemCols;
+    }
+
+    public void setItemCols(String itemCols) {
+        this.itemCols = itemCols;
+    }
+
+    public String getItemRows() {
+        return itemRows;
+    }
+
+    public void setItemRows(String itemRows) {
+        this.itemRows = itemRows;
+    }
+
+    public String getItemStyle() {
+        return itemStyle;
+    }
+
+    public void setItemStyle(String itemStyle) {
+        this.itemStyle = itemStyle;
+    }
+
+    public String getItemScript() {
+        return itemScript;
+    }
+
+    public void setItemScript(String itemScript) {
+        this.itemScript = itemScript;
+    }
+
+    public String getItemTips() {
+        return itemTips;
+    }
+
+    public void setItemTips(String itemTips) {
+        this.itemTips = itemTips;
+    }
+
+    public List<String> getItemValueList() {
+        return itemValueList;
+    }
+
+    public void setItemValueList(List<String> itemValueList) {
+        this.itemValueList = itemValueList;
+    }
+
+    public String getItemListTable() {
+        return itemListTable;
+    }
+
+    public void setItemListTable(String itemListTable) {
+        this.itemListTable = itemListTable;
+    }
+
+    public String getItemListTxt() {
+        return itemListTxt;
+    }
+
+    public void setItemListTxt(String itemListTxt) {
+        this.itemListTxt = itemListTxt;
+    }
+
+    public String getItemListVal() {
+        return itemListVal;
+    }
+
+    public void setItemListVal(String itemListVal) {
+        this.itemListVal = itemListVal;
+    }
+
+    public String getItemIsEditable() {
+        return itemIsEditable;
+    }
+
+    public void setItemIsEditable(String itemIsEditable) {
+        this.itemIsEditable = itemIsEditable;
+    }
+
+    public String getItemEditableProgram() {
+        return itemEditableProgram;
+    }
+
+    public void setItemEditableProgram(String itemEditableProgram) {
+        this.itemEditableProgram = itemEditableProgram;
+    }
+
+    public String getItemEditCondition() {
+        return itemEditCondition;
+    }
+
+    public void setItemEditCondition(String itemEditCondition) {
+        this.itemEditCondition = itemEditCondition;
+    }
+
+    public String getItemIsHidden() {
+        return itemIsHidden;
+    }
+
+    public void setItemIsHidden(String itemIsHidden) {
+        this.itemIsHidden = itemIsHidden;
+    }
+
+    public String getItemQtName() {
+        return itemQtName;
+    }
+
+    public void setItemQtName(String itemQtName) {
+        this.itemQtName = itemQtName;
+    }
+
+    public String getItemIsRequired() {
+        return itemIsRequired;
+    }
+
+    public void setItemIsRequired(String itemIsRequired) {
+        this.itemIsRequired = itemIsRequired;
+    }
+
+    public String getItemIsHttpSave() {
+        return itemIsHttpSave;
+    }
+
+    public void setItemIsHttpSave(String itemIsHttpSave) {
+        this.itemIsHttpSave = itemIsHttpSave;
+    }
+
+    public String getItemHttpVolumnPath() {
+        return itemHttpVolumnPath;
+    }
+
+    public void setItemHttpVolumnPath(String itemHttpVolumnPath) {
+        this.itemHttpVolumnPath = itemHttpVolumnPath;
+    }
+
+    public String getItemHttpPathField() {
+        return itemHttpPathField;
+    }
+
+    public void setItemHttpPathField(String itemHttpPathField) {
+        this.itemHttpPathField = itemHttpPathField;
+    }
+
+    public String getItemRight() {
+        return itemRight;
+    }
+
+    public void setItemRight(String itemRight) {
+        this.itemRight = itemRight;
+    }
+
+    public String getItemSeniorQueryCols() {
+        return itemSeniorQueryCols;
+    }
+
+    public void setItemSeniorQueryCols(String itemSeniorQueryCols) {
+        this.itemSeniorQueryCols = itemSeniorQueryCols;
+    }
+
+    public String getItemSeniorQueryColsCounts() {
+        return itemSeniorQueryColsCounts;
+    }
+
+    public void setItemSeniorQueryColsCounts(String itemSeniorQueryColsCounts) {
+        this.itemSeniorQueryColsCounts = itemSeniorQueryColsCounts;
+    }
+
+    public String getItemQuerySql() {
+        return itemQuerySql;
+    }
+
+    public void setItemQuerySql(String itemQuerySql) {
+        this.itemQuerySql = itemQuerySql;
+    }
+
+
+    public String getItemHrefFields() {
+        return itemHrefFields;
+    }
+
+    public void setItemHrefFields(String itemHrefFields) {
+        this.itemHrefFields = itemHrefFields;
+    }
+
+    public String getItemHrefConf() {
+        return itemHrefConf;
+    }
+
+    public void setItemHrefConf(String itemHrefConf) {
+        this.itemHrefConf = itemHrefConf;
+    }
+
+    public String getItemQueryRefFields() {
+        return itemQueryRefFields;
+    }
+
+    public void setItemQueryRefFields(String itemQueryRefFields) {
+        this.itemQueryRefFields = itemQueryRefFields;
+    }
+
+    public String getItemCustomClass() {
+        return itemCustomClass;
+    }
+
+    public void setItemCustomClass(String itemCustomClass) {
+        this.itemCustomClass = itemCustomClass;
+    }
+
+    public String getItemCtrlDisplyCol() {
+        return itemCtrlDisplyCol;
+    }
+
+    public void setItemCtrlDisplyCol(String itemCtrlDisplyCol) {
+        this.itemCtrlDisplyCol = itemCtrlDisplyCol;
+    }
+
+    public String getItemCtrlDisplyCondition() {
+        return itemCtrlDisplyCondition;
+    }
+
+    public void setItemCtrlDisplyCondition(String itemCtrlDisplyCondition) {
+        this.itemCtrlDisplyCondition = itemCtrlDisplyCondition;
+    }
+
+    public String getItemIsNavigatorExpand() {
+        return itemIsNavigatorExpand;
+    }
+
+    public void setItemIsNavigatorExpand(String itemIsNavigatorExpand) {
+        this.itemIsNavigatorExpand = itemIsNavigatorExpand;
+    }
+
+    public String getItemIsShowFolder() {
+        return itemIsShowFolder;
+    }
+
+    public void setItemIsShowFolder(String itemIsShowFolder) {
+        this.itemIsShowFolder = itemIsShowFolder;
+    }
+
+    public String getItemParentFolderName() {
+        return itemParentFolderName;
+    }
+
+    public void setItemParentFolderName(String itemParentFolderName) {
+        this.itemParentFolderName = itemParentFolderName;
+    }
+
+    public String getItemShowExpression() {
+        return itemShowExpression;
+    }
+
+    public void setItemShowExpression(String itemShowExpression) {
+        this.itemShowExpression = itemShowExpression;
+    }
+
+    public String getItemDateFormat() {
+        return itemDateFormat;
+    }
+
+    public void setItemDateFormat(String itemDateFormat) {
+        this.itemDateFormat = itemDateFormat;
+    }
+    @Override
+    public String toString() {
+        return "PRMItemDO{" +
+                "itemField='" + itemField + '\'' +
+                ", itemOR='" + itemOR + '\'' +
+                ", itemEQ='" + itemEQ + '\'' +
+                ", itemTrim='" + itemTrim + '\'' +
+                ", itemDbl='" + itemDbl + '\'' +
+                ", itemCut='" + itemCut + '\'' +
+                ", itemInObj='" + itemInObj + '\'' +
+                ", itemAddFilter='" + itemAddFilter + '\'' +
+                ", itemOutType='" + itemOutType + '\'' +
+                ", itemPageSize='" + itemPageSize + '\'' +
+                ", itemImgWH='" + itemImgWH + '\'' +
+                ", itemOutFields='" + itemOutFields + '\'' +
+                ", itemKeyFields='" + itemKeyFields + '\'' +
+                ", itemBat='" + itemBat + '\'' +
+                ", itemFieldWidth='" + itemFieldWidth + '\'' +
+                ", itemTxf='" + itemTxf + '\'' +
+                ", itemName='" + itemName + '\'' +
+                ", itemType='" + itemType + '\'' +
+                ", itemTypeText='" + itemTypeText + '\'' +
+                ", itemValue='" + itemValue + '\'' +
+                ", itemCols='" + itemCols + '\'' +
+                ", itemRows='" + itemRows + '\'' +
+                ", itemStyle='" + itemStyle + '\'' +
+                ", itemScript='" + itemScript + '\'' +
+                ", itemTips='" + itemTips + '\'' +
+                ", itemValueList=" + itemValueList +
+                ", itemListTable='" + itemListTable + '\'' +
+                ", itemListTxt='" + itemListTxt + '\'' +
+                ", itemListVal='" + itemListVal + '\'' +
+                ", itemIsEditable='" + itemIsEditable + '\'' +
+                ", itemEditableProgram='" + itemEditableProgram + '\'' +
+                ", itemEditCondition='" + itemEditCondition + '\'' +
+                ", itemIsHidden='" + itemIsHidden + '\'' +
+                ", itemQtName='" + itemQtName + '\'' +
+                ", itemIsRequired='" + itemIsRequired + '\'' +
+                ", itemIsHttpSave='" + itemIsHttpSave + '\'' +
+                ", itemHttpVolumnPath='" + itemHttpVolumnPath + '\'' +
+                ", itemHttpPathField='" + itemHttpPathField + '\'' +
+                ", itemRight='" + itemRight + '\'' +
+                ", itemSeniorQueryCols='" + itemSeniorQueryCols + '\'' +
+                ", itemSeniorQueryColsCounts='" + itemSeniorQueryColsCounts + '\'' +
+                ", itemQuerySql='" + itemQuerySql + '\'' +
+                ", itemHrefFields='" + itemHrefFields + '\'' +
+                ", itemHrefConf='" + itemHrefConf + '\'' +
+                ", itemQueryRefFields='" + itemQueryRefFields + '\'' +
+                ", itemCustomClass='" + itemCustomClass + '\'' +
+                ", itemCtrlDisplyCol='" + itemCtrlDisplyCol + '\'' +
+                ", itemCtrlDisplyCondition='" + itemCtrlDisplyCondition + '\'' +
+                ", itemIsNavigatorExpand='" + itemIsNavigatorExpand + '\'' +
+                ", itemIsShowFolder='" + itemIsShowFolder + '\'' +
+                ", itemParentFolderName='" + itemParentFolderName + '\'' +
+                ", itemShowExpression='" + itemShowExpression + '\'' +
+                ", itemDateFormat='" + itemDateFormat + '\'' +
+                '}';
+    }
+}
diff --git a/Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/model/PortalVIDO.java b/Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/model/PortalVIDO.java
new file mode 100644
index 0000000..00e2b38
--- /dev/null
+++ b/Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/model/PortalVIDO.java
@@ -0,0 +1,101 @@
+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;
+
+/**
+ * 鐘舵�佹睜
+ * @author weidy
+ * @date 2022-2-15
+ */
+@VciBtmType(name = "status",text = "琛ㄥ崟",tableName = "portal_vi",lifeCycle = FrameWorkLcStatusConstant.EMTYPE_LIFE_CYCLE)
+@Transient
+public class PortalVIDO implements java.io.Serializable {
+
+    private static final long serialVersionUID = -8378041621144542492L;
+    /**
+     * 涓婚敭
+     */
+    private String id;
+    /**
+     * 0: 涓氬姟绫诲瀷; 1: 閾炬帴绫诲瀷. 榛樿0
+     */
+    private short typeFlag;
+    /**
+     * 绫诲瀷鍚�
+     */
+    private String typeName;
+    /**
+     * 瑙嗗浘鍚�
+     */
+    private String viName;
+    /**
+     * 瑙嗗浘绫诲瀷: 杈撳叆琛ㄥ崟鎴栧垎椤靛垪琛�
+     */
+    private short viType;
+    /**
+     * 瀹氫箟璇︽儏
+     */
+    private String prm;
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public short getTypeFlag() {
+        return typeFlag;
+    }
+
+    public void setTypeFlag(short typeFlag) {
+        this.typeFlag = typeFlag;
+    }
+
+    public String getTypeName() {
+        return typeName;
+    }
+
+    public void setTypeName(String typeName) {
+        this.typeName = typeName;
+    }
+
+    public String getViName() {
+        return viName;
+    }
+
+    public void setViName(String viName) {
+        this.viName = viName;
+    }
+
+    public short getViType() {
+        return viType;
+    }
+
+    public void setViType(short viType) {
+        this.viType = viType;
+    }
+
+    public String getPrm() {
+        return prm;
+    }
+
+    public void setPrm(String prm) {
+        this.prm = prm;
+    }
+
+    @Override
+    public String toString() {
+        return "PortalVIVO{" +
+                "id='" + id + '\'' +
+                ", typeFlag=" + typeFlag +
+                ", typeName='" + typeName + '\'' +
+                ", viName='" + viName + '\'' +
+                ", viType=" + viType +
+                ", prm='" + prm + '\'' +
+                '}';
+    }
+}
diff --git a/Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/model/SmFunctionForPlatform1.java b/Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/model/SmFunctionForPlatform1.java
index ee29c80..a240e31 100644
--- a/Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/model/SmFunctionForPlatform1.java
+++ b/Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/model/SmFunctionForPlatform1.java
@@ -52,9 +52,9 @@
     private String plsuffixb;
 
     /**
-     * 鍔熻兘缂栧彿
+     * 鍔熻兘缂栧彿 TODO:20240822纭骞冲彴宸茬粡鍘绘帀杩欎釜瀛楁浜嗭紝鎵�浠ヨ〃涓篃鍒犳帀浜嗚瀛楁骞跺皢杩欏効娉ㄩ噴鎺変簡
      */
-    private Integer plmoduleno;
+    //private Integer plmoduleno;
 
     /**
      * 鎻忚堪
@@ -152,13 +152,13 @@
         this.plsuffixb = plsuffixb == null ? null : plsuffixb.trim();
     }
 
-    public Integer getPlmoduleno() {
+    /*public Integer getPlmoduleno() {
         return plmoduleno;
     }
 
     public void setPlmoduleno(Integer plmoduleno) {
         this.plmoduleno = plmoduleno;
-    }
+    }*/
 
     public String getPldesc() {
         return pldesc;
@@ -234,7 +234,7 @@
                 ", plsuffixc='" + plsuffixc + '\'' +
                 ", plresourceb='" + plresourceb + '\'' +
                 ", plsuffixb='" + plsuffixb + '\'' +
-                ", plmoduleno=" + plmoduleno +
+                //", plmoduleno=" + plmoduleno +
                 ", pldesc='" + pldesc + '\'' +
                 ", plisvalid=" + plisvalid +
                 ", plimage='" + plimage + '\'' +
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 473c411..09b7139 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
@@ -2,6 +2,7 @@
 package com.vci.pagemodel;
 
 
+import java.io.Serializable;
 import java.util.HashMap;
 import java.util.List;
 
@@ -10,7 +11,7 @@
  *
  * @author Chill
  */
-public class MenuVO  {
+public class MenuVO implements Serializable {
 	private static final long serialVersionUID = 1L;
 
 	/**
@@ -49,9 +50,24 @@
 	private String alias;
 
 	/**
-	 * 璇锋眰鍦板潃
+	 * 璇锋眰鍦板潃锛岀晫闈㈣矾寰�
 	 */
 	private String path;
+
+	/**
+	 * 瀹㈡埛绔湴鍧�
+	 */
+	private String pathC;
+
+	/**
+	 * resourceDotNet
+	 */
+	private String resourceDotNet;
+
+	/**
+	 * resourceDotMobile
+	 */
+	private String resourceMobile;
 
 	/**
 	 * 鑿滃崟璧勬簮
@@ -109,10 +125,68 @@
 	private String modeType;
 
 	/**
+	 * 鏄ā鍧椾笅瀛愬璞℃槸妯″潡杩樻槸鎿嶄綔锛�0琛ㄧず鏃犲瓙鑺傜偣锛�1琛ㄧず鏄ā鍧楋紝2琛ㄧず鏄搷浣�
+	 */
+	private Integer childType;
+
+	/**
+	 * 1鏈夋晥0鏃犳晥锛氭棤鏁堟椂锛屽湪鍔熻兘鏉冮檺鐣岄潰涓嶆樉绀�
+	 */
+	private Boolean isValid;
+
+	/**
 	 * 鍓嶇鏄惁闅愯棌
 	 */
 	private HashMap<String,Boolean> meta = new HashMap<>();
 
+	public void setPathC(String pathC) {
+		this.pathC = pathC;
+	}
+
+	public void setResourceDotNet(String resourceDotNet) {
+		this.resourceDotNet = resourceDotNet;
+	}
+
+	public void setResourceMobile(String resourceMobile) {
+		this.resourceMobile = resourceMobile;
+	}
+
+	public void setValid(Boolean valid) {
+		isValid = valid;
+	}
+
+	public String getPathC() {
+		return pathC;
+	}
+
+	public String getResourceDotNet() {
+		return resourceDotNet;
+	}
+
+	public String getResourceMobile() {
+		return resourceMobile;
+	}
+
+	public Boolean getValid() {
+		return isValid;
+	}
+
+	public void setIsValid(Boolean isValid) {
+		this.isValid = isValid;
+	}
+
+	public Boolean getIsValid() {
+		return isValid;
+	}
+
+	public void setChildType(Integer childType) {
+		this.childType = childType;
+	}
+
+	public Integer getChildType() {
+		return childType;
+	}
+
 	public String getModeType() {
 		return modeType;
 	}
diff --git a/Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/pagemodel/PRMItemVO.java b/Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/pagemodel/PRMItemVO.java
new file mode 100644
index 0000000..667ea91
--- /dev/null
+++ b/Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/pagemodel/PRMItemVO.java
@@ -0,0 +1,767 @@
+package com.vci.pagemodel;
+
+import com.vci.bo.ItemSeniorQueryBO;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class PRMItemVO implements java.io.Serializable {
+    private static final long serialVersionUID = 8300550928400559987L;
+    /**
+     * 浣跨敤瀛楁
+     */
+    private String itemField = "";
+    //list
+    private String itemOR = "";
+    private String itemEQ = "";
+    private String itemTrim = "";
+    /**
+     * 蹇界暐
+     */
+    private String itemDbl = "";
+    /**
+     * 瀛楃涓叉埅鍙�
+     */
+    private String itemCut = "";
+    /**
+     *缁戝畾琛ㄥ崟
+     */
+    private String itemInObj = "";
+    /**
+     * form锛氬瓧娈佃〃杈惧紡  table锛氶檮鍔犳煡璇㈡潯浠�
+     */
+    private String itemAddFilter = "";
+    /**
+     *
+     */
+    private String itemOutType = "";
+    /**
+     * table 姣忛〉鍙樉绀鸿鏁�
+     */
+    private String itemPageSize = "";
+    /**
+     * 鍥剧墖瀹介珮锛�0,0
+     */
+    private String itemImgWH = "";
+    /**
+     * 闇�瑕佷娇鐢ㄧ殑瀛楁
+     */
+    private String itemOutFields = "";
+    /**
+     * 寰呴�夋嫨鐨勫睘鎬у瓧娈�
+     */
+    private List<String> itemSelectoutFieldList=new ArrayList<>();
+
+
+    /**
+     * 闇�瑕佷娇鐢ㄧ殑闆嗗悎
+     */
+    private List<String> itemOutFieldList=new ArrayList<>();
+    /**
+     * 闇�瑕佹悳绱㈢殑瀛楁
+     */
+    private String itemKeyFields = "";
+
+
+    /**
+     *寰呮悳绱㈠瓧娈�
+     */
+    private List<String> itemSearchFieldList=new ArrayList<>();
+    /**
+     * 闇�瑕佹悳绱㈢殑瀛楁
+     */
+    private List<String> itemKeyFieldList=new ArrayList<>();
+
+    private String itemBat = "";
+    /**
+     * 瀹藉害
+     */
+    private String itemFieldWidth = "";
+    /**
+     * 鍒楁樉绀哄娈� itemOutFieldList 鐩稿尮閰�
+     */
+    private List<KeyValue> itemFieldWidthList=new ArrayList<>();
+
+    //form
+    private String itemTxf = "";
+    /**
+     * 鏄剧ず鍚嶇О
+     */
+    private String itemName = "";
+    /**
+     * 灞炴�х被鍨�
+     *      text:鍗曡鏂囨湰妗�
+     * 		textbtn:鏂囨湰鎸夐挳妗�:
+     * 		textarea:澶氳鏂囨湰妗�:
+     * 		richtext:瀵屾枃鏈:
+     * 		number:鏁板瓧杈撳叆妗�:
+     * 		password:瀵嗙爜妗�:
+     * 		radio:鍗曢�夋寜閽�:
+     * 		checkbox:澶氶�夋寜閽�:
+     * 		select:涓嬫媺鑿滃崟:
+     * 		multiselect:澶氶�変笅鎷夎彍鍗�:
+     * 		date:鏃ユ湡杈撳叆妗�:
+     * 		time:鏃堕棿杈撳叆妗�:
+     * 		datetime:鏃ユ湡鏃堕棿杈撳叆妗�:
+     * 		file:鏂囦欢涓婁紶:
+     * 		multiFile:澶氭枃浠朵笂浼�:
+     * 		custom:鑷畾涔�:
+     * 		customform:鑷畾涔夎〃鍗�:
+     * 		hidden:闅愯棌鎴栨櫘閫氭枃瀛�:
+     * 		webeditor:Web缂栬緫鍣�:
+     * 		specialCharacter:鐗规畩瀛楃:
+     */
+    private String itemType = "";
+    /**
+     * 灞炴�х被鍨嬫樉绀哄��
+     */
+    private String itemTypeText = "";
+    /**
+     * 榛樿鍊�
+     */
+    private String itemValue = "";
+    /**
+     *鍗犱綅鏂瑰紡 1:鏄剧ず锛�2:涓嶆樉绀�
+     */
+    private String itemCols = "";
+    /**
+     *
+     */
+    private String itemRows = "";
+    /**
+     * 闄勫姞灞炴�э紙鏍峰紡锛�
+     */
+    private String itemStyle = "";
+    /**
+     *鑴氭湰楠岃瘉
+     */
+    private String itemScript = "";
+    /**
+     * 鎻愮ず鏂囧瓧
+     */
+    private String itemTips = "";
+    /**
+     * 鏋氫妇鍊�
+     */
+    private List<String> itemValueList = null;
+
+
+    /**
+     *涓�绾у弬鐓�
+     */
+    private String itemListTable = "";
+    /**
+     *浜岀骇鍙傜収
+     */
+    private String itemListTxt = "";
+    /**
+     *鍙傜収鍊�
+     */
+    private String itemListVal = "";
+    /**
+     * 鏄惁鍙互缂栬緫0:缂栬緫锛�1锛氬彧璇�
+     */
+    private String itemIsEditable = "";
+    /**
+     * 鍙閫夋嫨鏉′欢
+     */
+    private String itemEditableProgram = "";
+
+    /**
+     *
+     */
+    private String itemEditCondition = "";
+    /**
+     * 鏄惁鏄剧ず瀛楁 0锛涗笉鏄剧ず锛�1锛氭樉绀�
+     */
+    private String itemIsHidden = "";
+    /**
+     * 鏌ヨ妯℃澘鍚嶇О
+     */
+    private String itemQtName = "";
+    /**
+     * 鏄惁蹇呭~ 0:鍚︼紝1锛氭槸
+     */
+    private String itemIsRequired = "";
+    /**
+     *http瀛樺偍寮�鍏�  0锛氬惁锛�1锛氭槸
+     */
+    private String itemIsHttpSave = "";
+    /**
+     * 瀛樺偍璺緞
+     */
+    private String itemHttpVolumnPath = "";
+    /**
+     * 瀛樺偍璺緞瀛楁
+     */
+    private String itemHttpPathField = "";
+    /**
+     * 鏉冮檺鎺у埗
+     */
+    private String itemRight = "";
+    /**
+     * 楂樼骇鏌ヨ鍒�
+     */
+    private String itemSeniorQueryCols = "";
+    /**
+     * 楂樼骇鏌ヨ鍚勫垪浣跨敤娆℃暟
+     */
+    private String itemSeniorQueryColsCounts = "";
+
+    /**
+     *楂樼骇鏌ヨsql
+     */
+    private String itemQuerySql = "";
+    /***
+     * 楂樼骇鏌ヨ瀵硅薄
+     */
+    private  List<ItemSeniorQueryBO> itemSeniorQueryBOS=new ArrayList<>();
+
+    /**
+     * 瓒呴摼鎺ュ瓧娈�
+     */
+    private String itemHrefFields = "";
+    /**
+     * 瓒呴摼鎺ラ厤缃�
+     */
+    private String itemHrefConf = "";
+    /**
+     * 鏌ヨ鍏宠仈鍒�
+     */
+    private String itemQueryRefFields = "";
+    /***
+     * 鑷畾涔夌被璺緞
+     */
+    private String itemCustomClass = "";
+    /**
+     * 鎺у埗鏄剧ず鍒�
+     */
+    private String itemCtrlDisplyCol = "";
+    /**
+     * 鎺у埗鏄剧ず鏉′欢
+     */
+    private String itemCtrlDisplyCondition = "";
+    /**
+     * 鏌ヨ鍖哄煙鏄剧ず鎺у埗 true锛氭樉绀猴紝false 涓嶆樉绀�
+     */
+    private String itemIsNavigatorExpand = "";
+    /**
+     * 鏄惁鏄剧ず鏂囦欢澶� true锛氭樉绀猴紝false 涓嶆樉绀�
+     */
+    private String itemIsShowFolder = "";
+    /**
+     * 鐖舵枃浠跺す鍚嶇О
+     */
+    private String itemParentFolderName = "";
+    /**
+     *   鏄剧ず琛ㄨ揪寮� ${aa}-${bb}
+     */
+    private String itemShowExpression = "";
+    /**
+     * 鏁版嵁涓烘棩鏈熺被鍨嬫椂鐨勬牸寮忓寲瀛楃涓� 濡� yyyy-MM-dd HH:mm:ss
+     */
+    private String itemDateFormat = "";
+
+    public String getItemRight() {
+        return itemRight;
+    }
+    public void setItemRight(String itemRight) {
+        this.itemRight = itemRight;
+    }
+    public String getItemQuerySql() {
+        return itemQuerySql;
+    }
+    public void setItemQuerySql(String itemQuerySql) {
+        this.itemQuerySql = itemQuerySql;
+    }
+    public String getItemFieldWidth() {
+        return itemFieldWidth;
+    }
+    public void setItemFieldWidth(String itemFieldWidth) {
+        this.itemFieldWidth = itemFieldWidth;
+    }
+    public String getItemParentFolderName() {
+        return itemParentFolderName;
+    }
+    public void setItemParentFolderName(String itemParentFolderName) {
+        this.itemParentFolderName = itemParentFolderName;
+    }
+    public String getItemIsShowFolder() {
+        return itemIsShowFolder;
+    }
+    public void setItemIsShowFolder(String itemIsShowFolder) {
+        this.itemIsShowFolder = itemIsShowFolder;
+    }
+    public String getItemIsNavigatorExpand() {
+        return itemIsNavigatorExpand;
+    }
+    public void setItemIsNavigatorExpand(String itemIsNavigatorExpand) {
+        this.itemIsNavigatorExpand = itemIsNavigatorExpand;
+    }
+    public String getItemField() {
+        return itemField;
+    }
+    public void setItemField(String itemField) {
+        this.itemField = itemField;
+    }
+    public String getItemOR() {
+        return itemOR;
+    }
+    public void setItemOR(String itemOR) {
+        this.itemOR = itemOR;
+    }
+    public String getItemEQ() {
+        return itemEQ;
+    }
+    public void setItemEQ(String itemEQ) {
+        this.itemEQ = itemEQ;
+    }
+    public String getItemTrim() {
+        return itemTrim;
+    }
+    public void setItemTrim(String itemTrim) {
+        this.itemTrim = itemTrim;
+    }
+    public String getItemDbl() {
+        return itemDbl;
+    }
+    public void setItemDbl(String itemDbl) {
+        this.itemDbl = itemDbl;
+    }
+    public String getItemCut() {
+        return itemCut;
+    }
+    public void setItemCut(String itemCut) {
+        this.itemCut = itemCut;
+    }
+    public String getItemInObj() {
+        return itemInObj;
+    }
+    public void setItemInObj(String itemInObj) {
+        this.itemInObj = itemInObj;
+    }
+    public String getItemOutType() {
+        return itemOutType;
+    }
+    public void setItemOutType(String itemOutType) {
+        this.itemOutType = itemOutType;
+    }
+    public String getItemPageSize() {
+        return itemPageSize;
+    }
+    public void setItemPageSize(String itemPageSize) {
+        this.itemPageSize = itemPageSize;
+    }
+    public String getItemImgWH() {
+        return itemImgWH;
+    }
+    public void setItemImgWH(String itemImgWH) {
+        this.itemImgWH = itemImgWH;
+    }
+    public String getItemOutFields() {
+        return itemOutFields;
+    }
+    public void setItemOutFields(String itemOutFields) {
+        this.itemOutFields = itemOutFields;
+    }
+    public String getItemKeyFields() {
+        return itemKeyFields;
+    }
+    public void setItemKeyFields(String itemKeyFields) {
+        this.itemKeyFields = itemKeyFields;
+    }
+    public String getItemBat() {
+        return itemBat;
+    }
+    public void setItemBat(String itemBat) {
+        this.itemBat = itemBat;
+    }
+    public String getItemTxf() {
+        return itemTxf;
+    }
+    public void setItemTxf(String itemTxf) {
+        this.itemTxf = itemTxf;
+    }
+    public String getItemName() {
+        return itemName;
+    }
+    public void setItemName(String itemName) {
+        this.itemName = itemName;
+    }
+    public String getItemType() {
+        return itemType;
+    }
+    public void setItemType(String itemType) {
+        this.itemType = itemType;
+    }
+    public String getItemValue() {
+        return itemValue;
+    }
+    public void setItemValue(String itemValue) {
+        this.itemValue = itemValue;
+    }
+    public String getItemCols() {
+        return itemCols;
+    }
+    public void setItemCols(String itemCols) {
+        this.itemCols = itemCols;
+    }
+    public String getItemRows() {
+        return itemRows;
+    }
+    public void setItemRows(String itemRows) {
+        this.itemRows = itemRows;
+    }
+    public List<String> getItemValueList() {
+        return itemValueList;
+    }
+    public void setItemValueList(List<String> itemValueList) {
+        this.itemValueList = itemValueList;
+    }
+    public String getItemListTable() {
+        return itemListTable;
+    }
+    public void setItemListTable(String itemListTable) {
+        this.itemListTable = itemListTable;
+    }
+
+    public String getItemListTxt() {
+        return itemListTxt;
+    }
+    public void setItemListTxt(String itemListTxt) {
+        this.itemListTxt = itemListTxt;
+    }
+    public String getItemListVal() {
+        return itemListVal;
+    }
+    public void setItemListVal(String itemListVal) {
+        this.itemListVal = itemListVal;
+    }
+    public String getItemAddFilter() {
+        return itemAddFilter;
+    }
+    public void setItemAddFilter(String itemAddFilter) {
+        this.itemAddFilter = itemAddFilter;
+    }
+    public String getItemStyle() {
+        return itemStyle;
+    }
+    public void setItemStyle(String itemStyle) {
+        this.itemStyle = itemStyle;
+    }
+    public String getItemScript() {
+        return itemScript;
+    }
+    public void setItemScript(String itemScript) {
+        this.itemScript = itemScript;
+    }
+    public String getItemTips() {
+        return itemTips;
+    }
+    public void setItemTips(String itemTips) {
+        this.itemTips = itemTips;
+    }
+    public String getItemIsEditable() {
+        return itemIsEditable;
+    }
+    public void setItemIsEditable(String itemIsEditable) {
+        this.itemIsEditable = itemIsEditable;
+    }
+    public String getItemIsHidden() {
+        return itemIsHidden;
+    }
+    public void setItemIsHidden(String itemIsHidden) {
+        this.itemIsHidden = itemIsHidden;
+    }
+    public String getItemQtName() {
+        return itemQtName;
+    }
+    public void setItemQtName(String itemQtName) {
+        this.itemQtName = itemQtName;
+    }
+    public String getItemIsRequired() {
+        return itemIsRequired;
+    }
+    public void setItemIsRequired(String itemIsRequired) {
+        this.itemIsRequired = itemIsRequired;
+    }
+    public String getItemSeniorQueryCols() {
+        return itemSeniorQueryCols;
+    }
+    public void setItemSeniorQueryCols(String itemSeniorQueryCols) {
+        this.itemSeniorQueryCols = itemSeniorQueryCols;
+    }
+    public String getItemSeniorQueryColsCounts() {
+        return itemSeniorQueryColsCounts;
+    }
+    public void setItemSeniorQueryColsCounts(String itemSeniorQueryColsCounts) {
+        this.itemSeniorQueryColsCounts = itemSeniorQueryColsCounts;
+    }
+    public String getItemHrefFields() {
+        return itemHrefFields;
+    }
+    public void setItemHrefFields(String itemHrefFields) {
+        this.itemHrefFields = itemHrefFields;
+    }
+    public String getItemHrefConf() {
+        return itemHrefConf;
+    }
+    public void setItemHrefConf(String itemHrefConf) {
+        this.itemHrefConf = itemHrefConf;
+    }
+    public String getItemQueryRefFields() {
+        return itemQueryRefFields;
+    }
+    public void setItemQueryRefFields(String itemQueryRefFields) {
+        this.itemQueryRefFields = itemQueryRefFields;
+    }
+    public String getItemCustomClass() {
+        return itemCustomClass;
+    }
+    public void setItemCustomClass(String itemCustomClass) {
+        this.itemCustomClass = itemCustomClass;
+    }
+    public String getItemCtrlDisplyCol() {
+        return itemCtrlDisplyCol;
+    }
+    public void setItemCtrlDisplyCol(String itemCtrlDisplyCol) {
+        this.itemCtrlDisplyCol = itemCtrlDisplyCol;
+    }
+    public String getItemCtrlDisplyCondition() {
+        return itemCtrlDisplyCondition;
+    }
+    public void setItemCtrlDisplyCondition(String itemCtrlDisplyCondition) {
+        this.itemCtrlDisplyCondition = itemCtrlDisplyCondition;
+    }
+    public String getItemIsHttpSave() {
+        return itemIsHttpSave;
+    }
+    public void setItemIsHttpSave(String itemIsHttpSave) {
+        this.itemIsHttpSave = itemIsHttpSave;
+    }
+    public String getItemHttpVolumnPath() {
+        return itemHttpVolumnPath;
+    }
+    public void setItemHttpVolumnPath(String itemHttpVolumnPath) {
+        this.itemHttpVolumnPath = itemHttpVolumnPath;
+    }
+    public String getItemHttpPathField() {
+        return itemHttpPathField;
+    }
+    public void setItemHttpPathField(String itemHttpPathField) {
+        this.itemHttpPathField = itemHttpPathField;
+    }
+    public String getItemEditCondition() {
+        return itemEditCondition;
+    }
+    public void setItemEditCondition(String itemEditCondition) {
+        this.itemEditCondition = itemEditCondition;
+    }
+    public String getItemEditableProgram() {
+        return itemEditableProgram;
+    }
+    public void setItemEditableProgram(String itemEditableProgram) {
+        this.itemEditableProgram = itemEditableProgram;
+    }
+
+    public String getItemShowExpression() {
+        return itemShowExpression;
+    }
+    public void setItemShowExpression(String itemShowExpression) {
+        this.itemShowExpression = itemShowExpression;
+    }
+    public String getItemDateFormat() {
+        return itemDateFormat;
+    }
+    public void setItemDateFormat(String itemDateFormat) {
+        this.itemDateFormat = itemDateFormat;
+    }
+
+    public List<String> getItemOutFieldList() {
+        return itemOutFieldList;
+    }
+
+    public void setItemOutFieldList(List<String> itemOutFieldList) {
+        this.itemOutFieldList = itemOutFieldList;
+    }
+
+    public List<String> getItemKeyFieldList() {
+        return itemKeyFieldList;
+    }
+
+    public void setItemKeyFieldList(List<String> itemKeyFieldList) {
+        this.itemKeyFieldList = itemKeyFieldList;
+    }
+
+    public List<KeyValue> getItemFieldWidthList() {
+        return itemFieldWidthList;
+    }
+
+    public void setItemFieldWidthList(List<KeyValue> itemFieldWidthList) {
+        this.itemFieldWidthList = itemFieldWidthList;
+    }
+
+    public String getItemTypeText() {
+        return itemTypeText;
+    }
+
+    public void setItemTypeText(String itemTypeText) {
+        this.itemTypeText = itemTypeText;
+    }
+
+    public List<ItemSeniorQueryBO> getItemSeniorQueryBOS() {
+        return itemSeniorQueryBOS;
+    }
+
+    public void setItemSeniorQueryBOS(List<ItemSeniorQueryBO> itemSeniorQueryBOS) {
+        this.itemSeniorQueryBOS = itemSeniorQueryBOS;
+    }
+
+    public List<String> getItemSelectoutFieldList() {
+        return itemSelectoutFieldList;
+    }
+
+    public void setItemSelectoutFieldList(List<String> itemSelectoutFieldList) {
+        this.itemSelectoutFieldList = itemSelectoutFieldList;
+    }
+
+    public List<String> getItemSearchFieldList() {
+        return itemSearchFieldList;
+    }
+
+    public void setItemSearchFieldList(List<String> itemSearchFieldList) {
+        this.itemSearchFieldList = itemSearchFieldList;
+    }
+
+    @Override
+    public String toString() {
+        return "PRMItemVO{" +
+                "itemField='" + itemField + '\'' +
+                ", itemOR='" + itemOR + '\'' +
+                ", itemEQ='" + itemEQ + '\'' +
+                ", itemTrim='" + itemTrim + '\'' +
+                ", itemDbl='" + itemDbl + '\'' +
+                ", itemCut='" + itemCut + '\'' +
+                ", itemInObj='" + itemInObj + '\'' +
+                ", itemAddFilter='" + itemAddFilter + '\'' +
+                ", itemOutType='" + itemOutType + '\'' +
+                ", itemPageSize='" + itemPageSize + '\'' +
+                ", itemImgWH='" + itemImgWH + '\'' +
+                ", itemOutFields='" + itemOutFields + '\'' +
+                ", itemSelectoutFieldList=" + itemSelectoutFieldList +
+                ", itemOutFieldList=" + itemOutFieldList +
+                ", itemKeyFields='" + itemKeyFields + '\'' +
+                ", itemSearchFieldList=" + itemSearchFieldList +
+                ", itemKeyFieldList=" + itemKeyFieldList +
+                ", itemBat='" + itemBat + '\'' +
+                ", itemFieldWidth='" + itemFieldWidth + '\'' +
+                ", itemFieldWidthList=" + itemFieldWidthList +
+                ", itemTxf='" + itemTxf + '\'' +
+                ", itemName='" + itemName + '\'' +
+                ", itemType='" + itemType + '\'' +
+                ", itemTypeText='" + itemTypeText + '\'' +
+                ", itemValue='" + itemValue + '\'' +
+                ", itemCols='" + itemCols + '\'' +
+                ", itemRows='" + itemRows + '\'' +
+                ", itemStyle='" + itemStyle + '\'' +
+                ", itemScript='" + itemScript + '\'' +
+                ", itemTips='" + itemTips + '\'' +
+                ", itemValueList=" + itemValueList +
+                ", itemListTable='" + itemListTable + '\'' +
+                ", itemListTxt='" + itemListTxt + '\'' +
+                ", itemListVal='" + itemListVal + '\'' +
+                ", itemIsEditable='" + itemIsEditable + '\'' +
+                ", itemEditableProgram='" + itemEditableProgram + '\'' +
+                ", itemEditCondition='" + itemEditCondition + '\'' +
+                ", itemIsHidden='" + itemIsHidden + '\'' +
+                ", itemQtName='" + itemQtName + '\'' +
+                ", itemIsRequired='" + itemIsRequired + '\'' +
+                ", itemIsHttpSave='" + itemIsHttpSave + '\'' +
+                ", itemHttpVolumnPath='" + itemHttpVolumnPath + '\'' +
+                ", itemHttpPathField='" + itemHttpPathField + '\'' +
+                ", itemRight='" + itemRight + '\'' +
+                ", itemSeniorQueryCols='" + itemSeniorQueryCols + '\'' +
+                ", itemSeniorQueryColsCounts='" + itemSeniorQueryColsCounts + '\'' +
+                ", itemQuerySql='" + itemQuerySql + '\'' +
+                ", itemSeniorQueryBOS=" + itemSeniorQueryBOS +
+                ", itemHrefFields='" + itemHrefFields + '\'' +
+                ", itemHrefConf='" + itemHrefConf + '\'' +
+                ", itemQueryRefFields='" + itemQueryRefFields + '\'' +
+                ", itemCustomClass='" + itemCustomClass + '\'' +
+                ", itemCtrlDisplyCol='" + itemCtrlDisplyCol + '\'' +
+                ", itemCtrlDisplyCondition='" + itemCtrlDisplyCondition + '\'' +
+                ", itemIsNavigatorExpand='" + itemIsNavigatorExpand + '\'' +
+                ", itemIsShowFolder='" + itemIsShowFolder + '\'' +
+                ", itemParentFolderName='" + itemParentFolderName + '\'' +
+                ", itemShowExpression='" + itemShowExpression + '\'' +
+                ", itemDateFormat='" + itemDateFormat + '\'' +
+                '}';
+    }
+    //    /**
+//     * 楂樼骇鏌ヨ鍒椾笌浣跨敤娆℃暟
+//     */
+//    public Map<String, Integer> getColAndUseCountMap() {
+//        if(this.itemSeniorQueryCols == null || this.itemSeniorQueryColsCounts == null
+//                || this.itemSeniorQueryCols.equals("") || this.itemSeniorQueryColsCounts.equals("")){
+//            return null;
+//        }
+//        Map<String, Integer> map = new LinkedHashMap<String, Integer>();
+//        String[] cols = this.itemSeniorQueryCols.split(",");
+//        String[] counts = this.itemSeniorQueryColsCounts.split(",");
+//        for(int i = 0; i < cols.length; i++){
+//            int count = Integer.valueOf(counts[i]);
+//            map.put(cols[i], count);
+//        }
+//        return map;
+//    }
+//
+//    /**
+//     * 楂樼骇鏌ヨ鑷畾涔夊垪涓庢煡璇ql
+//     */
+//    public Map<String, String> getCustomerColAndSql() {
+//        if(this.itemSeniorQueryCols == null || this.itemQuerySql == null
+//                || this.itemSeniorQueryCols.equals("") || this.itemQuerySql.equals("")){
+//            return null;
+//        }
+//        Map<String, String> map = new LinkedHashMap<String, String>();
+//        String[] cols = this.itemSeniorQueryCols.split(",");
+//        String[] sqls = this.itemQuerySql.split(";");
+//        for(int i = 0; i < cols.length; i++){
+//            String sql = sqls[i];
+//            if(sql != null && !sql.equalsIgnoreCase("NULL")){
+//                map.put(cols[i], sql);
+//            }
+//        }
+//        return map;
+//    }
+//
+//    /**
+//     * 杩斿洖 PRMItem 瀵硅薄鏄惁鏄剧ず
+//     * @return 瀵硅薄鏄惁鏄剧ず  (瀵瑰簲琛ㄥ崟灞炴�у畾涔夌殑鍗犱綅鏂瑰紡鐨勬樉绀恒�佷笉鏄剧ず锛�<p>true:鏄剧ず false:涓嶆樉绀�</p>
+//     */
+//    public boolean isShow(){
+//        return ("1".equalsIgnoreCase(this.getItemCols().trim()));
+//    }
+//    /**
+//     * 杩斿洖 PRMItem 瀵硅薄鏄惁鏄繀濉」
+//     * @return 瀵硅薄鏄惁鏄繀濉�<p>true:鏄惧繀濉」 false:涓嶆槸蹇呭~椤�</p>
+//     */
+//    public boolean isRequired(){
+//        return ("1".equalsIgnoreCase(this.getItemIsRequired().trim()));
+//    }
+//    /**
+//     * 杩斿洖 PRMItem 瀵硅薄 鏄惁鍙互缂栬緫
+//     * @return 瀵硅薄鏄惁鍙紪杈� <p>true: 鍙紪杈�(闈炲彧璇�) false: 涓嶅彲缂栬緫(鍙)</p>
+//     */
+//    public boolean isEditable(){
+//        return ("0".equalsIgnoreCase(this.getItemIsEditable().trim()));
+//    }
+//    /**
+//     * 杩斿洖 PRMItem 瀵硅薄 鏄惁鍙槸鍙
+//     * @return 瀵硅薄鏄惁鍙紪杈� <p>true: 鍙(涓嶅彲缂栬緫) false: 闈炲彧璇�(鍙紪杈�)</p>
+//     */
+//    public boolean isReadonly(){
+//        return !(isEditable());
+//    }
+
+}
diff --git a/Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/pagemodel/PRMVO.java b/Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/pagemodel/PRMVO.java
new file mode 100644
index 0000000..a4b5091
--- /dev/null
+++ b/Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/pagemodel/PRMVO.java
@@ -0,0 +1,44 @@
+package com.vci.pagemodel;
+
+import java.util.List;
+
+public class PRMVO implements   java.io.Serializable {
+
+    private static final long serialVersionUID = -7009693016048007945L;
+    private String showCols = "3";
+    private String formQtName = "";
+    private List<PRMItemVO> prmItemList;
+
+    public String getShowCols() {
+        return showCols;
+    }
+
+    public void setShowCols(String showCols) {
+        this.showCols = showCols;
+    }
+
+    public String getFormQtName() {
+        return formQtName;
+    }
+
+    public void setFormQtName(String formQtName) {
+        this.formQtName = formQtName;
+    }
+
+    public List<PRMItemVO> getPrmItemList() {
+        return prmItemList;
+    }
+
+    public void setPrmItemList(List<PRMItemVO> prmItemList) {
+        this.prmItemList = prmItemList;
+    }
+
+    @Override
+    public String toString() {
+        return "PRMVO{" +
+                "showCols='" + showCols + '\'' +
+                ", formQtName='" + formQtName + '\'' +
+                ", prmItemList=" + prmItemList +
+                '}';
+    }
+}
diff --git a/Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/pagemodel/PortalVIVO.java b/Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/pagemodel/PortalVIVO.java
new file mode 100644
index 0000000..2cfe1fb
--- /dev/null
+++ b/Source/plt-web/plt-web-parent/plt-web-api/src/main/java/com/vci/pagemodel/PortalVIVO.java
@@ -0,0 +1,96 @@
+package com.vci.pagemodel;
+
+/**
+ *
+ * 琛ㄥ崟鏄剧ず瀵硅薄
+ * @author xiej
+ * @date 2024/08/14 6:04 PM
+ */
+public class PortalVIVO implements  java.io.Serializable{
+
+    private static final long serialVersionUID = 8929303078545288873L;
+    /**
+     * 涓婚敭
+     */
+    private String id;
+    /**
+     * 0: 涓氬姟绫诲瀷; 1: 閾炬帴绫诲瀷. 榛樿0
+     */
+    private short typeFlag;
+    /**
+     * 绫诲瀷鍚�
+     */
+    private String typeName;
+    /**
+     * 瑙嗗浘鍚�
+     */
+    private String viName;
+    /**
+     * 瑙嗗浘绫诲瀷: 杈撳叆琛ㄥ崟鎴栧垎椤靛垪琛�
+     */
+    private short viType;
+    /**
+     * 瀹氫箟璇︽儏
+     */
+    private PRMVO   prm;
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public short getTypeFlag() {
+        return typeFlag;
+    }
+
+    public void setTypeFlag(short typeFlag) {
+        this.typeFlag = typeFlag;
+    }
+
+    public String getTypeName() {
+        return typeName;
+    }
+
+    public void setTypeName(String typeName) {
+        this.typeName = typeName;
+    }
+
+    public String getViName() {
+        return viName;
+    }
+
+    public void setViName(String viName) {
+        this.viName = viName;
+    }
+
+    public short getViType() {
+        return viType;
+    }
+
+    public void setViType(short viType) {
+        this.viType = viType;
+    }
+
+    public PRMVO getPrm() {
+        return prm;
+    }
+
+    public void setPrm(PRMVO prm) {
+        this.prm = prm;
+    }
+
+    @Override
+    public String toString() {
+        return "PortalVIVO{" +
+                "id='" + id + '\'' +
+                ", typeFlag=" + typeFlag +
+                ", typeName='" + typeName + '\'' +
+                ", viName='" + viName + '\'' +
+                ", viType=" + viType +
+                ", prm=" + prm +
+                '}';
+    }
+}
diff --git a/Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/web/util/VciBaseUtil.java b/Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/web/util/VciBaseUtil.java
index 1b3525c..b13d963 100644
--- a/Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/web/util/VciBaseUtil.java
+++ b/Source/plt-web/plt-web-parent/plt-web-base/src/main/java/com/vci/starter/web/util/VciBaseUtil.java
@@ -287,6 +287,28 @@
     }
 
     /**
+     * 鍘婚櫎鏈�鍓嶉潰鐨剆piltFilter锛屽幓闄ゅ悗闈㈢殑spiltFilter
+     * @param s 瀛楃涓�
+     * @param spiltFilter,鍒嗛殧绗�
+     * @return 鍘婚櫎鏈熬閫楀彿
+     */
+    public static String removeComma(String s,String spiltFilter){
+        if(s == null || s.trim().length() == 0) {
+            return s;
+        }
+        else{
+            if(s.startsWith(spiltFilter)) {
+                s = s.substring(spiltFilter.length(), s.length());
+            }
+            if(s.endsWith(spiltFilter)) {
+                s = s.substring(0, s.length() - spiltFilter.length());
+            }
+            return s;
+        }
+    }
+
+
+    /**
      * 涓簊ql涓娇鐢╥n鏃讹紝鎻愪緵杞崲锛屾敞鎰廼n閲岀殑鍊间笉鑳借秴杩�1000
      * @param s 瀛楃涓�
      * @return 杩斿洖sql璇彞
@@ -472,6 +494,21 @@
             charMap.put(String.valueOf(c), (!charMap.containsKey(String.valueOf(c))? 1 : charMap.get(String.valueOf(c)) + 1));
         }
         return charMap.get(String.valueOf(findC));
+    }
+
+    /**
+     * 甯﹂�楀彿鐨勫瓧绗︿覆杞负list
+     * @param s 瀛楃涓�
+     * @return 瀛楃涓插垪琛�
+     */
+    public static List<String> str2List(String s,String spilter){
+        if (isNull(s)) {
+            return null;
+        } else {
+            List<String> l = new ArrayList<String>();
+            Collections.addAll(l,removeComma(s,spilter).split(spilter));
+            return l;
+        }
     }
 
     /**
@@ -1333,6 +1370,25 @@
         }
     }
 
+
+    /**
+     * 鏁扮粍杞崲涓篠tring
+     * @param array 鏁扮粍瀵硅薄
+     * @param spiltFiter 鍒嗛殧绗�
+     * @return 閫楀彿閾炬帴鐨勫瓧绗︿覆
+     */
+    public static String array2String(String[] array,String spiltFiter) {
+        if(null == array || array.length == 0) {
+            return "";
+        } else{
+            String ss = "";
+            for(String s : array){
+                ss += s + spiltFiter;
+                //1.8鍙互
+            }
+            return removeComma(ss,spiltFiter);
+        }
+    }
     /**
      * 鏁扮粍杞崲涓篠tring
      * @param array 鏁扮粍瀵硅薄
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 8106ccf..1be0596 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
@@ -56,11 +56,12 @@
     /**
      * 閫氳繃妯″潡ID鑾峰彇瀛愮骇鍒楄〃
      * @param parentId
+     * @param modeType 妯″潡绫诲瀷
      * @param isAll 鏄惁鍖呮嫭鏃犳晥鐨勬ā鍧楋紝true鍒欏寘鎷�
      * @return
      * @throws VciBaseException
      */
-    List<MenuVO> getSysModelTreeMenuByPID(String parentId,boolean isAll) throws VciBaseException;
+    List<MenuVO> getSysModelTreeMenuByPID(String parentId,String modeType,boolean isAll) throws VciBaseException;
 
     int checkChildObject(String moduleId) throws VciException;
 
diff --git a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/compatibility/SmHMSysModConfigServiceI.java b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/compatibility/SmHMSysModConfigServiceI.java
new file mode 100644
index 0000000..0685871
--- /dev/null
+++ b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/compatibility/SmHMSysModConfigServiceI.java
@@ -0,0 +1,123 @@
+package com.vci.frameworkcore.compatibility;
+
+import com.vci.common.exception.VciException;
+import com.vci.corba.common.PLException;
+import com.vci.pagemodel.MenuVO;
+import com.vci.starter.web.exception.VciBaseException;
+import com.vci.starter.web.pagemodel.BaseResult;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.File;
+import java.io.IOException;
+import java.util.LinkedList;
+import java.util.List;
+
+/**
+ * 棣栭〉绯荤粺妯″潡閰嶇疆娣诲姞鎸夐挳銆佹坊鍔犳搷浣滅被鍨嬬瓑鎺ュ彛鏈嶅姟
+ * @author ludc
+ * @date 2024/8/19 12:42
+ */
+public interface SmHMSysModConfigServiceI {
+
+    /**
+     * 娣诲姞妯″潡
+     * @param menuVO
+     * @return
+     */
+    MenuVO addModule(MenuVO menuVO) throws VciBaseException;
+
+    /**
+     * 淇敼妯″潡
+     * @param menuVO
+     * @return
+     */
+    MenuVO updateModule(MenuVO menuVO) throws VciBaseException;
+
+    /**
+     * 鍒犻櫎妯″潡
+     * @param menuVO
+     * @return
+     */
+    boolean delModule(MenuVO menuVO);
+
+    /**
+     * 澧炲姞鎿嶄綔绫诲瀷
+     * @return
+     */
+    boolean addOperationType(List<MenuVO> menuVOList);
+
+    /**
+     * 鍒犻櫎闈炵郴缁熸ā鍧�
+     * @return
+     */
+    boolean delNonsysModule();
+
+    /**
+     * 鍒犻櫎涓氬姟妯″潡
+     * @return
+     */
+    boolean delBusinessModule();
+
+    /**
+     * 瀵煎嚭绠$悊鍔熻兘妯″潡鎴栨搷浣滅被鍨嬬鐞嗘ā鍧梥ql
+     * @param exportPath 瀵煎嚭璺緞
+     * @param isFunction 鏄惁鏄鍑虹鐞嗗姛鑳芥ā鍧梥ql
+     * @return
+     * @throws PLException
+     */
+    File exportFunctionSql(HttpServletResponse response,String exportPath,boolean isFunction/*鏄惁鏄鍑虹鐞嗗姛鑳芥ā鍧梥ql*/) throws PLException;
+
+    /**
+     * 瀵煎嚭
+     * @return
+     */
+    String exportModule(HttpServletResponse response) throws PLException, IOException;
+
+    /**
+     * 瀵煎叆
+     * @param files
+     * @return
+     * @throws PLException
+     */
+    BaseResult importModule(LinkedList<File> files) throws PLException, IOException;
+
+    /**
+     * 绠$悊鍔熻兘妯″潡銆佷笟鍔″姛鑳芥ā鍧椾笅鐨勫彾瀛愯妭鐐光�斾慨鏀规搷浣滃埆鍚嶆帴鍙�
+     * @param menuVO
+     * @return
+     * @throws VciException
+     */
+    boolean updateAlias(MenuVO menuVO) throws VciException;
+
+    //绯荤粺閰嶇疆鐩稿叧鎺ュ彛
+    /**
+     * 鏌ヨ绯荤粺閰嶇疆鍒嗙被
+     */
+    List<Object>getSysConfTree();
+
+    /**
+     * 澧炲姞绯荤粺閰嶇疆
+     * @return
+     */
+    boolean addSysConf();
+
+    /**
+     * 淇敼绯荤粺閰嶇疆
+     * @return
+     */
+    boolean updateSysConf();
+
+    /**
+     * 鍒犻櫎绯荤粺閰嶇疆
+     * @return
+     */
+    boolean delSysConf();
+
+    /**
+     * 瀵煎嚭绯荤粺閰嶇疆
+     * @param response
+     * @return
+     */
+    String exportSysConf(HttpServletResponse response);
+
+}
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 1f6c4de..8cde4ca 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
@@ -2,6 +2,7 @@
 
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.JSONReader;
 import com.vci.client.ClientSession;
 import com.vci.common.exception.VciException;
 import com.vci.common.locale.LocaleDisplay;
@@ -176,7 +177,7 @@
     private SmFunctionVO functionForPlatform1ToFunctionVO(SmFunctionForPlatform1 functionForPlatform1){
         SmFunctionVO functionVO = new SmFunctionVO();
         functionVO.setOid(functionForPlatform1.getPloid());
-        functionVO.setId(String.valueOf(functionForPlatform1.getPlmoduleno()));
+        //functionVO.setId(String.valueOf(functionForPlatform1.getPlmoduleno()));
         functionVO.setName(functionForPlatform1.getPlname());
         functionVO.setLogName(functionForPlatform1.getPlaliasname());
         if(StringUtils.isNotBlank(functionForPlatform1.getPlresourceb())){
@@ -287,8 +288,10 @@
         //濡傛灉鏄紑鍙戞垨鑰呮祴璇曠敤鎴凤紝闇�鍝熻幏鍙栫郴缁熸ā鍧楅厤缃彍鍗�
         if(adminOrDeveloperOrRoot){
             //鑾峰彇棣栭〉绯荤粺妯″潡閰嶇疆鑿滃崟
-            MenuVO menuVO = JsonConfigReader.getMenuVO();
-            functionVOList.add(menuVO);
+            MenuVO menuVO = JsonConfigReader.getSysModuleConf().getSysModuleNode();
+            if(Func.isNotEmpty(menuVO)){
+                functionVOList.add(menuVO);
+            }
         }
         return functionVOList.stream().sorted(Comparator.comparing(s -> s.getSort())).collect(Collectors.toList());
     }
@@ -296,27 +299,30 @@
     /**
      * 閫氳繃妯″潡ID鑾峰彇瀛愮骇鍒楄〃
      * @param parentId
+     * @param modeType 妯″潡绫诲瀷
      * @param isAll 鏄惁鍖呮嫭鏃犳晥鐨勬ā鍧楋紝true鍒欏寘鎷�
      * @return
      * @throws VciBaseException
      */
     @Override
-    public List<MenuVO> getSysModelTreeMenuByPID(String parentId,boolean isAll) throws VciBaseException{
+    public List<MenuVO> getSysModelTreeMenuByPID(String parentId,String modeType,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")){
+        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琛ㄧず鏄搷浣�**/
-                    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.setChildType(childType);
                                 menuVO.setId(info.id);
                                 menuVO.setCode(info.funcId);
                                 menuVO.setId(info.operId);
@@ -325,7 +331,8 @@
                                 menuVO.setAlias(info.operAlias);
                                 menuVO.setRemark(info.operDesc);
                                 menuVO.setSort((int) info.number);
-                                //menuVO.setIsValid(info.isValid);
+                                menuVO.setModeType("FunctionObject");
+                                menuVO.setIsValid(info.isValid);
                                 menuVO.setHasChildren(false);
                                 menuVOList.add(menuVO);
                             }
@@ -339,6 +346,8 @@
                             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) {
@@ -352,21 +361,36 @@
                 }
             }else{
                 try{
+                    MenuVO parentNode;
+                    //灏嗚繑鍥炵殑鑺傜偣澶栧眰濂椾笂褰撳墠鐖惰妭鐐�
+                    if(parentId.equals("systemManagmentNode")){
+                        parentNode = JsonConfigReader.getSysModuleConf().getSystemManagmentNode();
+                    }else{
+                        parentNode = JsonConfigReader.getSysModuleConf().getModelManagmentNode();
+                    }
+                    List<MenuVO> menuVOS = new ArrayList<>();
+                    //鏌ヨ鐨勪笁绾ц妭鐐�
                     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);
+                        menuVO.setChildType(childType);
+                        menuVOS.add(menuVO);
                     }
+                    parentNode.setChildren(menuVOS);
+                    menuVOList.add(parentNode);
                 }catch (PLException e) {
                     e.printStackTrace();
                     throw new VciBaseException(String.valueOf(e.code),e.messages);
                 }
             }
-        }else if(parentId.equals("operateType")){
+        }else if(parentId.equals("sysOptionNode")){
             //鍔犺浇鎵�鏈夋搷浣�
             try{
+                //灏嗚繑鍥炵殑鑺傜偣澶栧眰濂椾笂褰撳墠鐖惰妭鐐�
+                MenuVO parentNode = JsonConfigReader.getSysModuleConf().getOperateNode();
+                List<MenuVO> menuVOS = new ArrayList<>();
                 OperateInfo[] operateInfos = platformClientUtil.getFrameworkService().getOperateTreeList(parentId);
                 for(int i = 0; i < operateInfos.length;i++ ){
                     OperateInfo operateInfo = operateInfos[i];
@@ -376,19 +400,22 @@
                     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);
+                    menuVOS.add(menuVO);
                 }
+                parentNode.setChildren(menuVOS);
+                menuVOList.add(parentNode);
             }catch (PLException e) {
                 e.printStackTrace();
                 throw new VciBaseException(String.valueOf(e.code),new String[]{VciBaseUtil.getExceptionMessage(e)});
             }
         }
-        return menuVOList;
+        return menuVOList.stream().sorted(Comparator.comparing(s -> s.getSort())).collect(Collectors.toList());
     }
 
     /**
@@ -399,10 +426,11 @@
     private MenuVO functionInfoToMenuVO(FunctionInfo funcInfo){
         MenuVO menuVO = new MenuVO();
         menuVO.setId(funcInfo.id);
+        menuVO.setValid(funcInfo.isValid);
         menuVO.setSource(funcInfo.image);
-        //if(StringUtils.isBlank(menu.resourceB)){
-        //    continue;
-        //}
+        menuVO.setPathC(funcInfo.resourceC);
+        menuVO.setResourceDotNet(funcInfo.resourceDotNet);
+        menuVO.setResourceMobile(funcInfo.resourceMobile);
         menuVO.setPath(funcInfo.resourceB);
         menuVO.setParentId(funcInfo.parentId);
         menuVO.setCode(funcInfo.aliasName);
diff --git a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/compatibility/impl/SmHMSysModConfigServiceImpl.java b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/compatibility/impl/SmHMSysModConfigServiceImpl.java
new file mode 100644
index 0000000..e3b50dc
--- /dev/null
+++ b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/frameworkcore/compatibility/impl/SmHMSysModConfigServiceImpl.java
@@ -0,0 +1,1028 @@
+package com.vci.frameworkcore.compatibility.impl;
+
+import com.vci.client.common.excel.ExcelDocumentUtils;
+import com.vci.common.exception.VciException;
+import com.vci.common.locale.LocaleDisplay;
+import com.vci.common.utility.ObjectUtility;
+import com.vci.corba.common.PLException;
+import com.vci.corba.common.data.UserEntityInfo;
+import com.vci.corba.framework.data.FuncOperationInfo;
+import com.vci.corba.framework.data.FunctionInfo;
+import com.vci.corba.framework.data.OperateInfo;
+import com.vci.frameworkcore.compatibility.SmHMSysModConfigServiceI;
+import com.vci.pagemodel.MenuVO;
+import com.vci.client.common.excel.SheetDataSet;
+import com.vci.starter.poi.bo.WriteExcelData;
+import com.vci.starter.poi.bo.WriteExcelOption;
+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.SessionInfo;
+import com.vci.starter.web.util.LocalFileUtil;
+import com.vci.starter.web.util.VciBaseUtil;
+import com.vci.starter.web.util.WebThreadLocalUtil;
+import com.vci.web.util.Func;
+import com.vci.web.util.PlatformClientUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.*;
+import java.util.*;
+
+/**
+ * 棣栭〉绯荤粺妯″潡閰嶇疆娣诲姞鎸夐挳銆佹坊鍔犳搷浣滅被鍨嬬瓑鎺ュ彛鏈嶅姟
+ * @author ludc
+ * @date 2024/8/19 12:42
+ */
+@Service
+public class SmHMSysModConfigServiceImpl implements SmHMSysModConfigServiceI {
+
+    @Autowired
+    private PlatformClientUtil platformClientUtil;
+
+    private List<FunctionInfo> fileFunctionDatas = new ArrayList<FunctionInfo>();
+
+    private int count = 0;
+
+    private static FunctionOperateDelegate foDelegate;
+
+    {
+        if(Func.isEmpty(foDelegate)){
+            foDelegate = new FunctionOperateDelegate();
+        }
+    }
+
+    /**
+     * 鏃ュ織
+     */
+    private Logger logger = LoggerFactory.getLogger(getClass());
+
+    /**
+     * 娣诲姞妯″潡
+     * @param menuVO
+     * @return
+     */
+    @Override
+    public MenuVO addModule(MenuVO menuVO) throws VciBaseException {
+        VciBaseUtil.alertNotNull(menuVO,"鏂板鐨勬ā鍧楀璞�");
+        try {
+            //寰�鏁版嵁搴撻噷鎻掑叆鏂板缓妯″潡鏁版嵁
+            String puid = foDelegate.saveModule(menuVO);
+            /**
+             * 杩斿洖鍊硷細1锛岃〃绀烘ā鍧楀悕绉伴噸澶�
+             * 		   2锛岃〃绀烘ā鍧楁爣璇嗛噸澶�
+             *         3, 妯℃澘鍒悕瀛樺湪閲嶅
+             */
+            if(puid.equals("1")){
+                throw new VciBaseException("妯″潡鍚嶇О閲嶅锛岃淇敼锛�");
+            }else if(puid.equals("2")){
+                throw new VciBaseException("妯″潡鏍囪瘑閲嶅锛岃淇敼锛�");
+            }else if(puid.equals("3")) {
+                throw new VciBaseException("妯″潡鍒悕閲嶅锛岃淇敼锛�");
+            }
+            menuVO.setId(puid);
+            return menuVO;
+        } catch (Exception e) {
+            e.printStackTrace();
+            String exceptionMessage = VciBaseUtil.getExceptionMessage(e);
+            logger.error(exceptionMessage);
+            throw new VciBaseException(exceptionMessage);
+        }
+    }
+
+    /**
+     * 淇敼妯″潡
+     * @param menuVO
+     * @return
+     */
+    @Override
+    public MenuVO updateModule(MenuVO menuVO) throws VciBaseException {
+        VciBaseUtil.alertNotNull(menuVO,"淇敼鐨勬ā鍧楀璞�");
+        try {
+            String res = "";
+            //鏇存柊鏁版嵁搴�
+            res = foDelegate.updateMod(menuVO);
+            /**
+             * 杩斿洖锛�1琛ㄧず妯″潡鍚嶉噸澶嶃��
+             *       2琛ㄧず妯″潡鏍囪瘑閲嶅銆�
+             *       3鏍囩ず妯″潡鍒悕閲嶅銆�
+             */
+            if(res.equals("1")){
+                throw new VciBaseException("妯″潡鍚嶇О閲嶅锛岃淇敼锛�");
+            }else if(res.equals("2")){
+                throw new VciBaseException("妯″潡鏍囪瘑閲嶅锛岃淇敼锛�");
+            }else if(res.equals("3")) {
+                throw new VciBaseException("妯″潡鍒悕閲嶅锛岃淇敼锛�");
+            }/* else if (res.equals("4")) {
+                throw new VciBaseException("妯″潡缂栧彿閲嶅锛岃淇敼锛�");
+            }*/
+            return menuVO;
+        } catch (VciBaseException e) {
+            e.printStackTrace();
+            String exceptionMessage = VciBaseUtil.getExceptionMessage(e);
+            logger.error(exceptionMessage);
+            throw new VciBaseException(exceptionMessage);
+        }
+    }
+
+    /**
+     * 鍒犻櫎妯″潡
+     * @param menuVO
+     * @return
+     */
+    @Override
+    public boolean delModule(MenuVO menuVO) {
+        VciBaseUtil.alertNotNull(menuVO,"娣诲姞鎿嶄綔绫诲瀷鐨勫垪琛�");
+        String res = "";
+        try {
+            String puid = "";
+            if("FunctionObject".equals(menuVO.getModeType())) {
+                puid = menuVO.getId();
+            }else if("modelManagmentNode".equals(menuVO.getId())) {
+                puid = "modelManagmentNode";
+            }else if("systemManagmentNode".equals(menuVO.getId())) {
+                puid = "systemManagmentNode";
+            }
+            if(Func.isBlank(puid)){
+                throw new VciBaseException("鏈壘鍒拌鍒犻櫎鐨勬ā鍧楋紒");
+            }
+            res = foDelegate.deleteModule(puid);
+            /**
+             * 杩斿洖鍊硷細1琛ㄧず妯″潡鍦ㄦ潈闄愭ā鍧楀凡缁忔湁鎺堟潈淇℃伅锛屾棤娉曞垹闄�
+             */
+            if(res.equals("1")){
+               throw new VciBaseException("褰撳墠妯″潡锛堟垨涓嬬骇妯″潡锛夊凡缁忓瓨鍦ㄦ巿鏉冧俊鎭紝鏃犳硶鍒犻櫎銆�");
+            }
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            String exceptionMessage = VciBaseUtil.getExceptionMessage(e);
+            logger.error(exceptionMessage);
+            throw new VciBaseException(exceptionMessage);
+        }
+    }
+
+    /**
+     * 澧炲姞鎿嶄綔绫诲瀷
+     * @return
+     */
+    @Override
+    public boolean addOperationType(List<MenuVO> menuVOList) {
+        VciBaseUtil.alertNotNull(menuVOList,"娣诲姞鎿嶄綔绫诲瀷鐨勫垪琛�");
+        List<FuncOperationInfo> objs = new ArrayList<>();
+        //灏嗘搷浣滅被鍨嬬粍瑁呮垚闇�瑕佸瓨鍌ㄧ殑瀵硅薄
+        menuVOList.stream().forEach(menuVO -> {
+            FuncOperationInfo info = new FuncOperationInfo();
+            //info.id = menuVO.getId() == null ? "" : menuVO.getId();
+            info.funcId = menuVO.getParentId() == null ? "" : menuVO.getParentId();
+            info.operId = menuVO.getId() == null ? "" : menuVO.getId();
+            info.operName = menuVO.getName() == null ? "" : menuVO.getName();
+            //info.operIndentify = menuVO.getOperIndentify() == null ? "" : menuVO.getOperIndentify();
+            info.operAlias = menuVO.getAlias() == null ? "" : menuVO.getAlias();
+            info.operDesc = menuVO.getRemark() == null ? "" : menuVO.getRemark();
+            info.number = -1;
+            info.isValid = true;
+            /*VCIBaseTreeNode node = (VCIBaseTreeNode)treePaths[i].getLastPathComponent();
+            OperateObject operateObject = (OperateObject) node.getObj();
+            obj.setFuncId(funcObj.getId());
+            obj.setOperId(operateObject.getId());
+            obj.setOperName(operateObject.getName());
+            obj.setOperIndentify(operateObject.getIdentify());
+            obj.setOperAlias(operateObject.getAlias());
+            obj.setNumber(-1);
+            obj.setIsValid(true);*/
+            objs.add(info);
+        });
+
+        //鎵ц淇濆瓨
+        boolean res = true;
+        try {
+            res = this.saveFuncOperation(objs.toArray(new FuncOperationInfo[objs.size()]));
+        } catch (Exception e) {
+            res = false;
+            e.printStackTrace();
+            String exceptionMessage = "澧炲姞鎿嶄綔绫诲瀷澶辫触锛屽師鍥狅細" + VciBaseUtil.getExceptionMessage(e);
+            logger.error(exceptionMessage);
+            throw new VciBaseException(exceptionMessage);
+        }
+        return res;
+    }
+
+    /**
+     * 鍒犻櫎闈炵郴缁熸ā鍧�
+     * @return
+     */
+    @Override
+    public boolean delNonsysModule() {
+        try {
+            if(platformClientUtil.getFrameworkService().deleteModules("nonsys")){
+                return true;
+            }
+        } catch (PLException e) {
+            e.printStackTrace();
+            String exceptionMessage = "鍒犻櫎闈炵郴缁熸ā鍧楀け璐�,鍘熷洜锛�"+VciBaseUtil.getExceptionMessage(e);
+            logger.error(exceptionMessage);
+            throw new VciBaseException(exceptionMessage);
+        }
+        return false;
+    }
+
+    /**
+     * 鍒犻櫎涓氬姟妯″潡
+     * @return
+     */
+    @Override
+    public boolean delBusinessModule() {
+        try {
+            if(platformClientUtil.getFrameworkService().deleteModules("business")){
+                return true;
+            }
+        } catch (PLException e) {
+            e.printStackTrace();
+            String exceptionMessage = "鍒犻櫎涓氬姟妯″潡澶辫触,鍘熷洜锛�"+VciBaseUtil.getExceptionMessage(e);
+            logger.error(exceptionMessage);
+            throw new VciBaseException(exceptionMessage);
+        }
+        return false;
+    }
+
+    /**
+     * 瀵煎嚭sql
+     * @return
+     */
+    @Override
+    public File exportFunctionSql(HttpServletResponse response,String exportPath,boolean isFunction) throws PLException {
+        String dir = Func.isBlank(exportPath) ?  LocalFileUtil.getDefaultTempFolder():exportPath;
+        String[][] allDatas;
+        int size;
+        if(isFunction){
+            size = (int)platformClientUtil.getFrameworkService().getAllModelManagementNum();
+            allDatas = this.getAllDatas(size);
+        }else{
+            size = (int)platformClientUtil.getFrameworkService().getAllOperitionsNum();
+            allDatas = this.getAllOperitions(size);
+        }
+        File file = expData(dir,isFunction, allDatas);
+        return file;
+    }
+
+    /**
+     * 瀵煎嚭
+     * @return
+     */
+    @Override
+    public String exportModule(HttpServletResponse response) throws IOException {
+        String defaultTempFolder = LocalFileUtil.getDefaultTempFolder();
+        //鍐檈xcel
+        String excelPath = defaultTempFolder + File.separator + "module.xls";
+        final List<String> columns = new ArrayList<String>(Arrays.asList("PLNAME","PLRESOURCEC","PLSUFFIXC","PLRESOURCEB",
+                "PLSUFFIXB","PLMODULENO","PLDESC","PLISVALID","PLIMAGE","PLMODULESEQUENCE","PLALIASNAME",
+                "PLMODULENAME","PLRESOURCEDOTNET","PLRESOURCEMOBIL","绾у埆","鍒悕","PLNO","PLISVALID",
+                "PLNAME","PLUNIQUEFLAG","PLDESC","PLALIAS","PLSEQUENCE"));// 璁剧疆琛ㄥ崟鍒楀悕
+        //int count = transmitTreeObject.getCurrentTreeNode().getChildCount();
+        new File(excelPath).createNewFile();
+        //璁剧疆鍒�
+        List<WriteExcelData> excelDataList = new ArrayList<>(10000);
+        //璁剧疆鍒楀ご
+        for (int index = 0; index < columns.size(); index++) {
+            excelDataList.add(new WriteExcelData(0,index, columns.get(index)));
+        }
+        //鏌ヨ瑕佸鍑虹殑鏁版嵁
+        String[][] firstLevel = new String[3000][23];
+        try {
+            firstLevel = this.checkLevel();
+        } catch (VciBaseException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+        String[][] datas = new String[10000][columns.size()];
+        for(int i=0;i<firstLevel.length;i++){
+            datas[i] =firstLevel[i];
+        }
+        if(Func.isEmpty(datas)){
+            excelDataList.add(new WriteExcelData(1,1, "瀵煎嚭鐨勫垪琛ㄤ负绌猴紝璇峰埛鏂板悗灏濊瘯閲嶆柊瀵煎嚭锛�"));
+        }else{
+            for (int i = 0; i < firstLevel.length; i++) {
+                int row = i + 1;
+                excelDataList.add(new WriteExcelData(row,0, ""+datas[i][0]));
+                excelDataList.add(new WriteExcelData(row,1, ""+datas[i][1]));
+                excelDataList.add(new WriteExcelData(row,2, ""+datas[i][2]));
+                excelDataList.add(new WriteExcelData(row,3, ""+datas[i][3]));
+                excelDataList.add(new WriteExcelData(row,4, ""+datas[i][4]));
+                excelDataList.add(new WriteExcelData(row,5, ""+datas[i][5]));
+                excelDataList.add(new WriteExcelData(row,6, ""+datas[i][6]));
+                excelDataList.add(new WriteExcelData(row,7, ""+datas[i][7]));
+                excelDataList.add(new WriteExcelData(row,8, ""+datas[i][8]));
+                excelDataList.add(new WriteExcelData(row,9, ""+datas[i][9]));
+                excelDataList.add(new WriteExcelData(row,10,""+datas[i][10]));
+                excelDataList.add(new WriteExcelData(row,11,""+datas[i][11]));
+                excelDataList.add(new WriteExcelData(row,12,""+datas[i][12]));
+                excelDataList.add(new WriteExcelData(row,13,""+datas[i][13]));
+                excelDataList.add(new WriteExcelData(row,14,""+datas[i][14]));
+                excelDataList.add(new WriteExcelData(row,15,""+datas[i][15]));
+                excelDataList.add(new WriteExcelData(row,16,""+datas[i][16]));
+                excelDataList.add(new WriteExcelData(row,17,""+datas[i][17]));
+                excelDataList.add(new WriteExcelData(row,18,""+datas[i][18]));
+                excelDataList.add(new WriteExcelData(row,19,""+datas[i][19]));
+                excelDataList.add(new WriteExcelData(row,20,""+datas[i][20]));
+                excelDataList.add(new WriteExcelData(row,21,""+datas[i][21]));
+                excelDataList.add(new WriteExcelData(row,22,""+datas[i][22]));
+            }
+        }
+        WriteExcelOption excelOption = new WriteExcelOption(excelDataList);
+        ExcelUtil.writeDataToFile(excelPath, excelOption);
+        return excelPath;
+    }
+
+    /**
+     * 瀵煎叆
+     * @param files
+     * @return
+     * @throws PLException
+     */
+    @Override
+    public BaseResult importModule(LinkedList<File> files) throws PLException, IOException {
+        logger.info("姝e湪鏀堕泦琛ㄥ崟鏁版嵁......");
+        boolean isSuccess = collectionDatas(files);
+        logger.info("姝e湪瀵煎叆琛ㄥ崟浜哄憳淇℃伅......");
+        logger.info("count==="+count);
+        boolean resBoolean = false;
+        if(isSuccess == false){
+            resBoolean = importExcelData(count);
+        }
+        return resBoolean ? BaseResult.success("瀵煎叆鎴愬姛锛�"):BaseResult.fail("瀵煎叆澶辫触锛�");
+    }
+
+    /**
+     * 绠$悊鍔熻兘妯″潡銆佷笟鍔″姛鑳芥ā鍧椾笅鐨勫彾瀛愯妭鐐光�斾慨鏀规搷浣滃埆鍚嶆帴鍙�
+     * @return
+     */
+    @Override
+    public boolean updateAlias(MenuVO menuVO) throws VciException {
+        String alias = menuVO.getAlias();
+        if ("".equals(alias)){
+            throw new VciBaseException("璇峰~鍐欐搷浣滃埆鍚�!");
+        }
+        boolean isValid = menuVO.getIsValid();
+        String id = menuVO.getId();
+        return foDelegate.updateFuncOperation(id , alias, isValid);
+    }
+
+    @Override
+    public List<Object> getSysConfTree() {
+        return null;
+    }
+
+    @Override
+    public boolean addSysConf() {
+        return false;
+    }
+
+    @Override
+    public boolean updateSysConf() {
+        return false;
+    }
+
+    @Override
+    public boolean delSysConf() {
+        return false;
+    }
+
+    @Override
+    public String exportSysConf(HttpServletResponse response) {
+        return null;
+    }
+
+    /**
+     * 鏀堕泦琛ㄥ崟淇℃伅銆�
+     * @param files
+     * @return
+     * @throws PLException
+     * @throws IOException
+     */
+    private boolean collectionDatas(LinkedList<File> files) throws PLException, IOException{
+        boolean b=false;
+        for (File f : files) {
+            List<SheetDataSet> sheetDataSets = this.getFileList(f);
+            if (sheetDataSets != null && !sheetDataSets.isEmpty()) {
+                for (SheetDataSet sheet : sheetDataSets) {
+                    // sheet涓嶈兘涓虹┖骞朵笖蹇呴』鏈夊嚭琛ㄥご澶栫殑涓�鏉℃暟鎹�
+                    if (sheet != null && sheet.getDataSet() != null && sheet.getDataSet().size() > 1) {
+                        List<String[]> dataSet = sheet.getDataSet();
+                        String fParentId=""; //绗竴绾х殑id(绗簩绾х殑parentid)
+                        boolean boo=true;
+                        boolean first=false;
+                        String[] pd=new String[100];
+                        int jibie=2;
+                        for (int i = 1; i < dataSet.size(); i++) {
+                            //fileDatas = new ArrayList<FunctionObject>();
+                            String[] oneData = dataSet.get(i);
+                            String id = ObjectUtility.getNewObjectID36();
+
+                            FunctionInfo funObj=new FunctionInfo();
+                            boolean onebl=false;
+                            boolean twobl=false;
+                            boolean same=false;
+                            String plName=oneData[0];
+                            //TODO: 杩欓噷缁濆浼氬嚭闂锛屽鍑虹殑绗竴灞傜殑绾у埆閮芥槸0锛岄兘涓嶄細瀛樺湪绛変簬1鐨勶紝鎵�浠ュ钩鍙拌繖鍎跨瓑浜�1搴旇鏄笉瀵圭殑
+                            if(oneData[14].equals("0")) {
+                                try {
+                                    onebl = foDelegate.firstLevel(plName);
+                                } catch (VciException e) {
+                                    // TODO Auto-generated catch block
+                                    e.printStackTrace();
+                                }
+                                //濡傛灉绗竴绾ч噸鍚�
+                                if(onebl == true) {//绗竴绾ч噸鍚嶅悗瑕嗙洊绗竴绾�
+                                    fuzhi(funObj,oneData);
+                                    try {
+                                        fParentId = foDelegate.changeFirstLevel(funObj,plName);
+                                        pd[2]=fParentId;
+                                    } catch (VciException e) {
+                                        // TODO Auto-generated catch block
+                                        e.printStackTrace();
+                                    }
+                                    funObj.id = fParentId;
+                                    fileFunctionDatas.add(funObj);
+                                    first=true;
+
+
+                                } else {
+                                    funObj.id = id;
+                                    funObj.parentId = "modelManagmentNode";
+                                    fuzhi(funObj,oneData);
+                                    fileFunctionDatas.add(funObj);
+                                    first=false;
+                                }
+
+                                b=false;
+                            }
+                            //#########################     鍚堝苟     #########################
+                            for(jibie=2;jibie<100;jibie++){
+                                if(oneData[14].equals(String.valueOf(jibie))){
+                                    if(first == true && boo == true){
+                                        try {
+                                            if(pd[jibie]==null){
+                                                pd[jibie]="";
+                                            }
+                                            twobl=foDelegate.secondLevel(plName,pd[jibie]);
+                                        } catch (VciException e) {
+                                            // TODO Auto-generated catch block
+                                            e.printStackTrace();
+                                        }
+                                        if(twobl==true) {//閲嶅悕鍚庤鐩�
+                                            fuzhi(funObj,oneData);
+                                            try {
+                                                fParentId=foDelegate.changeSecondLevel(funObj,plName,pd[jibie]);
+                                                pd[jibie+1]=fParentId;
+                                            } catch (VciException e) {
+                                                // TODO Auto-generated catch block
+                                                e.printStackTrace();
+                                            }
+                                            //funObj.setId(fParentId);
+                                            funObj.id = pd[jibie+1];
+                                            fileFunctionDatas.add(funObj);
+                                            boo = true;
+
+                                        }
+                                    } else {
+                                        funObj.id = id;
+                                        b = false;
+                                    }
+                                }
+                            }
+
+                            if(oneData[14].equals("-1")) {
+                                importExcelData(count);
+                                FuncOperationInfo foObj = new FuncOperationInfo();
+                                int len=fileFunctionDatas.size();
+                                //**************鍚屼竴鑺傜偣涓嬩笉鑳芥湁鐩稿悓鐨勬搷浣滅被鍨�********************
+                                String dataOperName=oneData[18];
+                                String plFuncOid=fileFunctionDatas.get(len-1).id;
+                                try {
+                                    same = foDelegate.selSameOper(dataOperName,plFuncOid);
+                                } catch (VciBaseException e1) {
+                                    // TODO Auto-generated catch block
+                                    e1.printStackTrace();
+                                }
+                                //******************************************************
+                                if(same == false) {
+                                    foObj.id = id;
+                                    foObj.funcId = fileFunctionDatas.get(len-1).id;
+                                    try {
+                                        OperateInfo operObj = foDelegate.fetchOperateTypeByName(oneData[18]);
+                                        foObj.operId = operObj.id;
+                                    } catch (VciException e) {
+                                        // TODO Auto-generated catch block
+                                        e.printStackTrace();
+                                    }
+                                    foObj.number = Integer.parseInt(oneData[16]);
+                                    foObj.operAlias = oneData[15];
+                                    foObj.isValid = Integer.parseInt(oneData[17]) != 0;
+                                    try {
+                                        foDelegate.saveFuncOperation2(foObj);
+                                    } catch (VciException e) {
+                                        // TODO Auto-generated catch block
+                                        e.printStackTrace();
+                                    }
+
+                                } else {
+                                    foObj.number = Integer.parseInt(oneData[16]);
+                                    foObj.operAlias = oneData[15];
+                                    foObj.isValid = Integer.parseInt(oneData[17]) != 0;
+                                    try {
+                                        foDelegate.updateOperation(foObj,dataOperName,plFuncOid);
+                                    } catch (VciException e) {
+                                        // TODO Auto-generated catch block
+                                        e.printStackTrace();
+                                    }
+                                }
+                                count=fileFunctionDatas.size();
+                                b=true;
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        return b;
+    }
+
+    /**
+     * 瀵煎叆琛ㄥ崟鏁版嵁
+     * @throws VciException
+     */
+    private boolean importExcelData(int count) throws PLException {
+        boolean b=false;
+        try {
+            b=	foDelegate.importModules(fileFunctionDatas.toArray(new FunctionInfo[]{}),count);
+        } catch (VciBaseException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+        return b;
+    }
+
+    /**
+     * 鑾峰彇琛ㄥ崟鏁版嵁
+     * @param f
+     * @return
+     * @throws IOException
+     * @throws PLException
+     * @autor caicong
+     * @data 2014-3-11
+     */
+    private List<SheetDataSet> getFileList(File f) throws PLException, IOException {
+        // 鑾峰彇娴�
+        BufferedInputStream fileInputStream = new BufferedInputStream(
+                new FileInputStream(f));
+        String name = f.getName();
+        // 鑾峰彇琛╨ist
+        List<SheetDataSet> sheetDataSets = ExcelDocumentUtils
+                .readExcelDocument(name, fileInputStream);
+        return sheetDataSets;
+    }
+
+    /**
+     * 鏌ヨ"鍔熻兘妯″潡绠$悊"鏁翠釜鏍戠粨鏋勫苟瀵煎嚭
+     * add by caill start
+     * */
+    private String[][] checkLevel() throws VciBaseException{
+        String[][] res = new String[3000][23];
+        try{
+            res = platformClientUtil.getFrameworkService().checkLevel();
+        }catch (PLException e) {
+            e.printStackTrace();
+            throw new VciBaseException(String.valueOf(e.code), e.messages);
+        }
+        return res;
+    }
+
+    /**
+     * 灏嗘煡璇㈠嚭鐨勬暟鎹浆鎹㈡垚sql骞跺啓鍏ユ寚瀹氳矾寰勪笅
+     * @param dir
+     * @param plDatas
+     * @return
+     */
+    private File expData(String dir,boolean isFunction/*鏄惁鏄鍑虹鐞嗗姛鑳芥ā鍧梥ql*/, String[][] plDatas){
+        new File(dir).mkdir();
+        File file = new File(dir + (isFunction ? "/plfuncoperation.sql":"/ploperation.sql"));
+        try {
+            FileWriter w = new FileWriter(file);
+            BufferedWriter bw = new BufferedWriter(w);
+            System.out.println("闀垮害涓猴細"+plDatas.length);
+            for(int i=0;i<plDatas.length;i++){
+                if(isFunction){
+                    if(!plDatas[i][16].trim().equals("") && plDatas[i][16]!=null && !plDatas[i][16].equals("-1")){
+                        bw.write("insert into plfunction values('"+plDatas[i][0]+"','"+plDatas[i][1]+"',"+"'"+plDatas[i][2]+"',"+"'"+plDatas[i][3]+"',"+"'"+plDatas[i][4]+"',"
+                                +"'"+plDatas[i][5]+"',"+"'"+plDatas[i][6]+"',"+"'"+plDatas[i][7]+"',"+"'"+plDatas[i][8]+"',"+"'"+plDatas[i][9]+"',"+"'"+plDatas[i][10]+"',"+"'"+plDatas[i][11]+"',"
+                                +"'"+plDatas[i][12]+"',"+"'"+plDatas[i][13]+"',"+"'"+plDatas[i][14]+"',"+"'"+plDatas[i][15]+"');");
+                        bw.write("\r\n");
+                    }
+                    if(!plDatas[i][16].trim().equals("") && plDatas[i][16]!=null && plDatas[i][16].equals("-1")){
+                        bw.write("insert into plfuncoperation values('"+plDatas[i][17]+"','"+plDatas[i][18]+"',"+"'"+plDatas[i][19]+"',"+"'"+plDatas[i][20]+"',"+"'"+plDatas[i][21]+"',"
+                                +"'"+plDatas[i][22]+"');");
+                        bw.write("\r\n");
+                    }
+                }else{
+                    bw.write("insert into ploperation values('"+plDatas[i][0]+"','"+plDatas[i][1]+"',"+"'"+plDatas[i][2]+"',"+"'"+plDatas[i][3]+"',"+"'"+plDatas[i][4]+"',"
+                            +"'"+plDatas[i][5]+"');");
+                    bw.write("\r\n");
+                }
+            }
+
+            bw.flush();
+            bw.close();
+            return file;
+        } catch (IOException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    /**
+     * 淇濆瓨妯″潡涓嬬殑鎿嶄綔
+     * @param funcOperationObjs
+     * @return
+     * @throws VciException
+     */
+    public boolean saveFuncOperation(FuncOperationInfo[] funcOperationObjs) throws VciException {
+        if(funcOperationObjs == null || funcOperationObjs.length < 0){
+            return false;
+        }
+        boolean res = true;
+        try{
+            res = platformClientUtil.getFrameworkService().saveFuncOperation(funcOperationObjs, foDelegate.getUserEntityInfo());
+        }catch (PLException e) {
+            e.printStackTrace();
+            throw new VciException(String.valueOf(e.code),e.messages);
+        }
+        return res;
+    }
+
+    /**
+     * 鏌ヨ"鍔熻兘妯″潡绠$悊"鏁翠釜鏍戠粨鏋勫苟瀵煎嚭sql
+     * @return
+     * @throws PLException
+     */
+    public String[][] getAllDatas(int size) throws PLException {
+        String[][] res = new String[size][23];
+        try{
+            res = platformClientUtil.getFrameworkService().getAllDatas(size);
+        }catch (PLException e) {
+            e.printStackTrace();
+            throw new PLException(String.valueOf(e.code), e.messages);
+        }
+        return res;
+    }
+
+    /**
+     * 鑾峰緱鎵�鏈夌殑鎿嶄綔绫诲瀷骞跺鍑哄埌.sql鏂囦欢涓�
+     * add by caill start 2015.12.11
+     * */
+    private String[][] getAllOperitions(int size) throws VciBaseException{
+        String[][] res = new String[size][6];
+        try{
+            res = platformClientUtil.getFrameworkService().getAllOperitions(size);
+        }catch (PLException e) {
+            e.printStackTrace();
+            throw new VciBaseException(String.valueOf(e.code), e.messages);
+        }
+        return res;
+    }
+
+    public void fuzhi(FunctionInfo functionInfo,String[] oneData){
+        functionInfo.name = oneData[0];
+        functionInfo.resourceC = oneData[1];
+        functionInfo.suffixC = oneData[2];
+        functionInfo.desc = oneData[6];
+        functionInfo.resourceB = oneData[3];
+        functionInfo.suffixB = oneData[4];
+        functionInfo.seq = Integer.parseInt(oneData[9]);
+        //funObj.setModuleNo(Integer.parseInt(oneData[5]));
+        functionInfo.image = oneData[8];
+        functionInfo.isValid = Integer.parseInt(oneData[7]) != 0;
+        functionInfo.aliasName = oneData[10];
+        functionInfo.resourceDotNet = oneData[12];
+        functionInfo.resourceMobile = oneData[13];
+    }
+
+    /**
+     * 鍖呭惈淇濆瓨妯″潡鏂规硶绛夋搷浣滅被
+     */
+    private class FunctionOperateDelegate {
+
+        /**
+         * 鍒ゆ柇绗竴绾ф暟鎹湁娌℃湁閲嶅悕鐨�
+         * @param plName
+         * @return
+         * @throws VciException
+         */
+        public boolean firstLevel(String plName) throws VciException{
+            try{
+                return platformClientUtil.getFrameworkService().firstLevel(plName);
+            }catch (PLException e) {
+                e.printStackTrace();
+                throw new VciException(String.valueOf(e.code), e.messages);
+            }
+        }
+
+        /**
+         * 瑕嗙洊閲嶅悕鐨勭涓�绾ф暟鎹�
+         * add by caill
+         * */
+        public String changeFirstLevel(FunctionInfo functionInfo,String plName) throws VciException{
+            String fParentId="";
+            try {
+                fParentId= platformClientUtil.getFrameworkService().changeFirstLevel(functionInfo, plName);
+            } catch (PLException e) {
+                // TODO Auto-generated catch block
+                e.printStackTrace();
+            }
+
+            return fParentId;
+        }
+
+        /**
+         * 鍒ゆ柇绗簩绾ф暟鎹湁娌℃湁閲嶅悕鐨�
+         * add by caill
+         * */
+        public boolean secondLevel(String plName,String fParentId) throws VciException{
+            try{
+                return platformClientUtil.getFrameworkService().secondLevel(plName,fParentId);
+            }catch (PLException e) {
+                e.printStackTrace();
+                throw new VciException(String.valueOf(e.code), e.messages);
+            }
+        }
+
+        /**
+         * 瑕嗙洊閲嶅悕鐨勭浜岀骇鏁版嵁
+         * add by caill
+         * */
+        public String changeSecondLevel(FunctionInfo functionInfo,String plName,String fParentId) throws VciException{
+            String sParentId="";
+            try {
+                sParentId= platformClientUtil.getFrameworkService().changeSecondLevel(functionInfo, plName,fParentId);
+            } catch (PLException e) {
+                // TODO Auto-generated catch block
+                e.printStackTrace();
+            }
+            return sParentId;
+        }
+
+        /**
+         * 淇濆瓨妯″潡
+         * @param object
+         * @return
+         * @throws VciException
+         */
+        public String saveModule(MenuVO object) throws VciBaseException {
+            String res = "";
+            try{
+                res = platformClientUtil.getFrameworkService().saveModule(this.check(object,"add"),this.getUserEntityInfo());
+            }catch (PLException e) {
+                e.printStackTrace();
+                throw new VciBaseException(String.valueOf(e.code), e.messages);
+            }
+            return res;
+        }
+
+        /**
+         * 淇敼妯″潡
+         * @param object
+         * @return
+         * @throws VciException
+         */
+        public String updateMod(MenuVO object) throws VciBaseException {
+            String res = "";
+            try{
+                res = platformClientUtil.getFrameworkService().updateModule(this.check(object,"update"),this.getUserEntityInfo());
+            }catch (PLException e) {
+                e.printStackTrace();
+                throw new VciBaseException(String.valueOf(e.code), e.messages);
+            }
+            return res;
+        }
+
+        /**
+         * 鍒犻櫎妯″潡
+         * @param puid
+         * @return
+         * @throws VciException
+         */
+        public String deleteModule(String puid) throws VciBaseException{
+            String res = "";
+            try{
+                res = platformClientUtil.getFrameworkService().deleteModule(puid,this.getUserEntityInfo());
+            }catch (PLException e) {
+                e.printStackTrace();
+                throw new VciBaseException(String.valueOf(e.code), e.messages);
+            }
+            return res;
+        }
+
+        /**
+         * VO杞珼O瀵硅薄
+         * @return
+         */
+        public FunctionInfo menuVO2FunctionInfo(MenuVO object){
+            FunctionInfo info = new FunctionInfo();
+            info.id = object.getId() == null ? "" : object.getId();
+            //info.layer = object.getLayer();
+            info.name = object.getName() == null ? "" : object.getName();
+            info.parentId = object.getParentId() == null ? "" : object.getParentId();
+            info.resourceC = object.getPathC() == null ? "" : object.getPathC();
+            //info.suffixC = object.getSuffixC() == null ? "" : object.getSuffixC();
+            info.resourceB = object.getPath() == null ? "" : object.getPath();
+            //info.suffixB = object.getSuffixB() == null ? "" : object.getSuffixB();
+            info.desc = object.getRemark() == null ? "" : object.getRemark();
+            info.seq = object.getSort();
+            //info.moduleNo = object.getModuleNo();
+            info.image = object.getSource() == null ? "" : object.getSource();
+            info.isValid = object.getIsValid();
+            info.aliasName = object.getAlias() == null ? "" : object.getAlias();
+            info.resourceDotNet = object.getResourceDotNet() == null ? "" : object.getResourceDotNet();
+            info.resourceMobile = object.getResourceMobile() == null ? "" : object.getResourceMobile();
+            info.desc = object.getRemark();
+            return info;
+        }
+
+        /**
+         * <p>Description: 椤甸潰杈撳叆鐨勬牎楠�</p>
+         *
+         *@author xf
+         *@time 2012-5-15
+         *@return FunctionObject
+         * @return
+         */
+        private FunctionInfo check(MenuVO menuVO,String type) {
+            FunctionInfo obj = new FunctionInfo();
+
+            //鑾峰彇琛ㄥ崟杈撳叆鐨勫��
+            String modelName = menuVO.getName();
+            String csIdentity = menuVO.getPathC();
+            String bsIdentity = menuVO.getPath();
+            String aliasName = menuVO.getAlias();
+            String resDotNet = menuVO.getResourceDotNet();
+            String resMobile = menuVO.getResourceMobile();
+
+            //int moduleNo = transferStringToNum(moduleNoTxt.getText());
+            int sequence = menuVO.getSort();
+            String description = menuVO.getRemark();
+
+            if("".equals(modelName) || "null".equals(modelName) || modelName == null) {
+                throw new VciBaseException("妯″潡鍚嶄笉鑳戒负绌猴紒");
+            }else if(modelName.length() > 128) {
+                throw new VciBaseException("妯″潡鍚嶉暱搴︿笉鑳借秴杩�128锛�");
+            }else if(description.length() > 255) {
+                throw new VciBaseException("鎻忚堪闀垮害涓嶈兘瓒呰繃255锛�");
+            }else if(csIdentity != null && !"".equals(csIdentity) && csIdentity.length() > 255) {
+                throw new VciBaseException("C/S鏍囪瘑闀垮害涓嶈兘瓒呰繃255锛�");
+            } else if(resDotNet != null && !"".equals(resDotNet) && resDotNet.length() > 255) {
+                throw new VciBaseException(".NET鏍囪瘑闀垮害涓嶈兘瓒呰繃255锛�");
+            }else if(resMobile != null && !"".equals(resMobile) && resMobile.length() > 255) {
+                throw new VciBaseException("Mobile鏍囪瘑闀垮害涓嶈兘瓒呰繃255锛�");
+            } else if (sequence < 0) {
+                throw new VciBaseException("搴忓彿涓嶈兘灏忎簬0锛�");
+            }
+            if(type.equals("add")){
+                //缁檕bject瀵硅薄璧嬪��
+                String parentId = "";
+                if(menuVO.getModeType().equals("FunctionObject")) {
+                    parentId = menuVO.getParentId();
+                }else if("modelManagmentNode".equals(menuVO.getParentId())) {
+                    parentId = "modelManagmentNode";
+                }else if("systemManagmentNode".equals(menuVO.getParentId())) {
+                    parentId = "systemManagmentNode";
+                }
+                obj.parentId = parentId;
+            }else{
+                obj.id = menuVO.getId();
+                obj.parentId = menuVO.getParentId();
+            }
+            obj.name = modelName;
+            obj.resourceC = csIdentity;
+            obj.desc = description;
+            obj.resourceB = bsIdentity;
+            obj.suffixC = "";
+            obj.suffixB = "";
+            obj.seq = sequence;
+            obj.image = menuVO.getSource();
+            obj.isValid = menuVO.getValid();//1鏈夋晥0鏃犳晥
+            obj.aliasName = aliasName;
+            obj.resourceDotNet = resDotNet;
+            obj.resourceMobile = resMobile;
+            return obj;
+        }
+
+        /**
+         * 鑾峰彇UserEntityInfo瀵硅薄
+         * @return
+         */
+        public UserEntityInfo getUserEntityInfo(){
+            SessionInfo sessionInfo = WebThreadLocalUtil.getCurrentUserSessionInfoInThread();
+            UserEntityInfo userEntityInfo = new UserEntityInfo(sessionInfo.getUserId(), "");
+            return userEntityInfo;
+        }
+
+        /**
+         * 瀵煎叆妯″潡瀵硅薄
+         * add by caill
+         * */
+        public boolean importModules(FunctionInfo[] funObject,int count) throws VciBaseException{
+            boolean b=false;
+            int len = funObject.length;
+            List<FunctionInfo> funInfoList = new ArrayList<FunctionInfo>();
+            for(int i = count ; i<len ; i++){
+                if(funObject[i].parentId!=null){
+                    FunctionInfo funInfo = funObject[i];
+                    funInfoList.add(funInfo);
+                }
+            }
+            FunctionInfo[] funInfos = new FunctionInfo[funInfoList.size()];
+            for(int j=0;j<funInfoList.size();j++){
+                funInfos[j] = funInfoList.get(j);
+            }
+
+            try {
+                b = platformClientUtil.getFrameworkService().importModules(funInfos,this.getUserEntityInfo());
+            } catch (PLException e) {
+                // TODO Auto-generated catch block
+                e.printStackTrace();
+            }
+
+            return b;
+        }
+
+        /**
+         * 鏌ヨ鍚屼竴妯″潡涓槸鍚﹀凡缁忓瓨鍦ㄧ浉鍚岀殑鎿嶄綔绫诲瀷
+         * add by caill
+         * */
+        public boolean selSameOper(String dataOperName,String plFuncOid) throws VciBaseException{
+            boolean same=false;
+            try {
+                same = platformClientUtil.getFrameworkService().selSameOper(dataOperName,plFuncOid);
+            } catch (PLException e) {
+                // TODO Auto-generated catch block
+                e.printStackTrace();
+            }
+            return same;
+        }
+
+        public OperateInfo fetchOperateTypeByName(String name) throws VciException {
+            try{
+                OperateInfo info =  platformClientUtil.getFrameworkService().fetchOperateTypeByName(name);
+                return info;
+            }catch (PLException e) {
+                e.printStackTrace();
+                throw new VciBaseException(String.valueOf(e.code),e.messages);
+            }
+        }
+
+        /**
+         * 淇濆瓨鎿嶄綔绫诲瀷
+         * add by caill
+         * */
+        public boolean saveFuncOperation2(FuncOperationInfo funcOperationInfo) throws VciException{
+            try {
+                platformClientUtil.getFrameworkService().saveFuncOperation2(funcOperationInfo,this.getUserEntityInfo());
+            } catch (PLException e) {
+                // TODO Auto-generated catch block
+                e.printStackTrace();
+            }
+            return true;
+        }
+
+        /**
+         * 瑕嗙洊鎿嶄綔绫诲瀷
+         * add by caill
+         * */
+        public String updateOperation(FuncOperationInfo funcOperationInfo,String dataOperName,String plFuncOid) throws VciException{
+            try {
+                platformClientUtil.getFrameworkService().updateOperation(funcOperationInfo,this.getUserEntityInfo(),dataOperName,plFuncOid);
+            } catch (PLException e) {
+                // TODO Auto-generated catch block
+                e.printStackTrace();
+            }
+            return null;
+        }
+
+        public boolean updateFuncOperation(String id , String alias, boolean isSelected) throws VciException {
+            boolean res = false;
+            try{
+                res = platformClientUtil.getFrameworkService().updateFuncOperation(id, alias, isSelected, this.getUserEntityInfo());
+            }catch(PLException e){
+                throw new VciException(String.valueOf(e.code), e.messages);
+            }
+            return res;
+        }
+
+    }
+
+
+}
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
new file mode 100644
index 0000000..966811e
--- /dev/null
+++ b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/HMSysModConfigController.java
@@ -0,0 +1,259 @@
+package com.vci.web.controller;
+
+import com.vci.constant.FrameWorkLangCodeConstant;
+import com.vci.frameworkcore.compatibility.ISmFunctionQueryService;
+import com.vci.frameworkcore.compatibility.SmHMSysModConfigServiceI;
+import com.vci.pagemodel.MenuVO;
+import com.vci.starter.web.annotation.controller.VciUnCheckRight;
+import com.vci.starter.web.exception.VciBaseException;
+import com.vci.starter.web.pagemodel.BaseResult;
+import com.vci.starter.web.util.ControllerUtil;
+import com.vci.starter.web.util.LocalFileUtil;
+import com.vci.starter.web.util.VciBaseUtil;
+import com.vci.web.util.Func;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import java.io.File;
+import java.io.IOException;
+import java.util.Date;
+import java.util.LinkedList;
+import java.util.List;
+
+/**
+ * 棣栭〉绯荤粺妯″潡閰嶇疆鎺у埗鍣�
+ * @author ludc
+ * @date 2024/8/19 10:55
+ */
+@RestController
+@RequestMapping("/hmSysModConfigController")
+@VciUnCheckRight
+public class HMSysModConfigController {
+
+    /**
+     * 鍔熻兘鏌ヨ鏈嶅姟
+     */
+    @Resource
+    private ISmFunctionQueryService functionQueryService;
+
+    /**
+     * 棣栭〉绯荤粺閰嶇疆鏈嶅姟
+     */
+    @Resource
+    private SmHMSysModConfigServiceI hmSysModConfigService;
+
+    /**
+     * 鏃ュ織
+     */
+    private Logger logger = LoggerFactory.getLogger(getClass());
+
+    /**
+     * 鑾峰彇褰撳墠妯″潡涓嬬殑瀛愭ā鍧�
+     * @param parentId
+     * @param modeType
+     * @return
+     */
+    @GetMapping("/getSysModelTreeMenuByPID")
+    public BaseResult<List<MenuVO>> getSysModelTreeMenuByPID(String parentId, String modeType) {
+        try {
+            return BaseResult.dataList(functionQueryService.getSysModelTreeMenuByPID(parentId,modeType,true));
+        }catch (Exception e){
+            e.printStackTrace();
+            String errorMsg = "鏌ヨ瀛愭ā鍧楁椂鍑虹幇閿欒锛屽師鍥狅細"+ VciBaseUtil.getExceptionMessage(e);
+            logger.error(errorMsg);
+            throw new VciBaseException(errorMsg);
+        }
+    }
+
+    /**
+     * 娣诲姞妯″潡
+     * @param menuVO
+     * @return
+     */
+    @PostMapping("/addModel")
+    public BaseResult addModel(@RequestBody MenuVO menuVO) {
+        try {
+            return BaseResult.success(hmSysModConfigService.addModule(menuVO),"妯″潡澧炲姞鎴愬姛");
+        }catch (Exception e){
+            e.printStackTrace();
+            String errorMsg = "澧炲姞妯″潡鏃跺嚭鐜伴敊璇紝鍘熷洜锛�"+ VciBaseUtil.getExceptionMessage(e);
+            logger.error(errorMsg);
+            throw new VciBaseException(errorMsg);
+        }
+    }
+
+    /**
+     * 淇敼妯″潡
+     * @param menuVO
+     * @return
+     */
+    @PutMapping("/updateModel")
+    public BaseResult updateModel(@RequestBody MenuVO menuVO) {
+        try {
+            return BaseResult.success(hmSysModConfigService.updateModule(menuVO),"妯″潡淇敼鎴愬姛");
+        }catch (Exception e){
+            e.printStackTrace();
+            String errorMsg = "淇敼妯″潡鏃跺嚭鐜伴敊璇紝鍘熷洜锛�"+ VciBaseUtil.getExceptionMessage(e);
+            logger.error(errorMsg);
+            throw new VciBaseException(errorMsg);
+        }
+    }
+
+    /**
+     * 鍒犻櫎妯″潡
+     * @param menuVO
+     * @return
+     */
+    @DeleteMapping("/delModule")
+    public BaseResult delModule(@RequestBody MenuVO menuVO) {
+        try {
+            return BaseResult.success(hmSysModConfigService.delModule(menuVO),"妯″潡鍒犻櫎鎴愬姛");
+        }catch (Exception e){
+            e.printStackTrace();
+            String errorMsg = "鍒犻櫎妯″潡鏃跺嚭鐜伴敊璇紝鍘熷洜锛�"+ VciBaseUtil.getExceptionMessage(e);
+            logger.error(errorMsg);
+            throw new VciBaseException(errorMsg);
+        }
+    }
+
+    /**
+     * 绠$悊鍔熻兘妯″潡銆佷笟鍔″姛鑳芥ā鍧椾笅鐨勫彾瀛愯妭鐐光�斾慨鏀规搷浣滃埆鍚嶆帴鍙�
+     * @param menuVO
+     * @return
+     */
+    @PutMapping("/updateAlias")
+    public BaseResult updateAlias(@RequestBody MenuVO menuVO) {
+        try {
+            return BaseResult.success(hmSysModConfigService.updateAlias(menuVO),"鎿嶄綔鍒悕淇敼鎴愬姛");
+        }catch (Exception e){
+            e.printStackTrace();
+            String errorMsg = "鎿嶄綔鍒悕淇敼鏃跺嚭鐜伴敊璇紝鍘熷洜锛�"+ VciBaseUtil.getExceptionMessage(e);
+            logger.error(errorMsg);
+            throw new VciBaseException(errorMsg);
+        }
+    }
+
+    /**
+     * 娣诲姞鎿嶄綔绫诲瀷
+     * @param menuVOList
+     * @return
+     */
+    @PostMapping("/addOperationType")
+    public BaseResult addOperationType(@RequestBody List<MenuVO> menuVOList) {
+        try {
+            return BaseResult.success(hmSysModConfigService.addOperationType(menuVOList),"鎿嶄綔绫诲瀷娣诲姞鎴愬姛");
+        }catch (Exception e){
+            e.printStackTrace();
+            String errorMsg = "鍒犻櫎妯″潡鏃跺嚭鐜伴敊璇紝鍘熷洜锛�"+ VciBaseUtil.getExceptionMessage(e);
+            logger.error(errorMsg);
+            throw new VciBaseException(errorMsg);
+        }
+    }
+
+    /**
+     * 鍒犻櫎闈炵郴缁熸ā鍧�
+     * @return
+     */
+    @DeleteMapping("/delNonsysModule")
+    public BaseResult delNonsysModule() {
+        try {
+            return BaseResult.success(hmSysModConfigService.delNonsysModule(),"鍒犻櫎闈炵郴缁熸ā鍧楁垚鍔�");
+        }catch (Exception e){
+            e.printStackTrace();
+            String errorMsg = "鍒犻櫎闈炵郴缁熸ā鍧楁椂鍑虹幇閿欒锛屽師鍥狅細"+ VciBaseUtil.getExceptionMessage(e);
+            logger.error(errorMsg);
+            throw new VciBaseException(errorMsg);
+        }
+    }
+
+    /**
+     * 鍒犻櫎涓氬姟妯″潡
+     * @return
+     */
+    @PostMapping("/delBusinessModule")
+    public BaseResult delBusinessModule() {
+        try {
+            return BaseResult.success(hmSysModConfigService.delBusinessModule(),"鍒犻櫎涓氬姟妯″潡");
+        }catch (Exception e){
+            e.printStackTrace();
+            String errorMsg = "鍒犻櫎涓氬姟妯″潡鏃跺嚭鐜伴敊璇紝鍘熷洜锛�"+ VciBaseUtil.getExceptionMessage(e);
+            logger.error(errorMsg);
+            throw new VciBaseException(errorMsg);
+        }
+    }
+
+    /**
+     * 瀵煎嚭绠$悊鍔熻兘妯″潡鎴栨搷浣滅被鍨嬬鐞嗘ā鍧梥ql
+     * @return
+     */
+    @GetMapping("/exportFunctionSql")
+    public void exportFunctionSql(HttpServletResponse response,String exportPath,boolean isFunction) {
+        try {
+            File file = hmSysModConfigService.exportFunctionSql(response,exportPath,isFunction);
+            ControllerUtil.writeFileToResponse(response,file,true);
+        } catch (Exception e) {
+            String msg = "瀵煎嚭sql鏃跺嚭鐜伴敊璇紝鍘熷洜锛�" + VciBaseUtil.getExceptionMessage(e);
+            try {
+                //鍑洪敊鏃�
+                e.printStackTrace();
+                ControllerUtil.writeDataToResponse(response,"error_" + Func.format(new Date(),"yyyy-MM-dd HHmmss.sss") + ".txt", StringUtils.isNotBlank(msg)?msg.getBytes():new byte[0],null);
+            } catch (IOException ioException) {
+                ioException.printStackTrace();
+            }
+        }
+    }
+
+    /**
+     * 瀵煎嚭妯″潡
+     * @return
+     */
+    @GetMapping("/exportModule")
+    public void exportModule(HttpServletResponse response) {
+        try {
+            String excelPath = hmSysModConfigService.exportModule(response);
+            ControllerUtil.writeFileToResponse(response,excelPath);
+        } catch (Exception e) {
+            String msg = "瀵煎嚭妯″潡鏃跺嚭鐜伴敊璇紝鍘熷洜锛�" + VciBaseUtil.getExceptionMessage(e);
+            try {
+                //鍑洪敊鏃�
+                e.printStackTrace();
+                ControllerUtil.writeDataToResponse(response,"error_" + Func.format(new Date(),"yyyy-MM-dd HHmmss.sss") + ".txt", StringUtils.isNotBlank(msg)?msg.getBytes():new byte[0],null);
+            } catch (IOException ioException) {
+                ioException.printStackTrace();
+            }
+        }
+    }
+
+    /**
+     * 瀵煎叆妯″潡
+     * @return
+     */
+    @GetMapping("/importModule")
+    public BaseResult importModule(@RequestParam("files") List<MultipartFile> files) {
+        LinkedList<File> fileList = new LinkedList<>();
+        try {
+            for (MultipartFile file : files) {
+                String excelFileName = LocalFileUtil.getDefaultTempFolder() + File.separator + LocalFileUtil.getFileNameForIE(file.getOriginalFilename());
+                File file1 = new File(excelFileName);
+                file.transferTo(file1);
+                fileList.add(file1);
+            }
+            if(Func.isEmpty(fileList)){
+                return hmSysModConfigService.importModule(fileList);
+            } else {
+                return BaseResult.fail(FrameWorkLangCodeConstant.IMPORT_FAIL, new String[]{"鏃犲鍏ョ殑鏂囦欢"});
+            }
+        }catch (Throwable e) {
+            throw new VciBaseException(VciBaseUtil.getExceptionMessage(e),new String[0],e);
+        }finally {
+            fileList.stream().forEach(file -> file.delete());
+        }
+    }
+
+}
diff --git a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/OsActionController.java b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/OsActionController.java
new file mode 100644
index 0000000..01b4da8
--- /dev/null
+++ b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/OsActionController.java
@@ -0,0 +1,160 @@
+package com.vci.web.controller;
+
+import com.vci.corba.common.PLException;
+import com.vci.dto.PLActionClsDTO;
+import com.vci.dto.PLActionDTO;
+import com.vci.dto.PLActionQueryDTO;
+import com.vci.starter.web.pagemodel.BaseResult;
+import com.vci.web.service.OsActionServiceI;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * Action绠$悊鐨勬帶鍒跺櫒
+ * @author yuxc
+ * @date 2024-8-16
+ */
+@RequestMapping("/actionController")
+@RestController
+public class OsActionController {
+
+    /**
+     * Action鏈嶅姟
+     */
+    @Autowired
+    private OsActionServiceI osActionServiceI;
+
+    /**
+     * 淇濆瓨Action鍒嗙被淇℃伅
+     * @param pLActionCls Action鍒嗙被淇℃伅
+     * @return 淇濆瓨缁撴灉
+     */
+    @PostMapping("/saveActionCls")
+    public BaseResult saveActionCls(@RequestBody PLActionClsDTO pLActionCls){
+        try {
+            return osActionServiceI.saveActionCls(pLActionCls);
+        } catch (PLException e) {
+            BaseResult objectBaseResult = new BaseResult<>();
+            objectBaseResult.setCode(Integer.parseInt(e.code));
+            objectBaseResult.setMsg(Arrays.toString(e.messages));
+            return objectBaseResult;
+        }
+    }
+
+    /**
+     * 淇敼Action鍒嗙被淇℃伅
+     * @param pLActionCls Action鍒嗙被淇℃伅
+     * @return 淇敼缁撴灉
+     */
+    @PostMapping("/updateActionCls")
+    public BaseResult updateActionCls(@RequestBody PLActionClsDTO pLActionCls){
+        try {
+            return osActionServiceI.updateActionCls(pLActionCls);
+        } catch (PLException e) {
+            BaseResult objectBaseResult = new BaseResult<>();
+            objectBaseResult.setCode(Integer.parseInt(e.code));
+            objectBaseResult.setMsg(Arrays.toString(e.messages));
+            return objectBaseResult;
+        }
+    }
+
+    /**
+     * 鑾峰彇Action鍒嗙被鏍�
+     * isExp 鏄惁鐢ㄦ埛瀵煎嚭 true鏄紝false鍚�
+     * @return 鏌ヨ缁撴灉
+     */
+    @GetMapping("/getActionTree")
+    public BaseResult getActionTree(boolean isExp){
+        try {
+            return osActionServiceI.getActionTree(isExp);
+        } catch (PLException e) {
+            BaseResult objectBaseResult = new BaseResult<>();
+            objectBaseResult.setCode(Integer.parseInt(e.code));
+            objectBaseResult.setMsg(Arrays.toString(e.messages));
+            return objectBaseResult;
+        }
+    }
+
+    /**
+     * 鑾峰彇Action琛ㄦ牸鏁版嵁
+     * dto 鏌ヨ鏉′欢
+     * @return 鏌ヨ缁撴灉
+     */
+    @PostMapping("/getActionTableData")
+    public BaseResult getActionTableData(@RequestBody PLActionQueryDTO dto){
+        try {
+            return osActionServiceI.getActionTableData(dto);
+        } catch (PLException e) {
+            BaseResult objectBaseResult = new BaseResult<>();
+            objectBaseResult.setCode(Integer.parseInt(e.code));
+            objectBaseResult.setMsg(Arrays.toString(e.messages));
+            return objectBaseResult;
+        }
+    }
+
+    /**
+     * 淇濆瓨Action鏁版嵁
+     * dto action浼犺緭瀵硅薄
+     * @return 淇濆瓨缁撴灉
+     */
+    @PostMapping("/saveAction")
+    public BaseResult saveAction(@RequestBody PLActionDTO dto){
+        try {
+            return osActionServiceI.saveAction(dto);
+        } catch (PLException e) {
+            BaseResult objectBaseResult = new BaseResult<>();
+            objectBaseResult.setCode(Integer.parseInt(e.code));
+            objectBaseResult.setMsg(Arrays.toString(e.messages));
+            return objectBaseResult;
+        }
+    }
+
+    /**
+     * 淇敼Action鏁版嵁
+     * dto action浼犺緭瀵硅薄
+     * @return 淇敼缁撴灉
+     */
+    @PostMapping("/updateAction")
+    public BaseResult updateAction(@RequestBody PLActionDTO dto){
+        try {
+            return osActionServiceI.updateAction(dto);
+        } catch (PLException e) {
+            BaseResult objectBaseResult = new BaseResult<>();
+            objectBaseResult.setCode(Integer.parseInt(e.code));
+            objectBaseResult.setMsg(Arrays.toString(e.messages));
+            return objectBaseResult;
+        }
+    }
+
+    /**
+     * 鍒犻櫎Action鏁版嵁
+     * dto action浼犺緭瀵硅薄
+     * @return 鍒犻櫎缁撴灉
+     */
+    @DeleteMapping("/deleteAction")
+    public BaseResult deleteAction(@RequestBody PLActionDTO dto){
+        try {
+            return osActionServiceI.deleteAction(dto);
+        } catch (PLException e) {
+            BaseResult objectBaseResult = new BaseResult<>();
+            objectBaseResult.setCode(Integer.parseInt(e.code));
+            objectBaseResult.setMsg(Arrays.toString(e.messages));
+            return objectBaseResult;
+        }
+    }
+
+    /**
+     * 瀵煎嚭Action
+     * @return
+     */
+    @PostMapping("/exportBeans")
+    public void exportBeans(@RequestBody List<String> actionOid, HttpServletResponse response) throws PLException, IOException {
+        osActionServiceI.exportBeans(actionOid, response);
+    }
+
+}
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 7e9968d..d386a91 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
@@ -49,25 +49,6 @@
 	}
 
 	/**
-	 * 鑾峰彇褰撳墠妯″潡涓嬬殑瀛愭ā鍧�
-	 * @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/WebPortalVIController.java b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/WebPortalVIController.java
new file mode 100644
index 0000000..8e9cf64
--- /dev/null
+++ b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/WebPortalVIController.java
@@ -0,0 +1,72 @@
+package com.vci.web.controller;
+
+import com.vci.dto.PortalVIDTO;
+import com.vci.pagemodel.KeyValue;
+import com.vci.pagemodel.PortalVIVO;
+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.DataGrid;
+import com.vci.web.enumpck.ItemDblEnum;
+import com.vci.web.enumpck.ItemTypeEnum;
+import com.vci.web.service.OsPortalVIServiceI;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 鍏紡鎺у埗鍣�
+ * @author weidy
+ * @date 2022-2-11
+ */
+@RestController
+@RequestMapping("/portalVIController")
+public class WebPortalVIController {
+   private OsPortalVIServiceI portalVIServiceI;
+    /**
+     * 琛ㄥ崟鍒楄〃
+     * viType:琛ㄥ崟绫诲瀷;Form("Form", "琛ㄥ崟", (short)1), Table("Table", "琛ㄦ牸", (short)0);
+     * viTypeFlag:	LinkType("LinkType", "閾炬帴绫诲瀷鐨勮〃鍗�", (short)1), BtmType("BtmType", "涓氬姟绫诲瀷鐨勮〃鍗�", (short)0);
+     * @param baseQueryObject 鏌ヨ鏉′欢
+     * @return 鍒楄〃鐨勫唴瀹�
+     */
+    @GetMapping( "/referDataGrid")
+    @VciBusinessLog(operateName = "琛ㄥ崟/琛ㄦ牸鍒楄〃")
+    public DataGrid<PortalVIVO> referDataGrid(BaseQueryObject baseQueryObject){
+        return portalVIServiceI.gridPortalVIVOs(baseQueryObject);
+    }
+
+    /**
+     * 琛ㄥ崟/table淇濆瓨
+     * @param portalVIDTO
+     * @return
+     */
+    @PostMapping("/savePortalVI")
+    @VciBusinessLog(operateName = "娣诲姞琛ㄥ崟/琛ㄦ牸")
+    public BaseResult savePortalVI(@RequestBody PortalVIDTO portalVIDTO){
+        if(StringUtils.isNotBlank(portalVIDTO.getId())){
+            return portalVIServiceI.edit(portalVIDTO);
+        }else{
+            return portalVIServiceI.add(portalVIDTO);
+        }
+
+    }
+    /**
+     * 鑾峰彇灞炴�у瓧娈电被鍨�
+     */
+    @GetMapping("/getItemTypeList")
+    @VciBusinessLog(operateName = "灞炴�у瓧娈电被鍨�")
+    public BaseResult<List<KeyValue>> getItemTypeList(){
+        return  BaseResult.dataList(ItemTypeEnum.getEnumAll());
+    }
+    /**
+     * 鑾峰彇瓒呴摼鎺ュ脊鍑烘柟娉�
+     */
+    @GetMapping("/getItemDblList")
+    @VciBusinessLog(operateName = "灞炴�у瓧娈电被鍨�")
+    public BaseResult<List<KeyValue>> getItemDblList(){
+        return  BaseResult.dataList(ItemDblEnum.getEnumAll());
+    }
+
+}
diff --git a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/enumpck/ItemDblEnum.java b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/enumpck/ItemDblEnum.java
new file mode 100644
index 0000000..456ec30
--- /dev/null
+++ b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/enumpck/ItemDblEnum.java
@@ -0,0 +1,125 @@
+package com.vci.web.enumpck;
+
+import com.vci.pagemodel.KeyValue;
+import com.vci.starter.web.enumpck.BaseEnum;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public enum ItemDblEnum implements BaseEnum {
+    EDIT_PANEL("0","淇敼椤甸潰"),
+    CUSTOM_PANEL("1","鑷畾涔夐〉闈�"),
+    DIALOG("2","寮瑰嚭灏忕獥鍙�"),
+    OVERLOOK("3", "蹇界暐");
+    /**
+     * 鏋氫妇鐨勫��
+     */
+    private String value;
+
+    /**
+     * 鏋氫妇鏄剧ず鏂囨湰
+     */
+    private String text;
+
+    /**
+     * 鑾峰彇鏋氫妇鍊�
+     *
+     * @return 鏋氫妇鍊�
+     */
+    @Override
+    public String getValue() {
+        return value;
+    }
+
+    /**
+     * 璁剧疆鏋氫妇鍊�
+     *
+     * @param value 鏋氫妇鍊�
+     */
+    public void setValue(String value) {
+        this.value = value;
+    }
+
+    /**
+     * 鑾峰彇鏋氫妇鏄剧ず鏂囨湰
+     *
+     * @return 鏄剧ず鏂囨湰
+     */
+    @Override
+    public String getText() {
+        return text;
+    }
+
+    /**
+     * 璁剧疆鏄剧ず鏂囨湰
+     *
+     * @param text 鏄剧ず鏂囨湰
+     */
+    public void setText(String text) {
+        this.text = text;
+    }
+    ItemDblEnum(String value, String text) {
+        this.value = value;
+        this.text = text;
+    }
+
+
+    /**
+     * 鏍规嵁鍚嶇О鑾峰彇瀵瑰簲鐨勬灇涓惧��
+     *
+     * @param text 鍚嶇О
+     * @return 鏋氫妇鍊�
+     */
+    public static String getValueByText(String text) {
+        for (ItemDblEnum wenum : ItemDblEnum.values()) {
+            if (wenum.getText().equalsIgnoreCase(text)) {
+                return wenum.getValue();
+            }
+        }
+        return "";
+    }
+
+    /**
+     * 鏍规嵁鏋氫妇鍊艰幏鍙栧悕绉�
+     *
+     * @param value 鏋氫妇鍊�
+     * @return 鍚嶇О
+     */
+    public static String getTextByValue(String value) {
+        for (ItemDblEnum wenum : ItemDblEnum.values()) {
+            if (wenum.getValue().equalsIgnoreCase(value)) {
+                return wenum.getText();
+            }
+        }
+        return "";
+    }
+    /**
+     * 鏍规嵁鏋氫妇鍊艰幏鍙栨灇涓惧璞�
+     *
+     * @param value 鏋氫妇鍊�
+     * @return 鏋氫妇瀵硅薄锛屼笉瀛樺湪鏃跺�欒繑鍥瀗ull
+     */
+    public static ItemDblEnum forValue(String value) {
+        for (ItemDblEnum wenum : ItemDblEnum.values()) {
+            if (wenum.getValue().equalsIgnoreCase(value)) {
+                return wenum;
+            }
+        }
+        return null;
+    }
+    /**
+     * 鏍规嵁鏋氫妇鍊艰幏鍙栧悕绉�
+     *
+     * @return 鍚嶇О
+     */
+    public static List<KeyValue> getEnumAll() {
+        List<KeyValue> enumDataList=new ArrayList<>();
+        for (ItemDblEnum wenum : ItemDblEnum.values()) {
+            KeyValue enumData=new KeyValue();
+            enumData.setKey(wenum.value);
+            enumData.setValue(wenum.text);
+            enumDataList.add(enumData);
+        }
+        return enumDataList;
+    }
+}
diff --git a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/enumpck/ItemTypeEnum.java b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/enumpck/ItemTypeEnum.java
new file mode 100644
index 0000000..c2ef060
--- /dev/null
+++ b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/enumpck/ItemTypeEnum.java
@@ -0,0 +1,144 @@
+package com.vci.web.enumpck;
+
+import com.vci.pagemodel.KeyValue;
+import com.vci.starter.web.enumpck.BaseEnum;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public enum ItemTypeEnum implements BaseEnum {
+    TEXT("text","鍗曡鏂囨湰妗�"),
+    TEXTBTN("textbtn","鏂囨湰鎸夐挳妗�"),
+    TEXTAREA("textarea","澶氳鏂囨湰妗�"),
+    RICHTEXT("richtext","瀵屾枃鏈"),
+    NUMBER("number","鏁板瓧杈撳叆妗�"),
+    PASSWORD("password","瀵嗙爜妗�"),
+    RADIO("radio","鍗曢�夋寜閽�"),
+    CHECKBOX("checkbox","澶氶�夋寜閽�"),
+    SELECT("select","涓嬫媺鑿滃崟"),
+    MULTISELECT("multiselect","澶氶�変笅鎷夎彍鍗�"),
+    DATE("date","鏃ユ湡杈撳叆妗�"),
+    TIME("time","鏃堕棿杈撳叆妗�"),
+    DATETIME("datetime","鏃ユ湡鏃堕棿杈撳叆妗�"),
+    FILE("file","鏂囦欢涓婁紶"),
+    MULTIFILE("multiFile","澶氭枃浠朵笂浼�"),
+    CUSTOM("custom","鑷畾涔�"),
+    CUSTOMFORM("customform","鑷畾涔夎〃鍗�"),
+    HIDDEN("hidden","闅愯棌鎴栨櫘閫氭枃瀛�"),
+    WEBEDITOR("webeditor","Web缂栬緫鍣�"),
+    SPECIALCHARACTER("specialCharacter","鐗规畩瀛楃");
+
+
+
+    /**
+     * 鏋氫妇鐨勫��
+     */
+    private String value;
+
+    /**
+     * 鏋氫妇鏄剧ず鏂囨湰
+     */
+    private String text;
+
+    /**
+     * 鑾峰彇鏋氫妇鍊�
+     *
+     * @return 鏋氫妇鍊�
+     */
+    @Override
+    public String getValue() {
+        return value;
+    }
+
+    /**
+     * 璁剧疆鏋氫妇鍊�
+     *
+     * @param value 鏋氫妇鍊�
+     */
+    public void setValue(String value) {
+        this.value = value;
+    }
+
+    /**
+     * 鑾峰彇鏋氫妇鏄剧ず鏂囨湰
+     *
+     * @return 鏄剧ず鏂囨湰
+     */
+    @Override
+    public String getText() {
+        return text;
+    }
+
+    /**
+     * 璁剧疆鏄剧ず鏂囨湰
+     *
+     * @param text 鏄剧ず鏂囨湰
+     */
+    public void setText(String text) {
+        this.text = text;
+    }
+    ItemTypeEnum(String value, String text) {
+        this.value = value;
+        this.text = text;
+    }
+
+
+    /**
+     * 鏍规嵁鍚嶇О鑾峰彇瀵瑰簲鐨勬灇涓惧��
+     *
+     * @param text 鍚嶇О
+     * @return 鏋氫妇鍊�
+     */
+    public static String getValueByText(String text) {
+        for (ItemTypeEnum wenum : ItemTypeEnum.values()) {
+            if (wenum.getText().equalsIgnoreCase(text)) {
+                return wenum.getValue();
+            }
+        }
+        return "";
+    }
+
+    /**
+     * 鏍规嵁鏋氫妇鍊艰幏鍙栧悕绉�
+     *
+     * @param value 鏋氫妇鍊�
+     * @return 鍚嶇О
+     */
+    public static String getTextByValue(String value) {
+        for (ItemTypeEnum wenum : ItemTypeEnum.values()) {
+            if (wenum.getValue().equalsIgnoreCase(value)) {
+                return wenum.getText();
+            }
+        }
+        return "";
+    }
+    /**
+     * 鏍规嵁鏋氫妇鍊艰幏鍙栨灇涓惧璞�
+     *
+     * @param value 鏋氫妇鍊�
+     * @return 鏋氫妇瀵硅薄锛屼笉瀛樺湪鏃跺�欒繑鍥瀗ull
+     */
+    public static ItemTypeEnum forValue(String value) {
+        for (ItemTypeEnum wenum : ItemTypeEnum.values()) {
+            if (wenum.getValue().equalsIgnoreCase(value)) {
+                return wenum;
+            }
+        }
+        return null;
+    }
+    /**
+     * 鏍规嵁鏋氫妇鍊艰幏鍙栧悕绉�
+     *
+     * @return 鍚嶇О
+     */
+    public static List<KeyValue> getEnumAll() {
+        List<KeyValue> enumDataList=new ArrayList<>();
+        for (ItemTypeEnum wenum : ItemTypeEnum.values()) {
+            KeyValue enumData=new KeyValue();
+            enumData.setKey(wenum.value);
+            enumData.setValue(wenum.text);
+            enumDataList.add(enumData);
+        }
+        return enumDataList;
+    }
+}
diff --git a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/enumpck/PortalVIType.java b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/enumpck/PortalVIType.java
new file mode 100644
index 0000000..62b23ab
--- /dev/null
+++ b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/enumpck/PortalVIType.java
@@ -0,0 +1,85 @@
+package com.vci.web.enumpck;
+
+import com.vci.common.portal.enums.GetByType;
+
+/**
+ * 琛ㄥ崟绫诲瀷
+ * @author xiej
+ *
+ */
+public enum PortalVIType {
+	Form("Form", "琛ㄥ崟", (short)1),
+	Table("Table", "琛ㄦ牸", (short)0);
+	
+	private String name = "";
+	private String label = "";
+	private short intVal = 1;
+	
+	private PortalVIType(String name, String label, short intVal){
+		this.name = name;
+		this.label = label;
+		this.intVal = intVal;
+	}
+	
+	public static PortalVIType getByName(String name){
+		PortalVIType res = getByType(GetByType.Name, name);
+		return res;
+	}
+	
+	public static PortalVIType getByLabel(String label){
+		PortalVIType res = getByType(GetByType.Label, label);
+		return res;
+	}
+	
+	public static PortalVIType getByIntVal(int intVal){
+		PortalVIType res = getByType(GetByType.IntVal, String.valueOf(intVal));
+		return res;
+	}
+	
+	public static PortalVIType getByType(GetByType type, String val){
+		PortalVIType[] alls = getAll();
+		PortalVIType res = null;
+		for(PortalVIType obj : alls){
+			if(type == GetByType.Name && obj.getName().equalsIgnoreCase(val)){
+				res = obj;
+				break;
+			} else if(type  == GetByType.Label && obj.getLabel().equalsIgnoreCase(val)){
+				res = obj;
+				break;
+			} else if(type  == GetByType.IntVal && String.valueOf(obj.getIntVal()).equalsIgnoreCase(val)){
+				res = obj;
+				break;
+			}
+		}
+		return res;
+	}
+	
+	public static PortalVIType[] getAll(){
+		return PortalVIType.values();
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public String getLabel() {
+		return label;
+	}
+
+	public void setLabel(String label) {
+		this.label = label;
+	}
+
+	public short getIntVal() {
+		return intVal;
+	}
+
+	public void setIntVal(short intVal) {
+		this.intVal = intVal;
+	}
+	
+}
diff --git a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/enumpck/PortalVITypeFlag.java b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/enumpck/PortalVITypeFlag.java
new file mode 100644
index 0000000..8051091
--- /dev/null
+++ b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/enumpck/PortalVITypeFlag.java
@@ -0,0 +1,85 @@
+package com.vci.web.enumpck;
+
+import com.vci.common.portal.enums.GetByType;
+
+/**
+ * 琛ㄥ崟鏍囪绫诲瀷
+ * @author xiej
+ *
+ */
+public enum PortalVITypeFlag {
+	LinkType("LinkType", "閾炬帴绫诲瀷鐨勮〃鍗�", (short)1),
+	BtmType("BtmType", "涓氬姟绫诲瀷鐨勮〃鍗�", (short)0);
+	
+	private String name = "";
+	private String label = "";
+	private short intVal = 1;
+	
+	private PortalVITypeFlag(String name, String label, short intVal){
+		this.name = name;
+		this.label = label;
+		this.intVal = intVal;
+	}
+	
+	public static PortalVITypeFlag getByName(String name){
+		PortalVITypeFlag res = getByType(GetByType.Name, name);
+		return res;
+	}
+	
+	public static PortalVITypeFlag getByLabel(String label){
+		PortalVITypeFlag res = getByType(GetByType.Label, label);
+		return res;
+	}
+	
+	public static PortalVITypeFlag getByIntVal(int intVal){
+		PortalVITypeFlag res = getByType(GetByType.IntVal, String.valueOf(intVal));
+		return res;
+	}
+	
+	public static PortalVITypeFlag getByType(GetByType type, String val){
+		PortalVITypeFlag[] alls = getAll();
+		PortalVITypeFlag res = null;
+		for(PortalVITypeFlag obj : alls){
+			if(type == GetByType.Name && obj.getName().equalsIgnoreCase(val)){
+				res = obj;
+				break;
+			} else if(type  == GetByType.Label && obj.getLabel().equalsIgnoreCase(val)){
+				res = obj;
+				break;
+			} else if(type  == GetByType.IntVal && String.valueOf(obj.getIntVal()).equalsIgnoreCase(val)){
+				res = obj;
+				break;
+			}
+		}
+		return res;
+	}
+	
+	public static PortalVITypeFlag[] getAll(){
+		return PortalVITypeFlag.values();
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public String getLabel() {
+		return label;
+	}
+
+	public void setLabel(String label) {
+		this.label = label;
+	}
+
+	public short getIntVal() {
+		return intVal;
+	}
+
+	public void setIntVal(short intVal) {
+		this.intVal = intVal;
+	}
+	
+}
diff --git a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/other/ExportActionLogBean.java b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/other/ExportActionLogBean.java
new file mode 100644
index 0000000..231908c
--- /dev/null
+++ b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/other/ExportActionLogBean.java
@@ -0,0 +1,156 @@
+package com.vci.web.other;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+public class ExportActionLogBean implements IExportLogBean {
+    /**
+	 * 
+	 */
+	private static final long serialVersionUID = 10086L;
+	private String no = "1";
+    private static int index = 1;
+    private String exportState = "姝e父";
+    private String coding = "";
+    private String name ="";
+    private String CSRegister = "";
+    private String BSRegister = "";
+    private String type = "";
+    private String description = "";
+    private String category = "";
+    private Date date = null;
+    private SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss ");
+    
+    public ExportActionLogBean() {
+    
+    	   this( "-1", "ExportActionLogBean 瀵硅薄鏋勫缓 浣嗘湭璁剧疆鍊�", "null",
+    				 "null", "null",  "null",  "null",
+    				 "null",  "null" );
+    	   index = 1;
+    
+    }
+    public ExportActionLogBean(String exportState, String coding,
+    		String name, String cSRegister, String bSRegister, String type,
+    		String description, String category) {
+    	  this( ""+index++, exportState, coding,
+    			  name, cSRegister, bSRegister,type,
+    			  description,category);
+    }
+	public ExportActionLogBean(String no, String exportState, String coding,
+			String name, String cSRegister, String bSRegister, String type,
+			String description, String category) {
+		super();
+		this.no = no;
+		if( exportState!=null || !no.equals("-1")){//榛樿鐘舵�佷负姝e父
+			this.exportState = exportState;
+		}
+		
+		this.coding = coding;
+		this.name = name;
+		CSRegister = cSRegister;
+		BSRegister = bSRegister;
+		this.type = type;
+		this.description = description;
+		this.category = category;
+	}
+
+	@Override
+	public Object[] getLogRowObjcets() {
+		Object obj []=  {no,exportState,coding,name,CSRegister,BSRegister,type,description,category};
+		return obj;
+	}
+
+	public Object[] getInportLogRowObjcets() {
+		Object obj []=  {no,exportState,coding,name,CSRegister,BSRegister,type,description};
+		return obj;
+	}
+
+	public String getNo() {
+		return no;
+	}
+
+	public String getExportState() {
+		return exportState;
+	}
+
+
+
+	public String getName() {
+		return name;
+	}
+
+	public String getCSRegister() {
+		return CSRegister;
+	}
+
+	public String getBSRegister() {
+		return BSRegister;
+	}
+
+	public String getType() {
+		return type;
+	}
+
+	public String getDescription() {
+		return description;
+	}
+
+	public String getCategory() {
+		return category;
+	}
+
+	public void setNo(String no) {
+		this.no = no;
+	}
+
+	public void setExportState(String exportState) {
+		this.exportState = exportState;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public void setCSRegister(String cSRegister) {
+		CSRegister = cSRegister;
+	}
+
+	public void setBSRegister(String bSRegister) {
+		BSRegister = bSRegister;
+	}
+
+	public void setType(String type) {
+		this.type = type;
+	}
+
+	public void setDescription(String description) {
+		this.description = description;
+	}
+
+	public void setCategory(String category) {
+		this.category = category;
+	}
+
+	@Override
+	public String getLogRowContent() {
+		date = new Date();
+		String info =format.format(date)+"---------";
+		return info+" [搴忓彿=" + no + ", 瀵煎嚭鐘舵��=" + exportState
+				+ ", 缂栧彿=" + coding + ", 鍚嶇О=" + name + ", CS娉ㄥ唽="
+				+ CSRegister + ", BS娉ㄥ唽=" + BSRegister + ", 绫诲瀷=" + type
+				+ ", 鎻忚堪=" + description + ", 鎵�灞炲垎绫�=" + category
+				+ "]";
+	
+	}
+
+	public String getCoding() {
+		return coding;
+	}
+
+	public void setCoding(String coding) {
+		this.coding = coding;
+	}
+
+
+
+ 
+}
diff --git a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/other/ExportBeans.java b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/other/ExportBeans.java
new file mode 100644
index 0000000..109e2cc
--- /dev/null
+++ b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/other/ExportBeans.java
@@ -0,0 +1,153 @@
+package com.vci.web.other;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map.Entry;
+import com.vci.corba.portal.data.PLAction;
+import com.vci.corba.portal.data.PLActionCls;
+import com.vci.corba.portal.data.PLActionParam;
+
+
+public class ExportBeans implements Serializable{
+	private static final long serialVersionUID = 10086L;
+	private HashMap<String/*ActionId*/,PLAction>   PLActionBeans = new  HashMap<String,PLAction>();
+	private HashMap<String/*鍒嗙被鍚嶇О*/,String/*id*/> PLActionClsExt = new  HashMap<String,String>();
+	private HashMap<String/*id*/,PLActionCls>   PLActionClsBeans = new  HashMap<String,PLActionCls>();
+	private HashMap<String/*Action缂栫爜*/, ArrayList<PLActionParam> >   PLActionParamBeans = new  HashMap<String, ArrayList<PLActionParam> >();
+	private HashMap<String/*ActionCls缂栫爜*/, ArrayList<PLAction> >   PLActionListsMap = null;
+    private ExportActionLogBean logBean = null;//鏃ュ織鏂囦欢
+     
+	public ExportBeans() { 
+		
+		logBean = new ExportActionLogBean();
+	}
+	public HashMap<String, PLActionCls> getPLActionClsBeans() {
+		return PLActionClsBeans;
+	}
+	public HashMap<String, PLAction> getPLActions() {
+		return PLActionBeans;
+	}
+	
+	public void addPLActionClsBean(PLActionCls pLActionCls){
+		PLActionClsBeans.put(pLActionCls.id, pLActionCls);
+		PLActionClsExt.put(pLActionCls.name,pLActionCls.id);
+		
+	}
+	public PLActionCls getPLActionClsBeanById(String  id){
+		return PLActionClsBeans.get(id);
+	}
+	public PLActionCls getPLActionClsBeanByName(String  name){
+		if(PLActionClsExt.get(name) == null){
+			return null;
+		}
+		return PLActionClsBeans.get(PLActionClsExt.get(name));
+	}
+	/**
+	 * 娣诲姞PLActionBean骞跺悓鏃舵坊鍔燩LActionBean瀵瑰簲鍙傛暟杩涜璁板綍
+	 * @param pLAction
+	 */
+//	public void addPLActionBean(PLAction pLAction){
+//		this.addPLActionBean(pLAction,null);
+//	}
+	/**
+	 * 娣诲姞PLActionBean鍚� logBean瀛樺叆鍊�
+	 * 
+	 */
+	public void setLogBean(ExportActionLogBean logBean) {
+		this.logBean =  logBean;
+	}
+	/**
+	 * 娣诲姞PLActionBean鍚� logBean瀛樺叆鍊�
+	 *
+	 */
+	public ExportActionLogBean getLogBean() {
+		return logBean;
+	}
+
+	public PLAction getPLActionById(String pLActionId){
+		return PLActionBeans.get(pLActionId);
+	}
+	public ArrayList<PLAction> getPLActionByPlActionClsId(String plActionClsId){
+		if( PLActionListsMap == null){
+			PLActionListsMap = new HashMap<String/*ActionCls缂栫爜*/,ArrayList<PLAction>>(); 
+			for (Entry<String, PLAction> PLActionEntry : PLActionBeans.entrySet()) {
+				String PLActionListsMapKey = PLActionEntry.getValue().plActionCls ;
+				if(PLActionListsMapKey.equals("")){
+					PLActionListsMapKey = "when key is null ,change the key to this";
+				}
+				ArrayList<PLAction> actionList = PLActionListsMap.get(PLActionListsMapKey);
+				if( actionList == null){
+					 actionList = 	new ArrayList<PLAction>();
+					actionList.add(PLActionEntry.getValue());
+					PLActionListsMap.put(PLActionListsMapKey,actionList);
+				}else{
+					actionList.add(PLActionEntry.getValue());
+				}
+			
+			}
+		};
+		
+		if(plActionClsId.equals("")){
+			plActionClsId = "when key is null ,change the key to this";
+		}
+		return 	PLActionListsMap.get(plActionClsId);
+	}
+	public void addPLActionParamBean(PLActionParam pLActionParam){
+		if(pLActionParam.action!=null && pLActionParam.action!=""){
+			if(PLActionParamBeans.get(pLActionParam.action) == null){
+				ArrayList<PLActionParam> arraylist = new ArrayList<PLActionParam>();
+				PLActionParamBeans.put(pLActionParam.action, arraylist);
+			}
+			PLActionParamBeans.get(pLActionParam.action).add(pLActionParam);
+		}
+		
+	}
+	 public  PLActionParam[] getPLActionParamArrayByActionId(String paramString){
+		 ArrayList<PLActionParam> pLActionParams = PLActionParamBeans.get(paramString);
+		
+		 if(pLActionParams != null && pLActionParams.size() > 0 ){
+		    PLActionParam[] actionParams = new PLActionParam[pLActionParams.size()];
+			for (int i = 0; i < pLActionParams.size(); i++) {
+				actionParams[i] = pLActionParams.get(i);				
+			}
+			 return  actionParams;
+		 }
+		return null;
+	 }
+//		/**
+//		 * 娣诲姞PLActionBean骞跺悓鏃舵坊鍔燩LActionBean瀵瑰簲鍙傛暟杩涜璁板綍
+//		 * 鑳借繃鏂逛究鑾峰緱category鏃剁敤姝ゆ柟娉�. 鍙互闄嶄綆绯荤粺娑堣��
+//		 * @param pLAction
+//		 */
+//	public void addPLActionBean(PLAction plAction, String category) {
+//		PLActionBeans.put(plAction.plOId, plAction);
+//		PLActionCls[] plActionCls = null;
+//
+//		try {
+//			  if(category == null ){
+//				  plActionCls = UITools.getService().getPLActionClsArray();
+//					for (PLActionCls plActionCls2 : plActionCls) {//鑾峰緱鍒嗙被鍚嶇О
+//						if(plActionCls2.id.equals(plAction.plActionCls)){
+//							category = plActionCls2.name ;
+//						}
+//					}
+//		        }
+//			PLActionParam[] params = UITools.getService().getPLActionParamArrayByActionId(plAction.plOId);
+//			if(params != null && params.length > 0){//濡傛灉鍙傛暟瀛樺湪
+//				for (PLActionParam plActionParam : params) {//娣诲姞action鍙傛暟
+//					this.addPLActionParamBean(plActionParam);
+//				}
+//			}
+//			 logBean = new ExportActionLogBean(ExportActionLogBean.RIGHT_STATE,
+//						plAction.plCode,plAction.plName,plAction.plCSClass,plAction.plBSUrl,
+//						plAction.plTypeType,plAction.plDesc,category);
+//
+//		} catch (PLException e) {
+//			 logBean = new ExportActionLogBean(e.getMessage(),
+//						plAction.plCode,plAction.plName,plAction.plCSClass,plAction.plBSUrl,
+//						plAction.plTypeType,plAction.plDesc,category);			e.printStackTrace();
+//		}
+//	}
+
+}
\ No newline at end of file
diff --git a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/other/IExportLogBean.java b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/other/IExportLogBean.java
new file mode 100644
index 0000000..d35d27a
--- /dev/null
+++ b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/other/IExportLogBean.java
@@ -0,0 +1,19 @@
+package com.vci.web.other;
+
+import java.io.Serializable;
+
+public interface IExportLogBean extends Serializable{
+	static final long serialVersionUID = 1L;
+	 static String RIGHT_STATE = "姝e父";
+	/**
+	 * 杩斿洖瀛楃涓叉暟缁勫皢鍐呭鍐欏叆鍒癑Table鏂囦欢涓�
+	 * @return
+	 */
+	public abstract Object[] getLogRowObjcets();
+	/**
+	 * 杩斿洖瀛楃涓插皢鍐呭鍐欏叆鍒發og鏂囦欢涓�
+	 * @return
+	 */
+	public abstract String getLogRowContent();
+
+}
\ No newline at end of file
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
index 840d4f0..0efe596 100644
--- 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
@@ -17,20 +17,75 @@
     /**
      * 鑿滃崟json閰嶇疆鏂囦欢锛屽鏈夊叾浠栭渶瑕佽鍙栫殑锛屽彲浠ヤ豢鐓у綋鍓嶉�昏緫缂栧啓
      */
-    private static MenuVO menuVO;
+    private static sysModuleConf sysModuleConf;
 
     static{
         try {
             File file = ResourceUtils.getFile("classpath:menuConfig.json");
             String json = FileUtils.readFileToString(file, "UTF-8");
-            menuVO = JSON.parseObject(json, MenuVO.class);
+            sysModuleConf = JSON.parseObject(json, sysModuleConf.class);
         }catch (IOException e) {
             e.printStackTrace();
         }
     }
 
-    public static MenuVO getMenuVO() {
-        return menuVO;
+    public static sysModuleConf getSysModuleConf() {
+        return sysModuleConf;
+    }
+
+    public static class sysModuleConf {
+
+        /**
+         * 绯荤粺妯″潡閰嶇疆
+         */
+        private MenuVO sysModuleNode;
+
+        /**
+         * 绠$悊鍔熻兘妯″潡
+         */
+        private MenuVO systemManagmentNode;
+
+        /**
+         * 涓氬姟鍔熻兘妯″潡
+         */
+        private MenuVO modelManagmentNode;
+
+        /**
+         * 鎿嶄綔绫诲瀷妯″潡
+         */
+        private MenuVO operateNode;
+
+        public void setSysModuleNode(MenuVO sysModuleNode) {
+            this.sysModuleNode = sysModuleNode;
+        }
+
+        public void setSystemManagmentNode(MenuVO systemManagmentNode) {
+            this.systemManagmentNode = systemManagmentNode;
+        }
+
+        public void setModelManagmentNode(MenuVO modelManagmentNode) {
+            this.modelManagmentNode = modelManagmentNode;
+        }
+
+        public MenuVO getSysModuleNode() {
+            return sysModuleNode;
+        }
+
+        public MenuVO getSystemManagmentNode() {
+            return systemManagmentNode;
+        }
+
+        public MenuVO getModelManagmentNode() {
+            return modelManagmentNode;
+        }
+
+        public void setOperateNode(MenuVO operateNode) {
+            this.operateNode = operateNode;
+        }
+
+        public MenuVO getOperateNode() {
+            return operateNode;
+        }
     }
 
 }
diff --git a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/OsActionServiceI.java b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/OsActionServiceI.java
new file mode 100644
index 0000000..26e0397
--- /dev/null
+++ b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/OsActionServiceI.java
@@ -0,0 +1,68 @@
+package com.vci.web.service;
+
+import com.vci.corba.common.PLException;
+import com.vci.dto.PLActionClsDTO;
+import com.vci.dto.PLActionDTO;
+import com.vci.dto.PLActionQueryDTO;
+import com.vci.starter.web.pagemodel.BaseResult;
+import org.springframework.web.bind.annotation.RequestBody;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.util.List;
+
+/**
+ * Action绠$悊鐨勬湇鍔�
+ * @author yuxc
+ * @date 2024-8-16
+ */
+public interface OsActionServiceI {
+    /**
+     * 淇濆瓨Action鍒嗙被淇℃伅
+     * @param pLActionCls Action鍒嗙被淇℃伅
+     * @return 淇濆瓨缁撴灉
+     */
+    BaseResult saveActionCls(PLActionClsDTO pLActionCls) throws PLException;
+    /**
+     * 淇敼Action鍒嗙被淇℃伅
+     * @param pLActionCls Action鍒嗙被淇℃伅
+     * @return 淇敼缁撴灉
+     */
+    BaseResult updateActionCls(PLActionClsDTO pLActionCls) throws PLException;
+    /**
+     * 鑾峰彇Action鍒嗙被鏍�
+     * isExp 鏄惁鐢ㄦ埛瀵煎嚭 true鏄紝false鍚�
+     * @return 鏌ヨ缁撴灉
+     */
+    BaseResult getActionTree(boolean isExp) throws PLException;
+    /**
+     * 鑾峰彇Action琛ㄦ牸鏁版嵁
+     * dto 鏌ヨ鏉′欢
+     * @return 鏌ヨ缁撴灉
+     */
+    BaseResult getActionTableData(PLActionQueryDTO dto) throws PLException;
+    /**
+     * 淇濆瓨Action鏁版嵁
+     * dto action浼犺緭瀵硅薄
+     * @return 淇濆瓨缁撴灉
+     */
+    BaseResult saveAction(PLActionDTO dto) throws PLException;
+    /**
+     * 淇敼Action鏁版嵁
+     * dto action浼犺緭瀵硅薄
+     * @return 淇敼缁撴灉
+     */
+    BaseResult updateAction(PLActionDTO dto) throws PLException;
+    /**
+     * 鍒犻櫎Action鏁版嵁
+     * dto action浼犺緭瀵硅薄
+     * @return 鍒犻櫎缁撴灉
+     */
+    BaseResult deleteAction(PLActionDTO dto) throws PLException;
+    /**
+     * 瀵煎嚭Action
+     * @return
+     */
+    void exportBeans(List<String> actionOid, HttpServletResponse response) throws PLException, IOException;
+}
diff --git a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/OsBaseServiceI.java b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/OsBaseServiceI.java
index 841f993..445cb70 100644
--- a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/OsBaseServiceI.java
+++ b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/OsBaseServiceI.java
@@ -123,7 +123,9 @@
             pageHelper = new PageHelper(-1);
         }
         //鏈夐渶瑕佽浆鎹㈢殑灞炴��
-        pageHelper.addDefaultAsc("name");
+        if(StringUtils.isBlank(pageHelper.getSort()) && StringUtils.isBlank(pageHelper.getOrder())) {//濡傛灉娌℃湁璁剧疆鎺掑簭瀛楁锛屽垯榛樿涓�涓�
+            pageHelper.addDefaultAsc("name");
+        }
         VciQueryWrapperForDO queryWrapperForDO = new VciQueryWrapperForDO(baseQueryObject.getConditionMap(), tClass,pageHelper);
         queryWrapperForDO.setConditionMap(queryWrapperForDO.switchConditionMap());
         queryWrapperForDO.wrapperSql();
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 1256d2a..964b250 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
@@ -275,7 +275,7 @@
 
     /**
      * 瀵煎嚭涓氬姟绫诲瀷
-     * name 涓氬姟绫诲瀷鍚嶇О
+     * oid 涓氬姟绫诲瀷鍚嶇О
      * @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/OsPortalVIServiceI.java b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/OsPortalVIServiceI.java
new file mode 100644
index 0000000..45125b2
--- /dev/null
+++ b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/OsPortalVIServiceI.java
@@ -0,0 +1,79 @@
+package com.vci.web.service;
+import com.vci.corba.portal.data.PortalVI;
+import com.vci.dto.PortalVIDTO;
+import com.vci.pagemodel.PortalVIVO;
+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 java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 琛ㄥ崟/琛ㄦ牸鏈嶅姟
+ * @author weidy
+ * @date 2021-2-14
+ */
+public interface OsPortalVIServiceI extends OsBaseServiceI{
+
+    /**
+     * 琛ㄥ崟/琛ㄦ牸鐨勫垪琛�
+     * @param baseQueryObject 鏌ヨ瀵硅薄
+     * @return 閾炬帴绫诲瀷鐨勬樉绀哄璞�
+     */
+    DataGrid<PortalVIVO> gridPortalVIVOs(BaseQueryObject baseQueryObject);
+
+    /***
+     * 娣诲姞琛ㄥ崟/琛ㄦ牸
+     * @param portalVIDTO
+     * @return
+     * @throws VciBaseException
+     */
+    BaseResult add(PortalVIDTO portalVIDTO) throws VciBaseException;
+
+    /***
+     * 鏇存敼琛ㄥ崟/琛ㄦ牸
+     * @param portalVIDTO
+     * @return
+     * @throws VciBaseException
+     */
+    BaseResult edit(PortalVIDTO portalVIDTO) throws VciBaseException;
+
+    /**
+     *鏌ヨ鎵�鏈夎〃鍗曟垨鑰呰〃鏍�
+     * @return key 鏄敓鍛藉懆鏈熺殑缂栧彿鐨勮嫳鏂囧皬鍐�
+     * @throws VciBaseException 鏌ヨ鐨勬椂鍊欏嚭閿欎細鎶涘嚭寮傚父
+     */
+    Map<String, PortalVIVO> selectAllPortalVIMap() throws VciBaseException;
+
+
+
+    /**
+     * 琛ㄥ崟鐨勬暟鎹璞¤浆鎹负鏄剧ず瀵硅薄
+     * @param portalVIS 鏋氫妇鐨勫璞�
+     * @return 鏄剧ず瀵硅薄
+     */
+    List<PortalVIVO> portalVIDOO2VOS(Collection<PortalVI> portalVIS);
+
+    /**
+     * 琛ㄥ崟鐨勬暟鎹璞¤浆鎹负鏄剧ず瀵硅薄
+     * @param portalVI 鏁版嵁瀵硅薄
+     * @return 鏄剧ず瀵硅薄
+     */
+    PortalVIVO portalVIDOO2VO(PortalVI portalVI);
+
+    /***
+     * DTO杞垚PortalVI
+     * @param portalVIDTOS
+     * @return
+     */
+    public List<PortalVI> portalVIDTOO2VIS(Collection<PortalVIDTO> portalVIDTOS);
+    /***
+     * DTO杞垚PortalVI
+     * @param portalVIDTO
+     * @return
+     */
+    public   PortalVI portalVIDTOO2VI(PortalVIDTO portalVIDTO);
+}
diff --git a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/OsActionServiceImpl.java b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/OsActionServiceImpl.java
new file mode 100644
index 0000000..0ce7bef
--- /dev/null
+++ b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/OsActionServiceImpl.java
@@ -0,0 +1,405 @@
+package com.vci.web.service.impl;
+import cn.hutool.core.io.FileUtil;
+import com.vci.corba.common.PLException;
+import com.vci.corba.omd.ltm.LinkType;
+import com.vci.corba.omd.qtm.QTInfo;
+import com.vci.corba.portal.data.Constraint;
+import com.vci.corba.portal.data.PLAction;
+import com.vci.corba.portal.data.PLActionCls;
+import com.vci.corba.portal.data.PLActionParam;
+import com.vci.dto.PLActionClsDTO;
+import com.vci.dto.PLActionDTO;
+import com.vci.dto.PLActionQueryDTO;
+import com.vci.starter.web.pagemodel.BaseResult;
+import com.vci.starter.web.util.ControllerUtil;
+import com.vci.starter.web.util.LocalFileUtil;
+import com.vci.web.other.ExportActionLogBean;
+import com.vci.web.other.ExportBeans;
+import com.vci.web.other.LinkQTExportData;
+import com.vci.web.service.*;
+import com.vci.web.util.*;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.web.bind.annotation.RequestBody;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.*;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * Action绠$悊鐨勬湇鍔″疄鐜扮被
+ * @author yuxc
+ * @date 2024-8-16
+ */
+@Service
+public class OsActionServiceImpl implements OsActionServiceI {
+
+    @Autowired
+    private PlatformClientUtil platformClientUtil;
+    /**
+     * 淇濆瓨Action鍒嗙被淇℃伅
+     * @param pLActionCls Action鍒嗙被淇℃伅
+     * @return 淇濆瓨缁撴灉
+     */
+    @Override
+    public BaseResult saveActionCls(PLActionClsDTO pLActionCls) throws PLException {
+
+        if (pLActionCls.getName() == null || pLActionCls.getName().trim().equals("")) {
+            throw new PLException("500", new String[]{"鍒嗙被鍚嶇О涓嶈兘涓虹┖!"});
+        }
+        if (pLActionCls.getName().equals("鏈垎绫�")) {
+            throw new PLException("500", new String[]{"鏈垎绫昏妭鐐瑰凡缁忓瓨鍦�!"});
+        }
+        PLActionCls pac = new PLActionCls();
+        pac.id = WebUtil.getSnowflakePk();
+        pac.name = pLActionCls.getName();
+        pac.pid = pLActionCls.getPid();
+        pac.description = pLActionCls.getDescription() == null ? "" : pLActionCls.getDescription();
+        pac.creator = WebUtil.getCurrentUserId();
+        pac.createTime = System.currentTimeMillis();
+        pac.serialno = pLActionCls.getSerialno();
+        // 淇濆瓨鍒嗙被淇℃伅
+        String message = platformClientUtil.getUIService().creaetePLActionCls(pac);
+        if (message.startsWith("0")) {
+            if (message.equals("01")) {
+                message = "鍒嗙被" + pac.name + "宸茬粡瀛樺湪锛�";
+            } else if (message.equals("02")) {
+                message = "鍚屼竴鍒嗙被涓嬪簭鍙蜂笉鑳介噸澶嶏紒";
+            } else {
+                message = "淇濆瓨鍒嗙被鏃跺彂鐢熷紓甯革紒" + message.substring(1);
+            }
+            throw new PLException("500", new String[]{message});
+        }
+        return BaseResult.success("鍒嗙被鍒涘缓鎴愬姛锛�");
+    }
+
+    /**
+     * 淇敼Action鍒嗙被淇℃伅
+     * @param pLActionCls Action鍒嗙被淇℃伅
+     * @return 淇濆瓨缁撴灉
+     */
+    @Override
+    public BaseResult updateActionCls(PLActionClsDTO pLActionCls) throws PLException {
+
+        if (pLActionCls.getName() == null || pLActionCls.getName().trim().equals("")) {
+            throw new PLException("500", new String[]{"鍒嗙被鍚嶇О涓嶈兘涓虹┖!"});
+        }
+        if (pLActionCls.getName().equals("鏈垎绫�")) {
+            throw new PLException("500", new String[]{"鏈垎绫昏妭鐐瑰凡缁忓瓨鍦�!"});
+        }
+        if (pLActionCls.getId() == null || pLActionCls.getId().trim().equals("")) {
+            throw new PLException("500", new String[]{"涓婚敭涓嶈兘涓虹┖!"});
+        }
+        PLActionCls pac = new PLActionCls();
+        pac.name = pLActionCls.getName();
+        pac.pid = pLActionCls.getPid();
+        pac.description = pLActionCls.getDescription() == null ? "" : pLActionCls.getDescription();
+        pac.creator = WebUtil.getCurrentUserId();
+        pac.createTime = System.currentTimeMillis();
+        pac.serialno = pLActionCls.getSerialno();
+        // 淇敼鍒嗙被淇℃伅
+        String message = platformClientUtil.getUIService().editPLActionCls(pac);
+        if (message.startsWith("0")) {
+            if (message.equals("01")) {
+                message = "鍒嗙被" + pac.name + "宸茬粡瀛樺湪锛�";
+            } else if (message.equals("02")) {
+                message = "鍚屼竴鍒嗙被涓嬪簭鍙蜂笉鑳介噸澶嶏紒";
+            } else {
+                message = "淇敼鍒嗙被鏃跺彂鐢熷紓甯革紒" + message.substring(1);
+            }
+            throw new PLException("500", new String[]{message});
+        }
+        return BaseResult.success("鍒嗙被淇敼鎴愬姛锛�");
+    }
+
+    /**
+     * 鑾峰彇Action鍒嗙被鏍�
+     * isExp 鏄惁鐢ㄦ埛瀵煎嚭 true鏄紝false鍚�
+     * @return 鏌ヨ缁撴灉
+     */
+    @Override
+    public BaseResult getActionTree(boolean isExp) throws PLException {
+        PLActionCls[] clses = platformClientUtil.getUIService().getPLActionClsArray();
+        PLActionClsDTO treDto = new PLActionClsDTO();
+        treDto.setName("Action鍒嗙被");
+        Map<String, List<PLActionCls>> allDataMap = Arrays.stream(clses).collect(Collectors.groupingBy(pl -> pl.pid));
+
+        for (PLActionCls cls : clses) {
+            if (StringUtils.isBlank(cls.pid)) {
+                PLActionClsDTO parentDto = new PLActionClsDTO();
+                parentDto.setId(cls.id);
+                parentDto.setName(cls.name);
+                parentDto.setPid(cls.pid);
+                parentDto.setDescription(cls.description);
+                parentDto.setCreator(cls.creator);
+                parentDto.setCreateTime(cls.createTime);
+                parentDto.setSerialno(cls.serialno);
+                //杩欓噷澶勭悊瀵煎嚭鏍戠殑閫昏緫
+                if(isExp){
+                    Constraint[] consArray = new Constraint[1];
+                    consArray[0] =  new Constraint("plactioncls", cls.id);
+                    PLAction[] plActionsByConsArray = platformClientUtil.getUIService().getPLActionsByConsArray(consArray);
+                    if(parentDto.getChilds().isEmpty() && plActionsByConsArray.length == 0){
+                        continue;
+                    }
+                    for (PLAction plAction : plActionsByConsArray) {
+                        PLActionDTO plActionDTO = new PLActionDTO();
+                        plActionDTO.setPlName(plAction.plCode + "/" + plAction.plName);
+                        plActionDTO.setPlCode(plAction.plCode);
+                        plActionDTO.setPlOId(plAction.plOId);
+                        parentDto.getActionChilds().add(plActionDTO);
+                    }
+                }
+                addClsTreeNode(parentDto, allDataMap, isExp);
+                treDto.getChilds().add(parentDto);
+            }
+        }
+        PLActionClsDTO plac = new PLActionClsDTO();
+        plac.setName("鏈垎绫�");
+        if(isExp){
+            Constraint[] consArray = new Constraint[1];
+            consArray[0] =  new Constraint("plactioncls", "");
+            PLAction[] plActionsByConsArray = platformClientUtil.getUIService().getPLActionsByConsArray(consArray);
+            for (PLAction plAction : plActionsByConsArray) {
+                PLActionDTO plActionDTO = new PLActionDTO();
+                plActionDTO.setPlName(plAction.plCode + "/" + plAction.plName);
+                plActionDTO.setPlCode(plAction.plCode);
+                plActionDTO.setPlOId(plAction.plOId);
+                plac.getActionChilds().add(plActionDTO);
+            }
+        }
+        treDto.getChilds().add(plac);
+        return BaseResult.success(treDto);
+    }
+    /**
+     * 鑾峰彇Action琛ㄦ牸鏁版嵁
+     * dto 鏌ヨ鏉′欢
+     * @return 鏌ヨ缁撴灉
+     */
+    @Override
+    public BaseResult getActionTableData(PLActionQueryDTO dto) throws PLException {
+        Constraint[] consArray ;
+        if(StringUtils.isNotBlank(dto.getPlactioncls())){
+            consArray = new Constraint[7];
+            consArray[6] = new Constraint("plactioncls", dto.getPlactioncls());
+        }else {
+            consArray = new Constraint[6];
+        }
+        consArray[0] = new Constraint("plcode", dto.getPlcode());
+        consArray[1] = new Constraint("plname", dto.getPlname());
+        consArray[2] = new Constraint("plbsurl", dto.getPlbsurl());
+        consArray[3] = new Constraint("plcsclass", dto.getPlcsclass());
+        consArray[4] = new Constraint("pltypetype", dto.getPltypetype());
+        consArray[5] = new Constraint("pldesc", dto.getPldesc());
+        PLAction[] plActionsByConsArray = platformClientUtil.getUIService().getPLActionsByConsArray(consArray);
+        Arrays.sort(plActionsByConsArray, new Comparator<PLAction>() {
+            @Override
+            public int compare(PLAction o1, PLAction o2) {
+                String py1 = PinyinCommon.getPingYin(o1.plCode);
+                String py2 = PinyinCommon.getPingYin(o2.plCode);
+                return py1.compareTo(py2);
+            }
+        });
+        return BaseResult.dataList(Arrays.asList(plActionsByConsArray));
+    }
+    /**
+     * 淇濆瓨Action鏁版嵁
+     * dto action浼犺緭瀵硅薄
+     * @return 淇濆瓨缁撴灉
+     */
+    @Override
+    public BaseResult saveAction(PLActionDTO dto) throws PLException {
+        if(StringUtils.isBlank(dto.getPlCode())){
+            throw new PLException("500", new String[]{"璇疯緭鍏ョ紪鍙�"});
+        }
+        PLAction[] actionsInDB= platformClientUtil.getUIService().getAllPLAction();
+        for(int i =0;i<actionsInDB.length;i++){
+            if (dto.getPlCode().equals(actionsInDB[i].plCode)) {
+                throw new PLException("500", new String[]{"鏂板缓Action缂栧彿閲嶅锛岃閲嶆柊杈撳叆缂栧彿"});
+            }
+        }
+        PLAction plAction = new PLAction();
+        plAction.plOId = WebUtil.getSnowflakePk();
+        plAction.plCode = StringUtils.defaultString(dto.getPlCode());
+        plAction.plName = StringUtils.defaultString(dto.getPlName());
+        plAction.plCSClass = StringUtils.defaultString(dto.getPlCSClass());
+        plAction.plBSUrl = StringUtils.defaultString(dto.getPlBSUrl());
+        plAction.plDesc = StringUtils.defaultString(dto.getPlDesc());
+        plAction.plCreateUser = WebUtil.getCurrentUserId();
+        plAction.plModifyUser = WebUtil.getCurrentUserId();
+        plAction.plActionCls = StringUtils.defaultString(dto.getPlActionCls());
+        plAction.plTypeType = StringUtils.defaultString(dto.getPlTypeType());
+        boolean b = platformClientUtil.getUIService().savePLAction(plAction);
+        if(!b){
+            throw new PLException("500", new String[]{"淇濆瓨澶辫触锛侊紒"});
+        }
+        return BaseResult.success("鎿嶄綔鎴愬姛锛�");
+    }
+    /**
+     * 淇敼Action鏁版嵁
+     * dto action浼犺緭瀵硅薄
+     * @return 淇敼缁撴灉
+     */
+    @Override
+    public BaseResult updateAction(PLActionDTO dto) throws PLException {
+        if(StringUtils.isBlank(dto.getPlCode())){
+            throw new PLException("500", new String[]{"缂栧彿涓嶈兘涓虹┖"});
+        }
+        PLAction[] actionsInDB= platformClientUtil.getUIService().getAllPLAction();
+        for(int i =0;i<actionsInDB.length;i++){
+            if (dto.getPlCode().equals(actionsInDB[i].plCode) && !dto.getPlOId().equals(actionsInDB[i].plOId)) {
+                throw new PLException("500", new String[]{"淇敼Action缂栧彿閲嶅锛岃纭缂栧彿"});
+            }
+        }
+        PLAction plAction = new PLAction();
+        plAction.plOId = StringUtils.defaultString(dto.getPlOId());
+        plAction.plCode = StringUtils.defaultString(dto.getPlCode());
+        plAction.plName = StringUtils.defaultString(dto.getPlName());
+        plAction.plCSClass = StringUtils.defaultString(dto.getPlCSClass());
+        plAction.plBSUrl = StringUtils.defaultString(dto.getPlBSUrl());
+        plAction.plDesc = StringUtils.defaultString(dto.getPlDesc());
+        plAction.plCreateUser = dto.getPlCreateUser();
+        plAction.plModifyUser = WebUtil.getCurrentUserId();
+        plAction.plActionCls = StringUtils.defaultString(dto.getPlActionCls());
+        plAction.plTypeType = StringUtils.defaultString(dto.getPlTypeType());
+        boolean b = platformClientUtil.getUIService().updatePLAction(plAction);
+        if(!b){
+            throw new PLException("500", new String[]{"淇敼澶辫触锛侊紒"});
+        }
+        return BaseResult.success("淇敼鎴愬姛锛�");
+    }
+
+    /**
+     * 鍒犻櫎Action鏁版嵁
+     * dto action浼犺緭瀵硅薄
+     * @return 鍒犻櫎缁撴灉
+     */
+    @Override
+    public BaseResult deleteAction(PLActionDTO dto) throws PLException {
+        PLAction plAction = new PLAction();
+        plAction.plOId = StringUtils.defaultString(dto.getPlOId());
+        plAction.plCode = StringUtils.defaultString(dto.getPlCode());
+        plAction.plName = StringUtils.defaultString(dto.getPlName());
+        plAction.plCSClass = StringUtils.defaultString(dto.getPlCSClass());
+        plAction.plBSUrl = StringUtils.defaultString(dto.getPlBSUrl());
+        plAction.plDesc = StringUtils.defaultString(dto.getPlDesc());
+        plAction.plCreateUser = dto.getPlCreateUser();
+        plAction.plModifyUser = WebUtil.getCurrentUserId();
+        plAction.plActionCls = StringUtils.defaultString(dto.getPlActionCls());
+        plAction.plTypeType = StringUtils.defaultString(dto.getPlTypeType());
+        boolean b = platformClientUtil.getUIService().deletePLAction(plAction);
+        if(!b){
+            throw new PLException("500", new String[]{"鍒犻櫎澶辫触锛侊紒"});
+        }
+        return BaseResult.success("鍒犻櫎鎴愬姛锛�");
+    }
+    /**
+     * 瀵煎嚭Action
+     * @return
+     */
+    @Override
+    public void exportBeans(List<String> actionOid, HttpServletResponse response) throws PLException, IOException {
+        String defaultTempFolder = LocalFileUtil.getDefaultTempFolder();
+        String vciqtmfFileName = defaultTempFolder + File.separator + "actionTemplateExp" + new Date().getTime() + ".vciamf";
+        HashMap exportBeans = new HashMap<String, Object>();
+        getExportBeans(actionOid, exportBeans);// 鑾峰緱瀵煎嚭Bean鍚屾椂锛岃褰昹og
+
+        ObjectOutputStream vciamfFileStream = null;
+        try {
+            File vciqtmfFile = new File(vciqtmfFileName);
+            vciamfFileStream = new ObjectOutputStream(new FileOutputStream(vciqtmfFile));
+            vciamfFileStream.writeObject(exportBeans);
+        }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 actionOid 鐣岄潰閫夋嫨鐨刟ction鍒楄〃鏁版嵁
+     * @param exportBeansMap 瀵煎嚭瀵硅薄
+     * @return
+     * @throws PLException
+     */
+    private void getExportBeans(List<String> actionOid, HashMap exportBeansMap) throws PLException {
+        PLActionCls[] plActionClsArray = platformClientUtil.getUIService().getPLActionClsArray();
+        Map<String, PLActionCls> clsMap = Arrays.stream(plActionClsArray).collect(Collectors.toMap(e -> e.id, e -> e));
+        ExportBeans exportBeans = new ExportBeans();
+        for (String oid : actionOid) {
+            PLAction plAction = platformClientUtil.getUIService().getPLActionById(oid);
+            //鏈夌埗鑺傜偣鍒欒繘琛屽鐞�
+            if(StringUtils.isNotBlank(plAction.plActionCls)){
+                allPLActionClsParent(exportBeans, clsMap.get(plAction.plActionCls), clsMap);
+            }
+            exportBeans.getPLActions().put(plAction.plOId, plAction);
+            PLActionParam[] params = platformClientUtil.getUIService().getPLActionParamArrayByActionId(plAction.plOId);
+            if(params != null && params.length > 0){//濡傛灉鍙傛暟瀛樺湪
+                for (PLActionParam plActionParam : params) {//娣诲姞action鍙傛暟
+                    exportBeans.addPLActionParamBean(plActionParam);
+                }
+            }
+            String category = clsMap.containsKey(plAction.plActionCls) ? clsMap.get(plAction.plActionCls).name : "";
+            exportBeans.setLogBean(new ExportActionLogBean(ExportActionLogBean.RIGHT_STATE,
+                    plAction.plCode,plAction.plName,plAction.plCSClass,plAction.plBSUrl,
+                    plAction.plTypeType,plAction.plDesc,category));
+        }
+        exportBeansMap.put("exportBeans", exportBeans);
+    }
+    //澧炲姞鐖剁被鏁版嵁
+    private void allPLActionClsParent(ExportBeans exportBeans, PLActionCls cls, Map<String, PLActionCls> clsMap) {
+        if(cls.pid != ""){
+            allPLActionClsParent(exportBeans, clsMap.get(cls.pid), clsMap);
+        }
+        exportBeans.addPLActionClsBean(cls);
+    }
+
+    /**
+     * 娣诲姞瀛愯妭鐐�
+     * @param parentDto 鐖惰妭鐐瑰璞�
+     * @param allDataMap 鎵�鏈夊垎缁勫璞�
+     * @param isExp true涓哄鍑哄姛鑳界殑鏍戯紝false涓虹晫闈㈠垎绫绘爲
+     */
+    private void addClsTreeNode(PLActionClsDTO parentDto, Map<String, List<PLActionCls>> allDataMap, Boolean isExp) throws PLException {
+        if(allDataMap.containsKey(parentDto.id)){
+            for (PLActionCls cls : allDataMap.get(parentDto.id)) {
+                PLActionClsDTO childDto = new PLActionClsDTO();
+                childDto.setId(cls.id);
+                childDto.setName(cls.name);
+                childDto.setPid(cls.pid);
+                childDto.setDescription(cls.description);
+                childDto.setCreator(cls.creator);
+                childDto.setCreateTime(cls.createTime);
+                childDto.setSerialno(cls.serialno);
+                if(isExp){
+                    Constraint[] consArray = new Constraint[1];
+                    consArray[0] =  new Constraint("plactioncls", cls.id);
+                    PLAction[] plActionsByConsArray = platformClientUtil.getUIService().getPLActionsByConsArray(consArray);
+                    if(parentDto.getChilds().isEmpty() && plActionsByConsArray.length == 0){
+                        continue;
+                    }
+                    for (PLAction plAction : plActionsByConsArray) {
+                        PLActionDTO plActionDTO = new PLActionDTO();
+                        plActionDTO.setPlName(plAction.plCode + "/" + plAction.plName);
+                        plActionDTO.setPlCode(plAction.plCode);
+                        plActionDTO.setPlOId(plAction.plOId);
+                        parentDto.getActionChilds().add(plActionDTO);
+                    }
+                }
+                addClsTreeNode(childDto, allDataMap, isExp);
+                parentDto.getChilds().add(childDto);
+            }
+        }
+    }
+
+}
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 3f0f4d3..77fd212 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
@@ -1264,7 +1264,7 @@
 
     /**
      * 瀵煎嚭涓氬姟绫诲瀷
-     * name 涓氬姟绫诲瀷鍚嶇О
+     * oid 涓氬姟绫诲瀷鍚嶇О
      * @return 鍒涘缓缁撴灉
      */
     @Override
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
new file mode 100644
index 0000000..4b51876
--- /dev/null
+++ b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/service/impl/OsPortalVIServiceImpl.java
@@ -0,0 +1,627 @@
+package com.vci.web.service.impl;
+
+import com.vci.bo.ItemSeniorQueryBO;
+import com.vci.common.utility.ObjectUtility;
+import com.vci.corba.common.PLException;
+import com.vci.corba.portal.PortalService.GetPagePortalVIArrayByPageInfoResult;
+import com.vci.corba.portal.data.PortalVI;
+import com.vci.dto.PRMDTO;
+import com.vci.dto.PRMItemDTO;
+import com.vci.dto.PortalVIDTO;
+import com.vci.model.*;
+import com.vci.pagemodel.*;
+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.enumpck.ItemTypeEnum;
+import com.vci.web.enumpck.PortalVIType;
+import com.vci.web.enumpck.PortalVITypeFlag;
+import com.vci.web.service.OsPortalVIServiceI;
+import com.vci.web.util.PlatformClientUtil;
+import com.vci.web.util.UITools;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.stereotype.Service;
+
+import java.util.*;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.stream.Collectors;
+
+/*
+  * 閾炬帴绫诲瀷鏈嶅姟
+ * @author xiej
+ * @date 2024-08-14
+*/
+@Service
+public class OsPortalVIServiceImpl implements OsPortalVIServiceI  {
+    /**
+     * 鍔犺浇鑷韩
+     */
+    @Autowired(required = false)
+    @Lazy
+    private OsPortalVIServiceI self;
+
+    /**
+     * 骞冲彴鐨勮皟鐢ㄥ伐鍏风被
+     */
+    @Autowired
+    private PlatformClientUtil platformClientUtil;
+
+    @Override
+    public void clearCache() {
+
+    }
+    /**
+     * viType :Form("Form", "琛ㄥ崟", (short)1), Table("Table", "琛ㄦ牸", (short)0);
+     * viTypeFlag:	LinkType("LinkType", "閾炬帴绫诲瀷鐨勮〃鍗�", (short)1), BtmType("BtmType", "涓氬姟绫诲瀷鐨勮〃鍗�", (short)0);
+     * @param baseQueryObject 鏌ヨ瀵硅薄
+     * @return
+     */
+    @Override
+    public DataGrid<PortalVIVO> gridPortalVIVOs(BaseQueryObject baseQueryObject) {
+        Map<String, String> conditionMap=  baseQueryObject.getConditionMap();
+        if(conditionMap==null){
+            conditionMap=new HashMap<>();
+        }
+       String typeName=StringUtils.isBlank(conditionMap.get("typeName"))?"":conditionMap.get("typeName");
+        if(StringUtils.isBlank(typeName)){
+            return new DataGrid<>("娌℃湁閫夋嫨涓氬姟绫诲瀷");
+        }
+        String viName=StringUtils.isBlank(conditionMap.get("viName"))?"":conditionMap.get("viName");
+        String viTypeLabel=StringUtils.isBlank(conditionMap.get("viType"))?"":conditionMap.get("viType");
+        PortalVIType  portalVIType= PortalVIType.getByLabel(viTypeLabel);
+        Short viType=-1;
+        if(portalVIType!=null){
+            viType=portalVIType.getIntVal();
+        }
+        String viTypeFlagLabel=StringUtils.isBlank(conditionMap.get("viTypeFlag"))?"":conditionMap.get("viTypeFlag");
+        PortalVITypeFlag portalVITypeFlag= PortalVITypeFlag.getByLabel(viTypeFlagLabel);
+        Short viTypeFlag=-1;
+        if(portalVITypeFlag!=null){
+            viTypeFlag=portalVITypeFlag.getIntVal();
+        }
+        long pageIndex=baseQueryObject.getPage();
+        long pageSize=baseQueryObject.getLimit();
+        DataGrid<PortalVIVO> dataGrid = new DataGrid<>();
+        try {
+            GetPagePortalVIArrayByPageInfoResult pagePortalVIArrayByPageInfoResult= platformClientUtil.getPortalService().getPagePortalVIArrayByPageInfo(typeName,viName,viType,viTypeFlag,pageIndex,pageSize);
+            if(pagePortalVIArrayByPageInfoResult.total>0) {
+                PortalVI[] portalVIS = pagePortalVIArrayByPageInfoResult.returnValue;
+                List<PortalVIVO> portalVIVOS=  portalVIDOO2VOS(Arrays.asList(portalVIS));
+                dataGrid.setData(portalVIVOS);
+                dataGrid.setTotal(pagePortalVIArrayByPageInfoResult.total);
+            }else{
+                dataGrid = new DataGrid<>("娌掓湁鏌ヨ鍒版暟鎹�");
+            }
+        } catch (PLException e) {
+            e.printStackTrace();
+            dataGrid = new DataGrid<>("娌掓湁琛ㄥ崟鍑虹幇寮傚父:"+e.getMessage());
+        }
+        return dataGrid;
+    }
+
+    /***
+     * 琛ㄥ崟/琛ㄦ牸娣诲姞
+     * @param portalVIDTO
+     * @return
+     * @throws PLException
+     */
+    @Override
+    public BaseResult add(PortalVIDTO portalVIDTO) throws VciBaseException {
+        return  savePortalVIDTO(portalVIDTO,false);
+    }
+    /***
+     * 琛ㄥ崟/琛ㄦ牸鏇存敼
+     * @param portalVIDTO
+     * @return
+     * @throws PLException
+     */
+    @Override
+    public BaseResult edit(PortalVIDTO portalVIDTO) throws VciBaseException {
+        return  savePortalVIDTO(portalVIDTO,true);
+    }
+    private BaseResult savePortalVIDTO(PortalVIDTO portalVIDTO,boolean isEdit)  {
+
+        boolean _isBtm=false;
+        boolean flag = false;
+        String labelName=PortalVIType.Form.getName();
+        try {
+            VciBaseUtil.alertNotNull(portalVIDTO.getViName(),"鍚嶇О涓嶈兘涓虹┖锛�");
+            if(portalVIDTO.getPrm()==null||portalVIDTO.getPrm().getPrmItemList()==null||portalVIDTO.getPrm().getPrmItemList().size()==0){
+                throw  new Throwable(labelName+"锛屾湭璁剧疆");
+            }
+            if(PortalVIType.Table.getIntVal()==portalVIDTO.getViType()){//濡傛灉鏄〃鏍肩殑鐨勬牎楠�
+                labelName=PortalVIType.Table.getName();
+                PRMItemDTO prmItemDTO=  portalVIDTO.getPrm().getPrmItemList().get(0);
+                //姣忛〉鏄剧ず鏍¢獙
+                String rtnContent = isCorrectPageNums(prmItemDTO.getItemPageSize());
+                if (StringUtils.isNotBlank(rtnContent)) {
+                   throw new VciBaseException(rtnContent);
+                }
+            }else{
+
+            }
+            labelName= PortalVIType.getByIntVal(portalVIDTO.getViType()).getLabel();
+            if(!_isBtm){
+                PortalVI[] portalVIS=  platformClientUtil.getPortalService().getPortalVIArrayByTypeName(portalVIDTO.getTypeName());
+                for (int i = 0; i < portalVIS.length; i++) {
+                    PortalVI portalVI=  portalVIS[i];
+                   String viName= portalVI.viName;
+                   if(isEdit){//濡傛灉涓轰慨鏀�
+                       try {
+                           PortalVI oldPortalVI= platformClientUtil.getPortalService().getPortalVIById(portalVIDTO.getId());
+                           flag=platformClientUtil.getPortalService().judgeUpdateButton(oldPortalVI.typeFlag, oldPortalVI.viName, oldPortalVI.typeName);
+                           if (flag && (StringUtils.isNotBlank(portalVIDTO.getViName()))&&(!oldPortalVI.viName.equals(portalVIDTO.getViName()))) {
+                               throw  new Throwable("璇�"+labelName+"宸茬粡琚紩鐢紝涓嶈兘淇敼鍚嶇О!");
+                           }
+                       } catch (PLException e) {
+                           throw  new Throwable("鏌ヨ");
+                       }
+                       if (!portalVI.id.equals(portalVIDTO.getId())) {
+                           if (portalVI.viName.equals(portalVIDTO.getViName())) {
+                               throw  new Throwable("鍚嶇О宸茬粡瀛樺湪!");
+                           }
+                       }
+                   } else {
+                       portalVIDTO.setId(ObjectUtility.getNewObjectID36());
+                       if (portalVI.viName.equals(portalVIDTO.getViName())) {
+                           throw  new Throwable("鍚嶇О宸茬粡瀛樺湪!");
+                       }
+                   }
+                }
+            }else{
+                flag=platformClientUtil.getPortalService().judgeUpdateButton(portalVIDTO.getTypeFlag(), portalVIDTO.getViName(), portalVIDTO.getTypeName());
+            }
+            flag=  saveForm(portalVIDTO,isEdit);
+            if(flag){
+                return  BaseResult.success("淇濆瓨"+labelName+"鎴愬姛!");
+            }else{
+                new Throwable("淇濆瓨"+labelName+"澶辫触!");
+            }
+        } catch (Throwable e) {
+           // throw new VciBaseException("淇濆瓨琛ㄥ崟鍑虹幇寮傚父锛�"+e.getMessage());
+          return    BaseResult.fail("淇濆瓨"+labelName+"鍑虹幇寮傚父锛�"+e.getMessage());
+        }
+        return  BaseResult.success("淇濆瓨"+labelName+"鎴愬姛!");
+    }
+
+    /**
+     * 琛ㄥ崟/琛ㄦ牸
+     * @param portalVIDTO
+     * @param isEdit
+     * @return
+     */
+    private boolean saveForm(PortalVIDTO portalVIDTO,boolean isEdit) {
+        List<PRMItemDO> prmItemList = new ArrayList<PRMItemDO>();
+        try {
+            PortalVI pvi=portalVIDTOO2VI(portalVIDTO);
+            boolean res=false;
+            if (!isEdit) {
+                res= platformClientUtil.getPortalService().savePortalVI(pvi);
+            } else {
+                res= platformClientUtil.getPortalService().updatePortalVI(pvi);
+            }
+            return res;
+        } catch (Throwable e) {
+             e.printStackTrace();
+                return false;
+        }
+    }
+
+    @Override
+    public Map<String, PortalVIVO> selectAllPortalVIMap() throws VciBaseException {
+        return null;
+    }
+
+
+
+    /**
+     * 鍒ゆ柇姣忛〉琛屾暟瀹氫箟鏄惁姝g‘
+     * @Title		:isCorrectPageNums
+     * @Description	:
+     * @param pageText
+     * @return
+     */
+    protected String isCorrectPageNums(String pageText) {
+        if (pageText == null || pageText.trim().equals("")) {
+            return "";
+        }
+        //edit by guo褰撴瘡椤佃鏁颁腑涓嶆涓�涓�夐」鏃讹紝闇�瑕佸~鍐欓粯璁ょ殑鏄剧ず鏉℃暟锛屼笖榛樿鐨勫簲璇ュ瓨鍦ㄤ簬閫夐」涓��
+        if(pageText.indexOf(",")!=-1){
+            try {
+                String[] pages = pageText.split(",");
+                int index = pageText.indexOf("#");
+                String subpageText1 = pageText.substring(0, index);
+                String subpageText2 = pageText.substring(index+1);
+                if(subpageText1.contains(subpageText2)){
+                    for (String page : pages) {
+                        //if(!page.equalsIgnoreCase("all")){
+                        if(page.contains("#")){
+                            index = page.indexOf("#");
+                            page = page.substring(0, index);
+                        }
+                        Integer.parseInt(page);
+                        //}
+                    }
+                } else {
+                    return "杈撳叆椤垫暟涓嶇鍚堣鑼冿紝璇峰弬鐓ф枃鏈鎻愮ず鍐嶉噸鏂板~鍐欙紒";
+                }
+
+            }
+            catch (Exception e) {
+                return "杈撳叆椤垫暟涓嶇鍚堣鑼冿紝璇峰弬鐓ф枃鏈鎻愮ず鍐嶉噸鏂板~鍐欙紒";
+            }
+        }else {
+            try {
+                Integer.parseInt(pageText);
+            } catch (Exception e) {
+                return "杈撳叆椤垫暟涓嶇鍚堣鑼冿紝璇峰弬鐓ф枃鏈鎻愮ず閲嶆柊濉啓锛�";
+            }
+        }
+        return "";
+    }
+
+
+    /**
+     * 鏋氫妇鐨勬暟鎹璞¤浆鎹负鏄剧ず瀵硅薄
+     *
+     * @param portalVIS 鏋氫妇鐨勫璞�
+     * @return 鏄剧ず瀵硅薄
+     */
+    @Override
+    public List<PortalVIVO> portalVIDOO2VOS(Collection<PortalVI> portalVIS) {
+        List<PortalVIVO> portalVIVOS = new ArrayList<>();
+        Optional.ofNullable(portalVIS).orElseGet(()->new ArrayList<>()).stream().forEach(portalVI -> {
+            PortalVIVO portalVIVO = portalVIDOO2VO(portalVI);
+            portalVIVOS.add(portalVIVO);
+        });
+        return portalVIVOS;
+    }
+    /**
+     * 琛ㄥ崟鐨勬暟鎹璞¤浆鎹负鏄剧ず瀵硅薄
+     * @param portalVIDTOS 琛ㄥ崟鐨勫璞�
+     * @return 鏄剧ず瀵硅薄
+     */
+    @Override
+    public List<PortalVI> portalVIDTOO2VIS(Collection<PortalVIDTO> portalVIDTOS) {
+        List<PortalVI> portalVIS = new ArrayList<>();
+        Optional.ofNullable(portalVIDTOS).orElseGet(()->new ArrayList<>()).stream().forEach(portalVIDTO -> {
+            PortalVI portalVI = portalVIDTOO2VI(portalVIDTO);
+            portalVIS.add(portalVI);
+        });
+        return portalVIS;
+    }
+
+    /**
+     * 琛ㄥ崟鐨勬暟鎹璞¤浆鎹负鏄剧ず瀵硅薄
+     * @param portalVIDTO
+     * @return
+     */
+    @Override
+    public  PortalVI portalVIDTOO2VI(PortalVIDTO portalVIDTO) {
+        PortalVI portalVI=new PortalVI();
+        portalVI.id=portalVIDTO.getId();
+        portalVI.typeFlag= portalVIDTO.getTypeFlag();
+        portalVI.typeName=portalVIDTO.getTypeName();
+        portalVI.viName=portalVIDTO.getViName();
+        portalVI.viType=portalVIDTO.getViType();
+        short viType =portalVIDTO.getViType();
+        PRMDO prmdo = prmDOO2VIS(portalVIDTO.getPrm(),viType);
+        try {
+            portalVI.prm=UITools.getPRMText(prmdo);
+        } catch (Throwable e) {
+            e.printStackTrace();
+        }
+        return portalVI;
+    }
+
+    /**
+     * 琛ㄥ崟鏁版嵁瀵硅薄杞崲
+     * @param prmdto
+     * @param viType
+     * @return
+     */
+    private PRMDO prmDOO2VIS(PRMDTO prmdto, short viType) {
+        PRMDO prmdo=new PRMDO();
+        prmdo.setShowCols(prmdto.getShowCols());
+        prmdo.setFormQtName(prmdto.getFormQtName());
+        prmdo.setPrmItemList(pRMItemDTOO2DOS(prmdto.getPrmItemList(),viType));
+        return  prmdo;
+    }
+
+    @Override
+    public  PortalVIVO portalVIDOO2VO(PortalVI portalVI) {
+        PortalVIVO portalVIVO=new PortalVIVO();
+        portalVIVO.setId(portalVI.id);
+        portalVIVO.setTypeFlag(portalVI.typeFlag);
+        portalVIVO.setTypeName(portalVI.typeName);
+        portalVIVO.setViName(portalVI.viName);
+        portalVIVO.setViType(portalVI.viType);
+        String  prm= portalVI.prm;
+        PRMDO prmdo= UITools.getPRM(prm);
+        portalVIVO.setPrm(prmDOO2VOS(prmdo,portalVI.viType));
+        return portalVIVO;
+    }
+    private PRMVO prmDOO2VOS(PRMDO prmdo,short viType){
+        PRMVO prmvo=new PRMVO();
+        prmvo.setFormQtName(prmdo.getFormQtName());
+        prmvo.setShowCols(prmdo.getShowCols());
+        List<PRMItemDO> prmItemDOS= prmdo.getPrmItemList();
+        prmvo.setPrmItemList(pRMItemDOO2VOS(prmItemDOS,viType));
+        return prmvo;
+    }
+    public List<PRMItemVO> pRMItemDOO2VOS(Collection<PRMItemDO> prmItemDOS,short viType) {
+        List<PRMItemVO> portalVIVOS = new ArrayList<>();
+        Optional.ofNullable(prmItemDOS).orElseGet(()->new ArrayList<>()).stream().forEach(prmItemDO -> {
+            PRMItemVO prmItemVO = pRMItemDOO2VO(prmItemDO,viType);
+            portalVIVOS.add(prmItemVO);
+        });
+        return portalVIVOS;
+    }
+    public List<PRMItemDO> pRMItemDTOO2DOS(Collection<PRMItemDTO> prmItemDTOS,short viType) {
+        List<PRMItemDO> portalVIVOS = new ArrayList<>();
+        Optional.ofNullable(prmItemDTOS).orElseGet(()->new ArrayList<>()).stream().forEach(PRMItemDTO -> {
+            PRMItemDO PRMItemDO = pRMItemDTOO2DO(PRMItemDTO,viType);
+            portalVIVOS.add(PRMItemDO);
+        });
+        return portalVIVOS;
+    }
+
+    /**
+     * 鏁版嵁瀵硅薄杞崲
+     * @param prmItemDTO 鏁版嵁瀵硅薄
+     * @param viType 琛ㄥ崟绫诲瀷
+     * @return
+     */
+    private PRMItemDO pRMItemDTOO2DO(PRMItemDTO prmItemDTO,short viType) {
+        PRMItemDO prmItemDO=new PRMItemDO();
+        prmItemDO.setItemBat(prmItemDTO.getItemBat());
+        prmItemDO.setItemCols(prmItemDTO.getItemCols());
+        prmItemDO.setItemEQ(prmItemDTO.getItemEQ());
+        prmItemDO.setItemDbl(prmItemDTO.getItemDbl());
+        prmItemDO.setItemCut(prmItemDTO.getItemCut());
+        prmItemDO.setItemOR(prmItemDTO.getItemOR());
+        prmItemDO.setItemAddFilter(prmItemDTO.getItemAddFilter());
+        prmItemDO.setItemField(prmItemDTO.getItemField());
+        prmItemDO.setItemImgWH(prmItemDTO.getItemImgWH());
+        prmItemDO.setItemCtrlDisplyCol(prmItemDTO.getItemCtrlDisplyCol());//鎺у埗鏄剧ず鍒�
+        prmItemDO.setItemDateFormat(prmItemDTO.getItemDateFormat());// 鏁版嵁涓烘棩鏈熺被鍨嬫椂鐨勬牸寮忓寲瀛楃涓� 濡� yyyy-MM-dd HH:mm:ss
+        prmItemDO.setItemInObj(prmItemDTO.getItemInObj());
+        prmItemDO.setItemName(prmItemDTO.getItemName());
+        prmItemDO.setItemCustomClass(prmItemDTO.getItemCustomClass());//鑷畾涔夌被璺緞
+        prmItemDO.setItemIsHidden(prmItemDTO.getItemIsHidden());
+        prmItemDO.setItemIsEditable(prmItemDTO.getItemIsEditable());
+        prmItemDO.setItemIsRequired(prmItemDTO.getItemIsRequired());
+        prmItemDO.setItemFieldWidth(prmItemDTO.getItemFieldWidth());
+        prmItemDO.setItemTxf(prmItemDTO.getItemTxf());
+        prmItemDO.setItemRows(prmItemDTO.getItemRows());
+        prmItemDO.setItemHrefConf(prmItemDO.getItemHrefConf());//瓒呴摼鎺ラ厤缃�
+        prmItemDO.setItemTips(prmItemDTO.getItemTips());
+        prmItemDO.setItemTrim(prmItemDTO.getItemTrim());
+        prmItemDO.setItemDateFormat(prmItemDTO.getItemDateFormat());
+        prmItemDO.setItemCtrlDisplyCondition(prmItemDTO.getItemCtrlDisplyCondition());////鎺у埗鏄剧ず鏉′欢
+        prmItemDO.setItemEditableProgram(prmItemDTO.getItemEditableProgram());
+        prmItemDO.setItemEditCondition(prmItemDTO.getItemEditCondition());
+        prmItemDO.setItemHrefFields(prmItemDTO.getItemHrefFields());//瓒呴摼鎺ュ瓧娈�
+        prmItemDO.setItemValueList(prmItemDTO.getItemValueList());
+        prmItemDO.setItemValue(prmItemDTO.getItemValue());
+        prmItemDO.setItemStyle(prmItemDTO.getItemStyle());
+        prmItemDO.setItemShowExpression(prmItemDTO.getItemShowExpression());// 鏄剧ず琛ㄨ揪寮� ${aa}-${bb}
+        prmItemDO.setItemSeniorQueryColsCounts(prmItemDTO.getItemSeniorQueryColsCounts());//楂樼骇鏌ヨ鍚勫垪浣跨敤娆℃暟
+        prmItemDO.setItemType(prmItemDTO.getItemType());
+        prmItemDO.setItemScript(prmItemDTO.getItemScript());
+        prmItemDO.setItemRight(prmItemDTO.getItemRight());
+        prmItemDO.setItemQuerySql(prmItemDTO.getItemQuerySql());
+        prmItemDO.setItemQueryRefFields(prmItemDTO.getItemQueryRefFields());//鏌ヨ鍏宠仈鍒�
+        prmItemDO.setItemQtName(prmItemDTO.getItemQtName());//鏈彮鍚嶇О
+        prmItemDO.setItemParentFolderName(prmItemDTO.getItemParentFolderName());//鐖舵枃浠跺す鍚嶇О
+        prmItemDO.setItemPageSize(prmItemDTO.getItemPageSize());
+        prmItemDO.setItemOutType(prmItemDTO.getItemOutType());
+        prmItemDO.setItemOutFields(prmItemDTO.getItemOutFields());
+        prmItemDO.setItemListVal(prmItemDTO.getItemListVal());
+        prmItemDO.setItemListTxt(prmItemDTO.getItemListTxt());
+        prmItemDO.setItemListTable(prmItemDTO.getItemListTable());
+        prmItemDO.setItemKeyFields(prmItemDTO.getItemKeyFields());
+        prmItemDO.setItemIsShowFolder(prmItemDTO.getItemIsShowFolder());//鏄惁鏄剧ず鏂囦欢澶�
+        prmItemDO.setItemIsNavigatorExpand(prmItemDTO.getItemIsNavigatorExpand());////鏌ヨ鍖哄煙鏄剧ず鎺у埗
+        prmItemDO.setItemIsHttpSave(prmItemDTO.getItemIsHttpSave());
+        prmItemDO.setItemHttpVolumnPath(prmItemDTO.getItemHttpVolumnPath());
+        prmItemDO.setItemHttpPathField(prmItemDTO.getItemHttpPathField());
+        if(viType==PortalVIType.Table.getIntVal()) {//濡傛灉鏄〃鏍�
+            initTableConfigDTOO2DOData(prmItemDO,prmItemDTO);
+        }
+        return prmItemDO;
+    }
+    /**
+     * PRMItemDO 杞� PRMItemVO
+     * @param prmItemDO
+     * @param viType
+     * @return
+     */
+    private PRMItemVO pRMItemDOO2VO(PRMItemDO prmItemDO,short viType) {
+        PRMItemVO prmItemVO=new PRMItemVO();
+        prmItemVO.setItemBat(prmItemDO.getItemBat());
+        prmItemVO.setItemCols(prmItemDO.getItemCols());
+        prmItemVO.setItemEQ(prmItemDO.getItemEQ());
+        prmItemVO.setItemDbl(prmItemDO.getItemDbl());
+        prmItemVO.setItemCut(prmItemDO.getItemCut());
+        prmItemVO.setItemOR(prmItemDO.getItemOR());
+        prmItemVO.setItemAddFilter(prmItemDO.getItemAddFilter());
+        prmItemVO.setItemField(prmItemDO.getItemField());
+        prmItemVO.setItemImgWH(prmItemDO.getItemImgWH());
+        prmItemVO.setItemCtrlDisplyCol(prmItemDO.getItemCtrlDisplyCol());//鎺у埗鏄剧ず鍒�
+        prmItemVO.setItemDateFormat(prmItemDO.getItemDateFormat());// 鏁版嵁涓烘棩鏈熺被鍨嬫椂鐨勬牸寮忓寲瀛楃涓� 濡� yyyy-MM-dd HH:mm:ss
+        prmItemVO.setItemInObj(prmItemDO.getItemInObj());
+        prmItemVO.setItemName(prmItemDO.getItemName());
+        prmItemVO.setItemCustomClass(prmItemDO.getItemCustomClass());//鑷畾涔夌被璺緞
+        prmItemVO.setItemIsHidden(prmItemDO.getItemIsHidden());
+        prmItemVO.setItemIsEditable(prmItemDO.getItemIsEditable());
+        prmItemVO.setItemIsRequired(prmItemDO.getItemIsRequired());
+        prmItemVO.setItemFieldWidth(prmItemDO.getItemFieldWidth());
+        prmItemVO.setItemTxf(prmItemDO.getItemTxf());
+        prmItemVO.setItemRows(prmItemDO.getItemRows());
+        prmItemVO.setItemHrefConf(prmItemDO.getItemHrefConf());//瓒呴摼鎺ラ厤缃�
+        prmItemVO.setItemTips(prmItemDO.getItemTips());
+        prmItemVO.setItemTrim(prmItemDO.getItemTrim());
+        prmItemVO.setItemDateFormat(prmItemDO.getItemDateFormat());
+        prmItemVO.setItemCtrlDisplyCondition(prmItemDO.getItemCtrlDisplyCondition());////鎺у埗鏄剧ず鏉′欢
+        prmItemVO.setItemEditableProgram(prmItemDO.getItemEditableProgram());
+        prmItemVO.setItemEditCondition(prmItemDO.getItemEditCondition());
+        prmItemVO.setItemHrefFields(prmItemDO.getItemHrefFields());//瓒呴摼鎺ュ瓧娈�
+        prmItemVO.setItemValueList(prmItemDO.getItemValueList());
+        prmItemVO.setItemValue(prmItemDO.getItemValue());
+        prmItemVO.setItemStyle(prmItemDO.getItemStyle());
+        prmItemVO.setItemShowExpression(prmItemDO.getItemShowExpression());// 鏄剧ず琛ㄨ揪寮� ${aa}-${bb}
+        prmItemVO.setItemSeniorQueryColsCounts(prmItemDO.getItemSeniorQueryColsCounts());//楂樼骇鏌ヨ鍚勫垪浣跨敤娆℃暟
+        prmItemVO.setItemQuerySql(prmItemDO.getItemQuerySql());//楂樼骇鏌ヨsql
+        prmItemVO.setItemType(prmItemDO.getItemType());//灞炴�у熀鏈被鍨�
+        prmItemVO.setItemTypeText(ItemTypeEnum.getTextByValue(prmItemDO.getItemType()));//灞炴�у熀鏈被鍨嬫樉绀哄��
+        prmItemVO.setItemScript(prmItemDO.getItemScript());
+        prmItemVO.setItemRight(prmItemDO.getItemRight());
+        prmItemVO.setItemQueryRefFields(prmItemDO.getItemQueryRefFields());//鏌ヨ鍏宠仈鍒�
+        prmItemVO.setItemQtName(prmItemDO.getItemQtName());
+        prmItemVO.setItemParentFolderName(prmItemDO.getItemParentFolderName());//鐖舵枃浠跺す鍚嶇О
+        prmItemVO.setItemPageSize(prmItemDO.getItemPageSize());
+        prmItemVO.setItemOutType(prmItemDO.getItemOutType());
+        prmItemVO.setItemOutFields(prmItemDO.getItemOutFields());
+        prmItemVO.setItemListVal(prmItemDO.getItemListVal());//鍙傜収鍊�
+        prmItemVO.setItemListTxt(prmItemDO.getItemListTxt());
+        prmItemVO.setItemListTable(prmItemDO.getItemListTable());
+        prmItemVO.setItemKeyFields(prmItemDO.getItemKeyFields());
+        prmItemVO.setItemIsShowFolder(prmItemDO.getItemIsShowFolder());//鏄惁鏄剧ず鏂囦欢澶�
+        prmItemVO.setItemIsNavigatorExpand(prmItemDO.getItemIsNavigatorExpand());////鏌ヨ鍖哄煙鏄剧ず鎺у埗
+        prmItemVO.setItemIsHttpSave(prmItemDO.getItemIsHttpSave());
+        prmItemVO.setItemHttpVolumnPath(prmItemDO.getItemHttpVolumnPath());
+        prmItemVO.setItemHttpPathField(prmItemDO.getItemHttpPathField());
+        if(viType==PortalVIType.Table.getIntVal()) {//濡傛灉鏄〃鏍�
+            initTableConfigDOO2VOData(prmItemVO,prmItemDO);
+        }
+        return prmItemVO;
+    }
+
+    /**
+     * 鍒濆鍖栬〃鏍兼墍鐢ㄧ壒娈婂瓧娈甸厤缃�
+     * @param prmItemVO
+     * @param prmItemDO
+     */
+    private void initTableConfigDOO2VOData(PRMItemVO prmItemVO,PRMItemDO prmItemDO){
+        prmItemVO.setItemFieldWidthList(initItemFieldWidthList(prmItemDO.getItemOutFields(),prmItemDO.getItemFieldWidth()));//鍒楁樉绀哄娈� itemOutFieldList 鐩稿尮閰�
+        prmItemVO.setItemSeniorQueryBOS(initItemSeniorQueryBOData(prmItemDO.getItemSeniorQueryCols(),prmItemDO.getItemSeniorQueryColsCounts(),prmItemDO.getItemQuerySql()));//楂樼骇鏌ヨ瀵硅薄
+        List<String> allKeyList= getRefFormVIName(prmItemVO.getItemInObj());
+        List<String> itemOutFieldList =VciBaseUtil.str2List(prmItemVO.getItemOutFields());
+        List<String> itemKeyFieldList =VciBaseUtil.str2List(prmItemVO.getItemKeyFields());
+        List<String> itemSelectoutFieldList= allKeyList.stream().filter(s ->!itemOutFieldList.stream().map(s1 -> s1).collect(Collectors.toList()).contains(s) ).collect(Collectors.toList());
+        prmItemVO.setItemSelectoutFieldList(itemSelectoutFieldList);//寰呴�夋嫨鐨勫睘鎬у瓧娈�
+        prmItemVO.setItemOutFieldList(itemOutFieldList);//闇�瑕佷娇鐢ㄧ殑闆嗗悎
+        List<String> itemSearchFieldList= itemOutFieldList.stream().filter(s ->!itemKeyFieldList.stream().map(s1 -> s1).collect(Collectors.toList()).contains(s) ).collect(Collectors.toList());
+        prmItemVO.setItemSearchFieldList(itemSearchFieldList);//寰呮悳绱㈠瓧娈�
+        prmItemVO.setItemKeyFieldList(itemKeyFieldList);//鎼滅储瀛楁
+    }
+    /**
+     * 鍒濆鍖栬〃鏍兼墍鐢ㄧ壒娈婂瓧娈甸厤缃�
+     * @param prmItemDTO
+     * @param prmItemDO
+     */
+    private void initTableConfigDTOO2DOData(PRMItemDO prmItemDO,PRMItemDTO prmItemDTO){
+
+        prmItemDO.setItemOutFields(VciBaseUtil.array2String(prmItemDTO.getItemOutFieldList().toArray(new String[]{})));//闇�瑕佷娇鐢ㄧ殑瀛楁
+        prmItemDO.setItemKeyFields(VciBaseUtil.array2String(prmItemDTO.getItemKeyFieldList().toArray(new String[]{})));//闇�瑕佹悳绱㈢殑瀛楁
+       List<String> newItemFieldWidthList=prmItemDTO.getItemFieldWidthList().stream().map(KeyValue::getValue).distinct().collect(Collectors.toList());
+       prmItemDO.setItemFieldWidth(VciBaseUtil.array2String(newItemFieldWidthList.toArray(new String[]{}),":"));//瀛楁瀹藉害
+       List<ItemSeniorQueryBO> itemSeniorQueryBOS=  prmItemDTO.getItemSeniorQueryBOS();
+       List<String> itemSeniorQueryColsList=new ArrayList<>();
+       List<String> itemSeniorQueryColsCountsList=new ArrayList<>();
+       List<String> itemQuerySqlList=new ArrayList<>();
+       itemSeniorQueryBOS.stream().forEach(itemSeniorQueryBO -> {
+           String itemSeniorQueryCols= itemSeniorQueryBO.getItemSeniorQueryCols();
+           String itemSeniorQueryColsCounts=itemSeniorQueryBO.getItemSeniorQueryColsCounts();
+           String itemQuerySql=itemSeniorQueryBO.getItemQuerySql();
+           if(StringUtils.isNotBlank(itemSeniorQueryCols)) {
+               itemSeniorQueryColsList.add(itemSeniorQueryCols);
+           }
+            if(StringUtils.isNotBlank(itemSeniorQueryColsCounts)) {
+                itemSeniorQueryColsCountsList.add(itemSeniorQueryColsCounts);
+            }
+            if(StringUtils.isNotBlank(itemQuerySql)){
+                itemQuerySqlList.add(itemQuerySql);
+            }
+        });
+        prmItemDO.setItemSeniorQueryCols(VciBaseUtil.array2String(itemSeniorQueryColsList.toArray(new String[]{})));
+        prmItemDO.setItemSeniorQueryColsCounts(VciBaseUtil.array2String(itemSeniorQueryColsCountsList.toArray(new String[]{})));
+        prmItemDO.setItemQuerySql(VciBaseUtil.array2String(itemQuerySqlList.toArray(new String[]{}),";"));
+
+    }
+
+    /**
+     * 鍒濆鍖栬〃鏍煎垪瀹藉害闆嗗悎
+     */
+    private List<KeyValue>  initItemFieldWidthList(String itemOutFields,String itemFieldWidth){
+        List<KeyValue> keyValueList=new ArrayList<>();
+        List<String>itemOutFieldList=   VciBaseUtil.str2List(itemOutFields);
+        List<String>itemFieldWidthList=  VciBaseUtil.str2List(itemFieldWidth);
+        if(itemOutFieldList.size()>0) {
+            for (int i = 0; i < itemOutFieldList.size(); i++) {
+                KeyValue keyValue = new KeyValue();
+                String with = itemFieldWidthList.get(i);
+                keyValue.setKey(itemOutFieldList.get(i));
+                keyValue.setValue(StringUtils.isBlank(with) ? "250" : with);
+                keyValueList.add(keyValue);
+            }
+        }
+        return keyValueList;
+    }
+    /**
+     * 楂樼骇鏌ヨ閰嶇疆鍒濆鍖�
+     * @param itemSeniorQueryCols
+     * @param itemSeniorQueryColsCounts
+     * @param itemQuerySql
+     * @return
+     */
+    private List<ItemSeniorQueryBO>  initItemSeniorQueryBOData(String itemSeniorQueryCols,String itemSeniorQueryColsCounts,String itemQuerySql){
+        List<ItemSeniorQueryBO> itemSeniorQueryBOList=new ArrayList<>();
+        List<String> itemSeniorQueryColList= VciBaseUtil.str2List(itemSeniorQueryCols);
+        List<String> itemSeniorQueryColsCountList= VciBaseUtil.str2List(itemSeniorQueryColsCounts);
+        List<String> itemQuerySqlList= VciBaseUtil.str2List(itemQuerySql,";");
+        if (itemSeniorQueryColList!=null&&itemSeniorQueryColList.size()>0){
+            for (int i=0;i<itemSeniorQueryColList.size();i++){
+              String itemSeniorQueryCol=  itemSeniorQueryColList.get(i);
+                String itemSeniorQueryColsCount=  itemSeniorQueryColsCountList.get(i);
+                if(StringUtils.isNotBlank(itemSeniorQueryCol)){
+                    String querysql = "";
+                    if(itemQuerySqlList!=null){
+                        querysql = itemQuerySqlList.get(i);
+                    }
+                    ItemSeniorQueryBO itemSeniorQueryBO=null;
+                    if("null".equals(querysql) ){
+                        itemSeniorQueryBO=   new ItemSeniorQueryBO(itemSeniorQueryCol,itemSeniorQueryColsCount,"");
+                    }else{
+                        itemSeniorQueryBO= new ItemSeniorQueryBO(itemSeniorQueryCol,itemSeniorQueryColsCount,querysql);
+                    }
+                    itemSeniorQueryBOList.add(itemSeniorQueryBO);
+                }
+            }
+        }
+        return itemSeniorQueryBOList;
+    }
+    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){
+                 portalVIVO.getPrm().getPrmItemList().stream().forEach(k->{
+                     keyList.add(k.getItemField());
+                 });
+            }
+        } catch (PLException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+            return keyList;
+        }
+        return keyList;
+    }
+}
diff --git a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/util/PinyinCommon.java b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/util/PinyinCommon.java
new file mode 100644
index 0000000..12cefb5
--- /dev/null
+++ b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/util/PinyinCommon.java
@@ -0,0 +1,89 @@
+package com.vci.web.util;
+
+import net.sourceforge.pinyin4j.PinyinHelper;
+import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
+import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
+import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
+import net.sourceforge.pinyin4j.format.HanyuPinyinVCharType;
+import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;
+  
+/**  
+ * 
+ 
+ * @author: ligang 
+   
+ * @createtime: 2012-12-26  
+ 
+ * @version:  
+   
+ */
+	public class PinyinCommon {
+	
+	/**
+	 * 寰楀埌 鍏ㄦ嫾
+	 * @param src
+	 * @return
+	 */
+	public static String getPingYin(String src){ 
+	    char[] t1 = null; 
+	    t1=src.toCharArray(); 
+	    String[] t2 = new String[t1.length]; 
+	    HanyuPinyinOutputFormat t3 = new HanyuPinyinOutputFormat(); 
+	    t3.setCaseType(HanyuPinyinCaseType.LOWERCASE); 
+	    t3.setToneType(HanyuPinyinToneType.WITHOUT_TONE); 
+	    t3.setVCharType(HanyuPinyinVCharType.WITH_V); 
+	    String t4=""; 
+	    int t0=t1.length; 
+	    try { 
+	      for (int i=0;i<t0;i++) { 
+	      //鍒ゆ柇鏄惁涓烘眽瀛楀瓧绗� 
+	         if(Character.toString(t1[i]).matches("[\\u4E00-\\u9FA5]+")) {
+	              t2 = PinyinHelper.toHanyuPinyinStringArray(t1[i], t3); 
+	              t4+=t2[0]; 
+	         } else {
+	        	  t4+= Character.toString(t1[i]);
+	         }
+	      } 
+	      return t4; 
+	    } 
+	    catch (BadHanyuPinyinOutputFormatCombination e1) { 
+	      e1.printStackTrace(); 
+	    } 
+	    return t4; 
+	} 
+
+	/**
+	 * 寰楀埌涓枃棣栧瓧姣�
+	 * @param str
+	 * @return
+	 */
+	public static String getPinYinHeadChar(String str) { 
+
+		String convert = ""; 
+		for (int j = 0; j < str.length(); j++) { 
+			char word = str.charAt(j); 
+			String[] pinyinArray = PinyinHelper.toHanyuPinyinStringArray(word); 
+			if (pinyinArray != null) { 
+				convert += pinyinArray[0].charAt(0); 
+			}else { 
+				convert += word; 
+			} 
+		} 
+		return convert; 
+	} 
+	/**
+	 * 灏嗗瓧绗︿覆杞Щ涓篈SCII鐮� 
+	 * @param cnStr
+	 * @return
+	 */
+	public static String getCnASCII(String cnStr) { 
+		StringBuffer   strBuf   =   new   StringBuffer(); 
+		byte[]   bGBK   =   cnStr.getBytes(); 
+		for(int   i=0;i <bGBK.length;i++){ 
+    		//System.out.println(Integer.toHexString(bGBK[i]&0xff)); 
+            strBuf.append(Integer.toHexString(bGBK[i]&0xff)); 
+        } 
+        return strBuf.toString(); 
+	} 
+
+} 
\ No newline at end of file
diff --git a/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/util/UITools.java b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/util/UITools.java
new file mode 100644
index 0000000..e6fa0e6
--- /dev/null
+++ b/Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/util/UITools.java
@@ -0,0 +1,707 @@
+package com.vci.web.util;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import com.vci.model.PRMDO;
+import com.vci.model.PRMItemDO;
+import org.apache.commons.lang3.StringUtils;
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.DocumentHelper;
+import org.dom4j.Element;
+
+import com.vci.client.common.providers.ClientServiceProvider;
+import com.vci.common.portal.constants.PLDefinationConstants;
+import com.vci.common.portal.constants.PRMConstants;
+import com.vci.corba.portal.PortalServicePrx;
+
+
+/**
+ * UIService 妯″潡 Util 宸ュ叿绫�
+ * <p>Title: </p>
+ * <p>Description: </p>
+ * <p>Copyright: Copyright (c) 2017</p>
+ * <p>Company: VCI</p>
+ * @author xiongchao
+ * @time 2017-12-21
+ * @version 1.0
+ */
+public class UITools {
+private static PortalServicePrx portalService = null;
+	
+	public static PortalServicePrx getService(){
+		if(portalService != null){
+			return portalService;
+		}
+		try {
+			portalService = ClientServiceProvider.getUIService();
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		return portalService;
+	}
+	
+	/**
+	 * 灏唜ml鏂囨湰杞寲鎴怭RM瀵硅薄
+	 * @param text
+	 * @return
+	 */
+	@SuppressWarnings("unchecked")
+	public static PRMDO getPRM(String text){
+		
+		if (StringUtils.isEmpty(text))
+			return null;
+		
+		Document document = null;
+		try {
+			document = DocumentHelper.parseText(text);
+		} catch (DocumentException e) {
+			e.printStackTrace();
+		}
+		if(document == null){
+			return null;
+		}
+		PRMDO prm = new PRMDO();
+		try{
+			Element root = document.getRootElement();
+			String showCols = root.elementText(PRMConstants.JD_SHOWCOLS);
+			if(showCols == null || showCols.equals("")){
+				showCols = "3";
+			}
+			prm.setShowCols(showCols);
+			String formQtName = root.elementText(PRMConstants.JD_FORMQTNAME);
+			if(formQtName == null){
+				formQtName = "";
+			}
+			prm.setFormQtName(formQtName);
+			List<Element> items = root.elements(PRMConstants.JD_ITEM);
+			List<PRMItemDO> prmItemList = new ArrayList<PRMItemDO>();
+			prm.setPrmItemList(prmItemList);
+			for(Iterator<Element> i = items.iterator(); i.hasNext();){
+				Element item = i.next();
+				PRMItemDO prmItem = new PRMItemDO();
+				prmItemList.add(prmItem);
+				
+				String elementText = item.elementText(PRMConstants.JD_field);
+				prmItem.setItemField(elementText == null ? "" : elementText);
+				
+				elementText = item.elementText(PRMConstants.JD_or);
+				prmItem.setItemOR(elementText == null ? "" : elementText);
+				
+				elementText = item.elementText(PRMConstants.JD_eq);
+				prmItem.setItemEQ(elementText == null ? "" : elementText);
+				
+				elementText = item.elementText(PRMConstants.JD_trim);
+				prmItem.setItemTrim(elementText == null ? "" : elementText);
+				
+				elementText = item.elementText(PRMConstants.JD_dbl);
+				prmItem.setItemDbl(elementText == null ? "" : elementText);
+				
+				elementText = item.elementText(PRMConstants.JD_cut);
+				prmItem.setItemCut(elementText == null ? "" : elementText);
+				
+				elementText = item.elementText(PRMConstants.JD_inObj);
+				prmItem.setItemInObj(elementText == null ? "" : elementText);
+				
+				elementText = item.elementText(PRMConstants.JD_addFilter);
+				prmItem.setItemAddFilter(elementText == null ? "" : elementText);
+				
+				elementText = item.elementText(PRMConstants.JD_outType);
+				prmItem.setItemOutType(elementText == null ? "" : elementText);
+				
+				elementText = item.elementText(PRMConstants.JD_pageSize);
+				prmItem.setItemPageSize(elementText == null ? "" : elementText);
+				
+				elementText = item.elementText(PRMConstants.JD_imgWH);
+				prmItem.setItemImgWH(elementText == null ? "" : elementText);
+				
+				elementText = item.elementText(PRMConstants.JD_outFields);
+				prmItem.setItemOutFields(elementText == null ? "" : elementText);
+				
+				elementText = item.elementText(PRMConstants.JD_keyFields);
+				prmItem.setItemKeyFields(elementText == null ? "" : elementText);
+				
+				elementText = item.elementText(PRMConstants.JD_bat);
+				prmItem.setItemBat(elementText == null ? "" : elementText);
+				
+				elementText = item.elementText(PRMConstants.JD_txf);
+				prmItem.setItemTxf(elementText == null ? "" : elementText);
+				
+				elementText = item.elementText(PRMConstants.JD_name);
+				prmItem.setItemName(elementText == null ? "" : elementText);
+				
+				elementText = item.elementText(PRMConstants.JD_type);
+				prmItem.setItemType(elementText == null ? "" : elementText);
+				
+				elementText = item.elementText(PRMConstants.JD_value);
+				prmItem.setItemValue(elementText == null ? "" : elementText);
+				
+				elementText = item.elementText(PRMConstants.JD_cols);
+				prmItem.setItemCols(elementText == null ? "" : elementText);
+				// add by xchao 2017.11.23 begin
+				// prmItem 鐨� itemIsHidden 鍊肩瓑浜� itemCols 
+				// 璇ュ�兼帶鍒跺厓绱犳槸鍚︽樉绀� 1锛氭樉绀� 0锛氫笉鏄剧ず锛屽綋涓斾粎褰撶瓑浜�1鏃舵樉绀猴紝鍚﹀垯鎸変笉鏄剧ず
+				prmItem.setItemIsHidden(elementText == null ? "" : elementText);
+				// add by xchao 2017.11.23 end 
+				
+				elementText = item.elementText(PRMConstants.JD_rows);
+				prmItem.setItemRows(elementText == null ? "" : elementText);
+				
+				elementText = item.elementText(PRMConstants.JD_style);
+				prmItem.setItemStyle(elementText == null ? "" : elementText);
+				
+				elementText = item.elementText(PRMConstants.JD_script);
+				prmItem.setItemScript(elementText == null ? "" : elementText);
+				
+				elementText = item.elementText(PRMConstants.JD_tips);
+				prmItem.setItemTips(elementText == null ? "" : elementText);
+				
+				elementText = item.elementText(PRMConstants.JD_valuelist);
+				if(elementText == null || elementText.equals("")){
+					prmItem.setItemValueList(new ArrayList<String>());
+				}else{
+					prmItem.setItemValueList(arrayToList(elementText.split(";")));
+				}
+				
+				elementText = item.elementText(PRMConstants.JD_listTable);
+				prmItem.setItemListTable(elementText == null ? "" : elementText);
+				
+				elementText = item.elementText(PRMConstants.JD_listTxt);
+				prmItem.setItemListTxt(elementText == null ? "" : elementText);
+				
+				elementText = item.elementText(PRMConstants.JD_listVal);
+				prmItem.setItemListVal(elementText == null ? "" : elementText);
+				
+				elementText = item.elementText(PRMConstants.JD_showExpression);
+				prmItem.setItemShowExpression(elementText == null ? "" : elementText);
+				
+				elementText = item.elementText(PRMConstants.JD_dateFormat);
+				prmItem.setItemDateFormat(elementText == null ? "" : elementText);
+				
+				
+				elementText = item.elementText(PRMConstants.JD_isEditable);
+				prmItem.setItemIsEditable(elementText == null ? "" : elementText);
+				
+				elementText = item.elementText(PRMConstants.JD_EditableProgram);
+				prmItem.setItemEditableProgram(elementText == null ? "" : elementText);
+				
+				elementText = item.elementText(PRMConstants.JD_qtName);
+				prmItem.setItemQtName(elementText == null ? "" : elementText);
+				
+				elementText = item.elementText(PRMConstants.JD_isRequired);
+				prmItem.setItemIsRequired(elementText == null ? "" : elementText);
+				
+				elementText = item.elementText(PRMConstants.JD_seniorQueryCols);
+				prmItem.setItemSeniorQueryCols(elementText == null ? "" : elementText);
+				
+				elementText = item.elementText(PRMConstants.JD_seniorQueryColsCounts);
+				prmItem.setItemSeniorQueryColsCounts(elementText == null ? "" : elementText);
+				
+				elementText = item.elementText(PRMConstants.JD_hrefFields);
+				prmItem.setItemHrefFields(elementText == null ? "" : elementText);
+				
+				elementText = item.elementText(PRMConstants.JD_hrefConf);
+				prmItem.setItemHrefConf(elementText == null ? "" : elementText);
+				
+				elementText = item.elementText(PRMConstants.JD_queryRefFields);
+				prmItem.setItemQueryRefFields(elementText == null ? "" : elementText);
+				
+				elementText = item.elementText(PRMConstants.JD_customClass);
+				prmItem.setItemCustomClass(elementText == null ? "" : elementText);
+				
+				elementText = item.elementText(PRMConstants.JD_ctrlDisplyCol);
+				prmItem.setItemCtrlDisplyCol(elementText == null ? "" : elementText);
+				
+				elementText = item.elementText(PRMConstants.JD_ctrlDisplyCondition);
+				prmItem.setItemCtrlDisplyCondition(elementText == null ? "" : elementText);
+				
+				elementText = item.elementText(PRMConstants.JD_isHttpSave);
+				prmItem.setItemIsHttpSave(elementText == null ? "" : elementText);
+				
+				elementText = item.elementText(PRMConstants.JD_httpVolumnPath);
+				prmItem.setItemHttpVolumnPath(elementText == null ? "" : elementText);
+				
+				elementText = item.elementText(PRMConstants.JD_httpPathField);
+				prmItem.setItemHttpPathField(elementText == null ? "" : elementText);
+				
+				elementText = item.elementText(PRMConstants.JD_editCondition);
+				prmItem.setItemEditCondition(elementText == null ? "" : elementText);
+				
+				elementText = item.elementText(PRMConstants.JD_isNavigatorExpand);
+				prmItem.setItemIsNavigatorExpand(elementText == null ? "" : elementText);
+				
+				elementText = item.elementText(PRMConstants.JD_isShowFolder);
+				prmItem.setItemIsShowFolder(elementText == null ? "" : elementText);
+				
+				elementText = item.elementText(PRMConstants.JD_parentFolderName);
+				prmItem.setItemParentFolderName(elementText == null ? "" : elementText);
+				
+				elementText = item.elementText(PRMConstants.JD_filterColWidth);
+				prmItem.setItemFieldWidth(elementText == null ? "" : elementText);
+				
+				elementText = item.elementText(PRMConstants.JD_QuerySql);
+				prmItem.setItemQuerySql(elementText == null ? "" : elementText);
+				
+				elementText = item.elementText(PRMConstants.JD_right);
+				prmItem.setItemRight(elementText == null ? "" : elementText);
+				
+			}
+		}catch(Exception e){
+			e.printStackTrace();
+		}
+		return prm;
+	}
+	
+	/**
+	 * 灏哖RM瀵硅薄杞寲鎴恱ml鏂囨湰
+	 * @param prm
+	 * @return
+	 * @throws Throwable 
+	 */
+	public static String getPRMText(PRMDO prm) throws Throwable{
+		try {
+			if (prm == null) {
+				return "";
+			}
+			Document document = DocumentHelper.createDocument();
+			Element rootNode = document.addElement(PRMConstants.JD_DATASET);
+			Element showColsNode = rootNode.addElement(PRMConstants.JD_SHOWCOLS);
+			showColsNode.setText(prm.getShowCols());
+			Element formQtNameNode = rootNode.addElement(PRMConstants.JD_FORMQTNAME);
+			formQtNameNode.setText(prm.getFormQtName());
+			List<PRMItemDO> prmItemList = prm.getPrmItemList();
+			if (prmItemList != null && prmItemList.size() > 0) {
+				for (Iterator<PRMItemDO> i = prmItemList.iterator(); i.hasNext();) {
+					Element itemNode = rootNode.addElement(PRMConstants.JD_ITEM);
+					PRMItemDO item = i.next();
+
+					Element itemChildNode = itemNode.addElement(PRMConstants.JD_field);
+					itemChildNode.setText(item.getItemField());
+
+					itemChildNode = itemNode.addElement(PRMConstants.JD_or);
+					itemChildNode.setText(item.getItemOR());
+
+					itemChildNode = itemNode.addElement(PRMConstants.JD_eq);
+					itemChildNode.setText(item.getItemEQ());
+
+					itemChildNode = itemNode.addElement(PRMConstants.JD_trim);
+					itemChildNode.setText(item.getItemTrim());
+
+					itemChildNode = itemNode.addElement(PRMConstants.JD_dbl);
+					itemChildNode.setText(item.getItemDbl());
+
+					itemChildNode = itemNode.addElement(PRMConstants.JD_cut);
+					itemChildNode.setText(item.getItemCut());
+
+					itemChildNode = itemNode.addElement(PRMConstants.JD_inObj);
+					itemChildNode.setText(item.getItemInObj());
+
+					itemChildNode = itemNode.addElement(PRMConstants.JD_addFilter);
+					itemChildNode.setText(item.getItemAddFilter());
+
+					itemChildNode = itemNode.addElement(PRMConstants.JD_outType);
+					itemChildNode.setText(item.getItemOutType());
+
+					itemChildNode = itemNode.addElement(PRMConstants.JD_pageSize);
+					itemChildNode.setText(item.getItemPageSize());
+
+					itemChildNode = itemNode.addElement(PRMConstants.JD_imgWH);
+					itemChildNode.setText(item.getItemImgWH());
+
+					itemChildNode = itemNode.addElement(PRMConstants.JD_outFields);
+					itemChildNode.setText(item.getItemOutFields());
+
+					itemChildNode = itemNode.addElement(PRMConstants.JD_keyFields);
+					itemChildNode.setText(item.getItemKeyFields());
+
+					itemChildNode = itemNode.addElement(PRMConstants.JD_bat);
+					itemChildNode.setText(item.getItemBat());
+
+					itemChildNode = itemNode.addElement(PRMConstants.JD_txf);
+					itemChildNode.setText(item.getItemTxf());
+
+					itemChildNode = itemNode.addElement(PRMConstants.JD_name);
+					itemChildNode.setText(item.getItemName());
+
+					itemChildNode = itemNode.addElement(PRMConstants.JD_type);
+					itemChildNode.setText(item.getItemType());
+
+					itemChildNode = itemNode.addElement(PRMConstants.JD_value);
+					itemChildNode.setText(item.getItemValue());
+
+					itemChildNode = itemNode.addElement(PRMConstants.JD_showExpression);
+					itemChildNode.setText(item.getItemShowExpression());
+					
+					itemChildNode = itemNode.addElement(PRMConstants.JD_dateFormat);
+					itemChildNode.setText(item.getItemDateFormat());
+
+					itemChildNode = itemNode.addElement(PRMConstants.JD_cols);
+					itemChildNode.setText(item.getItemCols());
+					
+					itemChildNode = itemNode.addElement(PRMConstants.JD_rows);
+					itemChildNode.setText(item.getItemRows());
+
+					itemChildNode = itemNode.addElement(PRMConstants.JD_style);
+					itemChildNode.setText(item.getItemStyle());
+
+					itemChildNode = itemNode.addElement(PRMConstants.JD_script);
+					itemChildNode.setText(item.getItemScript());
+
+					itemChildNode = itemNode.addElement(PRMConstants.JD_tips);
+					itemChildNode.setText(item.getItemTips());
+
+					itemChildNode = itemNode.addElement(PRMConstants.JD_valuelist);
+					itemChildNode.setText(listToString(item.getItemValueList()));
+
+					itemChildNode = itemNode.addElement(PRMConstants.JD_listTable);
+					itemChildNode.setText(item.getItemListTable());
+
+					itemChildNode = itemNode.addElement(PRMConstants.JD_listTxt);
+					itemChildNode.setText(item.getItemListTxt());
+
+					itemChildNode = itemNode.addElement(PRMConstants.JD_listVal);
+					itemChildNode.setText(item.getItemListVal());
+
+					itemChildNode = itemNode.addElement(PRMConstants.JD_isEditable);
+					itemChildNode.setText(item.getItemIsEditable());
+					
+					itemChildNode = itemNode.addElement(PRMConstants.JD_EditableProgram);
+					itemChildNode.setText(item.getItemEditableProgram());
+					
+					itemChildNode = itemNode.addElement(PRMConstants.JD_qtName);
+					itemChildNode.setText(item.getItemQtName());
+
+					itemChildNode = itemNode.addElement(PRMConstants.JD_isRequired);
+					itemChildNode.setText(item.getItemIsRequired());
+					
+					itemChildNode = itemNode.addElement(PRMConstants.JD_seniorQueryCols);
+					itemChildNode.setText(item.getItemSeniorQueryCols());
+					
+					itemChildNode = itemNode.addElement(PRMConstants.JD_seniorQueryColsCounts);
+					itemChildNode.setText(item.getItemSeniorQueryColsCounts());
+					
+					itemChildNode = itemNode.addElement(PRMConstants.JD_hrefFields);
+					itemChildNode.setText(item.getItemHrefFields());
+					
+					itemChildNode = itemNode.addElement(PRMConstants.JD_hrefConf);
+					itemChildNode.setText(item.getItemHrefConf());
+					
+					itemChildNode = itemNode.addElement(PRMConstants.JD_queryRefFields);
+					itemChildNode.setText(item.getItemQueryRefFields());
+					
+					itemChildNode = itemNode.addElement(PRMConstants.JD_customClass);
+					itemChildNode.setText(item.getItemCustomClass());
+					
+					itemChildNode = itemNode.addElement(PRMConstants.JD_ctrlDisplyCol);
+					itemChildNode.setText(item.getItemCtrlDisplyCol());
+					
+					itemChildNode = itemNode.addElement(PRMConstants.JD_ctrlDisplyCondition);
+					itemChildNode.setText(item.getItemCtrlDisplyCondition());
+					
+					itemChildNode = itemNode.addElement(PRMConstants.JD_isHttpSave);
+					itemChildNode.setText(item.getItemIsHttpSave());
+					
+					itemChildNode = itemNode.addElement(PRMConstants.JD_httpVolumnPath);
+					itemChildNode.setText(item.getItemHttpVolumnPath());
+					
+					itemChildNode = itemNode.addElement(PRMConstants.JD_httpPathField);
+					itemChildNode.setText(item.getItemHttpPathField());
+					
+					itemChildNode = itemNode.addElement(PRMConstants.JD_editCondition);
+					itemChildNode.setText(item.getItemEditCondition());
+					
+					itemChildNode = itemNode.addElement(PRMConstants.JD_isNavigatorExpand);
+					itemChildNode.setText(item.getItemIsNavigatorExpand());
+					
+					itemChildNode = itemNode.addElement(PRMConstants.JD_isShowFolder);
+					itemChildNode.setText(item.getItemIsShowFolder());
+					
+					itemChildNode = itemNode.addElement(PRMConstants.JD_parentFolderName);
+					itemChildNode.setText(item.getItemParentFolderName());
+					
+					itemChildNode = itemNode.addElement(PRMConstants.JD_filterColWidth);
+					itemChildNode.setText(item.getItemFieldWidth());
+					
+					itemChildNode = itemNode.addElement(PRMConstants.JD_QuerySql);
+					itemChildNode.setText(item.getItemQuerySql());
+					
+					itemChildNode = itemNode.addElement(PRMConstants.JD_right);
+					itemChildNode.setText(item.getItemRight());
+				}
+			}
+			return document.asXML();
+		} catch (Throwable e) {
+			e.printStackTrace();
+			throw e;
+		}
+	}
+	
+//	/**
+//	 * 灏嗕粠鏁版嵁搴撲腑璇诲彇鐨剎ml鏂囨湰杞寲鎴愬搴旂殑PLDefination瀵硅薄
+//	 * @param text
+//	 * @return
+//	 * @throws Throwable
+//	 */
+//	public static PLDefination getPLDefination(String text) throws Throwable{
+//		try{
+//			Document document = null;
+//			document = DocumentHelper.parseText(text);
+//			if(document == null){
+//				return null;
+//			}
+//			PLDefination obj = new PLDefination();
+//			Element root = document.getRootElement();
+//			if(root != null){
+//				String elementText = root.elementText(PLDefinationConstants.TYPE);
+//				if(elementText == null || elementText.equals("")){
+//					elementText = "0";
+//				}
+//				obj.setType(Integer.parseInt(elementText));
+//
+//				elementText = root.elementText(PLDefinationConstants.SHOWABS);
+//				obj.setShowAbs(elementText == null ? "" : elementText);
+//
+//				elementText = root.elementText(PLDefinationConstants.SEPARATOR);
+//				obj.setSeparator(elementText == null ? "" : elementText);
+//
+//				elementText = root.elementText(PLDefinationConstants.SHOWLINKABS);
+//				obj.setShowLinkAbs(elementText == null ? "" : elementText);
+//
+//				elementText = root.elementText(PLDefinationConstants.SEARCHTARGET);
+//				obj.setSearchTarger(elementText == null ? "" : elementText);
+//
+//				elementText = root.elementText(PLDefinationConstants.TEMPLATETYPE);
+//				obj.setTemplateType(elementText == null ? "" : elementText);
+//
+//				elementText = root.elementText(PLDefinationConstants.SHOWTYPE);
+//				obj.setShowType(elementText == null ? "" : elementText);
+//
+//				elementText = root.elementText(PLDefinationConstants.TEMPLATEID);
+//				obj.setTemplateId(elementText == null ? "" : elementText);
+//
+//				elementText = root.elementText(PLDefinationConstants.ORIENTATION);
+//				obj.setOrientation(elementText == null ? "" : elementText);
+//
+//				elementText = root.elementText(PLDefinationConstants.VALIDITY);
+//				obj.setValidity(elementText == null ? "" : elementText);
+//
+//				elementText = root.elementText(PLDefinationConstants.ORDERFIELD);
+//				obj.setOrderField(elementText == null ? "" : elementText);
+//
+//				elementText = root.elementText(PLDefinationConstants.ORDERMODE);
+//				obj.setOrderMode(elementText == null ? "" : elementText);
+//
+//				elementText = root.elementText(PLDefinationConstants.RETURNROWS);
+//				obj.setReturnRows(elementText == null ? "" : elementText);
+//
+//				elementText = root.elementText(PLDefinationConstants.CONTROLPATH);
+//				obj.setControlPath(elementText == null ? "" : elementText);
+//
+//				elementText = root.elementText(PLDefinationConstants.EXPANDMODE);
+//				obj.setExpandMode(elementText == null ? "" : elementText);
+//
+//				elementText = root.elementText(PLDefinationConstants.LINKTYPE);
+//				obj.setLinkType(elementText == null ? "" : elementText);
+//
+//
+//				elementText = root.elementText(PLDefinationConstants.ISSHOWIMAGE);
+//				obj.setIsShowImage(elementText == null ? "" : elementText);
+//
+//				elementText = root.elementText(PLDefinationConstants.EXPANDCOLS);
+//				obj.setExpandCols(elementText == null ? "" : elementText);
+//
+//				elementText = root.elementText(PLDefinationConstants.SHOWCONTENT);
+//				obj.setShowContent(elementText == null ? "" : elementText);
+//
+//				elementText = root.elementText(PLDefinationConstants.SHOWCONTENTTYPE);
+//				obj.setShowContentType(elementText == null ? "" : elementText);
+//
+//				elementText = root.elementText(PLDefinationConstants.SHOWCONTENTRELATION);
+//				obj.setShowContentRelation(elementText == null ? "" : elementText);
+//
+//				elementText = root.elementText(PLDefinationConstants.SHOWCONTENTTABLE);
+//				obj.setShowContentTable(elementText == null ? "" : elementText);
+//
+//				elementText = root.elementText(PLDefinationConstants.NAVIGATORTYPE);
+//				obj.setNavigatorType(elementText == null ? "" : elementText);
+//
+//				elementText = root.elementText(PLDefinationConstants.EVENTKEY);
+//				obj.setEventKey(elementText == null ? "" : elementText);
+//
+//				elementText = root.elementText(PLDefinationConstants.EVENTVALUE);
+//				obj.setEventValue(elementText == null ? "" : elementText);
+//
+//				elementText = root.elementText(PLDefinationConstants.ROOTCONTENT);
+//				obj.setRootContent(elementText == null ? "" : elementText);
+//
+//				elementText = root.elementText(PLDefinationConstants.UIPARSER);
+//				obj.setUiParser(elementText == null ? "" : elementText);
+//
+//				elementText = root.elementText(PLDefinationConstants.EXTATTR);
+//				obj.setExtAttr(elementText == null ? "" : elementText);
+//
+//				elementText = root.elementText(PLDefinationConstants.QUERYTEMPLATENAME);
+//				obj.setQueryTemplateName(elementText == null ? "" : elementText);
+//
+//				elementText = root.elementText(PLDefinationConstants.SUBUILAYOUT);
+//				obj.setSubUILayout(elementText == null ? "" : elementText);
+//			}
+//			return obj;
+//		}catch(Throwable e){
+//			e.printStackTrace();
+//			throw e;
+//		}
+//	}
+//
+//	/**
+//	 * 灏哖LDefination瀵硅薄杞寲鎴恱ml鏂囨湰
+//	 * @param obj
+//	 * @return
+//	 * @throws Throwable
+//	 */
+//	public static String getPLDefinationText(PLDefination obj) throws Throwable{
+//		try{
+//			if(obj == null){
+//				return "";
+//			}
+//
+//			Document doc = DocumentHelper.createDocument();
+//			Element rootNode = doc.addElement(PLDefinationConstants.PLDEFINATION);
+//
+//			Element node = rootNode.addElement(PLDefinationConstants.TYPE);
+//			node.setText(String.valueOf(obj.getType()));
+//
+//			node = rootNode.addElement(PLDefinationConstants.SHOWABS);
+//			node.setText(obj.getShowAbs());
+//
+//			node = rootNode.addElement(PLDefinationConstants.SEPARATOR);
+//			node.setText(obj.getSeparator());
+//
+//			node = rootNode.addElement(PLDefinationConstants.SHOWLINKABS);
+//			node.setText(obj.getShowLinkAbs());
+//
+//			node = rootNode.addElement(PLDefinationConstants.SEARCHTARGET);
+//			node.setText(obj.getSearchTarger());
+//
+//			node = rootNode.addElement(PLDefinationConstants.TEMPLATETYPE);
+//			node.setText(obj.getTemplateType());
+//
+//			node = rootNode.addElement(PLDefinationConstants.SHOWTYPE);
+//			node.setText(obj.getShowType());
+//
+//			node = rootNode.addElement(PLDefinationConstants.TEMPLATEID);
+//			node.setText(obj.getTemplateId());
+//
+//			node = rootNode.addElement(PLDefinationConstants.ORIENTATION);
+//			node.setText(obj.getOrientation());
+//
+//			node = rootNode.addElement(PLDefinationConstants.VALIDITY);
+//			node.setText(obj.getValidity());
+//
+//			node = rootNode.addElement(PLDefinationConstants.ORDERFIELD);
+//			node.setText(obj.getOrderField());
+//
+//			node = rootNode.addElement(PLDefinationConstants.ORDERMODE);
+//			node.setText(obj.getOrderMode());
+//
+//			node = rootNode.addElement(PLDefinationConstants.RETURNROWS);
+//			node.setText(obj.getReturnRows());
+//
+//			node = rootNode.addElement(PLDefinationConstants.CONTROLPATH);
+//			node.setText(obj.getControlPath());
+//
+//			node = rootNode.addElement(PLDefinationConstants.EXPANDMODE);
+//			node.setText(obj.getExpandMode());
+//
+//			node = rootNode.addElement(PLDefinationConstants.LINKTYPE);
+//			node.setText(obj.getLinkType());
+//
+//			node = rootNode.addElement(PLDefinationConstants.ISSHOWIMAGE);
+//			node.setText(obj.getIsShowImage());
+//
+//			node = rootNode.addElement(PLDefinationConstants.EXPANDCOLS);
+//			node.setText(obj.getExpandCols());
+//
+//			node = rootNode.addElement(PLDefinationConstants.SHOWCONTENT);
+//			node.setText(obj.getShowContent());
+//
+//			node = rootNode.addElement(PLDefinationConstants.SHOWCONTENTTYPE);
+//			node.setText(obj.getShowContentType());
+//
+//			node = rootNode.addElement(PLDefinationConstants.SHOWCONTENTRELATION);
+//			node.setText(obj.getShowContentRelation());
+//
+//			node = rootNode.addElement(PLDefinationConstants.SHOWCONTENTTABLE);
+//			node.setText(obj.getShowContentTable());
+//
+//			node = rootNode.addElement(PLDefinationConstants.NAVIGATORTYPE);
+//			node.setText(obj.getNavigatorType());
+//
+//			node = rootNode.addElement(PLDefinationConstants.EVENTKEY);
+//			node.setText(obj.getEventKey());
+//
+//			node = rootNode.addElement(PLDefinationConstants.EVENTVALUE);
+//			node.setText(obj.getEventValue());
+//
+//			node = rootNode.addElement(PLDefinationConstants.ROOTCONTENT);
+//			node.setText(obj.getRootContent());
+//
+//			node = rootNode.addElement(PLDefinationConstants.UIPARSER);
+//			node.setText(obj.getUiParser());
+//
+//			node = rootNode.addElement(PLDefinationConstants.EXTATTR);
+//			node.setText(obj.getExtAttr());
+//
+//			node = rootNode.addElement(PLDefinationConstants.QUERYTEMPLATENAME);
+//			node.setText(obj.getQueryTemplateName());
+//
+//			node = rootNode.addElement(PLDefinationConstants.SUBUIOBJTYPE);
+//			node.setText(obj.getSubUiObjType());
+//
+//			node = rootNode.addElement(PLDefinationConstants.SUBUILAYOUT);
+//			node.setText(obj.getSubUILayout());
+//
+//			return doc.asXML();
+//		}catch(Throwable e){
+//			throw e;
+//		}
+//
+//	}
+	
+	/**
+	 * 灏咥RRAY杞寲鎴怢IST
+	 * @param array
+	 * @return
+	 */
+	public static List<String> arrayToList(String[] array){
+		if(array == null || array.length == 0){
+			return null;
+		}
+		List<String> list = new ArrayList<String>();
+		for(int i = 0; i < array.length; i++){
+			list.add(array[i]);
+		}
+		return list;
+	}
+	
+	/**
+	 * 灏哃IST鍔犱笂';'鎷兼垚瀛楃涓�
+	 * @param list
+	 * @return
+	 */
+	public static String listToString(List<String> list){
+		StringBuilder strb = new StringBuilder();
+		if(list != null && list.size() > 0){
+			for(int i = 0; i < list.size(); i++){
+				strb.append(list.get(i));
+				if(i < list.size() - 1){
+					strb.append(";");
+				}
+			}
+		}
+		return strb.toString();
+	}
+	
+}
diff --git a/Source/plt-web/plt-web-ui/src/api/modeling/businessType/api.js b/Source/plt-web/plt-web-ui/src/api/modeling/businessType/api.js
index 2c93f95..ccac952 100644
--- a/Source/plt-web/plt-web-ui/src/api/modeling/businessType/api.js
+++ b/Source/plt-web/plt-web-ui/src/api/modeling/businessType/api.js
@@ -1,6 +1,6 @@
 import request from '@/router/axios';
 
-// 鍒楄〃鏌ヨ
+// 涓氬姟绫诲瀷鏍戞煡璇�
 export function getBizTypes(params) {
   return request({
     url: "/api/btmTypeController/getTreeBizTypes",
@@ -8,6 +8,14 @@
     params
   });
 }
+// 鏌ヨ鎵�鏈夌殑灞炴�э紝鍙傛暟btmId(涓氬姟绫诲瀷鍚嶇О锛�
+export function getAllAttributesByBtmId(params) {
+  return request({
+    url: "/api/btmTypeController/getAllAttributesByBtmId",
+    method: "get",
+    params
+  });
+}
 
 // 鍒涘缓
 export function addLifeCycle(params) {
diff --git a/Source/plt-web/plt-web-ui/src/api/modeling/linkType/api.js b/Source/plt-web/plt-web-ui/src/api/modeling/linkType/api.js
index 0500f79..1621bf1 100644
--- a/Source/plt-web/plt-web-ui/src/api/modeling/linkType/api.js
+++ b/Source/plt-web/plt-web-ui/src/api/modeling/linkType/api.js
@@ -8,6 +8,14 @@
   });
 }
 
+// 鏌ヨ鎵�鏈夌殑灞炴�э紝鍙傛暟name(閾炬帴绫诲瀷妯℃澘鍚嶇О锛�
+export function getAllAttributeByLink(params) {
+  return request({
+    url: "/api/linkTypeController/getAllAttributeByLink",
+    method: "get",
+    params
+  });
+}
 // 閫氳繃灞炴�ф睜杩斿洖鐨� attributes 鑾峰彇瀹屾暣鐨勪俊鎭�
 export function getByAttributeNames(params) {
   return request({
diff --git a/Source/plt-web/plt-web-ui/src/api/queryTemplate/businessTypeQuery.js b/Source/plt-web/plt-web-ui/src/api/queryTemplate/businessTypeQuery.js
new file mode 100644
index 0000000..3b4f3bd
--- /dev/null
+++ b/Source/plt-web/plt-web-ui/src/api/queryTemplate/businessTypeQuery.js
@@ -0,0 +1,12 @@
+import request from '@/router/axios';
+//涓氬姟绫诲瀷鏌ヨ妯℃澘
+// 妯℃澘鍒楄〃鏌ヨ
+export function gridTemplate(params) {
+  return request({
+    url: "/api/templateController/queryTemplateList",
+    method: "get",
+    params:{
+      ...params
+    }
+  });
+}
diff --git a/Source/plt-web/plt-web-ui/src/api/queryTemplate/linkTypeQuery.js b/Source/plt-web/plt-web-ui/src/api/queryTemplate/linkTypeQuery.js
new file mode 100644
index 0000000..12b013c
--- /dev/null
+++ b/Source/plt-web/plt-web-ui/src/api/queryTemplate/linkTypeQuery.js
@@ -0,0 +1,10 @@
+import request from '@/router/axios';
+//閾炬帴绫诲瀷鏌ヨ妯℃澘
+// 鍒犻櫎
+export function deleteLinkTemplate(params) {
+  return request({
+    url: "/api/templateController/deleteLinkTemplate",
+    method: "delete",
+    data:params
+  });
+}
diff --git a/Source/plt-web/plt-web-ui/src/api/queryTemplate/queryDefine.js b/Source/plt-web/plt-web-ui/src/api/queryTemplate/queryDefine.js
new file mode 100644
index 0000000..38c5e44
--- /dev/null
+++ b/Source/plt-web/plt-web-ui/src/api/queryTemplate/queryDefine.js
@@ -0,0 +1,50 @@
+import request from '@/router/axios';
+//鏌ヨ妯℃澘瀹氫箟
+// 妯℃澘鍒楄〃瀹氫箟涓嬫媺妗嗘煡璇�
+export function gridTemplate(params) {
+  return request({
+    url: "/api/templateController/queryTemplateList",
+    method: "get",
+    params:{
+      ...params
+    }
+  });
+}
+
+export function getObjTypeQTs(params) {
+  return request({
+    url: "/api/templateController/getObjTypeQTs",
+    method: "get",
+    params:{
+      ...params
+    }
+  });
+}
+
+// 淇敼
+export function updateTemplate(params) {
+  return request({
+    url: "/api/templateController/updateTemplate",
+    method: "post",
+    data:params
+  });
+}
+
+// 鍒涘缓
+export function saveTemplate(params) {
+  return request({
+    url: "/api/templateController/saveTemplate",
+    method: "post",
+    data:params
+  });
+}
+
+// 鍒犻櫎
+export function deleteTemplate(params) {
+  return request({
+    url: "/api/templateController/deleteTemplate",
+    method: "delete",
+    data:params
+  });
+}
+
diff --git a/Source/plt-web/plt-web-ui/src/views/modelingMenu/modeling/versioning/index.vue b/Source/plt-web/plt-web-ui/src/views/modelingMenu/modeling/versioning/index.vue
index aeb9eea..276a7f3 100644
--- a/Source/plt-web/plt-web-ui/src/views/modelingMenu/modeling/versioning/index.vue
+++ b/Source/plt-web/plt-web-ui/src/views/modelingMenu/modeling/versioning/index.vue
@@ -19,7 +19,7 @@
             </el-button>
           </div>
           <!-- 宸︿晶鏍�         -->
-          <div style="height:  calc(100vh - 300px);">
+          <div style="height:  calc(100vh - 260px);">
             <avue-tree :data="treeData" :option="treeOption" @node-click="nodeClick">
           <span slot-scope="{ node, data }" class="el-tree-node__label">
            <span style="font-size: 15px">
diff --git a/Source/plt-web/plt-web-ui/src/views/modelingMenu/queryTemplate/businessTypeQuery/index.vue b/Source/plt-web/plt-web-ui/src/views/modelingMenu/queryTemplate/businessTypeQuery/index.vue
index 308c333..ddeabbc 100644
--- a/Source/plt-web/plt-web-ui/src/views/modelingMenu/queryTemplate/businessTypeQuery/index.vue
+++ b/Source/plt-web/plt-web-ui/src/views/modelingMenu/queryTemplate/businessTypeQuery/index.vue
@@ -3,24 +3,9 @@
 
     <el-aside>
       <basic-container>
-        <div ref="TreeBox" style="height: calc(100vh - 144px);!important;">
-          <div class="headerCon">
-            <el-button icon="el-icon-plus" plain size="small" type="primary" @click="addClickHandler">鍒涘缓
-            </el-button>
-            <el-button icon="el-icon-edit" plain size="small" type="primary" @click="editClickHandler">淇敼
-            </el-button>
-            <el-button icon="el-icon-delete" plain size="small" type="danger" @click="delClickHandler">鍒犻櫎
-            </el-button>
-            <el-button icon="el-icon-download" plain size="small" type="primary" @click="exportClickHandler">瀵煎嚭
-            </el-button>
-            <el-button icon="el-icon-upload2" plain size="small" type="primary" @click="uploadClickHandler">瀵煎叆
-            </el-button>
-            <el-button class="smallBtn" plain size="small" type="primary"
-                       @click="checkViewClickHandler">鏌ョ湅浣跨敤鑼冨洿
-            </el-button>
-          </div>
+        <div ref="TreeBox" style="height: calc(100vh - 154px);!important;">
           <!-- 宸︿晶鏍�         -->
-          <div style="height:  calc(100vh - 280px);">
+          <div style="height:  calc(100vh - 190px);">
             <avue-tree :data="treeData" :option="treeOption" @node-click="nodeClick">
           <span slot-scope="{ node, data }" class="el-tree-node__label">
            <span style="font-size: 15px">
@@ -36,6 +21,16 @@
 
     <el-main>
       <basic-container>
+        <avue-crud  ref="crud"
+                    :data="crudData" :option="crudOption" :table-loading="tableLoading" style="margin-top: 10px">
+          <template slot="menuLeft" slot-scope="scope">
+            <el-button icon="el-icon-plus" size="small" type="primary" @click="addHandler">鍒涘缓</el-button>
+            <el-button icon="el-icon-edit" plain size="small" type="primary" @click="editHandler">淇敼</el-button>
+            <el-button icon="el-icon-delete" plain size="small" type="danger" @click="delHandler">鍒犻櫎</el-button>
+            <el-button icon="el-icon-download" plain size="small" type="primary" @click="exportClickHandler">瀵煎嚭</el-button>
+            <el-button icon="el-icon-upload2" plain size="small" type="primary" @click="upLoadClickHandler">瀵煎叆</el-button>
+          </template>
+        </avue-crud>
       </basic-container>
     </el-main>
 
@@ -43,8 +38,187 @@
 </template>
 
 <script>
+import {getBizTypes} from "@/api/modeling/businessType/api";
+import {gridTemplate,saveTemplate,updateTemplate,deleteTemplate} from "@/api/queryTemplate/queryDefine";
+import basicOption from "@/util/basic-option";
+import func from "@/util/func";
+import {dateFormat} from "@/util/date";
 export default {
-  name: "index"
+  name: "index",
+  data() {
+    return {
+      treeOption: {
+        height: 'auto',
+        defaultExpandedKeys: ['topNode'],
+        menu: false,
+        addBtn: false,
+        props: {
+          label: 'label',
+          value: 'oid',
+          children: 'children'
+        }
+      },
+      nodeRow: {},
+      treeData: [  {
+        label: '涓氬姟绫诲瀷鏍�',
+        oid: 'topNode',
+        children: []
+      }],
+      templateForm: '',
+      templateData: [],
+      form: {
+        name: ''
+      },
+      rules: {
+        name: [
+          {required: true, message: '璇疯緭鍏ユ煡璇㈡ā鏉垮悕绉�', trigger: 'blur'}
+        ]
+      },
+      title: '',
+      visible: false,
+      tableLoading: false,
+      crudData: [],
+      crudOption: {
+        ...basicOption,
+        addBtn: false,
+        editBtn: false,
+        delBtn: false,
+        selection: true,
+        menu: false,
+        height: "auto",
+        calcHeight: -40,
+        tip: false,
+        column: [{
+          label: '鏌ヨ妯℃澘鍚嶇О',
+          prop: 'name'
+        }, {
+          label: '鍒涘缓浜�',
+          prop: 'creator'
+        }, {
+          label: '鍒涘缓鏃堕棿',
+          prop: 'createTime',
+          formatter:function (row, value) {
+            return dateFormat(new Date(value))
+          }
+        }]
+      },
+      selectionRow: [],
+    }
+  },
+  created() {
+    this.getTreeList();
+  },
+  methods: {
+    //鏍戣〃鏌ヨ
+    getTreeList() {
+      const loading = this.$loading({});
+      getBizTypes().then(res => {
+        const data = res.data.data.map(item => {
+          item.label = item.attributes.id;
+          return item;
+        });
+        this.treeData[0].children = data;
+        loading.close();
+      })
+    },
+
+    // 鏍戠偣鍑�
+    nodeClick(row) {
+      this.nodeRow = row;
+      this.tableLoading = true;
+      this.getTemp();
+    },
+    getTemp() {
+      gridTemplate({btmName: this.nodeRow.label, linkFlag: false}).then(res => {
+        this.crudData =  res.data.data;
+        this.tableLoading = false;
+      })
+    },
+    selectHandler(selection, row) {
+
+    },
+    changeTemp(data) {
+      this.$refs.queryCrud.clearSelection();
+      if (data.value != '') {
+        let abNames = data.item.abNames.join(',').toLowerCase().split(',')
+
+      }
+    },
+    //鍒涘缓
+    addHandler() {
+      if (func.isEmptyObject(this.nodeRow)) {
+        this.$message.error('璇烽�夋嫨瑕佹坊鍔犵殑鑺傜偣');
+        return;
+      }
+      this.title = 'add';
+      this.visible = true;
+      this.$nextTick(() => {
+      });
+    },
+    //淇敼
+    editHandler() {
+      if (func.isEmptyObject(this.nodeRow)) {
+        this.$message.error('璇疯嚦灏戦�夋嫨涓�鏉℃暟鎹�');
+        return;
+      }
+      this.form.name = this.templateForm;
+      this.title = 'edit';
+      this.visible = true;
+      this.$nextTick(() => {
+      });
+    },
+    // 鏂板缂栬緫淇濆瓨
+    addDialogSavaHandler() {
+      this.$refs.form.validate((valid) => {
+        const saveFunction = this.title === 'add' ? saveTemplate : updateTemplate;
+        if (valid) {
+          saveFunction(this.form).then(res => {
+            if (res.data.code === 200) {
+              this.$message.success(res.data.obj);
+              this.addDialogClose();
+            }
+          })
+        } else {
+          return false;
+        }
+      });
+    },
+    // 鏂板缂栬緫瀵硅瘽妗嗗彇娑�
+    addDialogClose() {
+      this.form = {
+        name: ''
+      };
+      this.$refs.form.clearValidate();
+      this.visible = false;
+    },
+    //鍒犻櫎
+    delHandler() {
+      if (func.isEmptyObject(this.nodeRow)) {
+        this.$message.error('璇烽�夋嫨鏁版嵁');
+        return;
+      }
+      this.$confirm('鎮ㄧ‘瀹氳鍒犻櫎鎵�閫夋嫨鐨勬暟鎹悧锛�', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      }).then(() => {
+        deleteTemplate({
+          name: this.templateForm,
+          btmName: this.nodeRow.label,
+          linkFlag: false
+        }).then(res => {
+          if (res.data.code === 200) {
+            this.$message.success(res.data.obj);
+          }
+        })
+      }).catch(() => {
+        this.$message({
+          type: 'info',
+          message: '宸插彇娑堝垹闄�'
+        });
+      });
+    }
+  }
 }
 </script>
 
diff --git a/Source/plt-web/plt-web-ui/src/views/modelingMenu/queryTemplate/linkTypeQuery/index.vue b/Source/plt-web/plt-web-ui/src/views/modelingMenu/queryTemplate/linkTypeQuery/index.vue
index 308c333..5d18cfc 100644
--- a/Source/plt-web/plt-web-ui/src/views/modelingMenu/queryTemplate/linkTypeQuery/index.vue
+++ b/Source/plt-web/plt-web-ui/src/views/modelingMenu/queryTemplate/linkTypeQuery/index.vue
@@ -3,24 +3,9 @@
 
     <el-aside>
       <basic-container>
-        <div ref="TreeBox" style="height: calc(100vh - 144px);!important;">
-          <div class="headerCon">
-            <el-button icon="el-icon-plus" plain size="small" type="primary" @click="addClickHandler">鍒涘缓
-            </el-button>
-            <el-button icon="el-icon-edit" plain size="small" type="primary" @click="editClickHandler">淇敼
-            </el-button>
-            <el-button icon="el-icon-delete" plain size="small" type="danger" @click="delClickHandler">鍒犻櫎
-            </el-button>
-            <el-button icon="el-icon-download" plain size="small" type="primary" @click="exportClickHandler">瀵煎嚭
-            </el-button>
-            <el-button icon="el-icon-upload2" plain size="small" type="primary" @click="uploadClickHandler">瀵煎叆
-            </el-button>
-            <el-button class="smallBtn" plain size="small" type="primary"
-                       @click="checkViewClickHandler">鏌ョ湅浣跨敤鑼冨洿
-            </el-button>
-          </div>
+        <div ref="TreeBox" style="height: calc(100vh - 154px);!important;">
           <!-- 宸︿晶鏍�         -->
-          <div style="height:  calc(100vh - 280px);">
+          <div style="height:  calc(100vh - 190px);">
             <avue-tree :data="treeData" :option="treeOption" @node-click="nodeClick">
           <span slot-scope="{ node, data }" class="el-tree-node__label">
            <span style="font-size: 15px">
@@ -36,6 +21,16 @@
 
     <el-main>
       <basic-container>
+        <avue-crud  ref="crud"
+                    :data="crudData" :option="crudOption" :table-loading="tableLoading" style="margin-top: 10px">
+          <template slot="menuLeft" slot-scope="scope">
+            <el-button icon="el-icon-plus" size="small" type="primary" @click="addHandler">鍒涘缓</el-button>
+            <el-button icon="el-icon-edit" plain size="small" type="primary" @click="editHandler">淇敼</el-button>
+            <el-button icon="el-icon-delete" plain size="small" type="danger" @click="delHandler">鍒犻櫎</el-button>
+            <el-button icon="el-icon-download" plain size="small" type="primary" @click="exportClickHandler">瀵煎嚭</el-button>
+            <el-button icon="el-icon-upload2" plain size="small" type="primary" @click="upLoadClickHandler">瀵煎叆</el-button>
+          </template>
+        </avue-crud>
       </basic-container>
     </el-main>
 
@@ -43,8 +38,189 @@
 </template>
 
 <script>
+import {gridLink} from "@/api/modeling/linkType/api";
+import { gridTemplate, saveTemplate, updateTemplate} from "@/api/queryTemplate/queryDefine";
+import {deleteLinkTemplate} from "@/api/queryTemplate/linkTypeQuery";
+import func from "@/util/func";
+import {dateFormat} from "@/util/date";
+import basicOption from "@/util/basic-option";
+
 export default {
-  name: "index"
+  name: "index",
+  data() {
+    return {
+      treeOption: {
+        height: 'auto',
+        defaultExpandedKeys: ['topNode'],
+        menu: false,
+        addBtn: false,
+        props: {
+          label: 'label',
+          value: 'oid',
+          children: 'children'
+        }
+      },
+      nodeRow: {},
+      treeData: [{
+        label: '閾炬帴绫诲瀷',
+        oid: 'topNode',
+        children: []
+      }],
+      templateForm: '',
+      templateData: [],
+      form: {
+        name: ''
+      },
+      rules: {
+        name: [
+          {required: true, message: '璇疯緭鍏ユ煡璇㈡ā鏉垮悕绉�', trigger: 'blur'}
+        ]
+      },
+      title: '',
+      visible: false,
+      tableLoading: false,
+      crudData: [],
+      crudOption: {
+        ...basicOption,
+        addBtn: false,
+        editBtn: false,
+        delBtn: false,
+        selection: true,
+        menu: false,
+        height: "auto",
+        calcHeight: -40,
+        tip: false,
+        column: [{
+          label: '鏌ヨ妯℃澘鍚嶇О',
+          prop: 'name'
+        }, {
+          label: '鍒涘缓浜�',
+          prop: 'creator'
+        }, {
+          label: '鍒涘缓鏃堕棿',
+          prop: 'createTime',
+          formatter:function (row, value) {
+            return dateFormat(new Date(value))
+          }
+        }]
+      },
+      selectionRow: [],
+    }
+  },
+  created() {
+    this.getTreeList();
+  },
+  methods: {
+    //鏍戣〃鏌ヨ
+    getTreeList() {
+      const loading = this.$loading({});
+      gridLink().then(res => {
+        const data = res.data.data.map(item => {
+          item.label=item.name;
+          return item;
+        });
+        this.treeData[0].children = data;
+        loading.close();
+      })
+    },
+
+    // 鏍戠偣鍑�
+    nodeClick(row) {
+      this.nodeRow = row;
+      this.tableLoading = true;
+      this.getTemp();
+    },
+    getTemp() {
+      gridTemplate({btmName: this.nodeRow.label, linkFlag: true}).then(res => {
+        this.crudData = res.data.data;
+        this.tableLoading = false;
+      })
+    },
+    selectHandler(selection, row) {
+
+    },
+    changeTemp(data) {
+      this.$refs.queryCrud.clearSelection();
+      if (data.value != '') {
+        let abNames = data.item.abNames.join(',').toLowerCase().split(',')
+
+      }
+    },
+    //鍒涘缓
+    addHandler() {
+      if (func.isEmptyObject(this.nodeRow)) {
+        this.$message.error('璇烽�夋嫨瑕佹坊鍔犵殑鑺傜偣');
+        return;
+      }
+      this.title = 'add';
+      this.visible = true;
+      this.$nextTick(() => {
+      });
+    },
+    //淇敼
+    editHandler() {
+      if (func.isEmptyObject(this.nodeRow)) {
+        this.$message.error('璇疯嚦灏戦�夋嫨涓�鏉℃暟鎹�');
+        return;
+      }
+      this.form.name = this.templateForm;
+      this.title = 'edit';
+      this.visible = true;
+      this.$nextTick(() => {
+      });
+    },
+    // 鏂板缂栬緫淇濆瓨
+    addDialogSavaHandler() {
+      this.$refs.form.validate((valid) => {
+        const saveFunction = this.title === 'add' ? saveTemplate : updateTemplate;
+        if (valid) {
+          saveFunction(this.form).then(res => {
+            if (res.data.code === 200) {
+              this.$message.success(res.data.obj);
+              this.addDialogClose();
+            }
+          })
+        } else {
+          return false;
+        }
+      });
+    },
+    // 鏂板缂栬緫瀵硅瘽妗嗗彇娑�
+    addDialogClose() {
+      this.form = {
+        name: ''
+      };
+      this.$refs.form.clearValidate();
+      this.visible = false;
+    },
+    //鍒犻櫎
+    delHandler() {
+      if (func.isEmptyObject(this.nodeRow)) {
+        this.$message.error('璇烽�夋嫨鏁版嵁');
+        return;
+      }
+      this.$confirm('鎮ㄧ‘瀹氳鍒犻櫎鎵�閫夋嫨鐨勬暟鎹悧锛�', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      }).then(() => {
+        deleteLinkTemplate({
+          name: this.templateForm,
+          btmName: this.nodeRow.label,
+          linkFlag: false
+        }).then(res => {
+          if (res.data.code === 200) {
+            this.$message.success(res.data.obj);
+          }
+        })
+      }).catch(() => {
+        this.$message({
+          type: 'info',
+          message: '宸插彇娑堝垹闄�'
+        });
+      });
+    }
+  }
 }
 </script>
 
diff --git a/Source/plt-web/plt-web-ui/src/views/modelingMenu/queryTemplate/queryDefine/index.vue b/Source/plt-web/plt-web-ui/src/views/modelingMenu/queryTemplate/queryDefine/index.vue
index 308c333..7dd9032 100644
--- a/Source/plt-web/plt-web-ui/src/views/modelingMenu/queryTemplate/queryDefine/index.vue
+++ b/Source/plt-web/plt-web-ui/src/views/modelingMenu/queryTemplate/queryDefine/index.vue
@@ -1,26 +1,13 @@
 <template>
   <el-container>
-
     <el-aside>
       <basic-container>
-        <div ref="TreeBox" style="height: calc(100vh - 144px);!important;">
+        <div ref="TreeBox" style="height: calc(100vh - 154px);!important;">
           <div class="headerCon">
-            <el-button icon="el-icon-plus" plain size="small" type="primary" @click="addClickHandler">鍒涘缓
-            </el-button>
-            <el-button icon="el-icon-edit" plain size="small" type="primary" @click="editClickHandler">淇敼
-            </el-button>
-            <el-button icon="el-icon-delete" plain size="small" type="danger" @click="delClickHandler">鍒犻櫎
-            </el-button>
-            <el-button icon="el-icon-download" plain size="small" type="primary" @click="exportClickHandler">瀵煎嚭
-            </el-button>
-            <el-button icon="el-icon-upload2" plain size="small" type="primary" @click="uploadClickHandler">瀵煎叆
-            </el-button>
-            <el-button class="smallBtn" plain size="small" type="primary"
-                       @click="checkViewClickHandler">鏌ョ湅浣跨敤鑼冨洿
-            </el-button>
+            <avue-radio v-model="radioForm"  :dic="radioDic" style="margin: 10px 0 5px"></avue-radio>
           </div>
           <!-- 宸︿晶鏍�         -->
-          <div style="height:  calc(100vh - 280px);">
+          <div style="height:  calc(100vh - 230px);">
             <avue-tree :data="treeData" :option="treeOption" @node-click="nodeClick">
           <span slot-scope="{ node, data }" class="el-tree-node__label">
            <span style="font-size: 15px">
@@ -36,15 +23,332 @@
 
     <el-main>
       <basic-container>
+        妯℃澘鍒楄〃锛�<avue-select v-model="templateForm" placeholder="璇烽�夋嫨妯℃澘" type="tree" :dic="templateData" @change="changeTemp"></avue-select>
+        <h3>鏌ヨ灞炴��</h3>
+        <avue-crud  ref="queryCrud"
+          :data="attrData" :option="attrOption" :table-loading="tableLoading" style="margin-top: 10px">
+          <template slot="menuLeft" slot-scope="scope">
+            <el-button icon="el-icon-plus" size="small" type="primary" @click="addHandler">鍒涘缓</el-button>
+            <el-button icon="el-icon-edit" plain size="small" type="primary" @click="editHandler">淇敼</el-button>
+            <el-button icon="el-icon-delete" plain size="small" type="danger" @click="delHandler">鍒犻櫎</el-button>
+          </template>
+        </avue-crud>
       </basic-container>
     </el-main>
 
+    <!-- 鏂板 && 缂栬緫 -->
+    <el-dialog
+      v-dialogDrag
+      :title="title === 'add' ? '鍒涘缓' : '淇敼'"
+      :visible.sync="visible"
+      append-to-body="true"
+      class="avue-dialog"
+      width="75%"
+      @close="addDialogClose">
+      <el-form ref="form" :model="form" :rules="rules" label-width="95px">
+        <el-form-item label="妯℃澘鍚嶇О锛�" prop="name">
+          <el-input v-model="form.name"></el-input>
+        </el-form-item>
+      </el-form>
+      <avue-crud
+        ref="dialogCrud"
+        :data="attrData"
+        :option="dialogAttrOption"
+        @select="selectHandler">
+      </avue-crud>
+      <span slot="footer" class="dialog-footer">
+         <el-button @click="addDialogClose">鍙� 娑�</el-button>
+         <el-button type="primary" @click="addDialogSavaHandler">纭� 瀹�</el-button>
+        </span>
+    </el-dialog>
   </el-container>
 </template>
 
 <script>
+import {getBizTypes, getAllAttributesByBtmId} from "@/api/modeling/businessType/api";
+import {gridLink,getAllAttributeByLink} from "@/api/modeling/linkType/api";
+import {gridTemplate,saveTemplate,updateTemplate,deleteTemplate} from "@/api/queryTemplate/queryDefine";
+import basicOption from "@/util/basic-option";
+import func from "@/util/func";
+
 export default {
-  name: "index"
+  name: "index",
+  data() {
+    return{
+      treeOption: {
+        height: 'auto',
+        defaultExpandAll: false,
+        menu: false,
+        addBtn: false,
+        props: {
+          label: 'label',
+          value: 'oid',
+          children: 'children'
+        }
+      },
+      nodeRow:{},
+      treeData: [],
+      radioForm:0,
+      radioDic:[{
+        label:'涓氬姟绫诲瀷',
+        value:0
+      },{
+        label:'閾炬帴绫诲瀷',
+        value:1
+      }],
+      templateForm:'',
+      templateData:[],
+      form :{
+        abNames:[],
+        linkTypeName: "",//宸︿晶閫夌殑閾炬帴绫诲瀷鍚嶇О
+        btmName:'',//宸︿晶閫夋嫨鐨勪笟鍔$被鍨嬪悕绉�
+        name:''
+      },
+      rules: {
+        name: [
+          {required: true, message: '璇疯緭鍏ユā鏉垮悕绉�', trigger: 'blur'}
+        ]
+      },
+      attrData: [],
+      title: '',
+      visible: false,
+      tableLoading: false,
+      attrOption: {
+        ...basicOption,
+        addBtn: false,
+        editBtn: false,
+        delBtn: false,
+        selection: true,
+        selectable:function (){
+          return false;
+        },
+        menu:false,
+        height: "auto",
+        calcHeight: -40,
+        tip:false,
+        column: [{
+            label: '瀛楁缂栫爜',
+            prop: 'id'
+          },
+          {
+            label: '瀛楁鍚嶇О',
+            prop: 'name'
+          }]
+      },
+      selectionRow:[],
+      dialogAttrOption: {
+        ...basicOption,
+        addBtn: false,
+        editBtn: false,
+        delBtn: false,
+        selection: true,
+        menu:false,
+        height: "auto",
+        calcHeight: 140,
+        title:'鏌ヨ灞炴��',
+        tip:false,
+        header:false,
+        column: [{
+          label: '瀛楁缂栫爜',
+          prop: 'id'
+        },
+          {
+            label: '瀛楁鍚嶇О',
+            prop: 'name'
+          }]
+      },
+      dialogSelectionRow:[]
+    }
+  },
+  created() {
+    this.getTreeList();
+  },
+  watch: {
+    radioForm: {
+      handler(newval) {
+        const loading = this.$loading({});
+        if (newval ==0) {
+          getBizTypes().then(res => {
+            const data = res.data.data.map(item => {
+              item.label=item.attributes.id;
+              return item;
+            });
+            this.treeData = data;
+            loading.close();
+          })
+        }else {
+          gridLink().then(res => {
+            const data = res.data.data.map(item => {
+              item.label=item.name;
+              return item;
+            });
+            this.treeData =  data;
+            loading.close();
+          })
+        }
+      }
+    },
+  },
+  methods: {
+    //鏍戣〃鏌ヨ
+    getTreeList() {
+      const loading = this.$loading({});
+      getBizTypes().then(res => {
+        const data = res.data.data.map(item => {
+          item.label=item.attributes.id;
+          return item;
+        });
+        this.treeData = data;
+        loading.close();
+      })
+    },
+
+    // 鏍戠偣鍑�
+    nodeClick(row) {
+      this.nodeRow = row;
+      this.tableLoading = true;
+      if(this.radioForm==1){
+        //閾炬帴绫诲瀷
+        getAllAttributeByLink({name:row.label,linkFlag:true}).then(res => {
+          this.attrData = res.data.data;
+          this.getTemp();
+        })
+      }else {
+        //涓氬姟绫诲瀷
+        getAllAttributesByBtmId({btmId:row.label,linkFlag:false}).then(res => {
+          this.attrData = res.data.data;
+          this.getTemp();
+        })
+      }
+    },
+    getTemp() {
+      gridTemplate({btmName: this.nodeRow.label, linkFlag: this.radioForm == 1}).then(res => {
+        const data = res.data.data.map(item => {
+          item.label = item.name;
+          item.value = item.name;
+          return item;
+        });
+        this.templateData = data;
+        if (res.data.data.length > 0) {
+          this.templateForm = this.templateData[0].value;
+        } else {
+          this.templateForm = '';
+          this.$refs.queryCrud.clearSelection();
+        }
+        this.tableLoading = false;
+      })
+    },
+    selectHandler(selection, row){debugger;
+      this.dialogSelectionRow=selection
+    },
+    changeTemp(data) {
+      this.$refs.queryCrud.clearSelection();
+      if (data.value != '') {
+        let abNames = data.item.abNames.join(',').toLowerCase().split(',')
+        this.selectionRow = this.attrData.filter(item => {
+          return abNames.includes(item.id.toLowerCase())
+        })
+        this.$refs.queryCrud.toggleSelection(this.selectionRow);
+      }
+    },
+    //鍒涘缓
+    addHandler(){
+      if (func.isEmptyObject(this.nodeRow)) {
+        this.$message.error('璇烽�夋嫨瑕佹坊鍔犵殑鑺傜偣');
+        return;
+      }
+      this.title = 'add';
+      this.visible = true;
+      this.$nextTick(()=>{
+        this.$refs.dialogCrud.clearSelection();
+      });
+    },
+    //淇敼
+    editHandler(){
+      if (func.isEmptyObject(this.nodeRow)) {
+        this.$message.error('璇疯嚦灏戦�夋嫨涓�鏉℃暟鎹�');
+        return;
+      }
+      this.form.name = this.templateForm;
+      this.title = 'edit';
+      this.visible = true;
+      this.$nextTick(()=>{
+        this.dialogSelectionRow=this.selectionRow;
+        this.$refs.dialogCrud.clearSelection();
+        this.$refs.dialogCrud.toggleSelection(this.dialogSelectionRow );
+      });
+    },
+    // 鏂板缂栬緫淇濆瓨
+    addDialogSavaHandler() {
+      this.$refs.form.validate((valid) => {
+        const saveFunction = this.title === 'add' ? saveTemplate : updateTemplate;
+        if (valid) {
+          if(this.radioForm == 0){
+            this.form.btmName=this.nodeRow.label;
+            delete this.form.linkTypeName
+          }else {
+            this.form.linkTypeName=this.nodeRow.label;
+            delete this.form.btmName
+          }
+          let abNames=this.dialogSelectionRow.map(item => {
+            return item.id
+          })
+          if(abNames.length==0){
+            this.$message.error('璇烽�夋嫨鏌ヨ灞炴��');
+            return false;
+          }
+          this.form.abNames=abNames;
+          saveFunction(this.form).then(res => {
+            if (res.data.code === 200) {
+              this.$message.success(res.data.obj);
+              if(this.title === 'edit'){
+                this.templateForm='';
+              }
+              this.getTemp();
+              this.addDialogClose();
+            }
+          })
+        } else {
+          return false;
+        }
+      });
+    },
+    // 鏂板缂栬緫瀵硅瘽妗嗗彇娑�
+    addDialogClose() {
+      this.form = {
+        abNames:[],
+        linkTypeName: "",//宸︿晶閫夌殑閾炬帴绫诲瀷鍚嶇О
+        btmName:'',//宸︿晶閫夋嫨鐨勪笟鍔$被鍨嬪悕绉�
+        name:''
+      };
+      this.$refs.form.clearValidate();
+      this.visible = false;
+    },
+    //鍒犻櫎
+    delHandler(){
+      if (func.isEmptyObject(this.nodeRow)) {
+        this.$message.error('璇烽�夋嫨鏁版嵁');
+        return;
+      }
+      this.$confirm('鎮ㄧ‘瀹氳鍒犻櫎鎵�閫夋嫨鐨勬暟鎹悧锛�', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      }).then(() => {
+        deleteTemplate({name:this.templateForm,btmName: this.nodeRow.label, linkFlag: this.radioForm == 1}).then(res => {
+          if (res.data.code === 200) {
+            this.$message.success(res.data.obj);
+            this.getTemp();
+          }
+        })
+      }).catch(() => {
+        this.$message({
+          type: 'info',
+          message: '宸插彇娑堝垹闄�'
+        });
+      });
+    }
+  }
 }
 </script>
 

--
Gitblit v1.9.3