xiejun
2023-06-15 8e6c58eec222c4bbea613e02703d9af22da72bee
Merge remote-tracking branch 'origin/master'
已修改39个文件
已添加20个文件
4733 ■■■■■ 文件已修改
Source/UBCS-WEB/package-lock.json 584 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/package.json 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/api/omd/OmdAttribute.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/api/template/setPersonnel.js 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/components/FormTemplate/index.vue 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/components/flow-cycle/components/ContextMenu.vue 90 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/components/flow-cycle/components/ContextMenuItem.vue 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/components/flow-cycle/components/CustomCommand.vue 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/components/flow-cycle/components/DetailForm.vue 208 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/components/flow-cycle/components/DetailPanel.vue 119 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/components/flow-cycle/components/EditorMinimap.vue 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/components/flow-cycle/components/Icon.vue 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/components/flow-cycle/components/ItemPanel.vue 485 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/components/flow-cycle/components/Toolbar.vue 130 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/components/flow-cycle/components/ToolbarButton.vue 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/components/flow-cycle/flowchartEditor.vue 230 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/components/flow-cycle/iconfont.js 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/components/template/SetPersonnel.vue 138 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/views/MasterData/FormTempalteTest.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/views/flow/flowPath.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/views/integration/applicationForm.vue 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/views/integration/systemInfo.vue 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/views/modeling/Business.vue 94 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/views/modeling/LinkType.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/views/modeling/Version.vue 57 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/views/modeling/cycle.vue 333 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/views/modeling/original.vue 41 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/views/modeling/originalAdd.vue 167 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/views/modeling/status.vue 35 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/vue.config.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-omd-api/pom.xml 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/feign/IWebSecretClient.java 184 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/feign/IWebSecretFallback.java 101 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/utils/VciOmdUtil.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/web/constant/FrameWorkBusLangCodeConstant.java 519 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/web/enumpck/DataSecretEnum.java 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmEngineServiceImpl.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmIOServiceImpl.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/util/ClientBusinessObject.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-omd/pom.xml 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/controller/AttributeController.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/controller/RevisionRuleController.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/controller/StatusController.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/feign/RevisionRuleClient.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/feign/StatusClient.java 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/feign/WebSecretClient.java 111 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/mapper/RevisionRuleMapper.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/mapper/StatusMapper.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/IAttributeService.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/IRevisionRuleService.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/IStatusService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/IWebSecretService.java 120 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/AttributeServiceImpl.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/RevisionRuleServiceImpl.java 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/StatusServiceImpl.java 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/WebSecretServiceImpl.java 376 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-omd/src/main/resources/mapper/RevisionRuleMapper.xml 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-omd/src/main/resources/mapper/StatusMapper.xml 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-user/src/main/java/com/vci/ubcs/system/user/wrapper/UserWrapper.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
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",
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"
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,
    }
  })
}
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
    })
  }
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 {
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>
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>
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 */) {
          // æ­£å‘命令逻辑
          console.log('执行正向命令')
          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>
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>
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>
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>
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>
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>
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>
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>
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>
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);
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>
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'
    };
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>
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()
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()
            }
        },
        // åˆ é™¤å•条
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>
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() {
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();
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>
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>
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: '枚举代号',
                        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>
}</style>
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() {
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',
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>
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) ;
}
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("获取数据失败");
    }
}
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 {
    /**
     * å°†List<EnumVO> è½¬æ¢ä¸ºKeyValue ç±»åž‹
     * @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;
    }
}
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;
/**
 * åŸºç¡€æ¡†æž¶ä¸­ä¸šåŠ¡éƒ¨åˆ†çš„å¤šè¯­è¨€ä»£ç 
 * @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";
    /**
     * è§£é”æˆåŠŸ
     */
    public static final String UNLOCK_SUCCESS = "unlockSuccess";
    /**
     * è§£é”å¤±è´¥
     */
    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";
    /**
     * ä¸Šçº§æ¡£æ¡ˆä¸å­˜åœ¨
     */
    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";
}
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;
    }
}
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<>();
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 {
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;
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>
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);
    }
    /**
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));
        }
    }
    /**
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));
        }
    }
    /**
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));
    }
    /**
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));
    }
    /**
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));
    }
}
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);
}
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);
}
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);
}
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;
    /**
     * æŸ¥çœ‹åº”用范围
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;
    /**
     * èŽ·å–çŠ¶æ€åˆ—è¡¨
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) ;
}
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("该属性已被使用,不允许删除");
        }
    }
}
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)));
    }
    /**
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);
                }
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));
    }
}
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>
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>
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));