From 8e6c58eec222c4bbea613e02703d9af22da72bee Mon Sep 17 00:00:00 2001
From: xiejun <xj@2023>
Date: 星期四, 15 六月 2023 18:17:49 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 Source/UBCS-WEB/src/components/flow-cycle/components/CustomCommand.vue                                                       |   67 
 Source/UBCS-WEB/src/views/integration/applicationForm.vue                                                                    |    9 
 Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/mapper/RevisionRuleMapper.java                              |    9 
 Source/UBCS-WEB/src/components/flow-cycle/components/ContextMenuItem.vue                                                     |   35 
 Source/UBCS-WEB/src/views/integration/systemInfo.vue                                                                         |   56 
 Source/UBCS-WEB/src/components/template/SetPersonnel.vue                                                                     |  138 +
 Source/UBCS-WEB/vue.config.js                                                                                                |    2 
 Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/controller/StatusController.java                            |   17 
 Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/WebSecretServiceImpl.java                      |  376 ++++
 Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/IAttributeService.java                              |    9 
 Source/UBCS-WEB/src/api/omd/OmdAttribute.js                                                                                  |    4 
 Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/IWebSecretService.java                              |  120 +
 Source/UBCS-WEB/src/components/flow-cycle/components/Icon.vue                                                                |   15 
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/util/ClientBusinessObject.java                            |    1 
 Source/UBCS-WEB/src/views/flow/flowPath.vue                                                                                  |    2 
 Source/UBCS-WEB/src/views/modeling/Version.vue                                                                               |   57 
 Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/feign/RevisionRuleClient.java                               |   12 
 Source/UBCS/ubcs-service/ubcs-omd/pom.xml                                                                                    |    6 
 Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/AttributeServiceImpl.java                      |   41 
 Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/IStatusService.java                                 |    4 
 Source/UBCS-WEB/src/components/flow-cycle/components/Toolbar.vue                                                             |  130 +
 Source/UBCS/ubcs-service/ubcs-omd/src/main/resources/mapper/StatusMapper.xml                                                 |   13 
 Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/IRevisionRuleService.java                           |    5 
 Source/UBCS-WEB/src/components/flow-cycle/components/DetailForm.vue                                                          |  208 ++
 Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/web/enumpck/DataSecretEnum.java                |   76 
 Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/mapper/StatusMapper.java                                    |    9 
 Source/UBCS-WEB/src/components/flow-cycle/components/ContextMenu.vue                                                         |   90 +
 Source/UBCS/ubcs-service-api/ubcs-omd-api/pom.xml                                                                            |    6 
 Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/controller/AttributeController.java                         |    6 
 Source/UBCS-WEB/src/components/flow-cycle/components/DetailPanel.vue                                                         |  119 +
 Source/UBCS-WEB/package-lock.json                                                                                            |  584 +++++++
 Source/UBCS-WEB/src/views/modeling/LinkType.vue                                                                              |    1 
 Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/RevisionRuleServiceImpl.java                   |   19 
 Source/UBCS-WEB/src/api/template/setPersonnel.js                                                                             |   22 
 Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/controller/RevisionRuleController.java                      |   14 
 Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/StatusServiceImpl.java                         |   13 
 Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/feign/WebSecretClient.java                                  |  111 +
 Source/UBCS-WEB/package.json                                                                                                 |    1 
 Source/UBCS/ubcs-service/ubcs-omd/src/main/resources/mapper/RevisionRuleMapper.xml                                           |   11 
 Source/UBCS-WEB/src/views/modeling/Business.vue                                                                              |   94 
 Source/UBCS-WEB/src/components/flow-cycle/flowchartEditor.vue                                                                |  230 ++
 Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/web/constant/FrameWorkBusLangCodeConstant.java |  519 ++++++
 Source/UBCS-WEB/src/views/modeling/cycle.vue                                                                                 |  333 ++--
 Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/feign/IWebSecretFallback.java                       |  101 +
 Source/UBCS-WEB/src/components/flow-cycle/components/EditorMinimap.vue                                                       |   11 
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmIOServiceImpl.java                        |    3 
 Source/UBCS/ubcs-service/ubcs-user/src/main/java/com/vci/ubcs/system/user/wrapper/UserWrapper.java                           |    2 
 Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/feign/IWebSecretClient.java                         |  184 ++
 Source/UBCS-WEB/src/views/modeling/original.vue                                                                              |   41 
 Source/UBCS-WEB/src/views/modeling/status.vue                                                                                |   35 
 Source/UBCS-WEB/src/components/flow-cycle/iconfont.js                                                                        |    1 
 Source/UBCS-WEB/src/components/FormTemplate/index.vue                                                                        |    9 
 Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmEngineServiceImpl.java                    |   34 
 Source/UBCS-WEB/src/components/flow-cycle/components/ToolbarButton.vue                                                       |   28 
 Source/UBCS-WEB/src/views/MasterData/FormTempalteTest.vue                                                                    |    4 
 Source/UBCS-WEB/src/views/modeling/originalAdd.vue                                                                           |  167 +-
 Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/feign/StatusClient.java                                     |    9 
 Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/utils/VciOmdUtil.java                               |   25 
 Source/UBCS-WEB/src/components/flow-cycle/components/ItemPanel.vue                                                           |  485 ++++++
 59 files changed, 4,276 insertions(+), 457 deletions(-)

diff --git a/Source/UBCS-WEB/package-lock.json b/Source/UBCS-WEB/package-lock.json
index c93464c..8bcca95 100644
--- a/Source/UBCS-WEB/package-lock.json
+++ b/Source/UBCS-WEB/package-lock.json
@@ -14,6 +14,7 @@
         "classlist-polyfill": "^1.2.0",
         "crypto-js": "^4.0.0",
         "element-ui": "^2.15.6",
+        "instead": "^1.0.3",
         "js-base64": "^2.5.1",
         "js-cookie": "^2.2.0",
         "js-md5": "^0.7.3",
@@ -25,6 +26,7 @@
         "script-loader": "^0.7.2",
         "vue": "^2.6.10",
         "vue-axios": "^2.1.2",
+        "vue-flowchart-editor": "^1.0.2",
         "vue-i18n": "^8.7.0",
         "vue-router": "^3.0.1",
         "vuex": "^3.1.1"
@@ -51,6 +53,129 @@
       },
       "engines": {
         "node": ">=6.0.0"
+      }
+    },
+    "node_modules/@antv/attr": {
+      "version": "0.0.7",
+      "resolved": "https://registry.npmjs.org/@antv/attr/-/attr-0.0.7.tgz",
+      "integrity": "sha512-dgvJ2j6Sn7of8AET9ykTseS8mjwisLcAGf/UCkEaMLCduCr6hQtwAEBIZnEpk0b04QlD5pu0kqV93B1ItnvCPw==",
+      "dependencies": {
+        "@antv/util": "~1.2.5"
+      }
+    },
+    "node_modules/@antv/attr/node_modules/@antv/util": {
+      "version": "1.2.5",
+      "resolved": "https://registry.npmjs.org/@antv/util/-/util-1.2.5.tgz",
+      "integrity": "sha512-yz1AjXSEjNu9O5kK9pqKq69f/Iliu/IA3XXljUcfrlbUtmUJ0CH1tB5I60vPqfaKaUPhz+/35K+56yqaCsGmqA==",
+      "dependencies": {
+        "@antv/gl-matrix": "^2.7.1"
+      }
+    },
+    "node_modules/@antv/component": {
+      "version": "0.0.9",
+      "resolved": "https://registry.npmjs.org/@antv/component/-/component-0.0.9.tgz",
+      "integrity": "sha512-AcI6oG0Ot9svKieA3AowQuGmwsIjQpC2XJv71FRua/3b0IaWnF3K93vyJnmsWej+CQnXPE68JZaIjdgtAcgTwg==",
+      "dependencies": {
+        "@antv/attr": "~0.0.7",
+        "@antv/g": "~3.2.2",
+        "@antv/util": "~1.2.5",
+        "wolfy87-eventemitter": "~5.1.0"
+      }
+    },
+    "node_modules/@antv/component/node_modules/@antv/g": {
+      "version": "3.2.2",
+      "resolved": "https://registry.npmjs.org/@antv/g/-/g-3.2.2.tgz",
+      "integrity": "sha512-mBuFnoWS6zIRy+MhpGDJxq1tHJj0o1mp0ifWPRiIFO3rlZLcNHf0D/Ww+UoC5+d8GZTz+6JqIzmxCZ3EZ4LmdQ==",
+      "dependencies": {
+        "@antv/gl-matrix": "~2.7.1",
+        "@antv/util": "~1.2.3",
+        "d3-ease": "~1.0.3",
+        "d3-interpolate": "~1.1.5",
+        "d3-timer": "~1.0.6",
+        "wolfy87-eventemitter": "~5.1.0"
+      }
+    },
+    "node_modules/@antv/component/node_modules/@antv/util": {
+      "version": "1.2.5",
+      "resolved": "https://registry.npmjs.org/@antv/util/-/util-1.2.5.tgz",
+      "integrity": "sha512-yz1AjXSEjNu9O5kK9pqKq69f/Iliu/IA3XXljUcfrlbUtmUJ0CH1tB5I60vPqfaKaUPhz+/35K+56yqaCsGmqA==",
+      "dependencies": {
+        "@antv/gl-matrix": "^2.7.1"
+      }
+    },
+    "node_modules/@antv/component/node_modules/wolfy87-eventemitter": {
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/wolfy87-eventemitter/-/wolfy87-eventemitter-5.1.0.tgz",
+      "integrity": "sha512-VakY4+17DbamV2VW4nZERrSuilclCRcYtfchPWe6jlma8k0AeLJxBR+C5OSFFtICArDFdXk0yw67HUGrTCdrEg=="
+    },
+    "node_modules/@antv/g": {
+      "version": "3.4.10",
+      "resolved": "https://registry.npmjs.org/@antv/g/-/g-3.4.10.tgz",
+      "integrity": "sha512-pKy/L1SyRBsXuujdkggqrdBA0/ciAgHiArYBdIJsxHRxCneUP01wGwHdGfDayh2+S0gcSBHynjhoEahsaZaLkw==",
+      "dependencies": {
+        "@antv/gl-matrix": "~2.7.1",
+        "@antv/util": "~1.3.1",
+        "d3-ease": "~1.0.3",
+        "d3-interpolate": "~1.1.5",
+        "d3-timer": "~1.0.6",
+        "detect-browser": "^5.1.0"
+      }
+    },
+    "node_modules/@antv/g6": {
+      "version": "2.2.6",
+      "resolved": "https://registry.npmjs.org/@antv/g6/-/g6-2.2.6.tgz",
+      "integrity": "sha512-xxuXYjxw7o97PRo94e3pXHbsdHYdd+oKzy20ig91F61Bb7ddlHZg0I6ReU+skfS83cffqozgS+eZ9GWAUkS9UQ==",
+      "dependencies": {
+        "@antv/component": "~0.0.4",
+        "@antv/g": "^3.3.0",
+        "@antv/hierarchy": "~0.3.13",
+        "@antv/scale": "^0.0.1",
+        "@antv/util": "^1.2.0",
+        "d3": "^5.4.0",
+        "d3-sankey": "^0.7.1",
+        "d3-svg-legend": "^2.25.6",
+        "dagre": "~0.8.2",
+        "dom-to-image": "^2.6.0",
+        "lodash": "~4.17.4",
+        "wolfy87-eventemitter": "~5.2.4"
+      },
+      "engines": {
+        "node": ">=8.9.0"
+      }
+    },
+    "node_modules/@antv/gl-matrix": {
+      "version": "2.7.1",
+      "resolved": "https://registry.npmjs.org/@antv/gl-matrix/-/gl-matrix-2.7.1.tgz",
+      "integrity": "sha512-oOWcVNlpELIKi9x+Mm1Vwbz8pXfkbJKykoCIOJ/dNK79hSIANbpXJ5d3Rra9/wZqK6MC961B7sybFhPlLraT3Q=="
+    },
+    "node_modules/@antv/hierarchy": {
+      "version": "0.3.15",
+      "resolved": "https://registry.npmjs.org/@antv/hierarchy/-/hierarchy-0.3.15.tgz",
+      "integrity": "sha512-TxgrQrNayVLgimfbWti+QIMVEEt+Pc8dodMC4ypMSAsJ6Yj8JXmcibgego7j7dFRqnlzyUdaiNCQUMBgl2cQvQ==",
+      "dependencies": {
+        "@antv/util": "^1.2.4"
+      }
+    },
+    "node_modules/@antv/scale": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/@antv/scale/-/scale-0.0.1.tgz",
+      "integrity": "sha512-SZ5nRe57tYq1dOJLPwwc+8iQFeHXXMTq3Me9UKYmnSvy9uh0GMoe0OwqkwJuFDsGJjJ4iyM/JNuvb0mwCC+Nhw==",
+      "dependencies": {
+        "@antv/util": "~1.0.6",
+        "fecha": "~2.3.3"
+      }
+    },
+    "node_modules/@antv/scale/node_modules/@antv/util": {
+      "version": "1.0.12",
+      "resolved": "https://registry.npmjs.org/@antv/util/-/util-1.0.12.tgz",
+      "integrity": "sha512-lRQ98e4g6qHgZ78ak5HJq6tCQRfofcdIi5H7mXIubp2mpfQHaez2eMKxmPAvHTyD3At74gNP8qjFdzHsPcXsXA=="
+    },
+    "node_modules/@antv/util": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/@antv/util/-/util-1.3.1.tgz",
+      "integrity": "sha512-cbUta0hIJrKEaW3eKoGarz3Ita+9qUPF2YzTj8A6wds/nNiy20G26ztIWHU+5ThLc13B1n5Ik52LbaCaeg9enA==",
+      "dependencies": {
+        "@antv/gl-matrix": "^2.7.1"
       }
     },
     "node_modules/@babel/code-frame": {
@@ -1701,6 +1826,11 @@
         "node": ">=8"
       }
     },
+    "node_modules/@types/d3-selection": {
+      "version": "1.0.10",
+      "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-1.0.10.tgz",
+      "integrity": "sha512-mHICSFHpIwgTycsvgINYCwItk039eofbGRzVNdeUUtv0S2BD1vXFFUKaeMJN3ARbVl+hlsVOIwdzhzub5tjr6Q=="
+    },
     "node_modules/@types/glob": {
       "version": "7.2.0",
       "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz",
@@ -2507,6 +2637,15 @@
         "node": ">=4"
       }
     },
+    "node_modules/ant-design-palettes": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/ant-design-palettes/-/ant-design-palettes-1.1.3.tgz",
+      "integrity": "sha512-UpkkTp8egEN21KZNvY7sTcabLlkHvLvS71EVPk4CYi77Z9AaGGCaVn7i72tbOgWDrQp2wjIg8WgMbKBdK7GtWA==",
+      "deprecated": "Please use @ant-design/colors to replace ant-design-palettes",
+      "dependencies": {
+        "tinycolor2": "^1.4.1"
+      }
+    },
     "node_modules/any-promise": {
       "version": "1.3.0",
       "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
@@ -3235,6 +3374,16 @@
       "optional": true,
       "engines": {
         "node": ">=8"
+      }
+    },
+    "node_modules/bindings": {
+      "version": "1.5.0",
+      "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz",
+      "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==",
+      "dev": true,
+      "optional": true,
+      "dependencies": {
+        "file-uri-to-path": "1.0.0"
       }
     },
     "node_modules/bluebird": {
@@ -5260,6 +5409,366 @@
       "integrity": "sha512-NJGVKPS81XejHcLhaLJS7plab0fK3slPh11mESeeDq2W4ZI5kUKK/LRRdVDvjJseojbPB7ZwjnyOybg3Igea/A==",
       "dev": true
     },
+    "node_modules/d3": {
+      "version": "5.16.0",
+      "resolved": "https://registry.npmjs.org/d3/-/d3-5.16.0.tgz",
+      "integrity": "sha512-4PL5hHaHwX4m7Zr1UapXW23apo6pexCgdetdJ5kTmADpG/7T9Gkxw0M0tf/pjoB63ezCCm0u5UaFYy2aMt0Mcw==",
+      "dependencies": {
+        "d3-array": "1",
+        "d3-axis": "1",
+        "d3-brush": "1",
+        "d3-chord": "1",
+        "d3-collection": "1",
+        "d3-color": "1",
+        "d3-contour": "1",
+        "d3-dispatch": "1",
+        "d3-drag": "1",
+        "d3-dsv": "1",
+        "d3-ease": "1",
+        "d3-fetch": "1",
+        "d3-force": "1",
+        "d3-format": "1",
+        "d3-geo": "1",
+        "d3-hierarchy": "1",
+        "d3-interpolate": "1",
+        "d3-path": "1",
+        "d3-polygon": "1",
+        "d3-quadtree": "1",
+        "d3-random": "1",
+        "d3-scale": "2",
+        "d3-scale-chromatic": "1",
+        "d3-selection": "1",
+        "d3-shape": "1",
+        "d3-time": "1",
+        "d3-time-format": "2",
+        "d3-timer": "1",
+        "d3-transition": "1",
+        "d3-voronoi": "1",
+        "d3-zoom": "1"
+      }
+    },
+    "node_modules/d3-array": {
+      "version": "1.2.4",
+      "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz",
+      "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw=="
+    },
+    "node_modules/d3-axis": {
+      "version": "1.0.12",
+      "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-1.0.12.tgz",
+      "integrity": "sha512-ejINPfPSNdGFKEOAtnBtdkpr24c4d4jsei6Lg98mxf424ivoDP2956/5HDpIAtmHo85lqT4pruy+zEgvRUBqaQ=="
+    },
+    "node_modules/d3-brush": {
+      "version": "1.1.6",
+      "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-1.1.6.tgz",
+      "integrity": "sha512-7RW+w7HfMCPyZLifTz/UnJmI5kdkXtpCbombUSs8xniAyo0vIbrDzDwUJB6eJOgl9u5DQOt2TQlYumxzD1SvYA==",
+      "dependencies": {
+        "d3-dispatch": "1",
+        "d3-drag": "1",
+        "d3-interpolate": "1",
+        "d3-selection": "1",
+        "d3-transition": "1"
+      }
+    },
+    "node_modules/d3-chord": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-1.0.6.tgz",
+      "integrity": "sha512-JXA2Dro1Fxw9rJe33Uv+Ckr5IrAa74TlfDEhE/jfLOaXegMQFQTAgAw9WnZL8+HxVBRXaRGCkrNU7pJeylRIuA==",
+      "dependencies": {
+        "d3-array": "1",
+        "d3-path": "1"
+      }
+    },
+    "node_modules/d3-collection": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.7.tgz",
+      "integrity": "sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A=="
+    },
+    "node_modules/d3-color": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.4.1.tgz",
+      "integrity": "sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q=="
+    },
+    "node_modules/d3-contour": {
+      "version": "1.3.2",
+      "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-1.3.2.tgz",
+      "integrity": "sha512-hoPp4K/rJCu0ladiH6zmJUEz6+u3lgR+GSm/QdM2BBvDraU39Vr7YdDCicJcxP1z8i9B/2dJLgDC1NcvlF8WCg==",
+      "dependencies": {
+        "d3-array": "^1.1.1"
+      }
+    },
+    "node_modules/d3-dispatch": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.6.tgz",
+      "integrity": "sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA=="
+    },
+    "node_modules/d3-drag": {
+      "version": "1.2.5",
+      "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-1.2.5.tgz",
+      "integrity": "sha512-rD1ohlkKQwMZYkQlYVCrSFxsWPzI97+W+PaEIBNTMxRuxz9RF0Hi5nJWHGVJ3Om9d2fRTe1yOBINJyy/ahV95w==",
+      "dependencies": {
+        "d3-dispatch": "1",
+        "d3-selection": "1"
+      }
+    },
+    "node_modules/d3-dsv": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-1.2.0.tgz",
+      "integrity": "sha512-9yVlqvZcSOMhCYzniHE7EVUws7Fa1zgw+/EAV2BxJoG3ME19V6BQFBwI855XQDsxyOuG7NibqRMTtiF/Qup46g==",
+      "dependencies": {
+        "commander": "2",
+        "iconv-lite": "0.4",
+        "rw": "1"
+      },
+      "bin": {
+        "csv2json": "bin/dsv2json",
+        "csv2tsv": "bin/dsv2dsv",
+        "dsv2dsv": "bin/dsv2dsv",
+        "dsv2json": "bin/dsv2json",
+        "json2csv": "bin/json2dsv",
+        "json2dsv": "bin/json2dsv",
+        "json2tsv": "bin/json2dsv",
+        "tsv2csv": "bin/dsv2dsv",
+        "tsv2json": "bin/dsv2json"
+      }
+    },
+    "node_modules/d3-dsv/node_modules/commander": {
+      "version": "2.20.3",
+      "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+      "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="
+    },
+    "node_modules/d3-ease": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.7.tgz",
+      "integrity": "sha512-lx14ZPYkhNx0s/2HX5sLFUI3mbasHjSSpwO/KaaNACweVwxUruKyWVcb293wMv1RqTPZyZ8kSZ2NogUZNcLOFQ=="
+    },
+    "node_modules/d3-fetch": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-1.2.0.tgz",
+      "integrity": "sha512-yC78NBVcd2zFAyR/HnUiBS7Lf6inSCoWcSxFfw8FYL7ydiqe80SazNwoffcqOfs95XaLo7yebsmQqDKSsXUtvA==",
+      "dependencies": {
+        "d3-dsv": "1"
+      }
+    },
+    "node_modules/d3-force": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-1.2.1.tgz",
+      "integrity": "sha512-HHvehyaiUlVo5CxBJ0yF/xny4xoaxFxDnBXNvNcfW9adORGZfyNF1dj6DGLKyk4Yh3brP/1h3rnDzdIAwL08zg==",
+      "dependencies": {
+        "d3-collection": "1",
+        "d3-dispatch": "1",
+        "d3-quadtree": "1",
+        "d3-timer": "1"
+      }
+    },
+    "node_modules/d3-format": {
+      "version": "1.4.5",
+      "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.4.5.tgz",
+      "integrity": "sha512-J0piedu6Z8iB6TbIGfZgDzfXxUFN3qQRMofy2oPdXzQibYGqPB/9iMcxr/TGalU+2RsyDO+U4f33id8tbnSRMQ=="
+    },
+    "node_modules/d3-geo": {
+      "version": "1.12.1",
+      "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-1.12.1.tgz",
+      "integrity": "sha512-XG4d1c/UJSEX9NfU02KwBL6BYPj8YKHxgBEw5om2ZnTRSbIcego6dhHwcxuSR3clxh0EpE38os1DVPOmnYtTPg==",
+      "dependencies": {
+        "d3-array": "1"
+      }
+    },
+    "node_modules/d3-hierarchy": {
+      "version": "1.1.9",
+      "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-1.1.9.tgz",
+      "integrity": "sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ=="
+    },
+    "node_modules/d3-interpolate": {
+      "version": "1.1.6",
+      "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.1.6.tgz",
+      "integrity": "sha512-mOnv5a+pZzkNIHtw/V6I+w9Lqm9L5bG3OTXPM5A+QO0yyVMQ4W1uZhR+VOJmazaOZXri2ppbiZ5BUNWT0pFM9A==",
+      "dependencies": {
+        "d3-color": "1"
+      }
+    },
+    "node_modules/d3-path": {
+      "version": "1.0.9",
+      "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz",
+      "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg=="
+    },
+    "node_modules/d3-polygon": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-1.0.6.tgz",
+      "integrity": "sha512-k+RF7WvI08PC8reEoXa/w2nSg5AUMTi+peBD9cmFc+0ixHfbs4QmxxkarVal1IkVkgxVuk9JSHhJURHiyHKAuQ=="
+    },
+    "node_modules/d3-quadtree": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-1.0.7.tgz",
+      "integrity": "sha512-RKPAeXnkC59IDGD0Wu5mANy0Q2V28L+fNe65pOCXVdVuTJS3WPKaJlFHer32Rbh9gIo9qMuJXio8ra4+YmIymA=="
+    },
+    "node_modules/d3-random": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-1.1.2.tgz",
+      "integrity": "sha512-6AK5BNpIFqP+cx/sreKzNjWbwZQCSUatxq+pPRmFIQaWuoD+NrbVWw7YWpHiXpCQ/NanKdtGDuB+VQcZDaEmYQ=="
+    },
+    "node_modules/d3-sankey": {
+      "version": "0.7.1",
+      "resolved": "https://registry.npmjs.org/d3-sankey/-/d3-sankey-0.7.1.tgz",
+      "integrity": "sha512-KAyowBWtTLQxyXq1UhXcdCXKbuCQvL51FgqOS+fKlNTQ/4FfSWabRlWs2DezzwKyredAsOhBSQZN/i0XdeE2tQ==",
+      "dependencies": {
+        "d3-array": "1",
+        "d3-collection": "1",
+        "d3-shape": "^1.2.0"
+      }
+    },
+    "node_modules/d3-scale": {
+      "version": "2.2.2",
+      "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-2.2.2.tgz",
+      "integrity": "sha512-LbeEvGgIb8UMcAa0EATLNX0lelKWGYDQiPdHj+gLblGVhGLyNbaCn3EvrJf0A3Y/uOOU5aD6MTh5ZFCdEwGiCw==",
+      "dependencies": {
+        "d3-array": "^1.2.0",
+        "d3-collection": "1",
+        "d3-format": "1",
+        "d3-interpolate": "1",
+        "d3-time": "1",
+        "d3-time-format": "2"
+      }
+    },
+    "node_modules/d3-scale-chromatic": {
+      "version": "1.5.0",
+      "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-1.5.0.tgz",
+      "integrity": "sha512-ACcL46DYImpRFMBcpk9HhtIyC7bTBR4fNOPxwVSl0LfulDAwyiHyPOTqcDG1+t5d4P9W7t/2NAuWu59aKko/cg==",
+      "dependencies": {
+        "d3-color": "1",
+        "d3-interpolate": "1"
+      }
+    },
+    "node_modules/d3-selection": {
+      "version": "1.4.2",
+      "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.4.2.tgz",
+      "integrity": "sha512-SJ0BqYihzOjDnnlfyeHT0e30k0K1+5sR3d5fNueCNeuhZTnGw4M4o8mqJchSwgKMXCNFo+e2VTChiSJ0vYtXkg=="
+    },
+    "node_modules/d3-shape": {
+      "version": "1.3.7",
+      "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz",
+      "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==",
+      "dependencies": {
+        "d3-path": "1"
+      }
+    },
+    "node_modules/d3-svg-legend": {
+      "version": "2.25.6",
+      "resolved": "https://registry.npmjs.org/d3-svg-legend/-/d3-svg-legend-2.25.6.tgz",
+      "integrity": "sha512-6dueSjQr3+g9SlQ1SOzc4V58cCjjBeyo4WEcY8PW80i9XD/s562W/4xk05bpky0vzQx+i2XmXj3CYT+9KIRlnw==",
+      "dependencies": {
+        "@types/d3-selection": "1.0.10",
+        "d3-array": "1.0.1",
+        "d3-dispatch": "1.0.1",
+        "d3-format": "1.0.2",
+        "d3-scale": "1.0.3",
+        "d3-selection": "1.0.2",
+        "d3-transition": "1.0.3"
+      }
+    },
+    "node_modules/d3-svg-legend/node_modules/d3-array": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.0.1.tgz",
+      "integrity": "sha512-VPS5OH5Xb43tkFkxHEc4r5yWhlDwST47zh1q+qvgTj7xB9xDXn+UEcofhvNC7s8gD55y9Q/MCSPSBUVvnzo3Dw=="
+    },
+    "node_modules/d3-svg-legend/node_modules/d3-dispatch": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.1.tgz",
+      "integrity": "sha512-BRTp95mobTSKx8EtpOLbxXuYVtNNr0PmelkH9Uzg5cgcO5O1M0i3+2C0FeM2I95BwQoIlsuZXQTPIoIt5xOtmw=="
+    },
+    "node_modules/d3-svg-legend/node_modules/d3-format": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.0.2.tgz",
+      "integrity": "sha512-VHFdLLjGkeGrRL8T/rlIIDhI3vvVX/oOTM/GaDJfB1sIb4dU5ZgiEjg3EeidJdQ/70u60tM015TSWa1gqqLRhg=="
+    },
+    "node_modules/d3-svg-legend/node_modules/d3-scale": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-1.0.3.tgz",
+      "integrity": "sha512-ah2Xqywu96gau2iET3T0ZTsu0/X0gfoB8vDTuZ1OaG5F0SgGJLXreBVBknSZf2HKnxjenRvFok3qY2FgY4RpFg==",
+      "dependencies": {
+        "d3-array": "1",
+        "d3-collection": "1",
+        "d3-color": "1",
+        "d3-format": "1",
+        "d3-interpolate": "1",
+        "d3-time": "1",
+        "d3-time-format": "2"
+      }
+    },
+    "node_modules/d3-svg-legend/node_modules/d3-selection": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.0.2.tgz",
+      "integrity": "sha512-nInNdsdhljkDqkU/83bdWwtiJ7xsX3l57YZMlqsAOMeQROeCv7osPqQgYnao0NmRZEGc11hNakY+EOkaIdsWpQ=="
+    },
+    "node_modules/d3-svg-legend/node_modules/d3-transition": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-1.0.3.tgz",
+      "integrity": "sha512-Facxcbma0nA2GVrx7B/Mgnn5ju6SwUMzGa9YcYmQjpqmaIq1Zbp5vVJLjtH6b08Lu0vcX7O6a4z+AlLmdCxrCQ==",
+      "dependencies": {
+        "d3-color": "1",
+        "d3-dispatch": "1",
+        "d3-ease": "1",
+        "d3-interpolate": "1",
+        "d3-selection": "1",
+        "d3-timer": "1"
+      }
+    },
+    "node_modules/d3-time": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.1.0.tgz",
+      "integrity": "sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA=="
+    },
+    "node_modules/d3-time-format": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.3.0.tgz",
+      "integrity": "sha512-guv6b2H37s2Uq/GefleCDtbe0XZAuy7Wa49VGkPVPMfLL9qObgBST3lEHJBMUp8S7NdLQAGIvr2KXk8Hc98iKQ==",
+      "dependencies": {
+        "d3-time": "1"
+      }
+    },
+    "node_modules/d3-timer": {
+      "version": "1.0.10",
+      "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.10.tgz",
+      "integrity": "sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw=="
+    },
+    "node_modules/d3-transition": {
+      "version": "1.3.2",
+      "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-1.3.2.tgz",
+      "integrity": "sha512-sc0gRU4PFqZ47lPVHloMn9tlPcv8jxgOQg+0zjhfZXMQuvppjG6YuwdMBE0TuqCZjeJkLecku/l9R0JPcRhaDA==",
+      "dependencies": {
+        "d3-color": "1",
+        "d3-dispatch": "1",
+        "d3-ease": "1",
+        "d3-interpolate": "1",
+        "d3-selection": "^1.1.0",
+        "d3-timer": "1"
+      }
+    },
+    "node_modules/d3-voronoi": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/d3-voronoi/-/d3-voronoi-1.1.4.tgz",
+      "integrity": "sha512-dArJ32hchFsrQ8uMiTBLq256MpnZjeuBtdHpaDlYuQyjU0CVzCJl/BVW+SkszaAeH95D/8gxqAhgx0ouAWAfRg=="
+    },
+    "node_modules/d3-zoom": {
+      "version": "1.8.3",
+      "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-1.8.3.tgz",
+      "integrity": "sha512-VoLXTK4wvy1a0JpH2Il+F2CiOhVu7VRXWF5M/LroMIh3/zBAC3WAt7QoIvPibOavVo20hN6/37vwAsdBejLyKQ==",
+      "dependencies": {
+        "d3-dispatch": "1",
+        "d3-drag": "1",
+        "d3-interpolate": "1",
+        "d3-selection": "1",
+        "d3-transition": "1"
+      }
+    },
+    "node_modules/dagre": {
+      "version": "0.8.5",
+      "resolved": "https://registry.npmjs.org/dagre/-/dagre-0.8.5.tgz",
+      "integrity": "sha512-/aTqmnRta7x7MCCpExk7HQL2O4owCT2h8NT//9I1OQ9vt29Pa0BzSAkR5lwFUcQ7491yVi/3CXU9jQ5o0Mn2Sw==",
+      "dependencies": {
+        "graphlib": "^2.1.8",
+        "lodash": "^4.17.15"
+      }
+    },
     "node_modules/dashdash": {
       "version": "1.14.1",
       "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
@@ -5699,6 +6208,11 @@
         "npm": "1.2.8000 || >= 1.4.16"
       }
     },
+    "node_modules/detect-browser": {
+      "version": "5.3.0",
+      "resolved": "https://registry.npmjs.org/detect-browser/-/detect-browser-5.3.0.tgz",
+      "integrity": "sha512-53rsFbGdwMwlF7qvCt0ypLM5V5/Mbl0szB7GPN8y9NCcbknYOeVVXdrXEq+90IwAfrrzt6Hd+u2E2ntakICU8w=="
+    },
     "node_modules/detect-node": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz",
@@ -5801,6 +6315,11 @@
           "url": "https://github.com/sponsors/fb55"
         }
       ]
+    },
+    "node_modules/dom-to-image": {
+      "version": "2.6.0",
+      "resolved": "https://registry.npmjs.org/dom-to-image/-/dom-to-image-2.6.0.tgz",
+      "integrity": "sha512-Dt0QdaHmLpjURjU7Tnu3AgYSF2LuOmksSGsUcE6ItvJoCWTBEmiMXcqBdNSAm9+QbbwD7JMoVsuuKX6ZVQv1qA=="
     },
     "node_modules/domain-browser": {
       "version": "1.2.0",
@@ -6923,6 +7442,11 @@
         "node": ">=0.8.0"
       }
     },
+    "node_modules/fecha": {
+      "version": "2.3.3",
+      "resolved": "https://registry.npmjs.org/fecha/-/fecha-2.3.3.tgz",
+      "integrity": "sha512-lUGBnIamTAwk4znq5BcqsDaxSmZ9nDVJaij6NvRt/Tg4R69gERA+otPKbS86ROw9nxVMw2/mp1fnaiWqbs6Sdg=="
+    },
     "node_modules/figgy-pudding": {
       "version": "3.5.2",
       "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz",
@@ -7009,6 +7533,13 @@
       "engines": {
         "node": ">= 4"
       }
+    },
+    "node_modules/file-uri-to-path": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz",
+      "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==",
+      "dev": true,
+      "optional": true
     },
     "node_modules/filesize": {
       "version": "3.6.1",
@@ -7465,6 +7996,16 @@
         "assert-plus": "^1.0.0"
       }
     },
+    "node_modules/gg-editor-core": {
+      "version": "1.3.4",
+      "resolved": "https://registry.npmjs.org/gg-editor-core/-/gg-editor-core-1.3.4.tgz",
+      "integrity": "sha512-h2ALYh/os7XphrhR967HQoc48tX8+OoG+bCoDEphwLDwqOieoIAEngqjy7DBv1874fxhw7ry1F0bKHdzCvrVIQ==",
+      "dependencies": {
+        "@antv/g6": "^2.2.6",
+        "ant-design-palettes": "^1.1.3",
+        "wolfy87-eventemitter": "^5.2.5"
+      }
+    },
     "node_modules/glob": {
       "version": "7.2.3",
       "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
@@ -7617,6 +8158,14 @@
       "version": "4.2.11",
       "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
       "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="
+    },
+    "node_modules/graphlib": {
+      "version": "2.1.8",
+      "resolved": "https://registry.npmjs.org/graphlib/-/graphlib-2.1.8.tgz",
+      "integrity": "sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A==",
+      "dependencies": {
+        "lodash": "^4.17.15"
+      }
     },
     "node_modules/gzip-size": {
       "version": "5.1.1",
@@ -8210,7 +8759,6 @@
       "version": "0.4.24",
       "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
       "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
-      "dev": true,
       "dependencies": {
         "safer-buffer": ">= 2.1.2 < 3"
       },
@@ -8542,6 +9090,14 @@
       },
       "engines": {
         "node": ">=4"
+      }
+    },
+    "node_modules/instead": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/instead/-/instead-1.0.3.tgz",
+      "integrity": "sha512-7EUe8+ZmvERjdLwrEc1/CdErN8n8XYdF/uI+n8aLbs6Uf/wyqUXyFrCQ8HYADBFaz4+IqGiPVSTInpkMwqrXuw==",
+      "engines": {
+        "node": ">=10"
       }
     },
     "node_modules/internal-ip": {
@@ -13895,6 +14451,11 @@
         "aproba": "^1.1.1"
       }
     },
+    "node_modules/rw": {
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz",
+      "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ=="
+    },
     "node_modules/rx-lite": {
       "version": "4.0.8",
       "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz",
@@ -15819,6 +16380,11 @@
       "integrity": "sha512-qsdtZH+vMoCARQtyod4imc2nIJwg9Cc7lPRrw9CzF8ZKR0khdr8+2nX80PBhET3tcyTtJDxAffGh2rXH4tyU8A==",
       "dev": true
     },
+    "node_modules/tinycolor2": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz",
+      "integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw=="
+    },
     "node_modules/tmp": {
       "version": "0.0.33",
       "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
@@ -16549,6 +17115,17 @@
       },
       "engines": {
         "node": ">=4.0.0"
+      }
+    },
+    "node_modules/vue-flowchart-editor": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/vue-flowchart-editor/-/vue-flowchart-editor-1.0.2.tgz",
+      "integrity": "sha512-rTpbSob5YyHWbraMGVpu7HdtJ24ObHOpRglK9CRSKSLdbIij1w1Fi/vJ8/YGjByMHHXakKfQWi8Sv3oJIFwZyQ==",
+      "dependencies": {
+        "@antv/g6": "^2.2.6",
+        "gg-editor-core": "^1.3.4",
+        "lodash": "^4.17.15",
+        "vue": "^2.6.10"
       }
     },
     "node_modules/vue-hot-reload-api": {
@@ -17524,6 +18101,11 @@
         "string-width": "^1.0.2 || 2 || 3 || 4"
       }
     },
+    "node_modules/wolfy87-eventemitter": {
+      "version": "5.2.9",
+      "resolved": "https://registry.npmjs.org/wolfy87-eventemitter/-/wolfy87-eventemitter-5.2.9.tgz",
+      "integrity": "sha512-P+6vtWyuDw+MB01X7UeF8TaHBvbCovf4HPEMF/SV7BdDc1SMTiBy13SRD71lQh4ExFTG1d/WNzDGDCyOKSMblw=="
+    },
     "node_modules/word-wrap": {
       "version": "1.2.3",
       "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
diff --git a/Source/UBCS-WEB/package.json b/Source/UBCS-WEB/package.json
index 4034a7f..97c27ce 100644
--- a/Source/UBCS-WEB/package.json
+++ b/Source/UBCS-WEB/package.json
@@ -29,6 +29,7 @@
     "script-loader": "^0.7.2",
     "vue": "^2.6.10",
     "vue-axios": "^2.1.2",
+    "vue-flowchart-editor": "^1.0.2",
     "vue-i18n": "^8.7.0",
     "vue-router": "^3.0.1",
     "vuex": "^3.1.1"
diff --git a/Source/UBCS-WEB/src/api/omd/OmdAttribute.js b/Source/UBCS-WEB/src/api/omd/OmdAttribute.js
index 0573ad8..6e23b4e 100644
--- a/Source/UBCS-WEB/src/api/omd/OmdAttribute.js
+++ b/Source/UBCS-WEB/src/api/omd/OmdAttribute.js
@@ -24,12 +24,12 @@
   })
 }
 
-export const remove = (ids) => {
+export const remove = (oid) => {
   return request({
     url: '/api/ubcs-omd/attribute/remove',
     method: 'post',
     params: {
-      ids,
+      oid,
     }
   })
 }
diff --git a/Source/UBCS-WEB/src/api/template/setPersonnel.js b/Source/UBCS-WEB/src/api/template/setPersonnel.js
index ad7aa8b..bcf2771 100644
--- a/Source/UBCS-WEB/src/api/template/setPersonnel.js
+++ b/Source/UBCS-WEB/src/api/template/setPersonnel.js
@@ -12,24 +12,32 @@
 export const personnelCollect = (params) => {
   return request({
     url: '/api/ubcs-flow/taskUser/su',
-    method: 'get',
-    params: params
+    method: 'post',
+    data: params
   })
 }
 // 浜哄憳璁剧疆鍙栨秷鏀惰棌
 export const cancelCollect = (params) => {
   return request({
     url: '/api/ubcs-flow/taskUser/du',
-    method: 'get',
-    params: params
+    method: 'post',
+    data: params
   })
 }
 // 浜哄憳璁剧疆淇濆瓨
 export const personnelSave = (params) => {
   return request({
-    url: '/api/',
-    method: 'post',
-    data: params
+    url: '/api/ubcs-flow/vciflow/start',
+    method: 'get',
+    params: params
   })
 }
+// 浜哄憳璁剧疆淇濆瓨
+export const personnelDict = (params) => {
+    return request({
+      url: '/api/ubcs-user/allPage',
+      method: 'get',
+      params: params
+    })
+  }
 
diff --git a/Source/UBCS-WEB/src/components/FormTemplate/index.vue b/Source/UBCS-WEB/src/components/FormTemplate/index.vue
index a5e99a0..b910397 100644
--- a/Source/UBCS-WEB/src/components/FormTemplate/index.vue
+++ b/Source/UBCS-WEB/src/components/FormTemplate/index.vue
@@ -25,7 +25,8 @@
       v-if="
         type !== 'detail' &&
         dialogVisible &&
-        (showCodeApply || showResembleQuery)
+        (showCodeApply || showResembleQuery) &&
+        type !== 'preview'
       "
     >
       <el-tabs v-model="activeName" type="border-card" @tab-click="handleClick">
@@ -59,7 +60,7 @@
     <div class="avue-dialog__footer" v-if="type !== 'detail'">
       <el-button @click="close()">鍙� 娑�</el-button>
       <el-button @click="submit()" type="primary" :loading="submitBtnLoading"
-        >纭� 瀹�</el-button
+        >{{ submitText }}</el-button
       >
       <el-button
         @click="resembleQuerySubmit"
@@ -104,6 +105,10 @@
       type: String,
       default: "",
     },
+    submitText: {
+      type: String,
+      default: '纭� 瀹�'
+    }
   },
   data() {
     return {
diff --git a/Source/UBCS-WEB/src/components/flow-cycle/components/ContextMenu.vue b/Source/UBCS-WEB/src/components/flow-cycle/components/ContextMenu.vue
new file mode 100644
index 0000000..fd37f79
--- /dev/null
+++ b/Source/UBCS-WEB/src/components/flow-cycle/components/ContextMenu.vue
@@ -0,0 +1,90 @@
+<template>
+  <context-menu class="contextMenu">
+    <node-menu>
+      <menu-li command="copy" text="鎷疯礉" />
+      <menu-li command="delete" text="鍒犻櫎" />
+    </node-menu>
+    <edge-menu>
+      <menu-li command="delete" text="鍒犻櫎" />
+    </edge-menu>
+    <group-menu>
+      <menu-li command="copy" text="鎷疯礉" />
+      <menu-li command="delete" text="鍒犻櫎" />
+      <menu-li command="unGroup" icon="ungroup" text="鍙栨秷缂栫粍" />
+    </group-menu>
+    <multi-menu>
+      <menu-li command="copy" text="鎷疯礉" />
+      <menu-li command="paste" text="绮樿创" />
+      <menu-li command="addGroup" icon="group" text="缂栫粍" />
+      <menu-li command="delete" text="鍒犻櫎" />
+    </multi-menu>
+    <canvas-menu>
+      <menu-li command="undo" text="鎾ら攢" />
+      <menu-li command="redo" text="閲嶅仛" />
+      <menu-li command="pasteHere" icon="paste" text="绮樿创鍒拌繖閲�" />
+    </canvas-menu>
+  </context-menu>
+</template>
+
+<script>
+import {
+  NodeMenu,
+  EdgeMenu,
+  GroupMenu,
+  MultiMenu,
+  CanvasMenu,
+  ContextMenu,
+} from 'vue-flowchart-editor'
+import MenuLi from './ContextMenuItem'
+
+export default {
+  name: 'EditorContextMenu',
+  components: {
+    NodeMenu,
+    EdgeMenu,
+    GroupMenu,
+    MultiMenu,
+    CanvasMenu,
+    ContextMenu,
+    MenuLi,
+  },
+}
+</script>
+
+<style lang="scss" scoped>
+.contextMenu {
+  display: none;
+  overflow: hidden;
+  font-size: 12px;
+  background: #fff;
+  border-radius: 4px;
+  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
+}
+
+.contextMenu .command.disable .item {
+  color: rgba(0, 0, 0, 0.25);
+  cursor: auto;
+}
+
+.contextMenu .command.disable .item:hover {
+  background: #fff;
+}
+
+.contextMenu .item {
+  display: flex;
+  align-items: center;
+  padding: 5px 12px;
+  cursor: pointer;
+  transition: all 0.3s;
+  user-select: none;
+}
+
+.contextMenu .item:hover {
+  background: #e6f7ff;
+}
+
+.contextMenu .item i {
+  margin-right: 8px;
+  margin-top: 3px;
+}
+</style>
diff --git a/Source/UBCS-WEB/src/components/flow-cycle/components/ContextMenuItem.vue b/Source/UBCS-WEB/src/components/flow-cycle/components/ContextMenuItem.vue
new file mode 100644
index 0000000..c94ccd6
--- /dev/null
+++ b/Source/UBCS-WEB/src/components/flow-cycle/components/ContextMenuItem.vue
@@ -0,0 +1,35 @@
+<template>
+  <command :name="command">
+    <div class="item">
+      <icon :type="iconType" :title="text" />
+      <span>{{ label }}</span>
+    </div>
+  </command>
+</template>
+
+<script>
+import { Command } from 'vue-flowchart-editor'
+import Icon from './Icon'
+import upperFirst from 'lodash/upperFirst'
+
+export default {
+  name: 'EditorContextMenuItem',
+
+  components: {
+    Command,
+    Icon,
+  },
+
+  props: ['command', 'icon', 'text'],
+
+  computed: {
+    iconType() {
+      return `icon${this.icon || this.command}`
+    },
+
+    label() {
+      return this.text || upperFirst(this.command)
+    },
+  },
+}
+</script>
diff --git a/Source/UBCS-WEB/src/components/flow-cycle/components/CustomCommand.vue b/Source/UBCS-WEB/src/components/flow-cycle/components/CustomCommand.vue
new file mode 100644
index 0000000..a797ec9
--- /dev/null
+++ b/Source/UBCS-WEB/src/components/flow-cycle/components/CustomCommand.vue
@@ -0,0 +1,67 @@
+<template>
+  <div>
+    <register-command
+      name="generateData"
+      :config="generateDataCommandConfig"
+      extend="copy"
+    />
+    <register-command
+      name="downloadImage"
+      :config="downloadImageCommandConfig"
+      extend="copy"
+    />
+  </div>
+</template>
+
+<script>
+import { RegisterCommand } from 'vue-flowchart-editor'
+
+export default {
+  name: 'CustomCommand',
+
+  components: {
+    RegisterCommand,
+  },
+
+  inject: ['root'],
+
+  props: ['save', 'download'],
+
+  data() {
+    const { propsAPI } = this.root
+    const { save, download } = this
+    return {
+      generateDataCommandConfig: {
+        queue: false, // 鏄惁杩涘叆鍒楅槦锛岄粯璁や负 true
+        enable(/* editor */) {
+          // 鍛戒护鏄惁鍙敤
+          return true
+        },
+        execute(/* editor */) {
+          // 姝e悜鍛戒护閫昏緫
+          console.log('鎵ц姝e悜鍛戒护')
+          const data = propsAPI.save()
+          console.log(data)
+          console.log(JSON.stringify(data))
+          save(data)
+          alert(JSON.stringify(data))
+        },
+        back(/* editor */) {
+          // 鍙嶅悜鍛戒护閫昏緫
+          console.log('鎵ц鍙嶅悜鍛戒护')
+        },
+      },
+      downloadImageCommandConfig: {
+        queue: false,
+        enable() {
+          return true
+        },
+        execute() {
+          download()
+        },
+        back() {},
+      },
+    }
+  },
+}
+</script>
diff --git a/Source/UBCS-WEB/src/components/flow-cycle/components/DetailForm.vue b/Source/UBCS-WEB/src/components/flow-cycle/components/DetailForm.vue
new file mode 100644
index 0000000..282b161
--- /dev/null
+++ b/Source/UBCS-WEB/src/components/flow-cycle/components/DetailForm.vue
@@ -0,0 +1,208 @@
+<template>
+  <div class="right_box">
+    <hr />
+    <div v-if="type === 'node'">
+      <el-form
+        label-width="80px"
+        :model="formModel"
+        size="mini"
+        ref="form"
+        :rules="rules"
+      >
+        <el-form-item label="鍚嶇О" prop="label">
+          <el-input v-model.trim="formModel.label" :maxLength="20" disabled/>
+        </el-form-item>
+        <el-form-item label="褰㈢姸">
+          <el-select
+            v-model="formModel.shape"
+            placeholder="璇烽�夋嫨褰㈢姸"
+            style="width: 100%"
+          >
+            <el-option
+              v-for="item in shapeTypeList"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value"
+            >
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="棰滆壊">
+          <el-input v-model.trim="formModel.color" clearable />
+        </el-form-item>
+        <el-form-item label="瀹藉害" prop="width">
+          <el-input v-model.trim.number="formModel.width" clearable>
+            <template slot="prepend">瀹�</template>
+          </el-input>
+        </el-form-item>
+        <el-form-item label="楂樺害" prop="height">
+          <el-input v-model.trim.number="formModel.height" clearable>
+            <template slot="prepend">楂�</template>
+          </el-input>
+        </el-form-item>
+      </el-form>
+    </div>
+    <div v-else-if="type === 'edge'">
+      <el-form
+        label-width="80px"
+        :model="formModel"
+        size="small"
+        :rules="rules"
+      >
+        <el-form-item label="璧峰鐘舵��">
+          <el-input v-model.trim="formModel.source" disabled/>
+        </el-form-item>
+        <el-form-item label="鐩爣鐘舵��">
+          <el-input v-model.trim="formModel.target" disabled/>
+        </el-form-item>
+        <el-form-item label="鍚嶇О">
+          <el-input v-model.trim="formModel.label"/>
+        </el-form-item>
+        <el-form-item label="褰㈢姸">
+          <el-select
+            v-model="formModel.shape"
+            placeholder="璇烽�夋嫨褰㈢姸"
+            style="width: 100%"
+          >
+            <el-option
+              v-for="item in lineTypeList"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value"
+            >
+            </el-option>
+          </el-select>
+        </el-form-item>
+      </el-form>
+    </div>
+    <div class="btn_box">
+      <el-button type="primary" size="mini" @click="handleSubmit"
+        >鏇存柊灞炴��</el-button
+      >
+    </div>
+  </div>
+</template>
+
+<script>
+import { cloneDeep } from 'lodash'
+
+export default {
+  name: 'EditorDetailForm',
+
+  inject: ['root'],
+
+  props: ['type', 'readOnly'],
+
+  data() {
+    return {
+      formModel: {},
+      fontSize: 12,
+      shapeTypeList: [
+        { label: '鐭╁舰', value: 'flow-rect' },
+        { label: '妞渾', value: 'flow-circle' },
+        { label: '鑿卞舰', value: 'flow-rhombus' },
+        { label: '鑳跺泭', value: 'flow-capsule' },
+      ],
+      lineTypeList: [
+        { label: '鏇茬嚎', value: 'flow-smooth' },
+        { label: '鎶樼嚎', value: 'flow-polyline' },
+        { label: '鍦嗚鎶樼嚎', value: 'flow-polyline-round' },
+      ],
+      rules: {
+        label: [{ required: true, message: '鍚嶇О涓嶈兘涓虹┖', trigger: 'blur' }],
+        width: [
+          { required: true, message: '瀹藉害涓嶈兘涓虹┖', trigger: 'blur' },
+          { pattern: /^[0-9]+$/, message: '瀹藉害鍙兘涓烘暟瀛�', trigger: 'blur' },
+        ],
+        height: [
+          { required: true, message: '楂樺害涓嶈兘涓虹┖', trigger: 'blur' },
+          { pattern: /^[0-9]+$/, message: '楂樺害鍙兘涓烘暟瀛�', trigger: 'blur' },
+        ],
+      },
+    }
+  },
+
+  created() {
+    const formModel = this.root.propsAPI.getSelected()[0].getModel()
+    console.log(formModel, 'formModel');
+    this.formModel = Object.assign(
+      { width: 80, height: 48 },
+      { shape: 'flow-smooth' },
+      cloneDeep(formModel) // 闃叉璇紪杈�
+    )
+  },
+
+  methods: {
+    async handleSubmit() {
+      if (this.type === 'node') {
+        await this.$refs.form.validate()
+      }
+      const { getSelected, executeCommand, update } = this.root.propsAPI
+      const { formModel } = this
+      setTimeout(() => {
+        const item = getSelected()[0]
+        if (!item) return
+
+        // 鑷姩璋冩暣灏哄
+        const adjustSize = (model) => {
+          if (model.type !== 'node' || model.shape !== 'flow-rect') {
+            return model
+          }
+          const canvas = document.createElement('canvas')
+          const canvasContext = canvas.getContext('2d')
+          canvasContext.font = this.fontSize + 'px System'
+          let label = model.label.replace('\n', '')
+          let sourceWidth = this.formModel.width
+          let sourceHeight = this.formModel.height
+          const spacing = 10
+          // 鑾峰彇鏂囧瓧瀹藉害
+          const widthWithSpacing = canvasContext.measureText(label).width + spacing
+          model.size = `${sourceWidth}*${sourceHeight}` // 鍏堟仮澶嶉粯璁ゅ昂瀵�
+
+          if (widthWithSpacing <= sourceWidth) {
+            return model
+          }
+
+          // 鑷姩鎶樿
+          let multilineText = ''
+          let multilineCount = 1
+          let multilineTextWidth = 0
+
+          for (const char of label) {
+            const { width } = canvasContext.measureText(char)
+            console.log(multilineTextWidth + width + spacing, 'multilineTextWidth');
+            if (multilineTextWidth + width + spacing >= sourceWidth) {
+              multilineText += '\n'
+              multilineTextWidth = 0
+              multilineCount++
+            }
+            multilineText += char
+            multilineTextWidth += width
+          }
+
+          return {
+            ...model,
+            label: multilineText,
+            size: `${sourceWidth}*${Math.max(
+              sourceHeight,
+              this.fontSize * multilineCount * 1.2 + spacing
+            )}`,
+          }
+        }
+
+        const newFormModel = adjustSize(formModel)
+        console.log(newFormModel, 'newFormModel')
+        executeCommand(() => {
+          update(item, newFormModel)
+        })
+      }, 0)
+    },
+  },
+}
+</script>
+
+<style lang="scss" scoped>
+.btn_box {
+  text-align: center;
+}
+</style>
diff --git a/Source/UBCS-WEB/src/components/flow-cycle/components/DetailPanel.vue b/Source/UBCS-WEB/src/components/flow-cycle/components/DetailPanel.vue
new file mode 100644
index 0000000..1fb051b
--- /dev/null
+++ b/Source/UBCS-WEB/src/components/flow-cycle/components/DetailPanel.vue
@@ -0,0 +1,119 @@
+<template>
+  <div>
+    <div class="tree_data_box">
+      <el-form
+        ref="form"
+        size="mini"
+        label-width="80px"
+        :model="newRowData"
+        :rules="rules"
+      >
+        <el-form-item label="鍚嶇О" prop="name">
+          <el-input v-model.trim="newRowData.name" :maxLength="20" clearable />
+        </el-form-item>
+        <el-form-item label="鏍囩" prop="label">
+          <el-input v-model.trim="newRowData.label" clearable />
+        </el-form-item>
+        <el-form-item label="璧峰鐘舵��" prop="startState">
+          <el-select
+            v-model="newRowData.startState"
+            placeholder="璇烽�夋嫨璧峰鐘舵��"
+            style="width: 100%"
+          >
+            <el-option
+              v-for="item in []"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value"
+            >
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="鎻忚堪">
+          <el-input v-model.trim="newRowData.remark" type="textarea"></el-input>
+        </el-form-item>
+      </el-form>
+    </div>
+    <detail-panel>
+      <template v-slot="{ status }">
+        <node-panel :status="status">
+          <detail-form type="node" />
+        </node-panel>
+        <edge-panel :status="status">
+          <detail-form type="edge" />
+        </edge-panel>
+        <group-panel :status="status">
+          <detail-form type="group" />
+        </group-panel>
+        <multi-panel :status="status" />
+        <canvas-panel :status="status" />
+      </template>
+    </detail-panel>
+  </div>
+</template>
+
+<script>
+import {
+  NodePanel,
+  EdgePanel,
+  GroupPanel,
+  MultiPanel,
+  CanvasPanel,
+  DetailPanel,
+} from "vue-flowchart-editor";
+import DetailForm from "./DetailForm";
+
+export default {
+  name: "EditorDetailPanel",
+  components: {
+    NodePanel,
+    EdgePanel,
+    GroupPanel,
+    MultiPanel,
+    CanvasPanel,
+    DetailPanel,
+    DetailForm,
+  },
+  props: ["readOnly", "rowData"],
+  data() {
+    return {
+      newRowData: {},
+      rules: {
+        name: [{ required: true, message: "鍚嶇О涓嶈兘涓虹┖", trigger: "blur" }],
+        label: [{ required: true, message: "鏍囩涓嶈兘涓虹┖", trigger: "blur" }],
+        startState: [
+          // { required: true, message: "璧峰鐘舵�佷笉鑳戒负绌�", trigger: "change" },
+        ],
+      },
+    };
+  },
+  methods: {
+    getNewRowDate() {
+      return new Promise((resolve) => {
+        this.$refs.form.validate((flag) => {
+          if (!flag) {
+            resolve(false);
+          } else {
+            resolve(this.newRowData);
+          }
+        });
+      });
+    },
+  },
+  watch: {
+    rowData: {
+      deep: true,
+      immediate: true,
+      handler(newV) {
+        if (
+          typeof newV === "object" &&
+          newV !== null &&
+          Object.keys(this.rowData).length > 0
+        ) {
+          this.newRowData = Object.assign({}, newV);
+        }
+      },
+    },
+  },
+};
+</script>
diff --git a/Source/UBCS-WEB/src/components/flow-cycle/components/EditorMinimap.vue b/Source/UBCS-WEB/src/components/flow-cycle/components/EditorMinimap.vue
new file mode 100644
index 0000000..12f7d82
--- /dev/null
+++ b/Source/UBCS-WEB/src/components/flow-cycle/components/EditorMinimap.vue
@@ -0,0 +1,11 @@
+<template>
+  <minimap :height="200" />
+</template>
+
+<script>
+import { Minimap } from 'vue-flowchart-editor'
+export default {
+  name: 'EditorMinimap',
+  components: { Minimap },
+}
+</script>
diff --git a/Source/UBCS-WEB/src/components/flow-cycle/components/Icon.vue b/Source/UBCS-WEB/src/components/flow-cycle/components/Icon.vue
new file mode 100644
index 0000000..05b7abd
--- /dev/null
+++ b/Source/UBCS-WEB/src/components/flow-cycle/components/Icon.vue
@@ -0,0 +1,15 @@
+<template>
+  <i class="action" :title="text">
+    <svg width="1em" height="1em" fill="currentColor">
+      <use :xlink:href="'#' + type" />
+    </svg>
+  </i>
+</template>
+
+<script>
+import '../iconfont'
+export default {
+  name: 'EditorIcon',
+  props: ['type', 'text'],
+}
+</script>
diff --git a/Source/UBCS-WEB/src/components/flow-cycle/components/ItemPanel.vue b/Source/UBCS-WEB/src/components/flow-cycle/components/ItemPanel.vue
new file mode 100644
index 0000000..86a551e
--- /dev/null
+++ b/Source/UBCS-WEB/src/components/flow-cycle/components/ItemPanel.vue
@@ -0,0 +1,485 @@
+<template>
+  <div class="item_panel_box">
+    <el-input size="mini" placeholder="杈撳叆鍏抽敭瀛楄繘琛岃繃婊�" v-model="filterText">
+    </el-input>
+    <div class="box_item">
+      <item-panel class="item-panel" v-loading="loading">
+        <template v-for="(item, index) in filterNode">
+          <item
+            :key="index"
+            :type="item.type || 'node'"
+            :size="item.size || '80*48'"
+            :shape="item.shape || 'flow-rect'"
+            :model="{
+              // must have model property
+              color: item.color || '#1890FF',
+              label: item.id || '鑺傜偣'
+            }"
+          >
+            <template v-if="item.src">
+              <div class="item item-img">
+                <img :src="item.src" :alt="item.id" />
+              </div>
+            </template>
+            <template v-else>
+              <div :class="'item item-' + (item.shape || 'flow-rect')">
+                <span>{{ item.id }}</span>
+              </div>
+            </template>
+          </item>
+        </template>
+      </item-panel>
+    </div>
+  </div>
+</template>
+
+<script>
+import { Item, ItemPanel } from 'vue-flowchart-editor'
+import { getPage } from '../../../api/omd/status'
+
+export default {
+  name: 'EditorItemPanel',
+  components: { ItemPanel, Item },
+  props: {
+    // all nodes for drag to generate flowchart
+    treeClick: {
+      type: Function,
+    },
+  },
+  data() {
+    return {
+      filterText: '',
+      existList: [
+        {
+          id: 0,
+          label: '鐢熷懡鍛ㄦ湡妯℃澘鍒楄〃',
+          children: [
+            {
+              id: 1,
+              label: '娴嬭瘯鏁版嵁1',
+              data: {
+                nodes: [
+                  {
+                    type: 'node',
+                    size: '80*48',
+                    shape: 'flow-rect',
+                    color: '#1890FF',
+                    label: '娴嬭瘯鑺傜偣1',
+                    x: 358,
+                    y: 262.66666412353516,
+                    id: '5f2fae92',
+                    index: 0,
+                  },
+                  {
+                    type: 'node',
+                    size: '80*48',
+                    shape: 'flow-rect',
+                    color: '#1890FF',
+                    label: '娴嬭瘯鑺傜偣1',
+                    x: 349,
+                    y: 398.66666412353516,
+                    id: '39784055',
+                    index: 1,
+                  },
+                ],
+                edges: [
+                  {
+                    source: '5f2fae92',
+                    sourceAnchor: 2,
+                    target: '39784055',
+                    targetAnchor: 0,
+                    id: '40ff05c5',
+                    index: 2,
+                  },
+                ],
+              },
+            },
+            {
+              id: 2,
+              label: '娴嬭瘯鏁版嵁2',
+              data: {
+                nodes: [
+                  {
+                    type: 'node',
+                    size: '80*48',
+                    shape: 'flow-rect',
+                    color: '#1890FF',
+                    label: '娴嬭瘯鑺傜偣1',
+                    x: 319.5416564941406,
+                    y: 396.66666412353516,
+                    id: 'ee3b0618',
+                    index: 0,
+                  },
+                  {
+                    type: 'node',
+                    size: '80*48',
+                    shape: 'flow-rect',
+                    color: '#1890FF',
+                    label: '娴嬭瘯鑺傜偣2',
+                    x: 192.54165649414062,
+                    y: 277.66666412353516,
+                    id: 'a96bfab6',
+                    index: 4,
+                  },
+                  {
+                    type: 'node',
+                    size: '80*48',
+                    shape: 'flow-rect',
+                    color: '#1890FF',
+                    label: '娴嬭瘯鑺傜偣3',
+                    x: 360.5416564941406,
+                    y: 152.66666412353516,
+                    id: 'e76e769e',
+                    index: 5,
+                  },
+                ],
+                edges: [
+                  {
+                    source: 'e76e769e',
+                    sourceAnchor: 2,
+                    target: 'a96bfab6',
+                    targetAnchor: 0,
+                    id: '72117e49',
+                    index: 1,
+                  },
+                  {
+                    source: 'a96bfab6',
+                    sourceAnchor: 2,
+                    target: 'ee3b0618',
+                    targetAnchor: 0,
+                    id: '21db19e2',
+                    index: 2,
+                  },
+                  {
+                    source: 'e76e769e',
+                    sourceAnchor: 1,
+                    target: 'ee3b0618',
+                    targetAnchor: 1,
+                    id: '324dd9ae',
+                    index: 3,
+                  },
+                ],
+              },
+            },
+            {
+              id: 3,
+              label: '娴嬭瘯鏁版嵁3',
+              data: {
+                nodes: [
+                  {
+                    type: 'node',
+                    size: '80*48',
+                    shape: 'flow-rect',
+                    color: '#1890FF',
+                    label: '娴嬭瘯鑺傜偣1',
+                    x: 130.54165649414062,
+                    y: 108.66666412353516,
+                    id: '9bc884ca',
+                    index: 0,
+                  },
+                  {
+                    type: 'node',
+                    size: '80*48',
+                    shape: 'flow-rect',
+                    color: '#1890FF',
+                    label: '娴嬭瘯鑺傜偣2',
+                    x: 129.54165649414062,
+                    y: 227.66666412353516,
+                    id: 'd5997173',
+                    index: 1,
+                  },
+                  {
+                    type: 'node',
+                    size: '80*48',
+                    shape: 'flow-rect',
+                    color: '#1890FF',
+                    label: '娴嬭瘯鑺傜偣3',
+                    x: 129.54165649414062,
+                    y: 348.66666412353516,
+                    id: '79e40c28',
+                    index: 2,
+                  },
+                  {
+                    type: 'node',
+                    size: '80*48',
+                    shape: 'flow-rect',
+                    color: '#1890FF',
+                    label: '娴嬭瘯鑺傜偣4',
+                    x: 319.5416564941406,
+                    y: 349.16666412353516,
+                    id: '91a6982c',
+                    index: 3,
+                  },
+                  {
+                    type: 'node',
+                    size: '80*48',
+                    shape: 'flow-rect',
+                    color: '#1890FF',
+                    label: '娴嬭瘯鑺傜偣5',
+                    x: 537.5416564941406,
+                    y: 350.66666412353516,
+                    id: '3939704b',
+                    index: 4,
+                  },
+                  {
+                    type: 'node',
+                    size: '80*48',
+                    shape: 'flow-rect',
+                    color: '#1890FF',
+                    label: '娴嬭瘯鑺傜偣6',
+                    x: 533.5416564941406,
+                    y: 230.66666412353516,
+                    id: 'de373e3a',
+                    index: 5,
+                  },
+                  {
+                    type: 'node',
+                    size: '80*48',
+                    shape: 'flow-rect',
+                    color: '#1890FF',
+                    label: '娴嬭瘯鑺傜偣7',
+                    x: 537.5416564941406,
+                    y: 107.66666412353516,
+                    id: '7bdf94ba',
+                    index: 6,
+                  },
+                  {
+                    type: 'node',
+                    size: '80*48',
+                    shape: 'flow-rect',
+                    color: '#1890FF',
+                    label: '娴嬭瘯鑺傜偣8',
+                    x: 343.5416564941406,
+                    y: 106.66666412353516,
+                    id: '3e739b8e',
+                    index: 7,
+                  },
+                ],
+                edges: [
+                  {
+                    source: '9bc884ca',
+                    sourceAnchor: 2,
+                    target: 'd5997173',
+                    targetAnchor: 0,
+                    id: '88e19734',
+                    index: 8,
+                  },
+                  {
+                    source: 'd5997173',
+                    sourceAnchor: 2,
+                    target: '79e40c28',
+                    targetAnchor: 0,
+                    id: 'e38664d6',
+                    index: 9,
+                  },
+                  {
+                    source: '79e40c28',
+                    sourceAnchor: 1,
+                    target: '91a6982c',
+                    targetAnchor: 3,
+                    id: '3c95a9f2',
+                    index: 10,
+                  },
+                  {
+                    source: '91a6982c',
+                    sourceAnchor: 1,
+                    target: '3939704b',
+                    targetAnchor: 3,
+                    id: '5c517fcd',
+                    index: 11,
+                  },
+                  {
+                    source: '3939704b',
+                    sourceAnchor: 0,
+                    target: 'de373e3a',
+                    targetAnchor: 2,
+                    id: '037bce01',
+                    index: 12,
+                  },
+                  {
+                    source: 'de373e3a',
+                    sourceAnchor: 0,
+                    target: '7bdf94ba',
+                    targetAnchor: 2,
+                    id: 'b09bb221',
+                    index: 13,
+                  },
+                  {
+                    source: '7bdf94ba',
+                    sourceAnchor: 3,
+                    target: '3e739b8e',
+                    targetAnchor: 1,
+                    id: '466db0ea',
+                    index: 14,
+                  },
+                  {
+                    source: '3e739b8e',
+                    sourceAnchor: 3,
+                    target: '9bc884ca',
+                    targetAnchor: 1,
+                    id: '0ad68e07',
+                    index: 15,
+                  },
+                ],
+              },
+            },
+            {
+              id: 4,
+              label: '娴嬭瘯鏁版嵁4',
+              data: {
+                nodes: [
+                  {
+                    type: 'node',
+                    size: '80*48',
+                    shape: 'flow-rect',
+                    color: '#1890FF',
+                    label: '娴嬭瘯鑺傜偣6',
+                    x: 387.5416564941406,
+                    y: 310.66666412353516,
+                    id: '61775a95',
+                    index: 0,
+                  },
+                  {
+                    type: 'node',
+                    size: '80*48',
+                    shape: 'flow-rect',
+                    color: '#1890FF',
+                    label: '娴嬭瘯鑺傜偣7',
+                    x: 559.0416564941406,
+                    y: 122.16666412353516,
+                    id: '3ecf3a2c',
+                    index: 4,
+                  },
+                  {
+                    type: 'node',
+                    size: '80*48',
+                    shape: 'flow-rect',
+                    color: '#1890FF',
+                    label: '娴嬭瘯鑺傜偣8',
+                    x: 226.54165649414062,
+                    y: 121.16666412353516,
+                    id: '065c9aa9',
+                    index: 5,
+                  },
+                ],
+                edges: [
+                  {
+                    source: '065c9aa9',
+                    sourceAnchor: 2,
+                    target: '61775a95',
+                    targetAnchor: 0,
+                    id: 'd9ddab89',
+                    index: 1,
+                  },
+                  {
+                    source: '61775a95',
+                    sourceAnchor: 0,
+                    target: '3ecf3a2c',
+                    targetAnchor: 2,
+                    id: 'a010883c',
+                    index: 2,
+                  },
+                  {
+                    source: '3ecf3a2c',
+                    sourceAnchor: 3,
+                    target: '065c9aa9',
+                    targetAnchor: 1,
+                    id: '93207803',
+                    index: 3,
+                  },
+                ],
+              },
+            },
+            
+          ],
+        },
+      ],
+      nodeItems: [],
+      loading: false
+    }
+  },
+  created() {
+      this.loading = true
+    getPage(1, 99999).then(res => {
+      this.loading = false
+      if (res.data.code === 200) {
+        this.nodeItems = res.data.data.records
+      }
+    })
+  },
+  computed: {
+    filterNode() {
+      return this.nodeItems.filter(item => item.id.includes(this.filterText))
+    }
+  },
+}
+</script>
+
+<style lang="scss" scoped>
+.item_panel_box {
+  height: 100%;
+  padding: 5px;
+  overflow: hidden;
+  .exist_list {
+    max-height: 40%;
+    overflow-y: scroll;
+    .title {
+      padding: 10px 0;
+      text-align: center;
+      font-size: 16px;
+      font-weight: bold;
+    }
+  }
+  .box_item {
+    margin-top: 20px;
+  }
+}
+.item-panel {
+  width: 100%;
+  height: 500px;
+  text-align: center;
+  overflow-y: scroll;
+  .item {
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    font-size: 12px;
+    margin-left: auto;
+    margin-right: auto;
+    margin-bottom: 10px;
+    user-select: none;
+
+    &.item-flow-rect {
+      padding: 6px;
+      box-sizing: border-box;
+      border: 1px solid rgb(24, 144, 255);
+      background-color: rgba(24, 144, 255, 0.2);
+    }
+
+    &.item-flow-circle {
+      width: 70px;
+      height: 70px;
+      border-radius: 60px;
+      border: 1px solid rgb(250, 140, 22);
+      background-color: rgba(250, 140, 22, 0.2);
+    }
+
+    &.item-flow-rhombus {
+      width: 70px;
+      height: 70px;
+      margin: 25px auto;
+      border: 1px solid rgb(19, 194, 194);
+      background-color: rgba(19, 194, 194, 0.2);
+      transform: rotate(45deg);
+
+      span {
+        transform: rotate(-45deg);
+      }
+    }
+
+    &.item-img {
+      max-width: 100px;
+    }
+  }
+}
+</style>
diff --git a/Source/UBCS-WEB/src/components/flow-cycle/components/Toolbar.vue b/Source/UBCS-WEB/src/components/flow-cycle/components/Toolbar.vue
new file mode 100644
index 0000000..d902775
--- /dev/null
+++ b/Source/UBCS-WEB/src/components/flow-cycle/components/Toolbar.vue
@@ -0,0 +1,130 @@
+<template>
+  <toolbar class="toolbar">
+    <template>
+      <toolbar-button command="undo" text="鎾ら攢" />
+      <toolbar-button command="redo" text="閲嶅仛" />
+      <toolbar-button command="copy" text="澶嶅埗" />
+      <toolbar-button command="paste" text="绮樿创" />
+      <div class="split"></div>
+    </template>
+    <toolbar-button command="zoomIn" icon="zoom-in" text="鏀惧ぇ" />
+    <toolbar-button command="zoomOut" icon="zoom-out" text="缂╁皬" />
+    <toolbar-button command="autoZoom" icon="fit" text="鑷�傚簲" />
+    <toolbar-button command="resetZoom" icon="actual-size" text="瀹為檯灏哄" />
+    <template>
+      <div class="split"></div>
+      <!-- <toolbar-button command="toBack" icon="to-back" text="鍚戜笅涓�灞�" /> -->
+      <!-- <toolbar-button command="toFront" icon="to-front" text="鍚戜笂涓�灞�" /> -->
+      <!-- <toolbar-button command="addGroup" icon="group" text="缂栫粍" /> -->
+      <!-- <toolbar-button command="unGroup" icon="ungroup" text="鍙栨秷缂栫粍" /> -->
+      <toolbar-button command="selectAll" icon="select-all" text="鍏ㄩ��" />
+      <toolbar-button command="multiSelect" icon="select" text="妗嗛��" />
+      <div class="split"></div>
+      <toolbar-button command="delete" text="鍒犻櫎"/>
+      <toolbar-button command="clear" icon="clear" text="娓呯┖鐢诲竷" />
+    </template>
+    <template>
+      <div class="split"></div>
+      <toolbar-button
+        command="downloadImage"
+        icon="image"
+        text="涓嬭浇鍥惧儚"
+      />
+    </template>
+    <!-- right toolbar button -->
+    <!-- <div class="pull-right">
+      <toolbar-button
+        command="generateData"
+        icon="save"
+        text="鐢熸垚鏁版嵁"
+        label="淇濆瓨鏁版嵁"
+      />
+    </div> -->
+  </toolbar>
+</template>
+
+<script>
+import { Toolbar } from 'vue-flowchart-editor'
+import ToolbarButton from './ToolbarButton'
+
+export default {
+  name: 'FlowToolbar',
+
+  components: {
+    Toolbar,
+    ToolbarButton,
+  },
+
+  props: ['chartData', 'toggleReadOnly'],
+
+  methods: {
+  },
+}
+</script>
+
+<style lang="scss" scoped>
+.toolbar {
+  display: flex;
+  align-items: center;
+  height: 27px;
+
+  .split {
+    width: 10px;
+    height: 100%;
+    border-right: 1px solid #eee;
+    margin-right: 10px;
+  }
+
+  .pull-right {
+    display: flex;
+    align-items: center;
+    margin-left: auto;
+  }
+
+  .command {
+    margin-right: 15px;
+    display: flex;
+    color: #333;
+
+    i {
+      display: block;
+      width: 27px;
+      height: 27px;
+      margin: 0 6px;
+      padding-top: 10px;
+      text-align: center;
+      border: 1px solid #fff;
+      cursor: pointer;
+    }
+
+    span {
+      display: block;
+      font-size: 12px;
+      padding-top: 10px;
+      margin-left: -6px;
+      padding-right: 6px;
+      line-height: 20px;
+      cursor: pointer;
+    }
+
+    &:hover {
+      color: #1890ff;
+    }
+  }
+
+  .disable {
+    color: rgba(0, 0, 0, 0.25);
+    i {
+      cursor: not-allowed;
+    }
+
+    span {
+      cursor: not-allowed;
+    }
+
+    &:hover {
+      color: rgba(0, 0, 0, 0.25);
+    }
+  }
+}
+</style>
diff --git a/Source/UBCS-WEB/src/components/flow-cycle/components/ToolbarButton.vue b/Source/UBCS-WEB/src/components/flow-cycle/components/ToolbarButton.vue
new file mode 100644
index 0000000..05ee2b0
--- /dev/null
+++ b/Source/UBCS-WEB/src/components/flow-cycle/components/ToolbarButton.vue
@@ -0,0 +1,28 @@
+<template>
+  <command :name="command">
+    <icon :type="iconType" :title="text" />
+    <span v-if="label">{{ label }}</span>
+  </command>
+</template>
+
+<script>
+import { Command } from 'vue-flowchart-editor'
+import Icon from './Icon'
+
+export default {
+  name: 'EditorToolbarButton',
+
+  props: ['command', 'icon', 'text', 'label'],
+
+  computed: {
+    iconType() {
+      return `icon${this.icon || this.command}`
+    },
+  },
+
+  components: {
+    Command,
+    Icon,
+  },
+}
+</script>
diff --git a/Source/UBCS-WEB/src/components/flow-cycle/flowchartEditor.vue b/Source/UBCS-WEB/src/components/flow-cycle/flowchartEditor.vue
new file mode 100644
index 0000000..9b6c62e
--- /dev/null
+++ b/Source/UBCS-WEB/src/components/flow-cycle/flowchartEditor.vue
@@ -0,0 +1,230 @@
+<template>
+  <vue-flowchart-editor class="vue-flowchart-editor" ref="flowChart">
+    <div class="vfe-chart">
+      <!-- Top Menu -->
+      <div class="vfe-chart-header" v-if="type !== 'detail'">
+        <editor-toolbar :chart-data="flowChartData" />
+      </div>
+      <div class="vfe-chart-container">
+        <!-- Left Items -->
+        <div class="vfe-chart-sidebar" v-if="type !== 'detail'">
+          <editor-item-panel :node-items="flowChartNodeItems" />
+        </div>
+        <!-- Main Chart -->
+        <div class="vfe-chart-main">
+          <flow :data="flowChartData" :onAfterChange="onAfterChange" />
+          <div class="tooltip">
+            <template v-for="item in tooltipData">
+              <p :key="item.name">{{ item.name }}: {{ item.value }}</p>
+            </template>
+          </div>
+        </div>
+        <div class="vfe-chart-panel" v-if="type !== 'detail'">
+          <div class="vfe-chart-panel-detail">
+            <editor-detail-panel :rowData="rowData" ref="EditorDetailPanel" />
+          </div>
+        </div>
+      </div>
+    </div>
+    <!-- Mouse Right Button Context Menu -->
+    <editor-context-menu v-if="type !== 'detail'" />
+    <register-edge
+      name="custom-polyline"
+      extend="flow-polyline"
+      :config="customEdgeConfig"
+    />
+    <custom-command :download="downloadImage" />
+  </vue-flowchart-editor>
+</template>
+
+<script>
+import VueFlowchartEditor, { Flow, RegisterEdge } from "vue-flowchart-editor";
+import EditorToolbar from "./components/Toolbar";
+import EditorItemPanel from "./components/ItemPanel";
+import EditorDetailPanel from "./components/DetailPanel";
+import EditorMinimap from "./components/EditorMinimap";
+import EditorContextMenu from "./components/ContextMenu";
+import CustomCommand from "./components/CustomCommand";
+
+export default {
+  name: "FlowchartEditor",
+
+  components: {
+    VueFlowchartEditor,
+    Flow,
+    EditorToolbar,
+    EditorItemPanel,
+    EditorDetailPanel,
+    EditorMinimap,
+    EditorContextMenu,
+    CustomCommand,
+    RegisterEdge,
+  },
+
+  props: ["chartData", "chartDataNodeItems", "saveData", "rowData", "type"],
+
+  data() {
+    return {
+      flowChartData: this.chartData,
+      flowChartNodeItems: this.chartDataNodeItems,
+      customEdgeConfig: {
+        getActivedStyle(/*item*/) {
+          return {
+            lineWidth: 3,
+          };
+        },
+        getSelectedStyle(/*item*/) {
+          return {
+            lineWidth: 3,
+          };
+        },
+      },
+      tooltipShow: true,
+      tooltipData: [],
+    };
+  },
+
+  mounted() {
+    if (this.type === "add") {
+      this.$nextTick(() => {
+        this.$refs.flowChart.propsAPI.executeCommand("autoZoom");
+      });
+    }
+  },
+
+  methods: {
+    // onAfterChange(e) {
+    //   const model = e.model
+    //   console.log(JSON.parse(JSON.stringify(e)));
+    //   if (!model.change) {
+    //     model.id = model.label
+    //     model.change = true
+    //   } else {
+    //     return
+    //   }
+    //   const { nodes } = this.$refs.flowChart.propsAPI.save()
+    //   if (Array.isArray(nodes) && nodes.length > 0) {
+
+    //   } else {
+    //     this.$refs.flowChart.propsAPI.add("node", model);
+    //   }
+    //   throw '绂佹鍘熺敓鏂板鏂规硶'
+    // },
+    onAfterChange(e) {
+      console.log(e);
+      try {
+        if (e.action === "add" && e.model.type === "node") {
+          if (!e.model.change) {
+            this.$refs.flowChart.propsAPI.remove(e.item);
+            e.model.id = e.model.label;
+            e.model.change = true;
+            this.$refs.flowChart.propsAPI.add("node", e.model);
+          }
+        }
+      } catch (err) {
+        if (
+          err.message ===
+          `id:${e.model.label} has already been set, please set new one`
+        ) {
+          this.$message.error("涓嶈兘娣诲姞宸插瓨鍦ㄧ殑鑺傜偣锛�");
+        }
+      }
+    },
+    _downloadImage(data, filename = "flowchart.png") {
+      const a = document.createElement("a");
+      a.href = data;
+      a.download = filename;
+      document.body.appendChild(a);
+      a.click();
+    },
+
+    downloadImage() {
+      const page = this.$refs["flowChart"].propsAPI.editor.getCurrentPage();
+      this._downloadImage(page.saveImage().toDataURL("image/png"));
+    },
+    getNewRowData() {
+      return this.$refs.EditorDetailPanel.getNewRowDate();
+    },
+    getFlowData() {
+      return this.$refs.flowChart.propsAPI.save();
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.vue-flowchart-editor {
+  display: flex;
+  flex: 1;
+  flex-direction: column;
+  width: 100%;
+  height: 100%;
+  background: #fff;
+}
+
+.vfe-chart {
+  position: relative;
+  width: 100%;
+  height: 100%;
+  display: flex;
+  flex-direction: column;
+
+  .vfe-chart-header {
+    border: 1px solid #e6e9ed;
+    padding: 8px;
+  }
+
+  .vfe-chart-container {
+    flex: 1;
+    display: flex;
+    height: 550px;
+    overflow: hidden;
+    .vfe-chart-main {
+      position: relative;
+      flex: 1;
+      max-height: calc(100% - 5px); // fix scroll show
+
+      .tooltip {
+        position: absolute;
+        display: none;
+        top: 0;
+        left: 0;
+        width: 100px;
+        height: auto;
+        padding: 15px;
+        border-radius: 10px;
+        z-index: 999;
+        opacity: 0.8;
+        color: #ffffff;
+        font-size: 12px;
+        background-color: #000;
+
+        p {
+          margin: 0;
+        }
+      }
+    }
+
+    .vfe-chart-sidebar {
+      position: relative;
+      display: flex;
+      justify-content: center;
+      width: 15%;
+      background-color: #fafafa;
+      border-right: 1px solid #e6e9ed;
+    }
+
+    .vfe-chart-panel {
+      position: relative;
+      width: 300px;
+      background-color: #fafafa;
+      border-left: 1px solid #e6e9ed;
+
+      .vfe-chart-panel-detail {
+        box-sizing: border-box;
+        padding: 10px;
+      }
+    }
+  }
+}
+</style>
diff --git a/Source/UBCS-WEB/src/components/flow-cycle/iconfont.js b/Source/UBCS-WEB/src/components/flow-cycle/iconfont.js
new file mode 100644
index 0000000..a780a0b
--- /dev/null
+++ b/Source/UBCS-WEB/src/components/flow-cycle/iconfont.js
@@ -0,0 +1 @@
+!function(v){var c,h='<svg><symbol id="iconto-back" viewBox="0 0 1024 1024"><path d="M640 726.016l0-86.016 86.016 0 0 86.016-86.016 0zM640 214.016l0-86.016 86.016 0 0 86.016-86.016 0zM214.016 297.984l0 512 512 0 0 86.016-512 0q-36.010667 0-61.013333-25.984t-25.002667-59.989333l0-512 86.016 0zM809.984 726.016l0-86.016 86.016 0q0 34.005333-25.984 59.989333t-59.989333 25.984zM809.984 384l0-86.016 86.016 0 0 86.016-86.016 0zM809.984 553.984l0-84.010667 86.016 0 0 84.010667-86.016 0zM384 726.016q-36.010667 0-61.013333-25.984t-25.002667-59.989333l86.016 0 0 86.016zM553.984 128l0 86.016-84.010667 0 0-86.016 84.010667 0zM809.984 128q34.005333 0 59.989333 25.984t25.984 59.989333l-86.016 0 0-86.016zM553.984 640l0 86.016-84.010667 0 0-86.016 84.010667 0zM384 128l0 86.016-86.016 0q0-34.005333 25.002667-59.989333t61.013333-25.984zM384 470.016l0 84.010667-86.016 0 0-84.010667 86.016 0zM384 297.984l0 86.016-86.016 0 0-86.016 86.016 0z"  ></path></symbol><symbol id="iconfit" viewBox="0 0 1024 1024"><path d="M597.333333 405.376c0-0.128 0.085333-0.256 0.085333-0.384C597.418667 404.821333 597.333333 404.650667 597.333333 404.522667L597.333333 192.768C597.333333 180.522667 606.933333 170.538667 618.666667 170.666667c11.733333-0.042667 21.376 9.813333 21.376 22.144L640.042667 384l191.189333 0c12.16 0 22.186667 9.6 22.101333 21.333333 0 11.733333-9.813333 21.333333-22.186667 21.333333l-211.754667 0c-0.128 0-0.256-0.085333-0.384-0.085333S618.837333 426.666667 618.709333 426.666667c-4.821333 0-9.045333-1.962667-12.629333-4.736-0.853333-0.64-1.749333-0.981333-2.432-1.706667-0.213333-0.213333-0.298667-0.469333-0.512-0.725333C599.68 415.744 597.333333 410.837333 597.333333 405.376zM362.666667 170.666667C350.933333 170.624 341.290667 180.48 341.290667 192.810667L341.290667 384 150.101333 384C137.898667 384 127.914667 393.6 128 405.333333 128 417.066667 137.813333 426.666667 150.186667 426.666667l211.754667 0c0.128 0 0.256-0.085333 0.384-0.085333S362.496 426.666667 362.624 426.666667c4.821333 0 9.045333-1.962667 12.629333-4.736 0.853333-0.64 1.749333-0.981333 2.432-1.706667 0.213333-0.213333 0.298667-0.469333 0.512-0.725333C381.653333 415.744 384 410.837333 384 405.376c0-0.128-0.085333-0.256-0.085333-0.384C383.914667 404.821333 384 404.650667 384 404.522667L384 192.768C384 180.522667 374.4 170.538667 362.666667 170.666667zM831.146667 640l-211.754667 0c-0.128 0-0.256 0.085333-0.384 0.085333S618.837333 640 618.709333 640c-4.821333 0-9.088 2.005333-12.672 4.778667-0.810667 0.597333-1.706667 0.938667-2.389333 1.664-0.213333 0.213333-0.298667 0.469333-0.512 0.725333C599.68 650.922667 597.333333 655.829333 597.333333 661.290667c0 0.128 0.085333 0.256 0.085333 0.384 0 0.170667-0.085333 0.341333-0.085333 0.469333l0 211.797333c0 12.202667 9.6 22.229333 21.333333 22.101333 11.733333 0.042667 21.376-9.813333 21.376-22.144L640.042667 682.666667l191.189333 0c12.16 0 22.186667-9.6 22.101333-21.333333C853.333333 649.6 843.52 640 831.146667 640zM378.154667 647.168c-0.213333-0.256-0.298667-0.512-0.512-0.725333-0.682667-0.725333-1.578667-1.066667-2.389333-1.664C371.712 642.005333 367.445333 640 362.624 640c-0.128 0-0.213333 0.085333-0.341333 0.085333S362.026667 640 361.898667 640L150.186667 640C137.813333 640 128 649.6 128 661.333333 127.914667 673.066667 137.898667 682.666667 150.101333 682.666667l191.189333 0 0 191.189333c0 12.288 9.642667 22.186667 21.376 22.144C374.4 896.128 384 886.144 384 873.898667l0-211.797333c0-0.128-0.085333-0.298667-0.085333-0.469333C383.914667 661.546667 384 661.418667 384 661.290667 384 655.829333 381.653333 650.922667 378.154667 647.168zM490.666667 469.333333c-35.328 0-64 28.672-64 64s28.672 64 64 64 64-28.672 64-64S525.994667 469.333333 490.666667 469.333333z"  ></path></symbol><symbol id="iconpaste" viewBox="0 0 1024 1024"><path d="M776 248 704 248 704 192l99.968 0C819.392 192 832 204.608 832 220.032l0 98.88-56 0L776 248zM255.104 904 184 904 184 248 256 248 256 192 156.032 192C140.608 192 128 204.608 128 220.032l0 712C128 947.392 140.608 960 156.032 960l99.136 0L255.168 904zM640 320 320 320 320 192l64 0L384 120C384 89.216 409.216 64 440 64l72.064 0c30.784 0 56 25.216 56 56L568.064 192 640 192 640 320zM512.128 120.128C512.064 120.064 512 120 512 120L440.064 120.064c0 0 0 0.064-0.064 0.064L440 192l72.064 0 0.064 0L512.128 120.128zM888.256 995.776 888.256 578.88l-182.4-192L351.488 386.88c-18.624 0-31.232 12.608-31.232 28.032l0 580.864c0 15.36 12.608 28.032 28.032 28.032l512 0C875.648 1023.744 888.256 1011.136 888.256 995.776zM824.256 586.88l-129.6 0L694.656 450.88 824.256 586.88zM832.256 970.88 376.256 970.88 376.256 442.88l265.6 0 0 196.864 190.4 0L832.256 970.88z"  ></path></symbol><symbol id="iconactual-size" viewBox="0 0 1024 1024"><path d="M829.013333 810.666667l-640 0c-58.794667 0-106.666667-47.829333-106.666667-106.666667l0-469.333333c0-58.794667 47.872-106.666667 106.666667-106.666667l640 0c58.837333 0 106.666667 47.872 106.666667 106.666667l0 469.333333C935.68 762.837333 887.850667 810.666667 829.013333 810.666667zM189.013333 170.666667c-35.285333 0-64 28.714667-64 64l0 469.333333c0 35.285333 28.714667 64 64 64l640 0c35.285333 0 64-28.714667 64-64l0-469.333333c0-35.285333-28.714667-64-64-64L189.013333 170.666667zM338.346667 640.256c0 11.733333-9.557333 21.333333-21.333333 21.333333s-21.333333-9.6-21.333333-21.333333l0-341.333333c0-11.818667 9.557333-21.333333 21.333333-21.333333s21.333333 9.514667 21.333333 21.333333L338.346667 640.256zM722.346667 640.256c0 11.733333-9.557333 21.333333-21.333333 21.333333s-21.333333-9.6-21.333333-21.333333l0-341.333333c0-11.818667 9.557333-21.333333 21.333333-21.333333s21.333333 9.514667 21.333333 21.333333L722.346667 640.256zM509.013333 341.333333c-23.594667 0-42.666667 19.072-42.666667 42.666667s19.072 42.666667 42.666667 42.666667 42.666667-19.072 42.666667-42.666667S532.565333 341.333333 509.013333 341.333333zM509.013333 512c-23.594667 0-42.666667 19.072-42.666667 42.666667s19.072 42.666667 42.666667 42.666667 42.666667-19.072 42.666667-42.666667S532.565333 512 509.013333 512z"  ></path></symbol><symbol id="iconredo" viewBox="0 0 1024 1024"><path d="M708.16 635.904c-39.36 35.968-48.32 41.344-50.496-25.856-3.968-49.152 0-103.552 0-103.552-1.408-3.072-86.464-35.008-227.072 25.856C290.048 593.28 195.2 783.36 178.432 842.88 177.088 877.248 132.288 943.616 128 841.472c-0.576-166.656 64.512-341.12 230.336-441.152 154.624-93.248 283.264-83.776 297.408-78.848 0.256 1.344 0.64 1.856 1.344 1.024 0.192-0.256-0.384-0.64-1.344-1.024-1.216-6.208 2.496-38.272 2.88-98.56-2.368-54.144 12.096-55.808 49.536-26.944 68.544 56.32 251.776 231.36 251.776 231.36S776.768 580.608 708.16 635.904z"  ></path></symbol><symbol id="iconundo" viewBox="0 0 1024 1024"><path d="M379.776 635.904c39.36 35.968 48.32 41.344 50.496-25.856 3.968-49.152 0-103.552 0-103.552 1.408-3.072 86.464-35.008 227.072 25.856 140.544 60.928 235.456 251.008 252.16 310.528 1.344 34.368 46.144 100.736 50.432-1.344 0.576-166.656-64.512-341.12-230.336-441.152C574.976 307.072 446.4 316.608 432.192 321.472c-0.256 1.344-0.64 1.856-1.344 1.024-0.192-0.256 0.384-0.64 1.344-1.024 1.216-6.208-2.496-38.272-2.88-98.56 2.368-54.144-12.096-55.808-49.536-26.944C311.168 252.288 128 427.264 128 427.264S311.168 580.608 379.776 635.904z"  ></path></symbol><symbol id="icondelete" viewBox="0 0 1024 1024"><path d="M677.647059 256l0-90.352941c0-37.436235-23.461647-60.235294-61.771294-60.235294L408.094118 105.411765c-38.249412 0-61.741176 22.799059-61.741176 60.235294l0 90.352941-180.705882 0 0 60.235294 60.235294 0 0 512c0 54.272 33.972706 90.352941 90.352941 90.352941l391.529412 0c55.085176 0 90.352941-33.490824 90.352941-90.352941l0-512 60.235294 0 0-60.235294L677.647059 256zM406.588235 165.647059l210.823529 0-1.264941 90.352941L406.588235 256 406.588235 165.647059zM737.882353 858.352941l-451.764706 0 0-542.117647 451.764706 0L737.882353 858.352941zM466.823529 376.470588l-58.729412 0-1.505882 391.529412 60.235294 0L466.823529 376.470588zM617.411765 376.470588l-60.235294 0 0 391.529412 60.235294 0L617.411765 376.470588z"  ></path></symbol><symbol id="iconzoom-in" viewBox="0 0 1024 1024"><path d="M1000.146824 957.500235l-311.597176-311.597176c58.729412-68.487529 94.509176-157.214118 94.509176-254.373647 0-215.883294-175.646118-391.529412-391.529412-391.529412-104.628706 0-202.932706 40.719059-276.901647 114.688-73.968941 73.908706-114.627765 172.272941-114.627765 276.841412 0 215.883294 175.646118 391.529412 391.529412 391.529412 97.099294 0 185.886118-35.779765 254.433882-94.509176l311.597176 311.597176 42.586353-42.646588zM391.529412 722.823529c-182.693647 0-331.294118-148.600471-331.294118-331.294118 0-88.545882 34.394353-171.730824 96.978824-234.315294 62.584471-62.524235 145.769412-96.978824 234.315294-96.978824 182.693647 0 331.294118 148.600471 331.294118 331.294118 0 182.693647-148.600471 331.294118-331.294118 331.294118zM421.647059 361.411765l120.470588 0 0 60.235294-120.470588 0 0 120.470588-60.235294 0 0-120.470588-120.470588 0 0-60.235294 120.470588 0 0-120.470588 60.235294 0 0 120.470588z"  ></path></symbol><symbol id="iconzoom-out" viewBox="0 0 1024 1024"><path d="M999.344139 955.925769l-311.084802-311.084802c58.63284-68.374912 94.35377-157.015739 94.35377-253.955368 0-215.528306-175.357294-390.8856-390.8856-390.8856-104.396523 0-202.599013 40.652102-276.50646 114.439276-73.787174 73.84731-114.439276 172.0498-114.37914 276.446324 0 215.528306 175.357294 390.8856 390.8856 390.8856 96.939629 0 185.640592-35.72093 254.015504-94.35377l311.084802 311.084802 42.516326-42.576462zM391.727508 721.634954c-182.333098 0-330.749354-148.356119-330.749354-330.749354-0.060136-88.400282 34.337797-171.448438 96.819356-233.869861 62.421424-62.48156 145.529716-96.879493 233.929998-96.879493 182.333098 0 330.749354 148.356119 330.749354 330.749354 0 182.333098-148.416256 330.749354-330.749354 330.749354zM241.386892 360.817477l300.681231 0 0 60.136246-300.681231 0 0-60.136246z"  ></path></symbol><symbol id="iconcopy" viewBox="0 0 1024 1024"><path d="M880 247.008l-162.016-166.016Q700.992 64 677.984 64h-316.992q-26.016 0-46.016 18.016-16.992 15.008-23.008 36.992H231.968q-43.008 0-73.504 31.008t-30.496 76v627.008q0 44 30.496 75.488T231.968 960h508q43.008 0 73.504-31.488t30.496-75.488v-63.008q23.008-6.016 37.504-25.504t14.496-44.512V287.008q0-24-16-40z m-168-160.992l-3.008-3.008z m98.016 177.984L744 196z m-126.016-116.992l108 110.016h-108V147.008zM676.992 128zM204.992 948q4 0.992 4.992 2.016-2.016-0.992-4.992-2.016z m27.008 4q-6.016 0-12-0.992 4.992 0.992 12 0.992z m543.008-99.008q0 15.008-10.016 25.504t-24.992 10.496H232q-14.016 0-24.512-10.496t-10.496-25.504V225.984q0-15.008 10.496-25.504t24.512-10.496h58.016v531.008q0 30.016 20.992 51.008t50.016 20.992H775.04v60z m52-132.992q0 2.016-2.016 2.016h-464q-2.016 0-2.016-2.016V136.992q0-2.016 2.016-2.016h251.008v156.992q0 15.008 10.016 24.992t24 10.016h180.992v392.992z m9.984 64q4-0.992 8.992-2.016-4.992 0.992-8.992 2.016z m-244-168.992h-107.008q-15.008 0-24.992 10.496t-10.016 24.992 10.016 24.992 24.992 10.496h107.008q14.016 0 24.512-10.496t10.496-24.992-10.496-24.992-24.512-10.496z m107.008-111.008h-214.016q-14.016 0-24.512 10.496t-10.496 24.992 10.496 24.992 24.512 10.496h214.016q14.016 0 24-10.496t10.016-24.992-10.016-24.992-24-10.496z m-240.992 36q0 4 0.992 8-0.992-4-0.992-8zM700 512z m12 52l4-2.016z m-260.992-135.488q0 14.496 10.496 24.992t24.512 10.496h214.016q14.016 0 24-10.496t10.016-24.992-10.016-24.992-24-10.496h-214.016q-14.016 0-24.512 10.496t-10.496 24.992z m8 1.504z"  ></path></symbol><symbol id="iconsave" viewBox="0 0 1024 1024"><path d="M886.4 265.6l-128-128c-6.4-6.4-12.8-9.6-22.4-9.6H160c-19.2 0-32 12.8-32 32v704c0 19.2 12.8 32 32 32h704c19.2 0 32-12.8 32-32V288c0-9.6-3.2-16-9.6-22.4zM352 192h320v256H352V192z m480 640H192V192h96v288c0 19.2 12.8 32 32 32h384c19.2 0 32-12.8 32-32V204.8l96 96V832z"  ></path><path d="M576 256c-19.2 0-32 12.8-32 32v64c0 19.2 12.8 32 32 32s32-12.8 32-32V288c0-19.2-12.8-32-32-32z"  ></path></symbol><symbol id="iconselect-all" viewBox="0 0 1024 1024"><path d="M128 213.333333h85.333333V128c-47.146667 0-85.333333 38.186667-85.333333 85.333333z m0 341.333334h85.333333v-85.333334H128v85.333334z m170.666667 341.333333h85.333333v-85.333333h-85.333333v85.333333zM128 384h85.333333v-85.333333H128v85.333333zM554.666667 128h-85.333334v85.333333h85.333334V128z m256 0v85.333333h85.333333c0-47.146667-38.186667-85.333333-85.333333-85.333333zM213.333333 896v-85.333333H128c0 47.146667 38.186667 85.333333 85.333333 85.333333z m-85.333333-170.666667h85.333333v-85.333333H128v85.333333zM384 128h-85.333333v85.333333h85.333333V128z m85.333333 768h85.333334v-85.333333h-85.333334v85.333333z m341.333334-341.333333h85.333333v-85.333334h-85.333333v85.333334z m0 341.333333c47.146667 0 85.333333-38.186667 85.333333-85.333333h-85.333333v85.333333z m0-512h85.333333v-85.333333h-85.333333v85.333333z m0 341.333333h85.333333v-85.333333h-85.333333v85.333333z m-170.666667 170.666667h85.333333v-85.333333h-85.333333v85.333333z m0-682.666667h85.333333V128h-85.333333v85.333333zM298.666667 725.333333h426.666666V298.666667H298.666667v426.666666z m85.333333-341.333333h256v256H384V384z" fill="" ></path></symbol><symbol id="iconselect" viewBox="0 0 1024 1024"><path d="M324.266667 34.133333h-102.4c-10.24 0-17.066667 6.826667-17.066667 17.066667s6.826667 17.066667 17.066667 17.066667h102.4c10.24 0 17.066667-6.826667 17.066666-17.066667S334.506667 34.133333 324.266667 34.133333zM597.333333 34.133333h-102.4c-10.24 0-17.066667 6.826667-17.066666 17.066667s6.826667 17.066667 17.066666 17.066667h102.4c10.24 0 17.066667-6.826667 17.066667-17.066667s-6.826667-17.066667-17.066667-17.066667zM324.266667 716.8h-102.4c-10.24 0-17.066667 6.826667-17.066667 17.066667s6.826667 17.066667 17.066667 17.066666h102.4c10.24 0 17.066667-6.826667 17.066666-17.066666s-6.826667-17.066667-17.066666-17.066667zM563.2 716.8h-68.266667c-10.24 0-17.066667 6.826667-17.066666 17.066667s6.826667 17.066667 17.066666 17.066666h68.266667c10.24 0 17.066667-6.826667 17.066667-17.066666s-6.826667-17.066667-17.066667-17.066667zM34.133333 597.333333c0 10.24 6.826667 17.066667 17.066667 17.066667s17.066667-6.826667 17.066667-17.066667v-102.4c0-10.24-6.826667-17.066667-17.066667-17.066666s-17.066667 6.826667-17.066667 17.066666v102.4zM51.2 341.333333c10.24 0 17.066667-6.826667 17.066667-17.066666v-102.4c0-10.24-6.826667-17.066667-17.066667-17.066667s-17.066667 6.826667-17.066667 17.066667v102.4c0 10.24 6.826667 17.066667 17.066667 17.066666zM768 477.866667c-10.24 0-17.066667 6.826667-17.066667 17.066666v68.266667c0 10.24 6.826667 17.066667 17.066667 17.066667s17.066667-6.826667 17.066667-17.066667v-68.266667c0-10.24-6.826667-17.066667-17.066667-17.066666zM785.066667 221.866667c0-10.24-6.826667-17.066667-17.066667-17.066667s-17.066667 6.826667-17.066667 17.066667v102.4c0 10.24 6.826667 17.066667 17.066667 17.066666s17.066667-6.826667 17.066667-17.066666v-102.4zM733.866667 102.4h68.266666c10.24 0 17.066667-6.826667 17.066667-17.066667v-68.266666c0-10.24-6.826667-17.066667-17.066667-17.066667h-68.266666c-10.24 0-17.066667 6.826667-17.066667 17.066667v68.266666c0 10.24 6.826667 17.066667 17.066667 17.066667zM85.333333 0h-68.266666C6.826667 0 0 6.826667 0 17.066667v68.266666c0 10.24 6.826667 17.066667 17.066667 17.066667h68.266666c10.24 0 17.066667-6.826667 17.066667-17.066667v-68.266666c0-10.24-6.826667-17.066667-17.066667-17.066667zM85.333333 682.666667h-68.266666c-10.24 0-17.066667 6.826667-17.066667 17.066666v68.266667c0 10.24 6.826667 17.066667 17.066667 17.066667h68.266666c10.24 0 17.066667-6.826667 17.066667-17.066667v-68.266667c0-10.24-6.826667-17.066667-17.066667-17.066666zM1013.76 788.48l-375.466667-204.8c-6.826667-3.413333-13.653333-3.413333-20.48 3.413333-3.413333 3.413333-3.413333 10.24-3.413333 17.066667l170.666667 409.6c3.413333 6.826667 6.826667 10.24 13.653333 10.24s13.653333-3.413333 13.653333-10.24l64.853334-133.12 133.12-64.853333c6.826667-3.413333 10.24-10.24 10.24-13.653334 3.413333-6.826667 0-10.24-6.826667-13.653333z" fill="" ></path></symbol><symbol id="iconto-front" viewBox="0 0 1024 1024"><path d="M128 554.666667h85.333333v-85.333334H128v85.333334z m0 170.666666h85.333333v-85.333333H128v85.333333z m85.333333 170.666667v-85.333333H128c0 47.146667 38.186667 85.333333 85.333333 85.333333zM128 384h85.333333v-85.333333H128v85.333333z m512 512h85.333333v-85.333333h-85.333333v85.333333z m170.666667-768H384c-47.146667 0-85.333333 38.186667-85.333333 85.333333v426.666667c0 47.146667 38.186667 85.333333 85.333333 85.333333h426.666667c47.146667 0 85.333333-38.186667 85.333333-85.333333V213.333333c0-47.146667-38.186667-85.333333-85.333333-85.333333z m0 512H384V213.333333h426.666667v426.666667zM469.333333 896h85.333334v-85.333333h-85.333334v85.333333z m-170.666666 0h85.333333v-85.333333h-85.333333v85.333333z"  ></path></symbol><symbol id="iconimage" viewBox="0 0 1024 1024"><path d="M847.657 64.016H175.703c-61.766 0-111.993 50.227-111.993 111.992v671.954c0 61.765 50.226 111.993 111.993 111.993h671.954c61.765 0 111.992-50.228 111.992-111.993V176.01c0-61.765-50.227-111.993-111.992-111.993z m55.995 783.946c0 30.87-25.127 55.997-55.996 55.997H175.703c-30.87 0-55.996-25.127-55.996-55.997V176.01c0-30.87 25.128-55.996 55.996-55.996h671.954c30.87 0 55.996 25.127 55.996 55.996v671.953zM835.19 544.686l-83.995-55.996c-10.444-6.945-23.54-5.688-32.782 1.722l-0.246-0.3-133.184 106.551-197.435-135.752c-0.083-0.055-0.164-0.055-0.218-0.11-2.297-1.53-4.895-2.379-7.52-3.199-0.874-0.273-1.666-0.875-2.57-1.04-2.378-0.492-4.811-0.218-7.273-0.081-1.121 0.082-2.27-0.218-3.363 0-1.23 0.218-2.35 0.984-3.554 1.394-2.27 0.739-4.566 1.367-6.616 2.707-0.083 0.055-0.192 0.055-0.274 0.11L188.17 572.684c-12.878 8.585-16.35 25.946-7.765 38.824 5.386 8.094 14.273 12.47 23.323 12.47 5.332 0 10.718-1.533 15.503-4.704L371.444 517.81 803.8 815.042a27.793 27.793 0 0 0 15.831 4.923c8.913 0 17.663-4.238 23.105-12.14 8.749-12.74 5.523-30.156-7.219-38.934L633.214 629.802l103.956-83.147 66.959 44.621c4.786 3.172 10.171 4.704 15.503 4.704 9.05 0 17.937-4.374 23.323-12.469 8.584-12.877 5.112-30.24-7.766-38.825zM581.674 427.991c69.476 0 125.992-56.516 125.992-125.99 0-69.477-56.516-125.993-125.992-125.993-69.475 0-125.99 56.516-125.99 125.992s56.516 125.991 125.99 125.991z m0-195.985c38.607 0 69.995 31.387 69.995 69.994s-31.388 69.995-69.995 69.995c-38.606 0-69.995-31.39-69.995-69.995 0-38.607 31.39-69.994 69.995-69.994z"  ></path></symbol><symbol id="iconclear" viewBox="0 0 1024 1024"><path d="M686.464 452.821333c5.461333-15.274667 20.394667-43.690667 40.533333-77.952 14.549333-24.746667 39.466667-55.978667 64.810667-87.466666 6.4-7.978667 13.909333-17.152 22.357333-27.562667l34.304 19.456c-8.533333 10.752-15.914667 19.968-22.186666 27.733333-25.770667 31.914667-50.261333 62.165333-65.024 87.296-8.576 14.634667-15.872 27.562667-21.76 38.741334l116.906666 66.304a77.013333 77.013333 0 0 1 28.970667 106.24l-197.973333 336.810666a80 80 0 0 1-108.245334 28.458667l-411.562666-233.344a77.013333 77.013333 0 0 1-28.970667-106.24l197.973333-336.810667a80 80 0 0 1 108.245334-28.501333l116.821333 66.261333c6.912-10.624 14.634667-23.253333 23.253333-37.888 14.762667-25.173333 29.226667-61.056 44.501334-98.986666 3.712-9.173333 8.106667-20.053333 13.354666-32.725334l34.304 19.456-13.141333 32.853334c-15.061333 37.248-30.165333 74.069333-44.714667 98.816-20.138667 34.261333-37.717333 61.184-48.469333 73.429333l-118.229333-67.029333c-33.152-18.773333-73.301333-11.989333-92.074667 19.882666l-167.552 285.056c-18.773333 31.914667-6.826667 73.088 26.325333 91.904l352.554667 199.893334c33.109333 18.773333 75.050667 8.106667 93.781333-23.765334l167.594667-285.056c18.773333-31.914667 5.034667-69.248-28.117333-88.021333l-118.613334-67.242667z m-43.690667-290.133333c22.613333-36.906667 90.026667-47.786667 146.432-15.786667 56.405333 32 80.554667 94.762667 59.306667 132.437334l-34.304-19.456c9.984-18.944-7.68-57.728-45.056-78.890667-37.290667-21.162667-80.341333-16.810667-92.074667 1.109333l-34.304-19.456zM314.112 418.858667l472.704 267.989333-21.888 37.248L292.224 456.106667l21.888-37.205334z"  ></path></symbol><symbol id="icongroup" viewBox="0 0 1024 1024"><path d="M912 820.1V203.9c28-9.9 48-36.6 48-67.9 0-39.8-32.2-72-72-72-31.3 0-58 20-67.9 48H203.9C194 84 167.3 64 136 64c-39.8 0-72 32.2-72 72 0 31.3 20 58 48 67.9v616.2C84 830 64 856.7 64 888c0 39.8 32.2 72 72 72 31.3 0 58-20 67.9-48h616.2c9.9 28 36.6 48 67.9 48 39.8 0 72-32.2 72-72 0-31.3-20-58-48-67.9zM888 112c13.3 0 24 10.7 24 24s-10.7 24-24 24-24-10.7-24-24 10.7-24 24-24zM136 912c-13.3 0-24-10.7-24-24s10.7-24 24-24 24 10.7 24 24-10.7 24-24 24z m0-752c-13.3 0-24-10.7-24-24s10.7-24 24-24 24 10.7 24 24-10.7 24-24 24z m704 680H184V184h656v656z m48 72c-13.3 0-24-10.7-24-24s10.7-24 24-24 24 10.7 24 24-10.7 24-24 24z"  ></path><path d="M288 474h448c8.8 0 16-7.2 16-16V282c0-8.8-7.2-16-16-16H288c-8.8 0-16 7.2-16 16v176c0 8.8 7.2 16 16 16z m56-136h336v64H344v-64zM288 758h448c8.8 0 16-7.2 16-16V566c0-8.8-7.2-16-16-16H288c-8.8 0-16 7.2-16 16v176c0 8.8 7.2 16 16 16z m56-136h336v64H344v-64z"  ></path></symbol><symbol id="iconungroup" viewBox="0 0 1024 1024"><path d="M736 550H288c-8.8 0-16 7.2-16 16v176c0 8.8 7.2 16 16 16h448c8.8 0 16-7.2 16-16V566c0-8.8-7.2-16-16-16z m-56 136H344v-64h336v64zM888 816c-39.8 0-72 32.2-72 72s32.2 72 72 72 72-32.2 72-72-32.2-72-72-72z m0 96c-13.3 0-24-10.7-24-24s10.7-24 24-24 24 10.7 24 24-10.7 24-24 24zM736 266H288c-8.8 0-16 7.2-16 16v176c0 8.8 7.2 16 16 16h448c8.8 0 16-7.2 16-16V282c0-8.8-7.2-16-16-16z m-56 136H344v-64h336v64zM888 208c39.8 0 72-32.2 72-72s-32.2-72-72-72-72 32.2-72 72 32.2 72 72 72z m0-96c13.3 0 24 10.7 24 24s-10.7 24-24 24-24-10.7-24-24 10.7-24 24-24zM136 64c-39.8 0-72 32.2-72 72s32.2 72 72 72 72-32.2 72-72-32.2-72-72-72z m0 96c-13.3 0-24-10.7-24-24s10.7-24 24-24 24 10.7 24 24-10.7 24-24 24zM136 816c-39.8 0-72 32.2-72 72s32.2 72 72 72 72-32.2 72-72-32.2-72-72-72z m0 96c-13.3 0-24-10.7-24-24s10.7-24 24-24 24 10.7 24 24-10.7 24-24 24z"  ></path></symbol></svg>',l=(c=document.getElementsByTagName("script"))[c.length-1].getAttribute("data-injectcss");if(l&&!v.__iconfont__svg__cssinject__){v.__iconfont__svg__cssinject__=!0;try{document.write("<style>.svgfont {display: inline-block;width: 1em;height: 1em;fill: currentColor;vertical-align: -0.1em;font-size:16px;}</style>")}catch(c){console&&console.log(c)}}!function(c){if(document.addEventListener)if(~["complete","loaded","interactive"].indexOf(document.readyState))setTimeout(c,0);else{var l=function(){document.removeEventListener("DOMContentLoaded",l,!1),c()};document.addEventListener("DOMContentLoaded",l,!1)}else document.attachEvent&&(o=c,e=v.document,z=!1,(h=function(){try{e.documentElement.doScroll("left")}catch(c){return void setTimeout(h,50)}t()})(),e.onreadystatechange=function(){"complete"==e.readyState&&(e.onreadystatechange=null,t())});function t(){z||(z=!0,o())}var o,e,z,h}(function(){var c,l,t,o,e,z;(c=document.createElement("div")).innerHTML=h,h=null,(l=c.getElementsByTagName("svg")[0])&&(l.setAttribute("aria-hidden","true"),l.style.position="absolute",l.style.width=0,l.style.height=0,l.style.overflow="hidden",t=l,(o=document.body).firstChild?(e=t,(z=o.firstChild).parentNode.insertBefore(e,z)):o.appendChild(t))})}(window);
diff --git a/Source/UBCS-WEB/src/components/template/SetPersonnel.vue b/Source/UBCS-WEB/src/components/template/SetPersonnel.vue
index beb1801..279b8d1 100644
--- a/Source/UBCS-WEB/src/components/template/SetPersonnel.vue
+++ b/Source/UBCS-WEB/src/components/template/SetPersonnel.vue
@@ -1,15 +1,23 @@
 <template>
-    <el-dialog :title="title" :visible.sync="dialogVisible" append-to-body="true" width="30%">
-        <el-tag v-for="tag in tags" :key="tag" closable effect="dark" @click="handleClickTag(tag)"
-            @close="handleCloseTag(tag)">
-            <span> {{ tag }}</span>
-        </el-tag>
-        <el-divider></el-divider>
-        <el-form :model="formInline" class="demo-form-inline" label-position="left">
-            <el-form-item :label="item.taskName" v-for="(item,index) in initFrom" :key="index">
-                <el-select v-model="formInline[index].userId" :placeholder="item.taskName">
-                    <el-option label="鍖哄煙涓�" value="shanghai"></el-option>
-                    <el-option label="鍖哄煙浜�" value="beijing"></el-option>
+    <el-dialog :title="title" :visible.sync="dialogVisible" append-to-body="true">
+        <div>
+            <el-tag v-for="tag in tags" :key="tag" closable disable-transitions effect="dark" @click="handleClickTag(tag)"
+                @close="handleCloseTag(tag)">
+                <span> {{ tag.name }}</span>
+            </el-tag>
+        </div>
+
+        <el-divider v-if="tags.length !== 0"></el-divider>
+        <div class="btns-icon">
+            <el-button type="primary" icon="el-icon-star-off" @click="handleCollect"></el-button>
+            <!-- <el-button type="primary" icon="el-icon-refresh" ></el-button> -->
+        </div>
+        <el-form :model="saveParam" class="demo-form-inline" label-position="left">
+            <el-form-item :label="item.taskName" v-for="(item, index) in initFrom" :key="index">
+                <el-select style="width: 50%;" v-model="saveParam.flowTaskUsers[index]['userId']"
+                    :placeholder="item.taskName" @change="handleSelect($event, index)">
+                    <el-option :label="key.userNames" :value="key.userId" v-for="(key, keyi) in typeName"
+                        :key="keyi"></el-option>
                 </el-select>
             </el-form-item>
         </el-form>
@@ -20,7 +28,7 @@
     </el-dialog>
 </template>
 <script>
-import { personnelInit, personnelCollect, cancelCollect, personnelSave } from '@/api/template/setPersonnel.js'
+import { personnelInit, personnelCollect, cancelCollect, personnelSave, personnelDict } from '@/api/template/setPersonnel.js'
 export default {
     name: 'SetPersonnel',
     props: {
@@ -29,11 +37,18 @@
             typeof: Boolean,
             default: false
         },
+        // 鏍囬
         title: {
             typeof: String,
             default: '浜哄憳璁剧疆'
         },
-        code:{
+        // 妯℃澘id
+        code: {
+            typeof: String,
+            default: ''
+        },
+        // 妯℃澘鐢ㄩ��
+        type: {
             typeof: String,
             default: ''
         }
@@ -50,47 +65,108 @@
         return {
             dialogVisible: this.visible,
             initFrom: [],
-            tags: ['鏍囩1', '鏍囩2', '鏍囩3', '鏍囩4'],
-            formInline: []
+            tags: [],
+            typeName: [],
+            saveParam: {},
+            users: [],
 
         }
     },
     mounted() {
         this.apiInit()
+        this.apiDict()
     },
     methods: {
         async apiInit() {
-            const response = await personnelInit({type:'PUBLIC',templateId:'8b5e2017-990f-454a-9c39-4c4eeeb57553'})
+            const response = await personnelInit({ type: this.type, templateId: this.code })
             if (response.status === 200) {
                 console.log(response)
                 this.initFrom = response.data.data.user
-                this.formInline = response.data.data.user
+                this.tags = response.data.data.collect
+                const { modelKey, templateId } = response.data.data.flow
+                let flowTaskUsers = response.data.data.user
+                this.saveParam = { modelKey, templateId, flowTaskUsers: flowTaskUsers }
+                this.handleClickTag(this.tags[0])
             }
         },
-        async apiCollect() {
-            const response = await personnelCollect()
+        async apiDict() {
+            const response = await personnelDict()
             if (response.status === 200) {
                 console.log(response)
+                const data = response.data.data
+                this.typeName = data.map(item => {
+                    const { account, deptName, id, realName } = item
+                    let userNames = `${deptName} - ${realName} - ${account}`
+                    return { userId: id, userName: realName, userNames: userNames }
+                })
             }
         },
-        async canCollect(id) {
-            const response = await cancelCollect()
+
+        handleCollect() {
+            this.$prompt('璇疯緭鍏ヤ竴涓悕瀛�', '鎿嶄綔', {
+                confirmButtonText: '纭畾',
+                cancelButtonText: '鍙栨秷',
+            }).then(async ({ value }) => {
+                console.log(this.users)
+                this.saveParam.flowTaskUsers = this.users
+                this.saveParam = { ...this.saveParam, name: value }
+                console.log(this.saveParam)
+                const response = await personnelCollect(this.saveParam)
+                if (response.status === 200) {
+                    this.$nextTick(() => {
+                        this.apiInit()
+                    })
+                    console.log(response)
+                }
+            }).catch(() => {
+
+            });
+        },
+        async canCollect(name) {
+            const response = await cancelCollect({ name: name })
             if (response.status === 200) {
                 console.log(response)
+                this.apiInit()
+                this.$message({
+                    type: 'success',
+                    message: response.data.msg
+                });
             }
         },
         async apiSave() {
-            const response = await personnelSave()
-            if (response.status === 200) {
-                console.log(response)
+            try {
+                const { modelKey, templateId } = this.saveParam
+                const response = await personnelSave({ modelKey, templateId })
+                if (response.status === 200) {
+                    console.log(response)
+                    this.$message({
+                    type: 'success',
+                    message: response.data.msg
+                });
+                    this.done()
+                }
+            } catch {
+                console.error('鎺ュ彛璋冪敤澶辫触')
             }
         },
         handleClickTag(event) {
             console.log(event)
+            const flowTaskUsers = event.flowTaskUsers
+            this.saveParam.flowTaskUsers = flowTaskUsers.map(item => {
+                const { taskId, taskName, userId, userName } = item
+                return { taskId, taskName, userId, userName }
+            })
         },
         handleCloseTag(event) {
             console.log(event)
-            this.canCollect(event)
+            this.canCollect(event.name)
+        },
+        handleSelect(event, index) {
+            const res = this.typeName.find(item => item.userId === event)
+            const { userName } = res
+            let users = { ... this.saveParam.flowTaskUsers[index], userName }
+            console.log(users)
+            this.users[index] = users
         },
         done() {
             this.dialogVisible = false
@@ -99,8 +175,9 @@
             this.done()
         },
         handleConfirm() {
-            // this.done()
-            console.log(this.formInline)
+            console.log(this.users)
+            console.log(this.saveParam)
+            this.apiSave()
         }
     }
 }
@@ -108,6 +185,7 @@
 <style lang="scss">
 .el-tag+.el-tag {
     margin-left: 10px;
+    margin-top: 10px;
 }
 
 .button-new-tag {
@@ -123,4 +201,10 @@
     margin-left: 10px;
     vertical-align: bottom;
 }
+
+.btns-icon {
+    display: flex;
+    justify-content: end;
+    padding-bottom: 10px;
+}
 </style>
\ No newline at end of file
diff --git a/Source/UBCS-WEB/src/views/MasterData/FormTempalteTest.vue b/Source/UBCS-WEB/src/views/MasterData/FormTempalteTest.vue
index bcf3281..a0521bf 100644
--- a/Source/UBCS-WEB/src/views/MasterData/FormTempalteTest.vue
+++ b/Source/UBCS-WEB/src/views/MasterData/FormTempalteTest.vue
@@ -35,8 +35,8 @@
       disabledProp: ["id", 'lcstatus'],
       // 琛ㄥ崟绫诲瀷
       type: "add",
-      templateOid: "78B8C7C5-A042-0B96-FE6D-65421451782A",
-      codeClassifyOid: "4524E801-6CC6-92E8-1AC3-2AB9604E8F96",
+      templateOid: "A12826E4-2B66-6D56-DE30-92BB1D7F607F",
+      codeClassifyOid: "D9CF223F-317D-71EB-BD11-433A94CAD9F3",
       codeRuleOid: "B95872A6-9CEA-D490-8F1B-9D26548CAF96",
       rowOid: '6EF696C3-CD87-0E7C-1EA1-8DE3913A95C9'
     };
diff --git a/Source/UBCS-WEB/src/views/flow/flowPath.vue b/Source/UBCS-WEB/src/views/flow/flowPath.vue
index 15db06e..f1402d5 100644
--- a/Source/UBCS-WEB/src/views/flow/flowPath.vue
+++ b/Source/UBCS-WEB/src/views/flow/flowPath.vue
@@ -3,7 +3,7 @@
         <el-button @click="outerVisible = true">娴佺▼娴嬭瘯</el-button>
         <el-button @click="handleTable">浜哄憳璁剧疆</el-button>
         <flow-business :visible.sync="outerVisible"></flow-business>
-       <set-personnel :visible.sync="visibleFlow"></set-personnel>
+       <set-personnel :visible.sync="visibleFlow" code="8b5e2017-990f-454a-9c39-4c4eeeb57553" type="PUBLIC"></set-personnel>
     </div>
 </template>
 
diff --git a/Source/UBCS-WEB/src/views/integration/applicationForm.vue b/Source/UBCS-WEB/src/views/integration/applicationForm.vue
index db577fa..6cd1ac7 100644
--- a/Source/UBCS-WEB/src/views/integration/applicationForm.vue
+++ b/Source/UBCS-WEB/src/views/integration/applicationForm.vue
@@ -117,9 +117,13 @@
         },
         async getDataList() {
             this.loading = true
-            console.log(this.searchParam)
             const { pageSize, currentPage, total } = this.page
             let param = { size: pageSize, current: currentPage }
+            console.log(this.searchParam)
+            this.searchParam = Object.keys(this.searchParam)
+                .filter((key) => this.searchParam[key] !== null && this.searchParam[key] !== undefined && this.searchParam[key] !== "")
+                .reduce((acc, key) => ({ ...acc, [key]: this.searchParam[key] }), {});
+            console.log(this.searchParam)
             const response = await getList({ ...param, ...this.searchParam })
             if (response.status === 200) {
                 this.loading = false
@@ -137,8 +141,10 @@
         },
         handleReset() {
             this.searchParam = {}
+            this.getDataList()
         },
         handleSearch(form, done) {
+            console.log(form)
             const { id, groupCode, operationType } = form
             let dataTime = { id, groupCode, operationType }
             if (form.hasOwnProperty('createTime')) {
@@ -147,7 +153,6 @@
             if (form.hasOwnProperty('lastModifyTime')) {
                 dataTime = { lastModifyTime: dateFormat(form.lastModifyTime), ...dataTime }
             }
-            console.log(dataTime)
             this.searchParam = dataTime
             this.page.currentPage = 1
             this.getDataList()
diff --git a/Source/UBCS-WEB/src/views/integration/systemInfo.vue b/Source/UBCS-WEB/src/views/integration/systemInfo.vue
index f1f2b78..2b7e248 100644
--- a/Source/UBCS-WEB/src/views/integration/systemInfo.vue
+++ b/Source/UBCS-WEB/src/views/integration/systemInfo.vue
@@ -5,8 +5,8 @@
             @refresh-change="handleRefresh" @size-change="handleSizePage" @current-change="handleCurrentPage"
             @selection-change="selectionChange" @row-click="handleRowClick">
             <template slot="menuLeft">
-                <el-button icon="el-icon-search" size="small" type="primary" @click="handleStatus">鏌� 璇�
-                </el-button>
+                <!-- <el-button icon="el-icon-search" size="small" type="primary" @click="handleStatus">鏌� 璇�
+                </el-button> -->
                 <el-button icon="el-icon-delete" size="small" type="danger" @click="handleDeleteByIds">鍒� 闄�
                 </el-button>
             </template>
@@ -68,7 +68,8 @@
                             required: true,
                             message: '绯荤粺缂栧彿涓嶈兘涓虹┖',
                             trigger: 'blur'
-                        }]
+                        }],
+                        // maxlength: 30,    //瀛楁暟闄愬埗
                     }, {
                         label: '绯荤粺鍚嶇О',
                         prop: 'name',
@@ -77,7 +78,8 @@
                             required: true,
                             message: '绯荤粺鍚嶇О涓嶈兘涓虹┖',
                             trigger: 'blur'
-                        }]
+                        }],
+                        // maxlength: 30,    //瀛楁暟闄愬埗
                     },
                     {
                         label: '绯荤粺鎻忚堪',
@@ -95,6 +97,9 @@
             console.log(this.search)
             const { pageSize, currentPage } = this.page
             let param = { size: pageSize, current: currentPage }
+            this.search = Object.keys(this.search)
+                .filter((key) => this.search[key] !== null && this.search[key] !== undefined && this.search[key] !== "")
+                .reduce((acc, key) => ({ ...acc, [key]: this.search[key] }), {});
             const response = await getSysInfoList({ ...param, ...this.search })
             if (response.status === 200) {
                 console.log(response)
@@ -106,31 +111,36 @@
         },
         // 鏂板
         async handleSave(row, done, loading) {
-            const response = await sysInfoAdd(row)
-            if (response.status === 200) {
+            try {
+                const response = await sysInfoAdd(row)
+                if (response.status === 200) {
+                    this.$message({
+                        type: 'success',
+                        message: '鏂板鏁版嵁鎴愬姛锛�'
+                    })
+                    done(row)
+                    // this.$refs.crud.refreshTable()
+                    // this.getDataList()
+                }
+            } catch {
                 loading()
-                this.$message({
-                    type: 'success',
-                    message: '鏂板鏁版嵁鎴愬姛锛�'
-                })
-                done()
-                this.$refs.crud.refreshTable()
-                this.getDataList()
             }
         },
         // 缂栬緫
         async handleEdit(row, index, done, loading) {
-            console.log(row)
-            const { oid, id, name, description } = row
-            const response = await sysInfoEdit({ oid, id, name, description })
-            if (response.status === 200) {
+            try {
+                const { oid, id, name, description } = row
+                const response = await sysInfoEdit({ oid, id, name, description })
+                if (response.status === 200) {
+                    loading()
+                    this.$message({
+                        type: 'success',
+                        message: '淇敼鏁版嵁鎴愬姛锛�'
+                    })
+                    done(row)
+                }
+            } catch {
                 loading()
-                this.$message({
-                    type: 'success',
-                    message: '淇敼鏁版嵁鎴愬姛锛�'
-                })
-                done()
-                this.getDataList()
             }
         },
         // 鍒犻櫎鍗曟潯
diff --git a/Source/UBCS-WEB/src/views/modeling/Business.vue b/Source/UBCS-WEB/src/views/modeling/Business.vue
index 807155a..35923fd 100644
--- a/Source/UBCS-WEB/src/views/modeling/Business.vue
+++ b/Source/UBCS-WEB/src/views/modeling/Business.vue
@@ -4,7 +4,8 @@
       <el-button-group>
         <el-button type="primary" @click="businessAdd" size="small"> <i class="el-icon-plus"></i>&nbsp; 鏂板</el-button>
         <el-button type="primary" @click="businessEdit" size="small"><i class="el-icon-edit"></i>&nbsp; 淇敼</el-button>
-        <el-button type="primary" @click="selectFromTable" size="small"><i class="el-icon-thumb"></i>&nbsp; 浠庡凡鏈変腑鑾峰彇</el-button>
+        <el-button type="primary" @click="selectFromTable" size="small"><i class="el-icon-thumb"></i>&nbsp;
+          浠庡凡鏈変腑鑾峰彇</el-button>
       </el-button-group>
     </el-header>
     <el-container>
@@ -27,14 +28,16 @@
           <basic-container>
             <p style="margin-top: 10px;font-weight: 570;font-size: 19px">鍩烘湰淇℃伅</p>
             <el-descriptions class="margin-top" :column="3" :size="size" border>
-              <el-descriptions-item :labelStyle="descriptionOption.labelStyle" :contentStyle="descriptionOption.contentStyle">
+              <el-descriptions-item :labelStyle="descriptionOption.labelStyle"
+                :contentStyle="descriptionOption.contentStyle">
                 <template slot="label">
                   <i :class="icons.key"></i>
                   鑻辨枃鍚嶇О
                 </template>
                 {{ obj.id }}
               </el-descriptions-item>
-              <el-descriptions-item :labelStyle="descriptionOption.labelStyle" :contentStyle="descriptionOption.contentStyle">
+              <el-descriptions-item :labelStyle="descriptionOption.labelStyle"
+                :contentStyle="descriptionOption.contentStyle">
                 <template slot="label">
                   <i :class="icons.name"></i>
                   涓枃鍚嶇О
@@ -42,20 +45,22 @@
                 {{ obj.name }}
               </el-descriptions-item>
               <el-descriptions-item>
-                <template slot="label" :labelStyle="descriptionOption.labelStyle" :contentStyle="descriptionOption.contentStyle">
+                <template slot="label" :labelStyle="descriptionOption.labelStyle"
+                  :contentStyle="descriptionOption.contentStyle">
                   <i :class="icons.tableName"></i>
                   鏁版嵁搴撹〃鍚�
                 </template>
                 {{ obj.tableName }}
               </el-descriptions-item>
-              <el-descriptions-item :labelStyle="descriptionOption.labelStyle" :contentStyle="descriptionOption.contentStyle">
+              <el-descriptions-item :labelStyle="descriptionOption.labelStyle"
+                :contentStyle="descriptionOption.contentStyle">
                 <template slot="label">
                   <i :class="icons.domain"></i>
                   鎵�灞為鍩�
                 </template>
-                  <el-tag size="small">
-                    {{ obj.domainText }}
-                  </el-tag> 
+                <el-tag size="small">
+                  {{ obj.domainText }}
+                </el-tag>
               </el-descriptions-item>
               <!-- <el-descriptions-item>
             <template slot="label">
@@ -71,28 +76,31 @@
             </template>
             {{ obj.sss }}
           </el-descriptions-item> -->
-              <el-descriptions-item :labelStyle="descriptionOption.labelStyle" :contentStyle="descriptionOption.contentStyle">
+              <el-descriptions-item :labelStyle="descriptionOption.labelStyle"
+                :contentStyle="descriptionOption.contentStyle">
                 <template slot="label">
                   <i :class="icons.revisionRule"></i>
                   鐗堟湰瑙勫垯
                 </template>
                 {{ obj.versionRule }}
               </el-descriptions-item>
-              <el-descriptions-item :labelStyle="descriptionOption.labelStyle" :contentStyle="descriptionOption.contentStyle">
+              <el-descriptions-item :labelStyle="descriptionOption.labelStyle"
+                :contentStyle="descriptionOption.contentStyle">
                 <template slot="label">
                   <i :class="icons.lifeCycle"></i>
                   鐢熷懡鍛ㄦ湡
                 </template>
                 {{ obj.lifeCycleId }}
               </el-descriptions-item>
-              <el-descriptions-item :labelStyle="descriptionOption.labelStyle" :contentStyle="descriptionOption.contentStyle">
+              <el-descriptions-item :labelStyle="descriptionOption.labelStyle"
+                :contentStyle="descriptionOption.contentStyle">
                 <template slot="label">
                   <i :class="icons.view"></i>
                   瑙嗗浘
                 </template>
-               <el-tag size="small">
+                <el-tag size="small">
                   {{ obj.viewText }}
-               </el-tag>
+                </el-tag>
               </el-descriptions-item>
               <!-- <el-descriptions-item>
             <template slot="label">
@@ -101,7 +109,8 @@
             </template>
             {{ obj.implClass }}
           </el-descriptions-item> -->
-              <el-descriptions-item :labelStyle="descriptionOption.labelStyle" :contentStyle="descriptionOption.contentStyle">
+              <el-descriptions-item :labelStyle="descriptionOption.labelStyle"
+                :contentStyle="descriptionOption.contentStyle">
                 <template slot="label">
                   <i :class="icons.desc"></i>
                   鎻忚堪
@@ -114,9 +123,9 @@
           <basic-container>
             <p style="margin-top: 10px;font-weight: 570;font-size: 19px">灞炴�у垪琛�</p>
             <avue-crud class="attributeCrud" v-model="obj" :data="obj.attributes" :option="loadOption">
-              <template slot="attrDataTypeText" slot-scope="{row}" >
-                    <el-tag>{{row.attrDataTypeText}}</el-tag>
-                </template>
+              <template slot="attrDataTypeText" slot-scope="{row}">
+                <el-tag>{{ row.attrDataTypeText }}</el-tag>
+              </template>
             </avue-crud>
           </basic-container>
         </el-main>
@@ -129,7 +138,8 @@
           <div class="sep" style="height:7px">
 
           </div>
-          <avue-crud class="businessCrud" v-model="ref.form" :option="ref.option" :data="ref.data" @selection-change="selectionChange">
+          <avue-crud class="businessCrud" v-model="ref.form" :option="ref.option" :data="ref.data"
+            @selection-change="selectionChange">
           </avue-crud>
           <span slot="footer" class="dialog-footer">
             <el-button @click="dialoghandelfalse">鍙� 娑�</el-button>
@@ -138,8 +148,9 @@
         </el-dialog>
       </el-container>
     </el-container>
-    <business-add ref="btmAdd" :btmType="addOption.btmType" :domainOption="domainOptions" :icons="icons" @refreshTable="initTreeOnLoad">
-  </business-add>
+    <business-add ref="btmAdd" :btmType="addOption.btmType" :domainOption="domainOptions" :icons="icons"
+      @refreshTable="initTreeOnLoad">
+    </business-add>
   </el-container>
 </template>
 <script>
@@ -172,8 +183,8 @@
           children: 'childList',
         }
       },
-      addOption:{
-        btmType:{},
+      addOption: {
+        btmType: {},
       },
       loadOption: {
         border: true,
@@ -182,8 +193,8 @@
         addBtn: false,
         menu: false,
         highlightCurrentRow: true,
-        refreshBtn:false,
-        columnBtn:false,
+        refreshBtn: false,
+        columnBtn: false,
         column: [
           {
             label: '鑻辨枃鍚嶇О',
@@ -213,12 +224,12 @@
         ]
       },
       descriptionOption: {
-        labelStyle:'text-align:center;width:120px',
+        labelStyle: 'text-align:center;width:120px',
         contentStyle: 'width:240px;text-align:center;word-break;break-all;'
       },
       domain: null,
       domainOptions: [],
-      icons:{
+      icons: {
         key: 'el-icon-finished',
         name: 'el-icon-tickets',
         tableName: 'el-icon-date',
@@ -268,9 +279,13 @@
   },
   methods: {
     nodeClick(data) {
-      getDetail(data.oid).then(res => {
-        this.obj = res.data.data;
-      })
+      if (data.oid) {
+        getDetail(data.oid).then(res => {
+          this.obj = res.data.data;
+        })
+      }else{
+        this.$message.warning('璇风偣鍑诲瓙鑺傜偣');
+      }
     },
     //  鍩烘湰淇℃伅娣诲姞
     basicSave(row, done, loading) {
@@ -330,17 +345,17 @@
         this.initTreeOnLoad();
       })
     },
-    businessAdd(){
+    businessAdd() {
       this.$refs.btmAdd.showSubmitDialog = true;
       this.ifRefreshBtmAddRefresh();
     },
-    businessEdit(){
+    businessEdit() {
       var json = JSON.stringify(this.obj);
       this.$refs.btmAdd.btmType = JSON.parse(json);
       this.$refs.btmAdd.showSubmitDialog = true;
       this.ifRefreshBtmAddRefresh();
     },
-    ifRefreshBtmAddRefresh(){
+    ifRefreshBtmAddRefresh() {
       // this.$refs.btmAdd.refreshAttrTable();
     }
   },
@@ -353,13 +368,14 @@
   border-radius: 10px;
 }
 
-.businessCrud > .el-card:nth-of-type(2) > .el-card__body > .avue-crud__menu{
-        display: none !important;
+.businessCrud>.el-card:nth-of-type(2)>.el-card__body>.avue-crud__menu {
+  display: none !important;
 }
-.attributeCrud > .el-card:nth-of-type(2) > .el-card__body > .avue-crud__menu{
-        display: none !important;
+
+.attributeCrud>.el-card:nth-of-type(2)>.el-card__body>.avue-crud__menu {
+  display: none !important;
 }
-.businessTreeContainer > .el-card > .el-card__body {
+
+.businessTreeContainer>.el-card>.el-card__body {
   height: 775px;
-}
-</style>
+}</style>
diff --git a/Source/UBCS-WEB/src/views/modeling/LinkType.vue b/Source/UBCS-WEB/src/views/modeling/LinkType.vue
index afadda5..43e926a 100644
--- a/Source/UBCS-WEB/src/views/modeling/LinkType.vue
+++ b/Source/UBCS-WEB/src/views/modeling/LinkType.vue
@@ -255,7 +255,6 @@
             this.addOption.linkType = JSON.parse(json);
             this.$refs.linkAdd.linkType = this.addOption.linkType;
             this.$refs.linkAdd.showSubmitDialog = true;
-            console.log(this.obj);
         },
         // 浠庡凡鏈変腑鑾峰彇鎸夐挳鐐瑰嚮浜嬩欢
         selectFromTable() {
diff --git a/Source/UBCS-WEB/src/views/modeling/Version.vue b/Source/UBCS-WEB/src/views/modeling/Version.vue
index 5898873..2aaa39c 100644
--- a/Source/UBCS-WEB/src/views/modeling/Version.vue
+++ b/Source/UBCS-WEB/src/views/modeling/Version.vue
@@ -63,20 +63,38 @@
         searchMenuSpan:5,
         highlightCurrentRow: true,
         stripe:true,
+        viewBtn:false,
+        columnBtn:false,
         column:[
           {
-            label: '',
+            label: '閫夋嫨',
             prop: 'radio',
-            width: 120
+            width: 120,
+            display:false
           },
           {
             label:'鑻辨枃鍚嶇О',
-            prop: 'id'
+            prop: 'id',
+            rules: [
+              {
+                required: true,
+                message: '鑻辨枃鍚嶇О涓嶈兘涓虹┖',
+                trigger: 'blur'
+              }
+            ]
           },
           {
             label:"涓枃鍚嶇О",
             prop:"name",
             search:true,
+            required: true,
+            rules: [
+              {
+                required: true,
+                message: '涓枃鍚嶇О涓嶈兘涓虹┖',
+                trigger: 'blur'
+              }
+            ]
           },
           {
             label:"璺宠穬瀛楃",
@@ -84,11 +102,25 @@
           },
           {
             label: "鍒濆鍊�",
-            prop:"startCode"
+            prop:"startCode",
+            rules: [
+              {
+                required: true,
+                message: '鍒濆鍊间笉鑳戒负绌�',
+                trigger: 'blur'
+              }
+            ]
           },
           {
             label: "姝ラ暱",
-            prop: "serialStep"
+            prop: "serialStep",
+            rules: [
+              {
+                required: true,
+                message: '姝ラ暱涓嶈兘涓虹┖',
+                trigger: 'blur'
+              }
+            ]
           },
           {
             label: "鍓嶇紑",
@@ -171,11 +203,16 @@
       })
     },
     searchChange(params, done) {
-      if (done) done();
-      this.params = params;
-      this.page.currentPage = 1;
-      this.getList();
-      this.$message.success('鎼滅储鎴愬姛')
+      var p = {"name_like" : params.name}
+      getPage(this.page.currentPage,this.page.pageSize,p).then(res => {
+        const data = res.data.data
+        this.loading = false;
+        this.page.total = data.total;
+        this.data = data.records;
+      });
+      if (done) {
+       done(); 
+      }
     },
     refreshChange() {
       this.getList();
diff --git a/Source/UBCS-WEB/src/views/modeling/cycle.vue b/Source/UBCS-WEB/src/views/modeling/cycle.vue
index 5e3686d..ef721e2 100644
--- a/Source/UBCS-WEB/src/views/modeling/cycle.vue
+++ b/Source/UBCS-WEB/src/views/modeling/cycle.vue
@@ -1,190 +1,199 @@
 <template>
-  <el-container>
-  <el-aside width="240px">
-    <el-button @click="addHandlers"></el-button>
-    <basic-container style="margin-top: 10px">
-      <avue-tree id="basic" :data="treeData" :option="treeOption"  >
-      </avue-tree>
-    </basic-container>
-  </el-aside>
-  <basic-container >
-    <el-button type="primary" @click="dialogTableVisible=true" size="small">鍒涘缓妯℃澘</el-button>
-    <el-button type="primary"  size="small" @click="addHandlers">缂栬緫妯℃澘</el-button>
-    <el-button type="primary" size="small" @click="$refs.flow.addNode('ffff')">娣诲姞鑺傜偣</el-button>
-    <br/><br/>
-    <avue-flow ref="flow" v-model="form" :height="703" :option="option" :width="1500">
-      <template slot="header" slot-scope="scope">
-        <i class="el-icon-delete" @click="$refs.flow.deleteNode(scope.node.id)" style="margin-top: 8px"></i>
+  <basic-container class="">
+    <avue-crud :data="data" :option="option" @refresh-change="gettableList" :table-loading="loading">
+      <template slot-scope="scope" slot="menuLeft">
+        <el-button
+          type="primary"
+          icon="el-icon-plus"
+          size="small"
+          @click="openDialog('add', {})"
+          >鏂板</el-button
+        >
       </template>
-      <div slot-scope="{node}">
-        <span>{{ (node || {}).name }}</span>
-      </div>
-    </avue-flow>
-    <!--    鍒涘缓瀵硅瘽妗�-->
-    <el-dialog title="鍒涘缓妯℃澘" :visible.sync="dialogTableVisible" append-to-body>
-      <avue-form :data="addData" :option="addoption" v-model="forms">
-
-        <template slot="filetype">
-          <el-select v-model="forms.select" slot="prepend" placeholder="璇烽�夋嫨" style="max-width: 300px">
-            <el-option label="娴嬭瘯1" value="1"></el-option>
-            <el-option label="娴嬭瘯2" value="2"></el-option>
-            <el-option label="娴嬭瘯3" value="3"></el-option>
-          </el-select>
-          <el-button  type="primary" @click="handelLife" style="display: inline-block;margin-left: 5px">
-            娣诲姞璧峰鐘舵��
-          </el-button>
-        </template>
-      </avue-form>
+      <template slot-scope="{ row, index }" slot="menu">
+        <el-button
+          type="text"
+          icon="el-icon-edit"
+          size="mini"
+          @click="openDialog('edit', row)"
+          >缂栬緫</el-button
+        >
+        <el-button
+          type="text"
+          icon="el-icon-view"
+          size="mini"
+          @click="openDialog('detail', row)"
+          >棰勮</el-button
+        >
+      </template></avue-crud
+    >
+    <el-dialog
+      :visible="visible"
+      :width="dialogWidth"
+      :title="title"
+      append-to-body
+      :before-close="() => {visible = false}"
+      top="10vh"
+    >
+      <CycleFlow
+        v-if="visible"
+        class="cycle_flow"
+        :type="type"
+        :chart-data="rowData.data || {}"
+        :chart-data-node-items="flowChartNodeItems"
+        :rowData="rowData"
+        ref="vueFlowchartEditor"
+        @save-data="save"
+      />
+      <template #footer v-if="type !== 'detail'">
+        <el-button type="primary" size="mini" @click="submit">淇濆瓨</el-button>
+        <el-button type="" size="mini" @click="visible = false">鍙栨秷</el-button>
+      </template>
     </el-dialog>
   </basic-container>
-
-
-  </el-container>
-
 </template>
 
 <script>
+import CycleFlow from "@/components/flow-cycle/flowchartEditor.vue";
 export default {
   name: "cycle.vue",
+  components: { CycleFlow },
   data() {
     return {
-      //妯℃澘瀵硅瘽妗�,
-      dialogTableVisible:false,
-      forms:{
-        select:""
-      },
-      addData:[],
-      addoption:{
-        formslot:true,
-        column:[
+      option: {
+        border: true,
+        align: "center",
+        menuAlign: "center",
+        menu: true,
+        delBtn: false,
+        editBtn: false,
+        addBtn: false,
+        column: [
           {
-            label:"鍚嶇О",
-            prop:"name"
+            label: "鍚嶇О",
+            prop: "name",
           },
           {
-            label:"鏍囩",
-            prop:"tag"
+            label: "鏍囩",
+            prop: "label",
           },
           {
-            label:"璧峰鐘舵��",
-            prop:"filetype",
-            formslot: true,
-            span:24
+            label: "璧峰鐘舵��",
+            prop: "startState",
           },
           {
             label: "鎻忚堪",
-            prop:"desc",
-            type:"textarea",
-            span:13
-          }
-        ]
-      },
-      count: 0,
-      form: {},
-      treeData: [{
-        value: 0,
-        label: '鐢熷懡鍛ㄦ湡妯℃澘鍒楄〃',
-        children: [
-          {
-            value: 1,
-            label: 'A',
+            prop: "remark",
           },
-          {
-            value: 2,
-            label: 'B',
-          },
-          {
-            value: 3,
-            label: 'C',
-          },
-          {
-            value: 4,
-            label: 'D',
-          },
-          {
-            value: 5,
-            label: 'E',
-          }
-        ]
-      }],
-      treeOption: {
-        defaultExpandAll: true,
-      },
-      option: {
-        nodeList: [
-          {
-            "id": "nodeA",
-            "name": "娴佺▼A-鑺傜偣A",
-            "left": 39,
-            "top": 110,
-          },
-          {
-            "id": "nodeB",
-            "name": "娴佺▼A-鑺傜偣B",
-            "left": 340,
-            "top": 161,
-          },
-          {
-            "id": "nodeC",
-            "name": "娴佺▼A-鑺傜偣C",
-            "left": 739,
-            "top": 161,
-          },
-          {
-            "id": "nodeD",
-            "name": "鑺傜偣D",
-            "left": 739,
-            "top": 20,
-          }
         ],
-        lineList: [
-          {
-            "from": "nodeA",
-            "to": "nodeB"
+      },
+      data: [
+        {
+          name: "鎴戞槸name",
+          label: "鎴戞槸label",
+          startState: "鎴戞槸startState",
+          remark: "鎴戞槸remark",
+          data: {
+            nodes: [
+              {
+                type: "node",
+                size: "80*48",
+                shape: "flow-rect",
+                color: "#1890FF",
+                label: "Auditing",
+                x: 110.50303650877106,
+                y: 59.22389408123915,
+                id: "Auditing",
+                index: 0,
+              },
+              {
+                type: "node",
+                size: "80*48",
+                shape: "flow-rect",
+                color: "#1890FF",
+                label: "Editing",
+                x: 120.87992069414531,
+                y: 156.76660542375714,
+                id: "Editing",
+                index: 1,
+              },
+              {
+                type: "node",
+                size: "80*48",
+                shape: "flow-rect",
+                color: "#1890FF",
+                label: "Released",
+                x: 100.12615232339681,
+                y: 252.2339399292003,
+                id: "Released",
+                index: 2,
+              },
+            ],
+            edges: [
+              {
+                source: "Auditing",
+                sourceAnchor: 1,
+                target: "Released",
+                targetAnchor: 1,
+              },
+              {
+                source: "Editing",
+                sourceAnchor: 3,
+                target: "Auditing",
+                targetAnchor: 3,
+              },
+            ],
           },
-          {
-            "from": "nodeB",
-            "to": "nodeC"
-          },
-          {
-            "from": "nodeC",
-            "to": "nodeD"
-          }
-        ]
-      },
-      computed: {
-        nodeList() {
-          return this.option.nodeList
-        }
-      },
-      mounted() {
-        this.form = this.nodeList[this.count].id;
-      },
-      methods: {
-        handleClick(node) {
-          this.$message.success(JSON.stringify(node))
-          console.log(node)
         },
-        addHandler(){
-          this.dialogTableVisible=true
-          console.log(1)
-        },
-
-        handelLife(){
-          console.log("鐐瑰嚮鎴愬姛")
-        },
-        addHandlers(){
-          console.log(111)
-        }
+      ],
+      title: "棰勮鐢熷懡鍛ㄦ湡娴佺▼鍥�",
+      visible: false,
+      flowChartNodeItems: [],
+      rowData: {},
+      dialogWidth: "50%",
+      type: "detail",
+    };
+  },
+  methods: {
+    gettableList() {
+      this.loading = true
+    },
+    openDialog(type, row) {
+      if (type === "detail") {
+        this.title = "棰勮鐢熷懡鍛ㄦ湡娴佺▼鍥�";
+        this.dialogWidth = "50%";
+      } else if (type === "edit") {
+        this.title = "缂栬緫鐢熷懡鍛ㄦ湡娴佺▼鍥�";
+        this.dialogWidth = "95%";
+      } else if (type === "add") {
+        this.title = "鏂板鐢熷懡鍛ㄦ湡娴佺▼鍥�";
+        this.dialogWidth = "95%";
       }
-    }
-  }
-}
+      this.type = type;
+      this.rowData = row;
+      this.visible = true;
+    },
+    async submit() {
+      const newRowData = await this.$refs.vueFlowchartEditor.getNewRowData();
+      if (!newRowData) {
+        return;
+      }
+      const flowData = this.$refs.vueFlowchartEditor.getFlowData();
+      console.log(JSON.stringify(flowData));
+    },
+  },
+};
 </script>
 
-<style lang="scss">
-#basic {
-  height: 761px;
-  border-radius: 10px;
+<style lang="scss" scoped>
+/deep/ .el-dialog__body {
+  padding: 0 20px;
+}
+.cycle_flow {
+  height: 600px !important;
+  display: flex;
+  flex-direction: column;
+  margin: 0;
+  padding: 0;
 }
 </style>
diff --git a/Source/UBCS-WEB/src/views/modeling/original.vue b/Source/UBCS-WEB/src/views/modeling/original.vue
index eaf8f50..805e99f 100644
--- a/Source/UBCS-WEB/src/views/modeling/original.vue
+++ b/Source/UBCS-WEB/src/views/modeling/original.vue
@@ -8,15 +8,18 @@
             <el-radio v-model="selectRow" :label="row.$index">&nbsp;
             </el-radio>
           </template>
-          <template slot="menu">
-            <el-button icon="el-icon-edit" size="small" type="text" @click="updateSave">缂栬緫</el-button>
-            <el-button icon="el-icon-delete" size="small" type="text" @click="deleteSave">鍒犻櫎</el-button>
+          <template slot="menu" slot-scope="{row,index}">
+            <el-button icon="el-icon-edit" size="small" type="text" @click="updateSave(row,index)">缂栬緫</el-button>
+            <el-button icon="el-icon-delete" size="small" type="text" @click="deleteSave(row,index)">鍒犻櫎</el-button>
           </template>
           <template slot="menuLeft">
             <el-button size="small" type="primary" icon="el-icon-plus" @click="addSave">鏂�&nbsp;&nbsp;澧�
             </el-button>
             <el-button size="small" plain type="primary" icon="el-icon-zoom-in" @click="applyRangeOpen">鏌ョ湅浣跨敤鑼冨洿
             </el-button>
+            <el-input placeholder="鎸夊睘鎬ц嫳鏂囧悕绉版煡璇�" v-model="searchId" clearable prefix-icon="el-icon-search" class="attrSearch"
+              size="small" @change="doSearch" type="text"></el-input>
+            <el-button size="small" plain type="primary" icon="el-icon-search" @click="doSearch">&nbsp;鎼滅储</el-button>
           </template>
           <template slot="typeValue" slot-scope="{row}">
             <el-tag>{{ row.typeValue }}</el-tag>
@@ -126,7 +129,7 @@
         </el-tabs>
       </basic-container>
     </el-aside>
-    <originalAdd ref="originalAdd" :attribute="attribute" @refreshTable="refreshChange"></originalAdd>
+    <originalAdd ref="originalAdd" @refreshTable="refreshChange"></originalAdd>
   </el-container>
 </template>
 
@@ -154,6 +157,7 @@
       attribute: {
         nullable: true
       },
+      editAttibute: {},
       applyRangeData: [],
       option: {
         height: "550px",
@@ -169,6 +173,7 @@
         addBtn: false,
         editBtn: false,
         delBtn: false,
+        columnBtn:false,
         column: [{
           label: "閫夋嫨",
           prop: "radio",
@@ -246,7 +251,8 @@
         itemData: {},
         activeName: "referTab",
         form: {}
-      }
+      },
+      searchId: '',
     };
   },
   created() {
@@ -259,14 +265,21 @@
       this.$refs.originalAdd.showSubmitDialog = true;
       this.$refs.originalAdd.attribute = {};
     },
-    updateSave() {
+    updateSave(row,index) {
+      this.selectRow = index;
+      var json = JSON.stringify(row);
+      this.editAttibute = JSON.parse(json);
+      this.editAttibute.nullable = row.nullable == 'true' ? true : false;
+      this.$refs.originalAdd.attribute = this.editAttibute;
       this.$refs.originalAdd.showSubmitDialog = true;
-      this.$refs.originalAdd.attribute = this.attribute;
+      this.refreshChange()
     },
-    deleteSave() {
-      remove(this.itemForm.itemData).then(res => {
+    deleteSave(row,index) {
+      console.log(row);
+      remove(row.oid).then(res => {
         this.$message.success("鍒犻櫎鎴愬姛");
       });
+      this.refreshChange();
     },
     onLoad(page, params = {}) {
       this.loading = true;
@@ -303,6 +316,10 @@
 
       });
     },
+    doSearch(){
+      var params = {"id_like":this.searchId};
+      this.onLoad(this.page,params);
+    }
   },
   components: { Versionpackage }
 }
@@ -312,4 +329,10 @@
 .applyRangeTable>.el-card:nth-of-type(2)>.el-card__body>.avue-crud__menu {
   display: none !important;
 }
+.attrSearch {
+  width:201px;
+}
+.attrSearch > .el-input__inner {
+  width: 200px;
+}
 </style>
diff --git a/Source/UBCS-WEB/src/views/modeling/originalAdd.vue b/Source/UBCS-WEB/src/views/modeling/originalAdd.vue
index fc2bae1..c6e0c48 100644
--- a/Source/UBCS-WEB/src/views/modeling/originalAdd.vue
+++ b/Source/UBCS-WEB/src/views/modeling/originalAdd.vue
@@ -27,10 +27,12 @@
                     <el-switch v-model="attribute.nullable" active-text="鍏佽" inactive-text="涓嶅厑璁�"></el-switch>
                 </el-form-item>
                 <el-form-item label="闀垮害" label-width="100px" prop="maxLength">
-                    <el-input-number v-model="attribute.maxLength" :min="1" :max="4000" :step="1" controls-position="right"></el-input-number>
+                    <el-input-number v-model="attribute.maxLength" :min="1" :max="4000" :step="1"
+                        controls-position="right"></el-input-number>
                 </el-form-item>
-                <el-form-item label="绮惧害" label-width="100px" v-if="attribute.typeValue == 'VTDouble'">
-                    <el-input-number v-model="attribute.precision" :min="1" :max="20" :step="1" controls-position="right" @change="changeNumber"></el-input-number>
+                <el-form-item label="绮惧害" label-width="100px" v-if="attribute.typeKey == 'VTDouble'">
+                    <el-input-number v-model="attribute.precision" :min="1" :max="20" :step="1" controls-position="right"
+                        @change="changeNumber"></el-input-number>
                 </el-form-item>
                 <el-form-item label="鎻忚堪" label-width="100px">
                     <el-input v-model="attribute.description" type="text"></el-input>
@@ -59,7 +61,7 @@
                             </el-input>
                         </el-form-item>
                         <el-form-item label="鏋氫妇椤�" label-width="100px">
-                            
+
                         </el-form-item>
                     </el-tab-pane>
                 </el-tabs>
@@ -74,7 +76,7 @@
                 <el-container>
                     <el-aside>
                         <basic-container>
-                           <span class="el-dialog__title"> {{ domain.treeOption.title }} </span>
+                            <span class="el-dialog__title"> {{ domain.treeOption.title }} </span>
                             <div style="height:20px;"></div>
                             <avue-tree id="domain" :data="domain.data" :option="domain.treeOption" @node-click="nodeClick"
                                 class="businessTree" style="height: 418px">
@@ -89,7 +91,8 @@
                     </el-aside>
                     <el-main>
                         <basic-container>
-                            <avue-crud ref="btmTable" :option="btmRefer.option" :data="btmRefer.data" class="btmTable" @row-click="btmReferClick">
+                            <avue-crud ref="btmTable" :option="btmRefer.option" :data="btmRefer.data" class="btmTable"
+                                @row-click="btmReferClick">
                                 <template slot="radio" slot-scope="{row}">
                                     <el-radio v-model="btmRefer.selectRow" :label="row.$index">&nbsp;
                                     </el-radio>
@@ -105,9 +108,10 @@
                 </div>
             </el-dialog>
             <!-- 閫夋嫨鏋氫妇鏃剁殑寮圭獥 -->
-            <el-dialog title="鏋氫妇鍒楄〃" :visible.sync="enumRefer.show" append-to-body @close="closeEnumDialog" width="70%" 
+            <el-dialog title="鏋氫妇鍒楄〃" :visible.sync="enumRefer.show" append-to-body @close="closeEnumDialog" width="70%"
                 style="height: 115vh;">
-                <avue-crud ref="eunmTable" :option="enumRefer.option" :data="enumRefer.data" class="enumTable" @row-click="enumReferClick" :page.sync="enumRefer.enumPage">
+                <avue-crud ref="eunmTable" :option="enumRefer.option" :data="enumRefer.data" class="enumTable"
+                    @row-click="enumReferClick" :page.sync="enumRefer.enumPage">
                     <template slot="radio" slot-scope="{row}">
                         <el-radio v-model="enumRefer.selectRow" :label="row.$index">&nbsp;
                         </el-radio>
@@ -124,9 +128,9 @@
 </template>
 
 <script>
-import { getDictionary,getParentList } from '@/api/omd/enum'
-import { initTree,btmPage } from '@/api/omd/btmType'
-import { add} from '@/api/omd/OmdAttribute'
+import { getDictionary, getParentList } from '@/api/omd/enum'
+import { initTree, btmPage } from '@/api/omd/btmType'
+import { add } from '@/api/omd/OmdAttribute'
 export default {
     name: 'originalAdd',
     props: {
@@ -181,24 +185,24 @@
                     highlightCurrentRow: true,
                     column: [
                         {
-                        label: '',
-                        prop: 'radio',
-                        width: 60,
-                        hide: false
-                    },
-                    {
-                        label: '鑻辨枃鍚嶇О',
-                        prop: 'id',
-                        align: 'center',
-                        searchSpan:8,
-                        search: true,
-                    }, {
-                        label: '涓枃鍚嶇О',
-                        prop: 'name',
-                        align: 'center',
-                        searchSpan:8,
-                        search: true,
-                    }]
+                            label: '',
+                            prop: 'radio',
+                            width: 60,
+                            hide: false
+                        },
+                        {
+                            label: '鑻辨枃鍚嶇О',
+                            prop: 'id',
+                            align: 'center',
+                            searchSpan: 8,
+                            search: true,
+                        }, {
+                            label: '涓枃鍚嶇О',
+                            prop: 'name',
+                            align: 'center',
+                            searchSpan: 8,
+                            search: true,
+                        }]
                 },
                 // 鍙傜収椤甸潰琛ㄦ牸鏁版嵁
                 data: [],
@@ -231,17 +235,17 @@
                         prop: 'radio',
                         width: 60,
                         hide: false
-                    },{
+                    }, {
                         label: '鏋氫妇浠e彿',
                         prop: 'name',
                         align: 'center',
-                        searchSpan:8,
+                        searchSpan: 8,
                         search: true,
                     }, {
                         label: '鏋氫妇鍚嶇О',
                         prop: 'label',
                         align: 'center',
-                        searchSpan:8,
+                        searchSpan: 8,
                         search: true,
                     }]
                 },
@@ -283,30 +287,36 @@
             this.referToFlag = true;
             this.$refs.form.resetFields();
         },
-        submitAttribute() { 
-            add(this.attribute).then(res => {
-                this.$message.success("淇濆瓨鎴愬姛");
-                this.showSubmitDialog = false;
-                this.attribute = {};
-                this.$emit('refreshTable');
-            });
-            
+        submitAttribute() {
+            const that = this;
+            this.$refs.form.validate(function (pass, field) {
+                if (pass) {
+                    add(that.attribute).then(res => {
+                        that.$message.success("淇濆瓨鎴愬姛");
+                        that.showSubmitDialog = false;
+                        that.attribute = {};
+                        that.$emit('refreshTable');
+                    });
+                } else {
+                    that.$message.error('蹇呭~');
+                }
+            })
         },
         cancleSubmit() {
             this.closeSubmitDialog();
         },
         closeEnumDialog() {
             this.cancleEnum();
-         },
-        closeReferDialog() { 
+        },
+        closeReferDialog() {
             this.cancleBtm();
         },
-        confirmBtm() { 
+        confirmBtm() {
             this.attribute.referToId = this.btmRefer.selectItem.oid;
             this.attribute.referToName = this.btmRefer.selectItem.name;
             this.btmRefer.show = false;
         },
-        cancleBtm() { 
+        cancleBtm() {
             this.btmRefer.selectItem = {};
             this.btmRefer.show = false;
             this.btmRefer.selectRow = '';
@@ -316,8 +326,8 @@
             this.attribute.dictCode = this.enumRefer.selectItem.name;
             this.attribute.dictValue = this.enumRefer.selectItem.label;
             this.enumRefer.show = false;
-         },
-        cancleEnum() { 
+        },
+        cancleEnum() {
             this.enumRefer.selectItem = {};
             this.enumRefer.show = false;
             this.enumRefer.selectRow = '';
@@ -340,19 +350,19 @@
         // 鍙傜収绫诲瀷鏍戠殑鐐瑰嚮浜嬩欢
         nodeClick(data) {
             // 鍖哄垎涓氬姟绫诲瀷鐨勬煡璇㈠拰閾炬帴绫诲瀷鐨勬煡璇�
-            if(this.attribute.referTypeKey == 'btmType'){
-                btmPage(this.btmRefer.btmPage.currentPage,this.btmRefer.btmPage.pageSize,{domain:data.id}).then(res => {
+            if (this.attribute.referTypeKey == 'btmType') {
+                btmPage(this.btmRefer.btmPage.currentPage, this.btmRefer.btmPage.pageSize, { domain: data.id }).then(res => {
                     this.btmRefer.data = res.data.data.records;
                     this.btmRefer.btmPage.total = res.data.data.total;
                 })
             }
-            if(this.attribute.referTypeKey == 'linkType'){
+            if (this.attribute.referTypeKey == 'linkType') {
 
             }
         },
         // 鏋氫妇绫诲瀷杈撳叆妗嗚幏寰楃劍鐐规椂鐨勪簨浠�
         openEnumConfig() {
-            getParentList(this.enumRefer.enumPage.currentPage,this.enumRefer.enumPage.pageSize).then(res => {
+            getParentList(this.enumRefer.enumPage.currentPage, this.enumRefer.enumPage.pageSize).then(res => {
                 this.enumRefer.enumPage.total = res.data.data.total;
                 this.enumRefer.data = res.data.data.records;
             })
@@ -361,20 +371,20 @@
         // 灞炴�х被鍨嬩笅鎷夋閫夋嫨浜嬩欢
         typeSelectChange(value) {
             if (value == 'VTString') {
-                this.$set(this.attribute,"maxLength",150)
+                this.$set(this.attribute, "maxLength", 150)
             } else if (value == 'VTInteger') {
-                this.$set(this.attribute,"maxLength",50)
+                this.$set(this.attribute, "maxLength", 50)
             } else if (value == 'VTBoolean') {
-                this.$set(this.attribute,"maxLength",5)
+                this.$set(this.attribute, "maxLength", 5)
             } else if (value == 'VTDouble') {
-                this.$set(this.attribute,"maxLength",26)
-                this.$set(this.attribute,"precision",8)
+                this.$set(this.attribute, "maxLength", 26)
+                this.$set(this.attribute, "precision", 8)
             } else if (value == 'VTLong') {
-                this.$set(this.attribute,"maxLength",150)
+                this.$set(this.attribute, "maxLength", 150)
             } else if (value == 'VTDate' || value == 'VTTime' || value == 'VTDateTime') {
-                this.$set(this.attribute,"maxLength",6)
+                this.$set(this.attribute, "maxLength", 6)
             } else {
-                this.$set(this.attribute,"maxLength",50)
+                this.$set(this.attribute, "maxLength", 50)
             }
             this.attribute.typeCode = 'attributeType';
             this.attribute.typeKey = value;
@@ -395,7 +405,7 @@
                 this.$message.error('灞炴�х被鍨嬫病鎵惧埌鎴栬�呮湭瀹氫箟')
             })
         },
-        initAttributeReferTypeList(){
+        initAttributeReferTypeList() {
             getDictionary({ code: 'attributeReferType' }).then(res => {
                 res.data.data.forEach(element => {
                     this.btmRefer.referTypeList.push(
@@ -406,33 +416,33 @@
                 this.$message.error('鍙傜収绫诲瀷娌℃壘鍒版垨鑰呮湭瀹氫箟')
             })
         },
-        btmReferClick(row){
+        btmReferClick(row) {
             this.btmRefer.selectItem = row;
             this.btmRefer.selectRow = row.$index;
         },
-        enumReferClick(row){
+        enumReferClick(row) {
             this.enumRefer.selectItem = row;
             this.enumRefer.selectRow = row.$index;
         },
         // 鍙傜収鍚嶇О鐐瑰嚮娓呴櫎鏁版嵁
-        clearReferTo(){
-            this.$delete(this.attribute,'referToId');
-            this.$delete(this.attribute,'referToName');
+        clearReferTo() {
+            this.$delete(this.attribute, 'referToId');
+            this.$delete(this.attribute, 'referToName');
             this.btmRefer.selectItem = {};
             this.btmRefer.selectRow = '';
         },
-        handleClick(tab){
-            // 鍥犱负鍙兘鍙傜収鍜屾灇涓句簩閫変竴銆傛墍浠ュ湪鍒囨崲鐨勬椂鍊欐妸灞炴�х粰娓呯┖銆�
-            this.$delete(this.attribute,'referTypeCode');
-            this.$delete(this.attribute,'referTypeKey');
-            this.$delete(this.attribute,'referTypeValue');
-            this.$delete(this.attribute,'referToId');
-            this.$delete(this.attribute,'referToName');
-            this.$delete(this.attribute,'dictCode');
-            this.$delete(this.attribute,'dictKey');
-            this.$delete(this.attribute,'dictValue');
-            this.$delete(this.attribute,'usingDict');
-        }
+        // handleClick(tab){
+        //     // 鍥犱负鍙兘鍙傜収鍜屾灇涓句簩閫変竴銆傛墍浠ュ湪鍒囨崲鐨勬椂鍊欐妸灞炴�х粰娓呯┖銆�
+        //     this.$delete(this.attribute,'referTypeCode');
+        //     this.$delete(this.attribute,'referTypeKey');
+        //     this.$delete(this.attribute,'referTypeValue');
+        //     this.$delete(this.attribute,'referToId');
+        //     this.$delete(this.attribute,'referToName');
+        //     this.$delete(this.attribute,'dictCode');
+        //     this.$delete(this.attribute,'dictKey');
+        //     this.$delete(this.attribute,'dictValue');
+        //     this.$delete(this.attribute,'usingDict');
+        // }
     }
 }
 </script>
@@ -450,7 +460,6 @@
     width: 200px;
 }
 
-.attributeForm>.el-form-item>.el-form-item__content> .el-select>.el-input>.el-input__inner {
+.attributeForm>.el-form-item>.el-form-item__content>.el-select>.el-input>.el-input__inner {
     width: 200px;
-}
-</style>
\ No newline at end of file
+}</style>
\ No newline at end of file
diff --git a/Source/UBCS-WEB/src/views/modeling/status.vue b/Source/UBCS-WEB/src/views/modeling/status.vue
index 9d7c465..63e257a 100644
--- a/Source/UBCS-WEB/src/views/modeling/status.vue
+++ b/Source/UBCS-WEB/src/views/modeling/status.vue
@@ -65,19 +65,30 @@
           stripe:true,
           column:[
             {
-              label: '',
+              label: '閫夋嫨',
               prop: 'radio',
-              width: 120
+              width: 120,
+              display: false
             },
             {
               label:'鑻辨枃鍚嶇О',
               prop: 'id',
-              search: true
+              search: true,
+              rules: [{
+                required: true,
+                message: '鑻辨枃鍚嶇О涓嶈兘涓虹┖',
+                trigger: 'blur'
+              }]
             },
             {
               label:'涓枃鍚嶇О',
               prop:'name',
               search:true,
+              rules: [{
+                required: true,
+                message: '涓枃鍚嶇О涓嶈兘涓虹┖',
+                trigger: 'blur'
+              }]
             },
             {
               label: '鎻忚堪',
@@ -149,10 +160,22 @@
         })
       },
       searchChange(params, done) {
-        if (done) done();
-        this.params = params;
+        this.loading = true;
         this.page.currentPage = 1;
-        this.getList();
+        const p = {};
+        if(params.id){
+          p["id_like"] = params.id;
+        }
+        if(params.name){
+          p["name_like"] = params.name
+        }
+        getPage(this.page.currentPage,this.page.pageSize,p).then(res => {
+          const data = res.data.data
+          this.loading = false;
+          this.page.total = data.total;
+          this.data = data.records;
+          done();
+        })
         this.$message.success('鎼滅储鎴愬姛')
       },
       refreshChange() {
diff --git a/Source/UBCS-WEB/vue.config.js b/Source/UBCS-WEB/vue.config.js
index 332410b..95d7151 100644
--- a/Source/UBCS-WEB/vue.config.js
+++ b/Source/UBCS-WEB/vue.config.js
@@ -34,7 +34,7 @@
           target: 'http://192.168.1.104:37000',
         // target: 'http://192.168.1.63:37000',
         //target: 'http://192.168.3.7:37000',
-        // target: 'http://dev.vci-tech.com:37000',
+        target: 'http://dev.vci-tech.com:37000',
         //target: 'http://192.168.1.51:37000/',
         //杩滅▼婕旂ず鏈嶅姟鍦板潃,鍙敤浜庣洿鎺ュ惎鍔ㄩ」鐩�
         // target: 'https://saber.bladex.vip/api',
diff --git a/Source/UBCS/ubcs-service-api/ubcs-omd-api/pom.xml b/Source/UBCS/ubcs-service-api/ubcs-omd-api/pom.xml
index 69dc113..d44c9e9 100644
--- a/Source/UBCS/ubcs-service-api/ubcs-omd-api/pom.xml
+++ b/Source/UBCS/ubcs-service-api/ubcs-omd-api/pom.xml
@@ -20,6 +20,12 @@
             <artifactId>ubcs-util-api</artifactId>
             <version>3.0.1.RELEASE</version>
         </dependency>
+        <dependency>
+            <groupId>com.vci.ubcs</groupId>
+            <artifactId>ubcs-user-api</artifactId>
+            <version>3.0.1.RELEASE</version>
+            <scope>compile</scope>
+        </dependency>
     </dependencies>
 
 </project>
diff --git a/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/feign/IWebSecretClient.java b/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/feign/IWebSecretClient.java
new file mode 100644
index 0000000..0241c11
--- /dev/null
+++ b/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/feign/IWebSecretClient.java
@@ -0,0 +1,184 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 搴勯獮 (smallchill@163.com)
+ */
+package com.vci.ubcs.omd.feign;
+
+import com.vci.ubcs.omd.entity.Enum;
+import com.vci.ubcs.omd.entity.EnumItem;
+import com.vci.ubcs.omd.vo.EnumVO;
+import com.vci.ubcs.starter.exception.VciBaseException;
+import com.vci.ubcs.system.user.vo.UserVO;
+import io.swagger.models.auth.In;
+import org.springblade.core.launch.constant.AppConstant;
+import org.springblade.core.mp.support.BladePage;
+import org.springblade.core.tool.api.R;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import java.util.List;
+
+/**
+ * 鏋氫妇瀹氫箟 Feign鎺ュ彛绫�
+ *
+ * @author yuxc
+ * @since 2023-05-08
+ */
+@FeignClient(
+    value = AppConstant.APPLICATION_NAME_OMD,
+	fallback = IWebSecretFallback.class
+)
+public interface IWebSecretClient {
+
+    String API_PREFIX = "/client";
+    String MINUSER = API_PREFIX + "/secret/min-user";
+	String MINDATA = API_PREFIX + "/secret/min-data";
+	String MINIP = API_PREFIX + "/secret/min-ip";
+	String USER = API_PREFIX + "/secret/user";
+	String USERVO = API_PREFIX + "/secret/uservo";
+	String CHECKDATA = API_PREFIX + "/secret/check-data";
+	String CHECKUSERDATA = API_PREFIX + "/secret/chec-user-data";
+	String CHECKUSERIDDATA = API_PREFIX + "/secret/chec-userid-data";
+	String CHECKVO = API_PREFIX + "/secret/checkvo";
+	String IP = API_PREFIX + "/secret/ip";
+	String IPUSER = API_PREFIX + "/secret/ip-user";
+	String IPSECRET = API_PREFIX + "/secret/ip-secret";
+	String IPUSERID = API_PREFIX + "/secret/ip-userid";
+	String IPUSERVO = API_PREFIX + "/secret/ip-uservo";
+
+	/**
+	 * 鑾峰彇鐢ㄦ埛瀵嗙骇鐨勬渶灏忓��
+	 * @return 瀵嗙骇鐨勫��
+	 * @throws VciBaseException 鏌ヨ鍑洪敊浼氭姏鍑哄紓甯�
+	 */
+	@GetMapping(MINUSER)
+	R<Integer> getMinUserSecret() throws VciBaseException;
+
+	/**
+	 * 鑾峰彇鏁版嵁瀵嗙骇鐨勯粯璁ゅ��
+	 * @return 瀵嗙骇鐨勫��
+	 * @throws VciBaseException 鏌ヨ鍑洪敊浼氭姏鍑哄紓甯�
+	 */
+	@GetMapping(MINDATA)
+	R<Integer> getMinDataSecret() throws VciBaseException;
+
+	/**
+	 * 鑾峰彇IP瀵嗙骇鐨勯粯璁ゅ��
+	 * @return 瀵嗙骇鐨勫��
+	 * @throws VciBaseException 鏌ヨ鍑洪敊浼氭姏鍑哄紓甯�
+	 */
+	@GetMapping(MINIP)
+	R<Integer> getMinIpSecret() throws VciBaseException;
+
+	/**
+	 * 鑾峰彇鐢ㄦ埛瀵嗙骇
+	 * @param userId 鐢ㄦ埛涓婚敭
+	 * @return 鐢ㄦ埛鐨勫瘑绾�
+	 * @throws VciBaseException 鍙傛暟閿欒锛岀敤鎴蜂笉瀛樺湪浼氭姏鍑哄紓甯�
+	 */
+	@GetMapping(USER)
+	R<Integer> getUserSecret(@RequestParam("userId") String userId) throws VciBaseException ;
+
+	/**
+	 * 鑾峰彇鐢ㄦ埛瀵嗙骇
+	 * @param userVO 鐢ㄦ埛鐨勬樉绀哄璞�
+	 * @return 鐢ㄦ埛鐨勫瘑绾�
+	 * @throws VciBaseException 鍙傛暟閿欒锛岀敤鎴蜂笉瀛樺湪浼氭姏鍑哄紓甯�
+	 */
+	@GetMapping(USERVO)
+	R<Integer> getUserSecret(@RequestBody UserVO userVO) throws VciBaseException;
+
+	/**
+	 * 鏍¢獙褰撳墠鐢ㄦ埛鏄惁鏈夋潈闄愯闂暟鎹�
+	 * @param secret 鏁版嵁鐨勫瘑绾�
+	 * @return true琛ㄧず鍏佽璁块棶
+	 */
+	@GetMapping(CHECKDATA)
+	R<Boolean> checkDataSecret(@RequestParam("secret") int secret);
+
+	/**
+	 * 鏍¢獙鐢ㄦ埛鐨勫瘑绾ф槸鍚︽槸鍚︽湁鏉冮檺璁块棶鏁版嵁
+	 * @param secret 鏁版嵁鐨勫瘑绾�
+	 * @param userSecret 鐢ㄦ埛瀵嗙骇
+	 * @return true琛ㄧず鍏佽璁块棶
+	 */
+	@GetMapping(CHECKUSERDATA)
+	R<Boolean> checkDataSecret(@RequestParam("secret") int secret, @RequestParam("userSecret") int userSecret) ;
+
+	/**
+	 * 鏍规嵁鐢ㄦ埛鍚嶆潵鏍¢獙鏁版嵁瀵嗙骇
+	 * @param secret 鏁版嵁鐨勫瘑绾�
+	 * @param userId 鐢ㄦ埛鍚�
+	 * @return true琛ㄧず鍏佽璁块棶
+	 * @throws VciBaseException 鍙傛暟閿欒锛岀敤鎴蜂笉瀛樺湪浼氭姏鍑哄紓甯�
+	 */
+	@GetMapping(CHECKUSERIDDATA)
+	R<Boolean> checkDataSecret(@RequestParam("secret") int secret, @RequestParam("userId") String userId) throws VciBaseException;
+
+	/**
+	 * 鏍规嵁鐢ㄦ埛瀵硅薄鏉ユ牎楠屾暟鎹瘑绾�
+	 * @param secret  鏁版嵁鐨勫瘑绾�
+	 * @param userVO 鐢ㄦ埛鐨勬樉绀哄璞�
+	 * @return true琛ㄧず鍏佽璁块棶
+	 */
+	@GetMapping(CHECKVO)
+	R<Boolean> checkDataSecret(@RequestParam("secret") int secret,@RequestBody UserVO userVO) ;
+
+	/**
+	 * 鑾峰彇IP鍦板潃鐨勫瘑绾�
+	 * @param ip ip鍦板潃
+	 * @return 瀵嗙骇鐨勫��
+	 * @throws VciBaseException 鏌ヨ鍑洪敊鐨勬椂鍊欎細鎶涘嚭寮傚父
+	 */
+	@GetMapping(IP)
+	R<Integer> getIpSecret(@RequestParam("ip") String ip) throws VciBaseException;
+	/**
+	 * 妫�鏌ユ満鍣ㄥ瘑绾�
+	 * @param ipSecret 鏈哄櫒瀵嗙骇
+	 * @param userSecret 鐢ㄦ埛鐨勫瘑绾�
+	 * @return 瀵嗙骇鐨勫��
+	 */
+	@GetMapping(IPUSER)
+	R<Boolean> checkIpSecret(@RequestParam("ipSecret") int ipSecret, @RequestParam("userSecret") int userSecret);
+
+	/**
+	 * 妫�鏌ュ綋鍓嶇敤鎴锋槸鍚︾鍚堟満鍣ㄥ瘑绾�
+	 * @param ipSecret 鏈哄櫒瀵嗙骇
+	 * @return true琛ㄧず鍏佽璁块棶
+	 */
+	@GetMapping(IPSECRET)
+	R<Boolean> checkIpSecret(@RequestParam("ipSecret") int ipSecret) ;
+
+	/**
+	 * 鏍¢獙鎸囧畾ip鍜岀敤鎴锋槸鍚︾鍚堟満鍣ㄥ瘑绾�
+	 * @param ip ip鍦板潃
+	 * @param userId 鐢ㄦ埛鍚�
+	 * @return true琛ㄧず鍏佽璁块棶
+	 * @throws VciBaseException 鍙傛暟閿欒锛岀敤鎴蜂笉瀛樺湪浼氭姏鍑哄紓甯�
+	 */
+	@GetMapping(IPUSERID)
+	R<Boolean> checkIpSecret(@RequestParam("ip") String ip, @RequestParam("userId") String userId) throws VciBaseException;
+
+	/**
+	 * 鏍¢獙鎸囧畾IP鍜岀敤鎴峰璞$鍚堟満鍣ㄥ瘑绾�
+	 * @param ip ip鍦板潃
+	 * @param userVO 鐢ㄦ埛瀵硅薄
+	 * @return  true琛ㄧず鍏佽璁块棶
+	 */
+	@GetMapping(IPUSERVO)
+	R<Boolean> checkIpSecret(@RequestParam("ip") String ip,@RequestBody UserVO userVO) ;
+}
diff --git a/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/feign/IWebSecretFallback.java b/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/feign/IWebSecretFallback.java
new file mode 100644
index 0000000..f63660c
--- /dev/null
+++ b/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/feign/IWebSecretFallback.java
@@ -0,0 +1,101 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 搴勯獮 (smallchill@163.com)
+ */
+package com.vci.ubcs.omd.feign;
+import com.vci.ubcs.starter.exception.VciBaseException;
+import com.vci.ubcs.system.user.vo.UserVO;
+import org.springblade.core.tool.api.R;
+import org.springframework.stereotype.Component;
+
+/**
+ * Feign澶辫触閰嶇疆
+ *
+ * @author Chill
+ */
+@Component
+public class IWebSecretFallback implements IWebSecretClient {
+
+
+	@Override
+	public R<Integer> getMinUserSecret() throws VciBaseException {
+		return R.fail("鑾峰彇鏁版嵁澶辫触");
+	}
+
+	@Override
+	public R<Integer> getMinDataSecret() throws VciBaseException {
+		return R.fail("鑾峰彇鏁版嵁澶辫触");
+	}
+
+	@Override
+	public R<Integer> getMinIpSecret() throws VciBaseException {
+		return R.fail("鑾峰彇鏁版嵁澶辫触");
+	}
+
+	@Override
+	public R<Integer> getUserSecret(String userId) throws VciBaseException {
+		return R.fail("鑾峰彇鏁版嵁澶辫触");
+	}
+
+	@Override
+	public R<Integer> getUserSecret(UserVO userVO) throws VciBaseException {
+		return R.fail("鑾峰彇鏁版嵁澶辫触");
+	}
+
+	@Override
+	public R<Boolean> checkDataSecret(int secret) {
+		return R.fail("鑾峰彇鏁版嵁澶辫触");
+	}
+
+	@Override
+	public R<Boolean> checkDataSecret(int secret, int userSecret) {
+		return R.fail("鑾峰彇鏁版嵁澶辫触");
+	}
+
+	@Override
+	public R<Boolean> checkDataSecret(int secret, String userId) throws VciBaseException {
+		return R.fail("鑾峰彇鏁版嵁澶辫触");
+	}
+
+	@Override
+	public R<Boolean> checkDataSecret(int secret, UserVO userVO) {
+		return R.fail("鑾峰彇鏁版嵁澶辫触");
+	}
+
+	@Override
+	public R<Integer> getIpSecret(String ip) throws VciBaseException {
+		return R.fail("鑾峰彇鏁版嵁澶辫触");
+	}
+
+	@Override
+	public R<Boolean> checkIpSecret(int ipSecret, int userSecret) {
+		return R.fail("鑾峰彇鏁版嵁澶辫触");
+	}
+
+	@Override
+	public R<Boolean> checkIpSecret(int ipSecret) {
+		return R.fail("鑾峰彇鏁版嵁澶辫触");
+	}
+
+	@Override
+	public R<Boolean> checkIpSecret(String ip, String userId) throws VciBaseException {
+		return R.fail("鑾峰彇鏁版嵁澶辫触");
+	}
+
+	@Override
+	public R<Boolean> checkIpSecret(String ip, UserVO userVO) {
+		return R.fail("鑾峰彇鏁版嵁澶辫触");
+	}
+}
diff --git a/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/utils/VciOmdUtil.java b/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/utils/VciOmdUtil.java
new file mode 100644
index 0000000..e681dc8
--- /dev/null
+++ b/Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/utils/VciOmdUtil.java
@@ -0,0 +1,25 @@
+package com.vci.ubcs.omd.utils;
+
+import com.vci.ubcs.omd.vo.EnumVO;
+import com.vci.ubcs.starter.web.pagemodel.KeyValue;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class VciOmdUtil {
+	/**
+	 * 灏哃ist<EnumVO> 杞崲涓篕eyValue 绫诲瀷
+	 * @param enums 鏋氫妇闆嗗悎
+	 * @return KeyValue闆嗗悎
+	 */
+	public static List<KeyValue> enumsToListKeyVale(List<EnumVO> enums) {
+		List<KeyValue> keyValues = new ArrayList<>();
+		for (EnumVO anEnum : enums) {
+			KeyValue keyValue = new KeyValue();
+			keyValue.setKey(anEnum.getItemName());
+			keyValue.setValue(anEnum.getItemValue());
+			keyValues.add(keyValue);
+		}
+		return keyValues;
+	}
+}
diff --git a/Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/web/constant/FrameWorkBusLangCodeConstant.java b/Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/web/constant/FrameWorkBusLangCodeConstant.java
new file mode 100644
index 0000000..4396f43
--- /dev/null
+++ b/Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/web/constant/FrameWorkBusLangCodeConstant.java
@@ -0,0 +1,519 @@
+package com.vci.ubcs.starter.web.constant;
+
+/**
+ * 鍩虹妗嗘灦涓笟鍔¢儴鍒嗙殑澶氳瑷�浠g爜
+ * @author weidy
+ * @date 2020/4/25
+ */
+public class FrameWorkBusLangCodeConstant {
+
+	//鐧婚檰閮ㄥ垎鐨�
+	/**
+	 * 鐢ㄦ埛宸茬粡鐧诲綍
+	 */
+	public static final String USER_IS_LOGINED = "userIsLogined";
+
+	/**
+	 * 鐢ㄦ埛娌℃湁鎵惧埌
+	 */
+	public static final String USER_NOT_FOUND = "userNotFound";
+
+	/**
+	 * 鐢ㄦ埛宸茬粡鍋滅敤
+	 */
+	public static final String USER_IS_DISABLED = "userIsDisabled";
+
+	/**
+	 * 鐢ㄦ埛宸茬粡琚攣瀹�
+	 */
+	public static final String USER_IS_LOCK = "userIsLocked";
+
+	/**
+	 * 鐢ㄦ埛宸茬粡瓒呰繃澶辨晥鏃堕棿
+	 */
+	public static final String USER_MORE_THAN_DISABLE_DATE = "moreDisableDate";
+
+	/**
+	 * 鐢ㄦ埛瀵嗙爜閿欒琚攣瀹�
+	 */
+	public static final String USER_PWD_LOCK = "userPwdErrorLock";
+
+	/**
+	 * 鐢ㄦ埛瀵嗙爜涓嶇浉绛�
+	 */
+	public static final String USER_PWD_NOT_EQUAL = "userPwdNotEqual";
+
+
+	//瀵嗙爜鐩稿叧
+
+	/**
+	 * 纭瀵嗙爜涓嶇浉鍚�
+	 */
+	public static final String CHANGE_PWD_NOT_EQUAL="changePwdNotEqual";
+
+	/**
+	 * 娌℃湁瀵嗙爜绛栫暐
+	 */
+	public static final String HAS_NOT_PWD_STRATEGY="hasNotPasswordStrategy";
+
+	/**
+	 * 瀵嗙爜瀹夊叏绛栫暐鏈壘鍒�
+	 */
+	public static final String PASSWORD_STRATEGY_NOT_FOUND = "passwordStrategyNotFound";
+
+	/**
+	 * 瀵嗙爜鎵�闇�瀛楃绫诲瀷涓虹┖
+	 */
+	public static final String REQUIRE_CHAR_TYPE_NULL = "requireCharTypeNull";
+
+	/**
+	 * 瀵嗙爜鐨勫瓧绗︾被鍨嬩笉绗﹀悎瑕佹眰
+	 */
+	public static final String REQUIRE_CHAR_TYPE_NOT_EXIST = "requireCharTypeNotExist";
+
+	/**
+	 * 瀵嗙爜澶嶆潅搴︿笉绗﹀悎瑕佹眰
+	 */
+	public static final String LESS_CHAR_TYPE = "lessCharType";
+
+	/**
+	 * 瀵嗙爜涓嶅寘鍚皬鍐欏瓧姣�
+	 */
+	public static final String NOT_HAS_LOW_LETTER= "notHasLowLetter";
+
+	/**
+	 * 瀵嗙爜涓嶅寘鍚暟瀛�
+	 */
+	public static final String NOT_HAS_NUMBER = "notHasNumber";
+
+	/**
+	 * 瀵嗙爜涓嶅寘鍚壒娈婂瓧姣�
+	 */
+	public static final String NOT_HAS_SPECIAL ="notHasSpecial";
+
+	/**
+	 * 瀵嗙爜涓嶇鍚堟渶灏忛暱搴﹁姹�
+	 */
+	public static final String LESS_MIN_LENGTH = "lessMinLength";
+
+	/**
+	 * 瀵嗙爜涓嶇鍚堟渶澶ч暱搴﹁姹�
+	 */
+	public static final String MORE_MAX_lENGTH ="moreMaxLength";
+	/**
+	 * 瀵嗙爜鍗冲皢杩囨湡
+	 */
+	public static final String PASSWORD_REMAIN_DAY = "passwordRemainDay";
+
+	//缁勭粐
+
+
+	//閮ㄩ棬
+
+	//鑱屽姟
+
+
+	//鑱岀骇
+
+	//鐢ㄦ埛
+
+	//瑙掕壊
+
+	//鏉冮檺
+
+	//鍦板尯鍒嗙被
+
+	//鍦扮偣
+
+	//鑱旂郴浜�
+
+	//鐗╂枡鍩烘湰淇℃伅
+
+	//鐗╂枡
+
+	/**
+	 * 鐗╂枡鐨勫簭鍒楀彿
+	 */
+	public static final String BD_MATERIAL_SERIAL_NUMBER_REPEAT = "materialSerialNumberRepeat";
+
+	//搴撴埧绫诲瀷
+
+	/**
+	 * 搴撴埧鍒嗙被鐨勫唴閮ㄦ爣璇嗕笉鍏ㄦ槸鑻辨枃
+	 */
+	public static final String BD_WAREHOUSE_CLASSIFY_ID_NOT_LETTER = "warehouseClassifyIdNotLetter";
+
+	/**
+	 * 鍥犱负宸茬粡鏈夊瓨鍦ㄤ娇鐢ㄥ綋鍓嶅垎绫荤殑搴撴埧锛屾墍浠ュ彧鏄慨鏀瑰悕绉帮紝鎻忚堪鍜屼笂绾у垎绫�
+	 */
+	public static final String BD_WAREHOUSE_CLASSIFY_LINK_BY_WAREHOUSE ="warehouseClassifyLinkByWarehouse" ;
+
+	/**
+	 * 涓庝笂绾у簱鎴垮熀鏈垎绫荤殑搴撴埧绫诲瀷涓嶇浉鍚�
+	 */
+	public static final String BD_WAREHOUSE_CLASSIFY_TYPE_NOT_EQUAL_PARENT = "warehouseClassifyParentNotEqualType";
+
+	//搴撴埧绠$悊
+
+	/**
+	 * 涓庝笂绾у簱鎴跨殑搴撴埧鍒嗙被涓嶇浉鍚�
+	 */
+	public static final String BD_WAREHOUSE_PARENT_WAREHOUSE_NOT_EQUAL_CLASSIFY = "warehouseParentNotEqualClassify";
+
+	/**
+	 * 鏈夋暟鎹笉鑳戒慨鏀瑰簱鎴跨殑鎵�灞炲熀鏈垎绫�
+	 */
+	public static final String BD_WAREHOUSE_HAS_DATA_NOT_EDIT_CLASSIFY = "warehouseHasDataNotEditClassify";
+
+	/**
+	 * 娌℃湁浼犻�掔敤鎴风殑涓婚敭锛屼笉鑳借缃鐞嗗憳
+	 */
+	public static final String BD_WAREHOUSE_ADMIN_USEROID_NOT_HAS = "warehouseAdminUserOidNotHas";
+
+	/**
+	 * 涓哄簱鎴胯缃鐞嗗憳鎴愬姛
+	 */
+	public static final String BD_WAREHOUSE_ADMIN_LINK_SUCCESS = "warehouseAdminLinkSuccess";
+
+	/**
+	 * 搴撴埧鍒嗙被鐨勪富閿笉瀛樺湪
+	 */
+	public static final String BD_WAREHOUSE_CLASSIFY_OID_NOT_EXIST = "warehouseClassifyOidNotExsit";
+
+	/**
+	 * 褰撳墠鐢ㄦ埛娌℃湁搴撴埧鐨勬潈闄�
+	 */
+	public static final String BD_WAREHOUSE_NOT_RIGHT = "warehouseNotRight";
+
+
+	//璐т綅
+
+	/**
+	 * 涓婄骇涓嶆槸涓�涓揣鏋�
+	 */
+	public static final String BD_GOODS_LOCATION_PARENT_NOT_SHELF = "goodsLocationParentNotShelf";
+
+	//Feign
+
+	/**
+	 * 褰撳墠鐢ㄦ埛娌℃湁瀵硅搴撴埧鐨勬搷浣滄潈闄�
+	 */
+	public static final String BD_FEIGN_WAREHOUSEADMIN_NOT_PERMISSION = "feignCheckWareHouseAdminPermissions";
+
+	//璁¢噺鍗曚綅
+	/**
+	 * 璁¢噺鍗曚綅涓嶅瓨鍦�
+	 */
+	public static final String UNIT_NOT_EXIST_BY_IDS = "unitNotExistByIds";
+
+	/**
+	 * 娣诲姞鎴愬姛
+	 */
+	public static final String ADD_SUCCESS ="addSuccess";
+
+	/**
+	 * 娣诲姞澶辫触
+	 */
+	public static final String ADD_FAIL = "addFailInDB";
+
+	/**
+	 * 淇敼鎴愬姛
+	 */
+	public static final String EDIT_SUCCESS = "editSuccess";
+
+	/**
+	 * 淇敼澶辫触
+	 */
+	public static final String EDIT_FAIL = "editFail";
+
+	/**
+	 * 鍒犻櫎鎴愬姛
+	 */
+	public static final String DELETE_SUCCESS = "deleteSuccess";
+
+	/**
+	 * 绾ц仈鍒犻櫎鎴愬姛
+	 */
+	public static final String DELETE_SUCCESS_CASCADE = "deleteSuccessCascade";
+
+	/**
+	 * 鍒犻櫎澶辫触
+	 */
+	public static final String DELETE_FAIL = "deleteFail";
+
+	/**
+	 * 鍚敤鎴愬姛
+	 */
+	public static final String ENABLE_SUCCESS ="enableSuccess";
+
+	/**
+	 * 閿佸畾鎴愬姛
+	 */
+	public static final String LOCK_SUCCESS = "lockSuccess";
+
+	/**
+	 * 閿佸畾澶辫触
+	 */
+	public static final String LOCK_FAIL = "lockFail";
+
+	/**
+	 * 瑙i攣鎴愬姛
+	 */
+	public static final String UNLOCK_SUCCESS = "unlockSuccess";
+
+	/**
+	 * 瑙i攣澶辫触
+	 */
+	public static final String UNLOCK_FAIL = "unlockFail";
+
+	/**
+	 * 绾ц仈鍚敤鎴愬姛
+	 */
+	public static final String ENABLE_SUCCESS_CASCADE = "enableSuccessCascade";
+
+	/**
+	 * 鍚敤澶辫触
+	 */
+	public static final String ENABLE_FAIL = "enableFail";
+
+	/**
+	 * 鍋滅敤鎴愬姛
+	 */
+	public static final String DISABLE_SUCCESS = "disableSuccess";
+
+	/**
+	 * 绾ц仈鍋滅敤鎴愬姛
+	 */
+	public static final String DISABLE_SUCCESS_CASCADE = "disableSuccessCascade";
+
+	/**
+	 * 鍋滅敤澶辫触
+	 */
+	public static final String DISABLE_FAIL = "disableFail";
+
+	/**
+	 * 鍗囩増鏈彿鎴愬姛
+	 */
+	public static final String UP_REVISION_SUCCESS = "dataUpRevisionSuccess";
+
+	/**
+	 * 鍗囩増鏈彿澶辫触
+	 */
+	public static final String UP_REVISION_FAIL = "dataUpRevisionFail";
+
+	/**
+	 * 鍗囩増娆℃垚鍔�
+	 */
+	public static final String UP_VERSION_SUCCESS = "dataUpVersionSuccess";
+
+	/**
+	 * 鍗囩増娆″け璐�
+	 */
+	public static final String UP_VERSION_FAIL = "dataUpVersionFail";
+
+	/**
+	 * 鎻愪氦鎴愬姛
+	 */
+	public static final String SUBMIT_SUCCESS= "submitSuccess";
+
+	/**
+	 * 鎻愪氦澶辫触
+	 */
+	public static final String SUBMIR_FAIL = "submitFail";
+
+	/**
+	 * 鍙戝竷鎴愬姛
+	 */
+	public static final String RELEASE_SUCCESS = "releaseSuccess";
+
+	/**
+	 * 鍙戝竷澶辫触
+	 */
+	public static final String RELEASE_FAIL = "releaseFail";
+
+	/**
+	 * 鐗堟湰鍙烽噸澶�
+	 */
+	public static final String REVISION_REPEAT = "revisionRepeat";
+
+	/**
+	 * 鐗堟鍙烽噸澶�
+	 */
+	public static final String VERSION_REPEAT= "versionRepeat";
+
+	/**
+	 * 鏍规嵁涓婚敭鏌ヨ鏁版嵁涓嶅瓨鍦�
+	 */
+	public static final String DATA_OID_NOT_EXIST = "dataOidNotExist";
+
+	/**
+	 * 鏍规嵁涓婚敭鏌ヨ鐨勬暟鎹笉瀛樺湪
+	 */
+	public static final String DATA_ID_NOT_EXIST = "dataIdNotExist";
+
+	/**
+	 * 鏍规嵁鍚嶇О鏌ヨ鐨勬暟鎹笉瀛樺湪
+	 */
+	public static final String DATA_NAME_NOT_EXIST = "dataNameNotExist";
+
+	/**
+	 * 灞炴�у�奸噸澶�
+	 */
+	public static final String DATA_ATTR_REPEAT = "dataRepeat";
+
+	/**
+	 * 鑰佺増鏈殑鏁版嵁涓嶅瓨鍦�
+	 */
+	public static final String OLD_REVISION_DATA_NOT_EXIST = "oldRevsionDataNotExist";
+
+	/**
+	 * 涓婄骇涓婚敭瀹為檯鏄綋鍓嶈妭鐐圭殑涓嬬骇鑺傜偣锛屼細寮曡捣姝诲惊鐜�
+	 */
+	public static final String PARENT_OID_IS_CHILD ="parentIsChild";
+
+	/**
+	 * 鏁版嵁琚紩鐢紝涓嶅厑璁稿垹闄�
+	 */
+	public static final String DATA_LINKED_NOT_DELETE = "dataLinkedNotDelete";
+
+	/**
+	 * 鏁版嵁鐨勫瓙鑺傜偣涔熻寮曠敤锛屼笉鍏佽鍒犻櫎
+	 */
+	public static final String DATA_CASCADE_LINKED_NOT_DELETE = "dataCascadeLinkedNotDelete";
+
+	/**
+	 * 鏁版嵁琚紩鐢紝涓嶅厑璁镐慨鏀�
+	 */
+	public static final String DATA_LINKED_NOT_EDIT ="dataLinkedNotEdit";
+
+	/**
+	 * 鏁版嵁涓嶅紩鐢紝涓嶅厑璁镐慨鏀规煇涓睘鎬�
+	 */
+	public static final String DATA_LINKED_NOT_EDIT_ATTR="dataLinkedNotEditAttr";
+
+	/**
+	 * 涓婄骇妗f涓嶅瓨鍦�
+	 */
+	public static final String DATA_PARENT_NOT_EXIST = "parentNotExist";
+
+	/**
+	 * 鍒嗙被鏁版嵁涓嶅瓨鍦�
+	 */
+	public static final String DATA_CLASSIFY_NOT_EXIST = "classifyNotExist";
+
+	/**
+	 * 褰撳墠鐘舵�佷笅涓嶅厑璁镐慨鏀规暟鎹�
+	 */
+	public static final String LCSTATUS_CAN_NOT_EDIT = "lcStatusCannotEditData";
+
+	/**
+	 * 褰撳墠鐘舵�佷笅涓嶅厑璁稿垹闄ゆ暟鎹�
+	 */
+	public static final String LCSTATUS_CAN_NOT_DELETE = "lcStatusCannotDeleteData";
+
+	/**
+	 * 瀵煎叆鎴愬姛
+	 */
+	public static final String IMPORT_SUCCESS = "importSuccess";
+
+	/**
+	 * 瀵煎叆澶辫触
+	 */
+	public static final String IMPORT_FAIL = "importFail";
+
+	/**
+	 * 瀵煎叆鐨勬ā鏉挎枃浠朵笉瀛樺湪
+	 */
+	public static final String IMPORT_TEMPLATE_FILE_NOT_FOUND = "importTemplateFileNotFound";
+
+	/**
+	 * 瀵煎嚭鎴愬姛
+	 */
+	public static final String EXPORT_SUCCESS = "exportSuccess";
+
+	/**
+	 * 瀵煎嚭澶辫触
+	 */
+	public static final String EXPORT_FAIL = "exportFail";
+
+	/**
+	 * 涓婁紶鎴愬姛
+	 */
+	public static final String UPLOAD_SUCCESS = "uploadSuccess";
+
+	/**
+	 * 涓婁紶澶辫触
+	 */
+	public static final String UPLOAD_FAIL = "uploadFail";
+
+	/**
+	 * 涓嬭浇鎴愬姛
+	 */
+	public static final String DOWNLOAD_SUCCESS = "downloadSuccess";
+
+	/**
+	 * 涓嬭浇澶辫触
+	 */
+	public static final String DOWNLOAD_FAIL = "downloadFail";
+
+	/**
+	 * 鏂囦欢涓嶅瓨鍦�
+	 */
+	public static final String FILE_NOT_EXIST = "fileNotExist";
+
+	/**
+	 * 瀹℃壒鎴愬姛
+	 */
+	public static final String AUDIT_SUCCESS = "auditSuccess";
+
+	/**
+	 * 瀹℃壒澶辫触
+	 */
+	public static final String AUDIT_FAIL = "auditFail";
+
+	/**
+	 * 涓嬪彂鎴愬姛
+	 */
+	public static final String ISSUED_SUCCESS = "issuedSuccess";
+
+	/**
+	 * 涓嬪彂澶辫触
+	 */
+	public static final String ISSUED_FAIL = "issuedFail";
+
+	/**
+	 * 鎺ユ敹鎴愬姛
+	 */
+	public static final String RECEIVE_SUCCESS = "receiveSuccess";
+
+	/**
+	 * 鎺ユ敹澶辫触
+	 */
+	public static final String RECEIVE_FAIL = "receiveFail";
+
+	/**
+	 * 璁″垝鐨勫埗閫犱緷鎹笉瀛樺湪
+	 */
+	public static final String PLAN_SOURCE_NOT_EXIST = "planSourceNotExist";
+
+	/**
+	 * 璁″垝鐨勫埗閫犵洰鏍囦笉瀛樺湪
+	 */
+	public static final String PLAN_TARGET_NOT_EXIST = "planTargetNotExist";
+
+	/**
+	 * 娲惧彂鎴愬姛
+	 */
+	public static final String DISPATCH_SUCCESS = "dispatchSuccess";
+
+	/**
+	 * 娲惧彂澶辫触
+	 */
+	public static final String DISPATCH_FAIL = "dispatchFail";
+
+	/**
+	 * 璇ヨ鍒掍笅涓嶅瓨鍦ㄦ淳鍙戣繃鐨勪换鍔�
+	 */
+	public static final String DISPATCH_TASK_NOT_EXIST_BY_PLAN = "dispatchTaskNotExistByPlan";
+
+}
diff --git a/Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/web/enumpck/DataSecretEnum.java b/Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/web/enumpck/DataSecretEnum.java
new file mode 100644
index 0000000..472a7c7
--- /dev/null
+++ b/Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/web/enumpck/DataSecretEnum.java
@@ -0,0 +1,76 @@
+package com.vci.ubcs.starter.web.enumpck;
+
+
+public enum DataSecretEnum implements BaseEnumInt {
+	NONE(10, "闈炲瘑"),
+	INNER(15, "鍐呴儴"),
+	SECRET(20, "绉樺瘑"),
+	PRIVACY(30, "鏈哄瘑");
+
+	private int value;
+	private String text;
+
+	public int getValue() {
+		return this.value;
+	}
+
+	public void setValue(int value) {
+		this.value = value;
+	}
+
+	public String getText() {
+		return this.text;
+	}
+
+	public void setText(String text) {
+		this.text = text;
+	}
+
+	private DataSecretEnum(int secret, String secretText) {
+		this.value = secret;
+		this.text = secretText;
+	}
+
+	public static String getSecretText(int secret) {
+		DataSecretEnum[] var1 = values();
+		int var2 = var1.length;
+
+		for(int var3 = 0; var3 < var2; ++var3) {
+			DataSecretEnum eu = var1[var3];
+			if (eu.value == secret) {
+				return eu.text;
+			}
+		}
+
+		return NONE.text;
+	}
+
+	public static int getSecretValueByText(String text) {
+		DataSecretEnum[] var1 = values();
+		int var2 = var1.length;
+
+		for(int var3 = 0; var3 < var2; ++var3) {
+			DataSecretEnum eu = var1[var3];
+			if (eu.text.equalsIgnoreCase(text)) {
+				return eu.value;
+			}
+		}
+
+		return NONE.value;
+	}
+
+	public static boolean isValid(int secret) {
+		DataSecretEnum[] var1 = values();
+		int var2 = var1.length;
+
+		for(int var3 = 0; var3 < var2; ++var3) {
+			DataSecretEnum eu = var1[var3];
+			if (eu.value == secret) {
+				return true;
+			}
+		}
+
+		return false;
+	}
+}
+
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmEngineServiceImpl.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmEngineServiceImpl.java
index 9280f3a..606c7e8 100644
--- a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmEngineServiceImpl.java
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmEngineServiceImpl.java
@@ -24,10 +24,9 @@
 import com.vci.ubcs.code.vo.pagemodel.*;
 import com.vci.ubcs.omd.constant.BtmTypeLcStatusConstant;
 import com.vci.ubcs.omd.entity.BtmTypeAttribute;
-import com.vci.ubcs.omd.feign.IAttributeClient;
-import com.vci.ubcs.omd.feign.IBtmTypeClient;
-import com.vci.ubcs.omd.feign.IEnumClient;
-import com.vci.ubcs.omd.feign.IRevisionRuleClient;
+import com.vci.ubcs.omd.cache.EnumCache;
+import com.vci.ubcs.omd.feign.*;
+import com.vci.ubcs.omd.utils.VciOmdUtil;
 import com.vci.ubcs.omd.vo.BtmTypeAttributeVO;
 import com.vci.ubcs.omd.vo.BtmTypeVO;
 import com.vci.ubcs.omd.vo.EnumVO;
@@ -67,25 +66,18 @@
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
-import plm.bs.bom.clientobject.ClientBusinessObject;
 
 import javax.annotation.Resource;
 import java.beans.BeanInfo;
-import java.beans.IntrospectionException;
 import java.beans.Introspector;
 import java.beans.PropertyDescriptor;
-import java.lang.reflect.Field;
-import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.math.BigDecimal;
-import java.sql.SQLException;
-import java.sql.Timestamp;
 import java.time.LocalDateTime;
 import java.time.ZoneId;
 import java.time.ZonedDateTime;
 import java.util.*;
 import java.util.concurrent.ConcurrentHashMap;
-import java.util.function.Supplier;
 import java.util.stream.Collectors;
 
 import static com.vci.ubcs.code.constant.FrameWorkLangCodeConstant.DATA_OID_NOT_EXIST;
@@ -108,8 +100,6 @@
 	@Resource
 	private CodeClstemplateServiceImpl templateService;
 
-	@Resource
-	private IAttributeClient attributeClient;
 
 	/**
 	 * 鐢熸垚缂栫爜鐨勬湇鍔�
@@ -127,6 +117,11 @@
 	 */
 	@Resource
 	ISysClient iSysClient;
+	/**
+	 * 绯荤粺鐨勬湇鍔�
+	 */
+	@Resource
+	private IWebSecretClient secretService;
 	/**
 	 * 鐢ㄦ埛鏈嶅姟
 	 */
@@ -853,9 +848,7 @@
 			}
 
 			int secret = VciBaseUtil.getInt(String.valueOf(cbo.getSecretGrade()));
-			//鍚庣画鐪嬪瘑绾ф湇鍔℃槸鍚﹀彲鐢�
-//			if (secret == 0 || !secretService.checkDataSecret(secret)) {
-			if (secret == 0 ) {
+			if (secret == 0 || !secretService.checkDataSecret(secret).getData()) {
 				Integer userSecret = VciBaseUtil.getCurrentUserSecret();
 //				cbo.setAttributeValue(SECRET_FIELD, String.valueOf((userSecret == null || userSecret == 0) ? UserSecretEnum.NONE.getValue() : userSecret));
 				cbo.setSecretGrade(userSecret == null || userSecret == 0 ? UserSecretEnum.NONE.getValue() : userSecret);
@@ -1245,8 +1238,8 @@
 					fieldVO.setComboxKey(fieldVO.getField() + "_data");
 				}
 			} else {
-//				List<KeyValue> osEnumItemVOList= enumService.getEnum(attrVO.getEnumId());
-//				fieldVO.setData(osEnumItemVOList);
+				List<KeyValue> osEnumItemVOList= VciOmdUtil.enumsToListKeyVale(EnumCache.getList(attrVO.getEnumId()));
+				fieldVO.setData(osEnumItemVOList);
 			}
 		}
 		//鐪嬫槸鍚︽湁鍙傜収
@@ -1748,7 +1741,7 @@
 		if (attrVOMap.keySet().contains("secretgrade")) {
 			Integer userSecret = VciBaseUtil.getCurrentUserSecret();
 			if (userSecret == null || userSecret == 0) {
-//				userSecret = secretService.getMinUserSecret();
+				userSecret = secretService.getMinUserSecret().getData();
 			}
 			whereSql += " and ( t.secretGrade <= " + userSecret + ") ";
 		}
@@ -2970,12 +2963,11 @@
 	@Override
 	public MdmUIInfoVO getUIInfoByClassifyOid(String codeClassifyOid, String functionId) {
 		VciBaseUtil.alertNotNull(codeClassifyOid, "涓婚搴撳垎绫讳富閿�");
+
 		MdmUIInfoVO uiInfoVO = getTableDefineByTemplateVO(getUsedTemplateByClassifyOid(codeClassifyOid));
 		uiInfoVO.setLeaf(classifyService.countChildrenByClassifyOid(codeClassifyOid) == 0);
 		if (StringUtils.isNotBlank(functionId) && !"~".equalsIgnoreCase(functionId)) {
 			List<Menu> buttonVOS = iSysClient.getMenuButtonByType(uiInfoVO.getTemplateVO().getBtmTypeId()).getData();
-
-			//鍔熻兘鎸夐挳鏈嶅姟杩樻湭瀹炵幇锛岀瓑瀹炵幇浜嗭紝鍦ㄨ繘琛岃皟鐢�
 //			List<SmOperationVO> operationVOS = operationService.listButtonByFunctionId(functionId);
 //			if (operationVOS == null) {
 //				operationVOS = new ArrayList<>();
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmIOServiceImpl.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmIOServiceImpl.java
index d89aac3..cc8e8a7 100644
--- a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmIOServiceImpl.java
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmIOServiceImpl.java
@@ -43,6 +43,7 @@
 import com.vci.ubcs.starter.web.toolmodel.DateConverter;
 import com.vci.ubcs.starter.web.util.*;
 import lombok.AllArgsConstructor;
+import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections4.map.HashedMap;
 import org.apache.poi.hssf.usermodel.HSSFRichTextString;
@@ -71,7 +72,7 @@
 import static com.vci.ubcs.code.constant.MdmEngineConstant.*;
 import static com.vci.ubcs.starter.poi.util.ExcelUtil.*;
 
-@AllArgsConstructor
+@RequiredArgsConstructor
 @Service
 @Slf4j
 public class MdmIOServiceImpl implements MdmIOService {
diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/util/ClientBusinessObject.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/util/ClientBusinessObject.java
index a74b470..0bbfd41 100644
--- a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/util/ClientBusinessObject.java
+++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/util/ClientBusinessObject.java
@@ -1,7 +1,6 @@
 package com.vci.ubcs.code.util;
 
 import com.vci.ubcs.code.bo.AttributeValue;
-import com.vci.ubcs.code.vo.pagemodel.BaseModelVO;
 import com.vci.ubcs.starter.exception.VciBaseException;
 import com.vci.ubcs.starter.revision.model.BaseModel;
 import lombok.Data;
diff --git a/Source/UBCS/ubcs-service/ubcs-omd/pom.xml b/Source/UBCS/ubcs-service/ubcs-omd/pom.xml
index 5b2fc51..43686d4 100644
--- a/Source/UBCS/ubcs-service/ubcs-omd/pom.xml
+++ b/Source/UBCS/ubcs-service/ubcs-omd/pom.xml
@@ -75,6 +75,12 @@
             <version>3.0.1.RELEASE</version>
             <scope>compile</scope>
         </dependency>
+        <dependency>
+            <groupId>com.vci.ubcs</groupId>
+            <artifactId>ubcs-user-api</artifactId>
+            <version>3.0.1.RELEASE</version>
+            <scope>compile</scope>
+        </dependency>
     </dependencies>
 
     <build>
diff --git a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/controller/AttributeController.java b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/controller/AttributeController.java
index d9eae5f..eccc60d 100644
--- a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/controller/AttributeController.java
+++ b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/controller/AttributeController.java
@@ -134,15 +134,15 @@
 
 	/**
 	 * 鍒犻櫎
-	 * @param ids 涓婚敭闆嗗悎
+	 * @param oid 涓婚敭闆嗗悎
 	 * @return 鎵ц缁撴灉
 	 */
 	@PostMapping("/remove")
 	@ApiOperationSupport(order = 4)
 	@ApiOperation(value = "鍒犻櫎", notes = "涓婚敭闆嗗悎")
-	public R remove(@ApiParam(value = "涓婚敭闆嗗悎", required = true) @RequestParam String ids) {
+	public R remove(@ApiParam(value = "涓婚敭闆嗗悎", required = true) @RequestParam String oid) {
 		CacheUtil.clear(OmdCacheConstant.ATTR_CACHE);
-		return R.status(attributeService.removeAttrs(ids));
+		return attributeService.remove(oid);
 	}
 
 	/**
diff --git a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/controller/RevisionRuleController.java b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/controller/RevisionRuleController.java
index 96e0c27..a27dd86 100644
--- a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/controller/RevisionRuleController.java
+++ b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/controller/RevisionRuleController.java
@@ -1,5 +1,6 @@
 package com.vci.ubcs.omd.controller;
 
+import com.alibaba.cloud.commons.lang.StringUtils;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import com.vci.ubcs.omd.dto.RevisionRuleDTO;
@@ -12,11 +13,14 @@
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
 import org.springblade.core.mp.support.Condition;
+import org.springblade.core.mp.support.Query;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.BeanUtil;
 import org.springframework.web.bind.annotation.*;
+import springfox.documentation.annotations.ApiIgnore;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * Description: 鐗堟湰瑙勫垯鎺у埗鍣�
@@ -49,8 +53,8 @@
 	@GetMapping("page")
 	@ApiOperationSupport(order = 2)
 	@ApiOperation(value = "鍒嗛〉鏌ヨ鐗堟湰瑙勫垯",notes = "鍒嗛〉鏌ヨ鐗堟湰瑙勫垯")
-	public R<IPage<RevisionRuleVO>> page(BaseQueryObject baseQueryObject){
-		return R.data(revisionRuleService.pageQueryVO(baseQueryObject));
+	public R<IPage<RevisionRuleVO>> page(@ApiIgnore @RequestParam Map<String, Object> condition, Query query){
+		return R.data(revisionRuleService.pageQueryVO(condition,query));
 	}
 
 	/**
@@ -60,7 +64,11 @@
 	@ApiOperationSupport(order = 3)
 	@ApiOperation(value = "鏂板鎴栦慨鏀�",notes = "浼犲叆鐗堟湰瑙勫垯椤甸潰瀵硅薄")
 	public R<RevisionRuleVO> submit(@RequestBody RevisionRuleDTO ruleDTO){
-		return R.data(revisionRuleService.addSave(ruleDTO));
+		if (StringUtils.isBlank(ruleDTO.getOid())) {
+			return R.data(revisionRuleService.addSave(ruleDTO));
+		}else {
+			return R.data(revisionRuleService.editSave(ruleDTO));
+		}
 	}
 
 	/**
diff --git a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/controller/StatusController.java b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/controller/StatusController.java
index a7562b9..63b2ce0 100644
--- a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/controller/StatusController.java
+++ b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/controller/StatusController.java
@@ -1,5 +1,6 @@
 package com.vci.ubcs.omd.controller;
 
+import com.alibaba.cloud.commons.lang.StringUtils;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import com.vci.ubcs.omd.entity.Status;
@@ -11,9 +12,11 @@
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
 import org.springblade.core.mp.support.Condition;
+import org.springblade.core.mp.support.Query;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.BeanUtil;
 import org.springframework.web.bind.annotation.*;
+import springfox.documentation.annotations.ApiIgnore;
 
 import java.util.HashMap;
 import java.util.List;
@@ -50,12 +53,8 @@
 	@GetMapping("page")
 	@ApiOperationSupport(order = 2)
 	@ApiOperation(value = "鍒嗛〉鏌ヨ鐘舵�佹睜",notes = "鍒嗛〉鏌ヨ鐘舵�佹睜")
-	public R<IPage<StatusVO>> page(BaseQueryObject baseQueryObject){
-		Map<String, String> conditionMap = baseQueryObject.getConditionMap();
-		if (conditionMap == null){
-			conditionMap = new HashMap<>();
-		}
-		return R.data(statusService.listStatus(conditionMap,baseQueryObject.getPageHelper()));
+	public R<IPage<StatusVO>> page(@ApiIgnore @RequestParam Map<String, Object> condition, Query query){
+		return R.data(statusService.listStatus(condition,query));
 	}
 
 	/**
@@ -65,7 +64,11 @@
 	@ApiOperationSupport(order = 3)
 	@ApiOperation(value = "鏂板鎴栦慨鏀�",notes = "浼犲叆鐘舵�佹睜椤甸潰瀵硅薄")
 	public R<StatusVO> submit(@RequestBody StatusVO statusVO){
-		return R.data(statusService.addSave(statusVO));
+		if (StringUtils.isBlank(statusVO.getOid())){
+			return R.data(statusService.addSave(statusVO));
+		}else {
+			return R.data(statusService.editSave(statusVO));
+		}
 	}
 
 	/**
diff --git a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/feign/RevisionRuleClient.java b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/feign/RevisionRuleClient.java
index 91090da..164d400 100644
--- a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/feign/RevisionRuleClient.java
+++ b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/feign/RevisionRuleClient.java
@@ -13,6 +13,7 @@
 import org.springblade.core.mp.support.Query;
 import org.springblade.core.tenant.annotation.NonDS;
 import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.BeanUtil;
 import org.springframework.cglib.beans.BeanMap;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RestController;
@@ -54,7 +55,16 @@
 	@GetMapping(GET_REF_PAGE)
 	@Override
 	public R<IPage<RevisionRuleVO>> getRefPage(BaseQueryObject baseQueryObject) {
-		return R.data(service.pageQueryVO(baseQueryObject));
+		Map<String, String> conditionMap = baseQueryObject.getConditionMap();
+		if (conditionMap == null){
+			conditionMap = new HashMap<>();
+		}
+		Query query = new Query();
+		query.setSize(baseQueryObject.getLimit());
+		query.setCurrent(baseQueryObject.getPage());
+		Map<String,Object> condition = new HashMap<>();
+		BeanUtil.copy(conditionMap,condition);
+		return R.data(service.pageQueryVO(condition,query));
 	}
 
 	/**
diff --git a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/feign/StatusClient.java b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/feign/StatusClient.java
index 2158d86..a203ae7 100644
--- a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/feign/StatusClient.java
+++ b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/feign/StatusClient.java
@@ -8,8 +8,10 @@
 import com.vci.ubcs.starter.web.pagemodel.BaseQueryObject;
 import com.vci.ubcs.starter.web.util.VciBaseUtil;
 import lombok.AllArgsConstructor;
+import org.springblade.core.mp.support.Query;
 import org.springblade.core.tenant.annotation.NonDS;
 import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.BeanUtil;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.StringUtil;
 import org.springframework.web.bind.annotation.RestController;
@@ -44,7 +46,12 @@
 		if (conditionMap == null) {
 			conditionMap = new HashMap<>(16);
 		}
-		return R.data(service.listStatus(conditionMap,baseQueryObject.getPageHelper()));
+		Map<String,Object> condition = new HashMap<>();
+		BeanUtil.copy(conditionMap,condition);
+		Query query = new Query();
+		query.setCurrent(baseQueryObject.getPage());
+		query.setSize(baseQueryObject.getLimit());
+		return R.data(service.listStatus(condition,query));
 	}
 
 	/**
diff --git a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/feign/WebSecretClient.java b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/feign/WebSecretClient.java
new file mode 100644
index 0000000..116f24a
--- /dev/null
+++ b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/feign/WebSecretClient.java
@@ -0,0 +1,111 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 搴勯獮 (smallchill@163.com)
+ */
+package com.vci.ubcs.omd.feign;
+
+import com.vci.ubcs.omd.service.IWebSecretService;
+import com.vci.ubcs.starter.exception.VciBaseException;
+import com.vci.ubcs.system.user.vo.UserVO;
+import lombok.AllArgsConstructor;
+import org.springblade.core.tool.api.R;
+import org.springframework.web.bind.annotation.RestController;
+import springfox.documentation.annotations.ApiIgnore;
+
+
+/**
+ * 鏋氫妇瀹氫箟 Feign瀹炵幇绫�
+ *
+ * @author yuxc
+ * @since 2023-05-08
+ */
+@ApiIgnore()
+@RestController
+@AllArgsConstructor
+public class WebSecretClient implements IWebSecretClient {
+
+	IWebSecretService webSecretService;
+
+
+	@Override
+	public R<Integer> getMinUserSecret() throws VciBaseException {
+		return R.data(webSecretService.getMinUserSecret());
+	}
+
+	@Override
+	public R<Integer> getMinDataSecret() throws VciBaseException {
+		return R.data(webSecretService.getMinDataSecret());
+	}
+
+	@Override
+	public R<Integer> getMinIpSecret() throws VciBaseException {
+		return R.data(webSecretService.getMinIpSecret());
+	}
+
+	@Override
+	public R<Integer> getUserSecret(String userId) throws VciBaseException {
+		return R.data(webSecretService.getUserSecret(userId));
+	}
+
+	@Override
+	public R<Integer> getUserSecret(UserVO userVO) throws VciBaseException {
+		return R.data(webSecretService.getUserSecret(userVO));
+	}
+
+	@Override
+	public R<Boolean> checkDataSecret(int secret) {
+		return R.data(webSecretService.checkDataSecret(secret));
+	}
+
+	@Override
+	public R<Boolean> checkDataSecret(int secret, int userSecret) {
+		return R.data(webSecretService.checkDataSecret(secret,userSecret));
+	}
+
+	@Override
+	public R<Boolean> checkDataSecret(int secret, String userId) throws VciBaseException {
+		return R.data(webSecretService.checkDataSecret(secret,userId));
+	}
+
+	@Override
+	public R<Boolean> checkDataSecret(int secret, UserVO userVO) {
+		return R.data(webSecretService.checkDataSecret(secret,userVO));
+	}
+
+	@Override
+	public R<Integer> getIpSecret(String ip) throws VciBaseException {
+		return R.data(webSecretService.getIpSecret(ip));
+	}
+
+	@Override
+	public R<Boolean> checkIpSecret(int ipSecret, int userSecret) {
+		return R.data(webSecretService.checkIpSecret(ipSecret,userSecret));
+	}
+
+	@Override
+	public R<Boolean> checkIpSecret(int ipSecret) {
+		return R.data(webSecretService.checkIpSecret(ipSecret));
+	}
+
+	@Override
+	public R<Boolean> checkIpSecret(String ip, String userId) throws VciBaseException {
+		return R.data(webSecretService.checkIpSecret(ip,userId));
+	}
+
+	@Override
+	public R<Boolean> checkIpSecret(String ip, UserVO userVO) {
+		return R.data(webSecretService.checkIpSecret(ip,userVO));
+	}
+}
diff --git a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/mapper/RevisionRuleMapper.java b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/mapper/RevisionRuleMapper.java
index 29aeb60..cc4ef91 100644
--- a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/mapper/RevisionRuleMapper.java
+++ b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/mapper/RevisionRuleMapper.java
@@ -3,6 +3,9 @@
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.vci.ubcs.omd.entity.RevisionRule;
 
+import java.util.Collection;
+import java.util.List;
+
 /**
  * Description: 鐗堟湰瑙勫垯鏁版嵁灞�
  *
@@ -11,4 +14,10 @@
  */
 public interface RevisionRuleMapper extends BaseMapper<RevisionRule> {
 
+	/**
+	 * 鎸夌紪鍙峰拷鐣ュぇ灏忓啓鏌ヨ
+	 * @param records 璁板綍
+	 * @return
+	 */
+    List<RevisionRule> selectByIdIgnoreCase(Collection<String> records);
 }
diff --git a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/mapper/StatusMapper.java b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/mapper/StatusMapper.java
index 775603a..f77ea2d 100644
--- a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/mapper/StatusMapper.java
+++ b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/mapper/StatusMapper.java
@@ -3,6 +3,9 @@
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.vci.ubcs.omd.entity.Status;
 
+import java.util.Collection;
+import java.util.List;
+
 /**
  * Description: 鐘舵�佹睜鏁版嵁灞�
  *
@@ -10,4 +13,10 @@
  * @date 2023/5/23
  */
 public interface StatusMapper extends BaseMapper<Status> {
+	/**
+	 * 蹇界暐澶у皬鍐欑殑鏌ヨ
+	 * @param records
+	 * @return
+	 */
+    List<Status> selectByIdIgnoreCase(Collection<String> records);
 }
diff --git a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/IAttributeService.java b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/IAttributeService.java
index c6ed540..087244d 100644
--- a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/IAttributeService.java
+++ b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/IAttributeService.java
@@ -7,6 +7,7 @@
 import com.vci.ubcs.omd.vo.BtmTypeVO;
 import com.vci.ubcs.starter.exception.VciBaseException;
 import org.springblade.core.mp.base.BaseService;
+import org.springblade.core.tool.api.R;
 
 import java.util.Collection;
 import java.util.List;
@@ -84,4 +85,12 @@
 	 * @throws VciBaseException 涓嶇鍚堟椂鎶涘嚭寮傚父
 	 */
 	boolean checkAttribute(BtmTypeLinkAttributesDTO attributesDTO) throws VciBaseException;
+
+	/**
+	 * 鍗曚釜鍒犻櫎
+	 *
+	 * @param oid 涓婚敭
+	 * @return 鎵ц缁撴灉
+	 */
+	R remove(String oid);
 }
diff --git a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/IRevisionRuleService.java b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/IRevisionRuleService.java
index 21c6c00..b331197 100644
--- a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/IRevisionRuleService.java
+++ b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/IRevisionRuleService.java
@@ -182,11 +182,12 @@
 
 	/**
 	 * 鍒嗛〉鏌ヨ
-	 * @param baseQueryObject 鏌ヨ瀵硅薄
+	 * @param query 鍒嗛〉
+	 * @param condition 鏌ヨ鏉′欢
 	 * @return 鏌ヨ缁撴灉
 	 * @throws VciBaseException 鏌ヨ鍑洪敊鏃舵姏鍑哄紓甯�
 	 */
-	IPage<RevisionRuleVO> pageQueryVO(BaseQueryObject baseQueryObject) throws VciBaseException;
+	IPage<RevisionRuleVO> pageQueryVO(Map<String, Object> condition, Query query) throws VciBaseException;
 
 	/**
 	 * 鏌ョ湅搴旂敤鑼冨洿
diff --git a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/IStatusService.java b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/IStatusService.java
index 2ce2f32..b8ad564 100644
--- a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/IStatusService.java
+++ b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/IStatusService.java
@@ -5,7 +5,7 @@
 import com.vci.ubcs.omd.entity.Status;
 import com.vci.ubcs.omd.vo.StatusVO;
 import com.vci.ubcs.starter.exception.VciBaseException;
-import com.vci.ubcs.starter.web.pagemodel.PageHelper;
+import org.springblade.core.mp.support.Query;
 
 import java.util.Collection;
 import java.util.List;
@@ -26,7 +26,7 @@
 	 * @return 鐘舵�佸璞″垪琛�
 	 * @throws VciBaseException 鏌ヨ鍑洪敊鏃朵細鎶涘嚭寮傚父
 	 */
-	IPage<StatusVO> listStatus(Map<String,String> conditionMap, PageHelper pageHelper) throws VciBaseException;
+	IPage<StatusVO> listStatus(Map<String, Object> conditionMap, Query pageHelper) throws VciBaseException;
 
 	/**
 	 * 鑾峰彇鐘舵�佸垪琛�
diff --git a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/IWebSecretService.java b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/IWebSecretService.java
new file mode 100644
index 0000000..228f575
--- /dev/null
+++ b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/IWebSecretService.java
@@ -0,0 +1,120 @@
+package com.vci.ubcs.omd.service;
+
+import com.vci.ubcs.code.vo.pagemodel.SmUserVO;
+import com.vci.ubcs.starter.exception.VciBaseException;
+import com.vci.ubcs.system.user.vo.UserVO;
+
+/**
+ * web绔殑瀵嗙骇鏈嶅姟
+ */
+public interface IWebSecretService {
+
+
+	/**
+	 * 鑾峰彇鐢ㄦ埛瀵嗙骇鐨勬渶灏忓��
+	 * @return 瀵嗙骇鐨勫��
+	 * @throws VciBaseException 鏌ヨ鍑洪敊浼氭姏鍑哄紓甯�
+	 */
+	int getMinUserSecret() throws VciBaseException;
+
+	/**
+	 * 鑾峰彇鏁版嵁瀵嗙骇鐨勯粯璁ゅ��
+	 * @return 瀵嗙骇鐨勫��
+	 * @throws VciBaseException 鏌ヨ鍑洪敊浼氭姏鍑哄紓甯�
+	 */
+	int getMinDataSecret() throws VciBaseException;
+
+	/**
+	 * 鑾峰彇IP瀵嗙骇鐨勯粯璁ゅ��
+	 * @return 瀵嗙骇鐨勫��
+	 * @throws VciBaseException 鏌ヨ鍑洪敊浼氭姏鍑哄紓甯�
+	 */
+	int getMinIpSecret() throws VciBaseException;
+
+	/**
+	 * 鑾峰彇鐢ㄦ埛瀵嗙骇
+	 * @param userId 鐢ㄦ埛涓婚敭
+	 * @return 鐢ㄦ埛鐨勫瘑绾�
+	 * @throws VciBaseException 鍙傛暟閿欒锛岀敤鎴蜂笉瀛樺湪浼氭姏鍑哄紓甯�
+	 */
+	int getUserSecret(String userId) throws VciBaseException ;
+
+	/**
+	 * 鑾峰彇鐢ㄦ埛瀵嗙骇
+	 * @param userVO 鐢ㄦ埛鐨勬樉绀哄璞�
+	 * @return 鐢ㄦ埛鐨勫瘑绾�
+	 * @throws VciBaseException 鍙傛暟閿欒锛岀敤鎴蜂笉瀛樺湪浼氭姏鍑哄紓甯�
+	 */
+	int getUserSecret(UserVO userVO) throws VciBaseException;
+
+	/**
+	 * 鏍¢獙褰撳墠鐢ㄦ埛鏄惁鏈夋潈闄愯闂暟鎹�
+	 * @param secret 鏁版嵁鐨勫瘑绾�
+	 * @return true琛ㄧず鍏佽璁块棶
+	 */
+	boolean checkDataSecret(int secret);
+
+	/**
+	 * 鏍¢獙鐢ㄦ埛鐨勫瘑绾ф槸鍚︽槸鍚︽湁鏉冮檺璁块棶鏁版嵁
+	 * @param secret 鏁版嵁鐨勫瘑绾�
+	 * @param userSecret 鐢ㄦ埛瀵嗙骇
+	 * @return true琛ㄧず鍏佽璁块棶
+	 */
+	boolean checkDataSecret(int secret, int userSecret) ;
+
+	/**
+	 * 鏍规嵁鐢ㄦ埛鍚嶆潵鏍¢獙鏁版嵁瀵嗙骇
+	 * @param secret 鏁版嵁鐨勫瘑绾�
+	 * @param userId 鐢ㄦ埛鍚�
+	 * @return true琛ㄧず鍏佽璁块棶
+	 * @throws VciBaseException 鍙傛暟閿欒锛岀敤鎴蜂笉瀛樺湪浼氭姏鍑哄紓甯�
+	 */
+	boolean checkDataSecret(int secret, String userId) throws VciBaseException;
+
+	/**
+	 * 鏍规嵁鐢ㄦ埛瀵硅薄鏉ユ牎楠屾暟鎹瘑绾�
+	 * @param secret  鏁版嵁鐨勫瘑绾�
+	 * @param userVO 鐢ㄦ埛鐨勬樉绀哄璞�
+	 * @return true琛ㄧず鍏佽璁块棶
+	 */
+	boolean checkDataSecret(int secret, UserVO userVO) ;
+
+	/**
+	 * 鑾峰彇IP鍦板潃鐨勫瘑绾�
+	 * @param ip ip鍦板潃
+	 * @return 瀵嗙骇鐨勫��
+	 * @throws VciBaseException 鏌ヨ鍑洪敊鐨勬椂鍊欎細鎶涘嚭寮傚父
+	 */
+	int getIpSecret(String ip) throws VciBaseException;
+	/**
+	 * 妫�鏌ユ満鍣ㄥ瘑绾�
+	 * @param ipSecret 鏈哄櫒瀵嗙骇
+	 * @param userSecret 鐢ㄦ埛鐨勫瘑绾�
+	 * @return 瀵嗙骇鐨勫��
+	 */
+	boolean checkIpSecret(int ipSecret, int userSecret);
+
+	/**
+	 * 妫�鏌ュ綋鍓嶇敤鎴锋槸鍚︾鍚堟満鍣ㄥ瘑绾�
+	 * @param ipSecret 鏈哄櫒瀵嗙骇
+	 * @return true琛ㄧず鍏佽璁块棶
+	 */
+	boolean checkIpSecret(int ipSecret) ;
+
+	/**
+	 * 鏍¢獙鎸囧畾ip鍜岀敤鎴锋槸鍚︾鍚堟満鍣ㄥ瘑绾�
+	 * @param ip ip鍦板潃
+	 * @param userId 鐢ㄦ埛鍚�
+	 * @return true琛ㄧず鍏佽璁块棶
+	 * @throws VciBaseException 鍙傛暟閿欒锛岀敤鎴蜂笉瀛樺湪浼氭姏鍑哄紓甯�
+	 */
+	boolean checkIpSecret(String ip, String userId) throws VciBaseException;
+
+	/**
+	 * 鏍¢獙鎸囧畾IP鍜岀敤鎴峰璞$鍚堟満鍣ㄥ瘑绾�
+	 * @param ip ip鍦板潃
+	 * @param userVO 鐢ㄦ埛瀵硅薄
+	 * @return  true琛ㄧず鍏佽璁块棶
+	 */
+	boolean checkIpSecret(String ip, UserVO userVO) ;
+}
diff --git a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/AttributeServiceImpl.java b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/AttributeServiceImpl.java
index d98174c..0ab7e08 100644
--- a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/AttributeServiceImpl.java
+++ b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/AttributeServiceImpl.java
@@ -4,15 +4,12 @@
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.github.yulichang.wrapper.MPJLambdaWrapper;
 import com.vci.ubcs.omd.constant.OmdCacheConstant;
 import com.vci.ubcs.omd.dto.AttributeDTO;
 import com.vci.ubcs.omd.dto.BtmTypeLinkAttributesDTO;
 import com.vci.ubcs.omd.entity.Attribute;
 import com.vci.ubcs.omd.entity.BtmType;
-import com.vci.ubcs.omd.entity.BtmTypeAttribute;
 import com.vci.ubcs.omd.mapper.AttributeMapper;
-import com.vci.ubcs.omd.mapper.BtmTypeMapper;
 import com.vci.ubcs.omd.service.IAttributeService;
 import com.vci.ubcs.omd.vo.AttributeVO;
 import com.vci.ubcs.omd.vo.BtmTypeVO;
@@ -24,14 +21,11 @@
 import com.vci.ubcs.starter.web.util.VciBaseUtil;
 import org.springblade.core.cache.utils.CacheUtil;
 import org.springblade.core.log.exception.ServiceException;
-import org.springblade.core.tool.constant.BladeConstant;
-import org.springblade.core.tool.utils.BeanUtil;
+import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.Func;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
 
-import javax.annotation.Resource;
 import javax.validation.constraints.NotEmpty;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -82,13 +76,14 @@
 	 */
 	@Override
 	public boolean submit(AttributeDTO dto) {
+		VciBaseUtil.alertNotNull(dto.getId(),"灞炴�х紪鍙�",dto.getName(),"灞炴�у悕绉�",dto.getTypeKey(),"灞炴�х被鍨�",dto.getMaxLength(),"灞炴�ч暱搴�");
 		if (!Pattern.compile(REGEXP).matcher(dto.getId()).matches()){
-			throw new VciBaseException("灞炴�у悕绉皗0}鍙兘鏄嫳鏂�",new Object[]{dto.getId()});
+			throw new VciBaseException("灞炴�х紪鍙穥0}鍙兘鏄嫳鏂�",new Object[]{dto.getId()});
 		}
 		LambdaQueryWrapper<Attribute> wrapper = Wrappers.<Attribute>query().lambda().eq(Attribute::getId, dto.getId());
 		Long count = baseMapper.selectCount((Func.isEmpty(dto.getOid())) ? wrapper : wrapper.notIn(Attribute::getOid, dto.getOid()));
 		if (count > 0L) {
-			throw new ServiceException("灞炴�у悕宸插瓨鍦�!");
+			throw new ServiceException("灞炴�х紪鍙峰凡瀛樺湪!");
 		}
 		Attribute attribute = AttributeWrapper.build().copyBeforeSave(dto);
 		CacheUtil.clear(OmdCacheConstant.ATTR_CACHE);
@@ -98,13 +93,17 @@
 	/**
 	 * 鍒犻櫎
 	 *
-	 * @param ids 涓婚敭闆嗗悎
+	 * @param oids 涓婚敭闆嗗悎
 	 * @return 鎵ц缁撴灉
 	 */
 	@Override
-	public boolean removeAttrs(String ids) {
-		List<Long> idList = Func.toLongList(ids);
-		return !deleteLogic(idList) && removeByIds(idList);
+	public boolean removeAttrs(String oids) {
+		List<String> oidList = Func.toStrList(",", oids);
+		List<Attribute> list = list(Wrappers.<Attribute>query().lambda().in(Attribute::getOid, oidList));
+		if (!CollectionUtils.isEmpty(list)){
+			baseMapper.delete(Wrappers.<Attribute>query().lambda().in(Attribute::getOid,list.stream().map(Attribute::getOid).collect(Collectors.toList())));
+		}
+		return true;
 	}
 
 	/**
@@ -243,4 +242,20 @@
 		}
 		return pass;
 	}
+
+	/**
+	 * 鍗曚釜鍒犻櫎
+	 *
+	 * @param oid 涓婚敭
+	 * @return 鎵ц缁撴灉
+	 */
+	@Override
+	public R remove(String oid) {
+		List<BtmTypeVO> vos = applyRange(oid);
+		if (CollectionUtils.isEmpty(vos)){
+			 return R.status(removeAttrs(oid));
+		}else {
+			return R.fail("璇ュ睘鎬у凡琚娇鐢紝涓嶅厑璁稿垹闄�");
+		}
+	}
 }
diff --git a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/RevisionRuleServiceImpl.java b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/RevisionRuleServiceImpl.java
index a662529..0e9b55b 100644
--- a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/RevisionRuleServiceImpl.java
+++ b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/RevisionRuleServiceImpl.java
@@ -148,8 +148,7 @@
 	@Override
 	public List<RevisionRuleVO> listRevisionRuleByIdCollection(Collection<String> revisionRuleIdCollection) throws VciBaseException {
 		VciBaseUtil.alertNotNull(revisionRuleIdCollection,"鑻辨枃鍚嶇О闆嗗悎");
-//		return RevisionRuleWrapper.build().listVO(list(MybatisParameterUtil.cutInParameter(Wrappers.<RevisionRule>query().lambda(),RevisionRule::getId, Collections.singletonList(revisionRuleIdCollection))));
-		List<RevisionRule> list = baseMapper.selectList(Wrappers.<RevisionRule>query().lambda().in(RevisionRule::getId, revisionRuleIdCollection));
+		List<RevisionRule> list = baseMapper.selectByIdIgnoreCase(revisionRuleIdCollection);
 		return RevisionRuleWrapper.build().listVO(list);
 	}
 
@@ -545,20 +544,8 @@
 	 * @throws VciBaseException 鏌ヨ鍑洪敊鏃舵姏鍑哄紓甯�
 	 */
 	@Override
-	public IPage<RevisionRuleVO> pageQueryVO(BaseQueryObject baseQueryObject) throws VciBaseException {
-		Map<String, String> conditionMap = baseQueryObject.getConditionMap();
-		if (conditionMap == null){
-			conditionMap = new HashMap<>();
-		}
-		PageHelper pageHelper = baseQueryObject.getPageHelper();
-		Query query = new Query();
-		query.setCurrent(pageHelper.getPage());
-		query.setSize(pageHelper.getLimit());
-		query.setAscs(pageHelper.getSort());
-		RevisionRule queryConditionObj = new RevisionRule();
-		BeanMap beanMap = BeanMap.create(queryConditionObj);
-		beanMap.putAll(conditionMap);
-		return RevisionRuleWrapper.build().pageVO(baseMapper.selectPage(Condition.getPage(query),Condition.getQueryWrapper(queryConditionObj).lambda().orderByAsc(RevisionRule::getId)));
+	public IPage<RevisionRuleVO> pageQueryVO(Map<String, Object> condition, Query query) throws VciBaseException {
+		return RevisionRuleWrapper.build().pageVO(baseMapper.selectPage(Condition.getPage(query),Condition.getQueryWrapper(condition,RevisionRule.class).lambda().orderByAsc(RevisionRule::getId)));
 	}
 
 	/**
diff --git a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/StatusServiceImpl.java b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/StatusServiceImpl.java
index 5193ccc..0999276 100644
--- a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/StatusServiceImpl.java
+++ b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/StatusServiceImpl.java
@@ -11,7 +11,6 @@
 import com.vci.ubcs.omd.vo.StatusVO;
 import com.vci.ubcs.omd.wrapper.StatusWrapper;
 import com.vci.ubcs.starter.exception.VciBaseException;
-import com.vci.ubcs.starter.web.pagemodel.PageHelper;
 import com.vci.ubcs.starter.web.util.BeanUtil;
 import com.vci.ubcs.starter.web.util.VciBaseUtil;
 import org.springblade.core.mp.support.Condition;
@@ -46,14 +45,8 @@
 	 * @throws VciBaseException 鏌ヨ鍑洪敊鏃朵細鎶涘嚭寮傚父
 	 */
 	@Override
-	public IPage<StatusVO> listStatus(Map<String, String> conditionMap, PageHelper pageHelper) throws VciBaseException {
-		Query query = new Query();
-		query.setCurrent(pageHelper.getPage());
-		query.setSize(pageHelper.getLimit());
-		query.setAscs("id");
-		Status queryVO = new Status();
-		BeanMap.create(queryVO).putAll(conditionMap);
-		return StatusWrapper.build().pageVO(baseMapper.selectPage(Condition.getPage(query), Condition.getQueryWrapper(queryVO).lambda().orderByAsc(Status::getId)));
+	public IPage<StatusVO> listStatus(Map<String, Object> conditionMap, Query pageHelper) throws VciBaseException {
+		return StatusWrapper.build().pageVO(baseMapper.selectPage(Condition.getPage(pageHelper), Condition.getQueryWrapper(conditionMap,Status.class).lambda().orderByAsc(Status::getId)));
 	}
 
 	/**
@@ -203,7 +196,7 @@
 		Collection<Collection<String>> idCollections = VciBaseUtil.switchCollectionForOracleIn(idCollection);
 		if(!CollectionUtils.isEmpty(idCollections)) {
 			idCollections.forEach(s -> {
-				List<Status> queryResult = baseMapper.selectList(Wrappers.<Status>query().lambda().in(Status::getId,s));
+				List<Status> queryResult = baseMapper.selectByIdIgnoreCase(s);
 				if(!CollectionUtils.isEmpty(queryResult)){
 					statusDOList.addAll(queryResult);
 				}
diff --git a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/WebSecretServiceImpl.java b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/WebSecretServiceImpl.java
new file mode 100644
index 0000000..0d8bbe9
--- /dev/null
+++ b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/WebSecretServiceImpl.java
@@ -0,0 +1,376 @@
+package com.vci.ubcs.omd.service.impl;
+
+import com.vci.ubcs.common.utils.CommonUtil;
+import com.vci.ubcs.omd.cache.EnumCache;
+import com.vci.ubcs.omd.service.IWebSecretService;
+import com.vci.ubcs.omd.utils.VciOmdUtil;
+import com.vci.ubcs.starter.exception.VciBaseException;
+import com.vci.ubcs.starter.web.constant.EnumIdConstant;
+import com.vci.ubcs.starter.web.enumpck.DataSecretEnum;
+import com.vci.ubcs.starter.web.enumpck.UserSecretEnum;
+import com.vci.ubcs.starter.web.pagemodel.KeyValue;
+import com.vci.ubcs.starter.web.util.VciBaseUtil;
+import com.vci.ubcs.starter.web.util.WebUtil;
+import com.vci.ubcs.system.user.entity.User;
+import com.vci.ubcs.system.user.feign.IUserClient;
+import com.vci.ubcs.system.user.vo.UserVO;
+import net.logstash.logback.encoder.org.apache.commons.lang3.StringUtils;
+import org.springblade.core.tool.api.R;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+import static com.vci.ubcs.starter.web.constant.FrameWorkBusLangCodeConstant.DATA_ID_NOT_EXIST;
+
+/**
+ * 瀵嗙骇鐨勬湇鍔�
+ * @author weidy
+ * @date 2021-2-16
+ */
+@Service
+public class WebSecretServiceImpl implements IWebSecretService {
+
+
+	/**
+	 * 鐢ㄦ埛鏌ヨ鏈嶅姟
+	 */
+	@Autowired
+	private IUserClient userClient;
+
+	/**
+	 * 涓氬姟绫诲瀷鏈嶅姟
+	 */
+//	@Autowired
+//	private WebBoServiceI boService;
+
+	/**
+	 * 灞炴�х殑瀵硅薄
+	 */
+//	@Autowired
+//	private WebProperties properties;
+
+	/**
+	 * 鑾峰彇鐢ㄦ埛瀵嗙骇鐨勬渶灏忓��
+	 *
+	 * @return 瀵嗙骇鐨勫��
+	 * @throws VciBaseException 鏌ヨ鍑洪敊浼氭姏鍑哄紓甯�
+	 */
+	@Override
+	public int getMinUserSecret() throws VciBaseException {
+		List<KeyValue> enumKeyValueList = VciOmdUtil.enumsToListKeyVale(EnumCache.getList(EnumIdConstant.USERSECRET_ENUMNAME));
+//			enumService.getEnum(EnumIdConstant.USERSECRET_ENUMNAME);
+		//閲嶆柊璁剧疆鏋氫妇鐨勫��
+		if(!CollectionUtils.isEmpty(enumKeyValueList)){
+			List<KeyValue> keyValues = enumKeyValueList.stream().sorted((a, b) -> ((Integer) VciBaseUtil.getInt(a.getKey())).compareTo((Integer) VciBaseUtil.getInt(b.getKey()))).collect(Collectors.toList());
+			for(int i = 0 ; i < keyValues.size() ; i++){
+				KeyValue keyValue = keyValues.get(i);
+				if(i ==0){
+					UserSecretEnum.NONE.setValue(VciBaseUtil.getInt(keyValue.getKey()));
+					UserSecretEnum.NONE.setText(keyValue.getValue());
+				}else if(i ==1){
+					UserSecretEnum.SECRET.setValue(VciBaseUtil.getInt(keyValue.getKey()));
+					UserSecretEnum.SECRET.setText(keyValue.getValue());
+				}else{
+					UserSecretEnum.PRIVACY.setValue(VciBaseUtil.getInt(keyValue.getKey()));
+					UserSecretEnum.PRIVACY.setText(keyValue.getValue());
+				}
+			}
+		}
+		return getMinValueInKeyValueList(enumKeyValueList,UserSecretEnum.NONE.getValue());
+	}
+
+	/**
+	 * 鑾峰彇鏋氫妇涓殑鏈�灏忓��
+	 * @param enumKeyValueList 鏋氫妇K-V鍒楄〃
+	 * @param minValue 鏈�灏忓��
+	 * @return 鏈�灏忓��
+	 */
+	private int getMinValueInKeyValueList(  List<KeyValue> enumKeyValueList,int minValue){
+		for(KeyValue ec : enumKeyValueList){
+			int value = VciBaseUtil.getInt(ec.getKey());
+			if(minValue> value){
+				minValue = value;
+			}
+		}
+		return minValue;
+	}
+
+	/**
+	 * 鑾峰彇鏁版嵁瀵嗙骇鐨勯粯璁ゅ��
+	 *
+	 * @return 鏈�灏忓瘑绾х殑鍊�
+	 * @throws VciBaseException  鏌ヨ鍑洪敊浼氭姏鍑哄紓甯�
+	 */
+	@Override
+	public int getMinDataSecret() throws VciBaseException {
+		List<KeyValue> enumKeyValueList = VciOmdUtil.enumsToListKeyVale(EnumCache.getList(EnumIdConstant.DATASECRET_ENUMNAME));
+		//閲嶆柊璁剧疆鏋氫妇鐨勫��
+		if(!CollectionUtils.isEmpty(enumKeyValueList)){
+			List<KeyValue> keyValues = enumKeyValueList.stream().sorted((a, b) -> ((Integer) VciBaseUtil.getInt(a.getKey())).compareTo((Integer) VciBaseUtil.getInt(b.getKey()))).collect(Collectors.toList());
+			for(int i = 0 ; i < keyValues.size() ; i++){
+				KeyValue keyValue = keyValues.get(i);
+				if(i ==0){
+					DataSecretEnum.NONE.setValue(VciBaseUtil.getInt(keyValue.getKey()));
+					DataSecretEnum.NONE.setText(keyValue.getValue());
+				}else if(i ==1){
+					DataSecretEnum.INNER.setValue(VciBaseUtil.getInt(keyValue.getKey()));
+					DataSecretEnum.INNER.setText(keyValue.getValue());
+				}else if(i ==2){
+					DataSecretEnum.SECRET.setValue(VciBaseUtil.getInt(keyValue.getKey()));
+					DataSecretEnum.SECRET.setText(keyValue.getValue());
+				}else{
+					DataSecretEnum.PRIVACY.setValue(VciBaseUtil.getInt(keyValue.getKey()));
+					DataSecretEnum.PRIVACY.setText(keyValue.getValue());
+				}
+			}
+		}
+		return getMinValueInKeyValueList(enumKeyValueList,DataSecretEnum.NONE.getValue());
+	}
+
+	/**
+	 * 鑾峰彇IP瀵嗙骇鐨勯粯璁ゅ��
+	 *
+	 * @return 鏈�灏忓瘑绾х殑鍊�
+	 * @throws VciBaseException 鏌ヨ鍑洪敊浼氭姏鍑哄紓甯�
+	 */
+	@Override
+	public int getMinIpSecret() throws VciBaseException {
+		List<KeyValue> enumKeyValueList = VciOmdUtil.enumsToListKeyVale(EnumCache.getList(EnumIdConstant.IPSECRET_ENUMNAME));
+		return getMinValueInKeyValueList(enumKeyValueList,10);
+	}
+
+	/**
+	 * 鑾峰彇鐢ㄦ埛瀵嗙骇
+	 *
+	 * @param userId 鐢ㄦ埛鍚�
+	 * @return 鐢ㄦ埛瀵嗙骇鐨勫�硷紝濡傛灉娌℃湁瀵嗙骇锛岄粯璁や负鏈�灏忓瘑绾�
+	 * @throws VciBaseException 鏌ヨ鍑洪敊浼氭姏鍑哄紓甯�
+	 */
+	@Override
+	public int getUserSecret(String userId) throws VciBaseException {
+		WebUtil.alertNotNull(userId,"鐢ㄦ埛鍚�");
+		R<User> userR = userClient.userInfoById(Long.valueOf(userId));
+		if(userR.getData() == null){
+			throw new VciBaseException(DATA_ID_NOT_EXIST,new String[]{userId});
+		}
+		return userR.getData().getSecretGrade()==null?getMinUserSecret():Integer.parseInt(userR.getData().getSecretGrade());
+	}
+
+	/**
+	 * 鑾峰彇鐢ㄦ埛瀵嗙骇
+	 *
+	 * @param userVO 鐢ㄦ埛鐨勫璞�
+	 * @return 瀵嗙骇锛屼笉瀛樺湪鐨勬椂鍊欎负鏈�浣庡瘑绾�
+	 * @throws VciBaseException 鏌ヨ鍑洪敊浼氭姏鍑哄紓甯�
+	 */
+	@Override
+	public int getUserSecret(UserVO userVO) throws VciBaseException {
+		if(userVO == null){
+			throw new VciBaseException(DATA_ID_NOT_EXIST,new String[0]);
+		}
+		return userVO.getSecretGrade()==null?getMinUserSecret(): Integer.valueOf(userVO.getSecretGrade());
+	}
+
+
+	/**
+	 * 鏍¢獙褰撳墠鐢ㄦ埛鏄惁鏈夋潈闄愯闂暟鎹�
+	 *
+	 * @param secret 鏁版嵁鐨勫瘑绾�
+	 * @return true琛ㄧず鍙互璁块棶
+	 */
+	@Override
+	public boolean checkDataSecret(int secret) {
+		return checkDataSecret(secret,WebUtil.getCurrentUserSecret()==null?getMinUserSecret():WebUtil.getCurrentUserSecret());
+	}
+
+	/**
+	 * 鑾峰彇鏁版嵁鏉冮檺
+	 * @param secret 鏁版嵁鐨勫瘑绾х殑鍊�
+	 * @return 鏁版嵁瀵嗙骇
+	 */
+	private DataSecretEnum dataSecretForValue(int secret){
+		for(DataSecretEnum de : DataSecretEnum.values()){
+			if(de.getValue() == secret){
+				return de;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * 鐢ㄦ埛鐨勫瘑绾�
+	 * @param userSecret 鐢ㄦ埛鐨勫瘑绾�
+	 * @return 瀵嗙骇鐨勫璞�
+	 */
+	private UserSecretEnum userSecretForValue(int userSecret){
+		for(UserSecretEnum ue : UserSecretEnum.values()){
+			if(ue.getValue() == userSecret){
+				return  ue;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * 鏍¢獙鐢ㄦ埛鐨勫瘑绾ф槸鍚︽槸鍚︽湁鏉冮檺璁块棶鏁版嵁
+	 *
+	 * @param secret     鏁版嵁鐨勫瘑绾�
+	 * @param userSecret 鐢ㄦ埛瀵嗙骇
+	 * @return true琛ㄧず鍙互璁块棶
+	 */
+	@Override
+	public boolean checkDataSecret(int secret, int userSecret){
+		//鍙兘琚浆鎹簡涓�
+		DataSecretEnum de = dataSecretForValue(secret);
+		if(de == null){
+			de = DataSecretEnum.NONE;
+		}
+		UserSecretEnum ue = userSecretForValue(userSecret);
+		if(ue == null){
+			ue = UserSecretEnum.NONE;
+		}
+		int reaySecret = 0;
+		switch (de){
+			case NONE:
+				reaySecret=1;
+				break;
+			case INNER:
+				reaySecret = 2;
+				break;
+			case SECRET:
+				reaySecret = 3;
+				break;
+			default:
+				reaySecret = 4;
+				break;
+		}
+
+		int userReaySecret = 0;
+		switch (ue){
+			case NONE:
+				userReaySecret = 1;
+				break;
+			case SECRET:
+				userReaySecret = 3;
+				break;
+			default:
+				userReaySecret = 4;
+				break;
+		}
+		if(reaySecret> userReaySecret){
+			return false;
+		}else{
+			return true;
+		}
+	}
+
+	/**
+	 * 鏍规嵁鐢ㄦ埛鍚嶆潵鏍¢獙鏁版嵁瀵嗙骇
+	 *
+	 * @param secret 鏁版嵁鐨勫瘑绾�
+	 * @param userId 鐢ㄦ埛鍚�
+	 * @return true琛ㄧず鍙互璁块棶
+	 * @throws VciBaseException 鏌ヨ鍑洪敊浼氭姏鍑哄紓甯�
+	 */
+	@Override
+	public boolean checkDataSecret(int secret, String userId) throws VciBaseException {
+		return checkDataSecret(secret,getUserSecret(userId));
+	}
+
+	/**
+	 * 鏍规嵁鐢ㄦ埛瀵硅薄鏉ユ牎楠屾暟鎹瘑绾�
+	 *
+	 * @param secret 鏁版嵁瀵嗙骇
+	 * @param userVO 鐢ㄦ埛鐨勫璞�
+	 * @return true琛ㄧず鍙互璁块棶
+	 */
+	@Override
+	public boolean checkDataSecret(int secret, UserVO userVO)  {
+		return checkDataSecret(secret,getUserSecret(userVO));
+	}
+
+	/**
+	 * 鑾峰彇IP鍦板潃鐨勫瘑绾� 鏆傛椂杩樻湭浣跨敤锛屾暟鎹簱琛ㄤ篃杩樻湭绉绘銆�
+	 *
+	 * @param ip ip鍦板潃
+	 * @return 瀵嗙骇鐨勫��
+	 * @throws VciBaseException 鏌ヨ鍑洪敊鐨勬椂鍊欎細鎶涘嚭寮傚父
+	 */
+	@Override
+	public int getIpSecret(String ip) throws VciBaseException {
+		if(StringUtils.isBlank(ip)){
+			return getMinIpSecret();
+		}
+		Map<String,String> conditionMap = new HashMap<String, String>();
+		conditionMap.put("startip",ip.trim());
+
+//		List<ClientBusinessObject> ipCbos = boService.queryCBO(EnumIdConstant.IPSECRET_BTMNAME,conditionMap,null, Arrays.asList(new String[]{"ipsecret"}));
+		int ipSecret = 0;
+//		if(ipCbos!=null&& ipCbos.size()>0){
+//			ipSecret = WebUtil.getInt(ipCbos.get(0).getAttributeValue("ipsecret"));
+//		}
+		if(ipSecret == 0){
+			ipSecret = getMinIpSecret();
+		}
+		return ipSecret;
+	}
+
+	/**
+	 * 妫�鏌ユ満鍣ㄥ瘑绾�
+	 *
+	 * @param ipSecret   鏈哄櫒瀵嗙骇
+	 * @param userSecret 鐢ㄦ埛鐨勫瘑绾�
+	 * @return true琛ㄧず璁稿彲
+	 */
+	@Override
+	public boolean checkIpSecret(int ipSecret, int userSecret)  {
+		if(ipSecret> userSecret){
+			return false;
+		}else{
+			return true;
+		}
+	}
+
+	/**
+	 * 妫�鏌ュ綋鍓嶇敤鎴锋槸鍚︾鍚堟満鍣ㄥ瘑绾�
+	 *
+	 * @param ipSecret 鏈哄櫒瀵嗙骇
+	 * @return true琛ㄧず璁稿彲
+	 */
+	@Override
+	public boolean checkIpSecret(int ipSecret) {
+		return checkIpSecret(ipSecret,WebUtil.getCurrentUserSecret()==null?getMinUserSecret():WebUtil.getCurrentUserSecret());
+	}
+
+	/**
+	 * 鏍¢獙鎸囧畾ip鍜岀敤鎴锋槸鍚︾鍚堟満鍣ㄥ瘑绾�
+	 *
+	 * @param ip     ip鍦板潃
+	 * @param userId 鐢ㄦ埛鍚�
+	 * @return true琛ㄧず璁稿彲
+	 * @throws VciBaseException 鏌ヨ鍑洪敊浼氭姏鍑哄紓甯�
+	 */
+	@Override
+	public boolean checkIpSecret(String ip, String userId) throws VciBaseException {
+		return checkIpSecret(getIpSecret(ip),getUserSecret(userId));
+	}
+
+	/**
+	 * 鏍¢獙鎸囧畾IP鍜岀敤鎴峰璞$鍚堟満鍣ㄥ瘑绾�
+	 *
+	 * @param ip         ip鍦板潃
+	 * @param userVO 鐢ㄦ埛瀵硅薄
+	 * @return true琛ㄧず璁稿彲
+	 */
+	@Override
+	public boolean checkIpSecret(String ip, UserVO userVO) {
+		return checkIpSecret(getIpSecret(ip),getUserSecret(userVO));
+	}
+}
diff --git a/Source/UBCS/ubcs-service/ubcs-omd/src/main/resources/mapper/RevisionRuleMapper.xml b/Source/UBCS/ubcs-service/ubcs-omd/src/main/resources/mapper/RevisionRuleMapper.xml
index e129aa4..77ae7a5 100644
--- a/Source/UBCS/ubcs-service/ubcs-omd/src/main/resources/mapper/RevisionRuleMapper.xml
+++ b/Source/UBCS/ubcs-service/ubcs-omd/src/main/resources/mapper/RevisionRuleMapper.xml
@@ -29,4 +29,15 @@
         pl_omd_revision_rule
     </sql>
 
+    <select id="selectByIdIgnoreCase" resultMap="BaseResultMap">
+        select <include refid="base_query_column"/> from <include refid="tableName"/>
+        where lower(id) in
+        <foreach collection="records" item="item" index="arrayindex" open=" ( " close=")" >
+            #{item,jdbcType=VARCHAR}
+            <if test="(arrayindex != records.size() -1)">
+                ,
+            </if>
+        </foreach>
+    </select>
+
 </mapper>
diff --git a/Source/UBCS/ubcs-service/ubcs-omd/src/main/resources/mapper/StatusMapper.xml b/Source/UBCS/ubcs-service/ubcs-omd/src/main/resources/mapper/StatusMapper.xml
index ab1a809..d9f33cf 100644
--- a/Source/UBCS/ubcs-service/ubcs-omd/src/main/resources/mapper/StatusMapper.xml
+++ b/Source/UBCS/ubcs-service/ubcs-omd/src/main/resources/mapper/StatusMapper.xml
@@ -6,7 +6,7 @@
         <result column="id" jdbcType="VARCHAR" property="id" />
         <result column="name" jdbcType="VARCHAR" property="name" />
         <result column="description" jdbcType="VARCHAR" property="description" />
-        <result column="btm_name" property="btmname" jdbcType="VARCHAR" />
+        <result column="btm_name" property="btmName" jdbcType="VARCHAR" />
         <result column="owner" property="owner" jdbcType="VARCHAR" />
         <result column="creator" jdbcType="VARCHAR" property="creator" />
         <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
@@ -23,4 +23,15 @@
         pl_omd_status
     </sql>
 
+    <select id="selectByIdIgnoreCase" resultMap="BaseResultMap">
+        select <include refid="base_query_column"/> from <include refid="tableName"/>
+                    where lower(id) in
+        <foreach collection="records" item="item" index="arrayindex" open=" ( " close=")" >
+            #{item,jdbcType=VARCHAR}
+            <if test="(arrayindex != records.size() -1)">
+                ,
+            </if>
+        </foreach>
+    </select>
+
 </mapper>
diff --git a/Source/UBCS/ubcs-service/ubcs-user/src/main/java/com/vci/ubcs/system/user/wrapper/UserWrapper.java b/Source/UBCS/ubcs-service/ubcs-user/src/main/java/com/vci/ubcs/system/user/wrapper/UserWrapper.java
index a72b04d..245038e 100644
--- a/Source/UBCS/ubcs-service/ubcs-user/src/main/java/com/vci/ubcs/system/user/wrapper/UserWrapper.java
+++ b/Source/UBCS/ubcs-service/ubcs-user/src/main/java/com/vci/ubcs/system/user/wrapper/UserWrapper.java
@@ -47,7 +47,7 @@
 		List<String> roleName = SysCache.getRoleNames(user.getRoleId());
 		List<String> deptName = SysCache.getDeptNames(user.getDeptId());
 		List<String> postName = SysCache.getPostNames(user.getPostId());
-		userVO.setTenantName(tenant.getTenantName());
+		userVO.setTenantName(tenant==null?"":tenant.getTenantName());
 		userVO.setRoleName(Func.join(roleName));
 		userVO.setDeptName(Func.join(deptName));
 		userVO.setPostName(Func.join(postName));

--
Gitblit v1.9.3