xiejun
2023-12-29 f02a461cd0e0c6ad326cd71e3af733e3292407fc
Merge remote-tracking branch 'origin/master'
已修改47个文件
已删除93个文件
已添加10个文件
21024 ■■■■■ 文件已修改
Source/UBCS-WEB/dist/cdn/animate/3.5.2/animate.css 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/dist/cdn/avue/2.9.12/avue.min.js 11763 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/dist/cdn/avue/2.9.12/index.css 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/dist/cdn/axios/1.0.0/axios.min.js 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/dist/cdn/element-ui/2.15.6/index.js 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/dist/cdn/element-ui/2.15.6/theme-chalk/fonts/element-icons.ttf 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/dist/cdn/element-ui/2.15.6/theme-chalk/fonts/element-icons.woff 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/dist/cdn/element-ui/2.15.6/theme-chalk/index.css 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/dist/cdn/iconfont/avue/iconfont.css 201 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/dist/cdn/iconfont/avue/iconfont.eot 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/dist/cdn/iconfont/avue/iconfont.js 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/dist/cdn/iconfont/avue/iconfont.json 331 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/dist/cdn/iconfont/avue/iconfont.svg 164 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/dist/cdn/iconfont/avue/iconfont.ttf 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/dist/cdn/iconfont/avue/iconfont.woff 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/dist/cdn/iconfont/avue/iconfont.woff2 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/dist/cdn/iconfont/index.css 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/dist/cdn/iconfont/saber/iconfont.css 345 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/dist/cdn/iconfont/saber/iconfont.eot 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/dist/cdn/iconfont/saber/iconfont.js 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/dist/cdn/iconfont/saber/iconfont.json 583 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/dist/cdn/iconfont/saber/iconfont.svg 272 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/dist/cdn/iconfont/saber/iconfont.ttf 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/dist/cdn/iconfont/saber/iconfont.woff 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/dist/cdn/iconfont/saber/iconfont.woff2 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/dist/cdn/nutflow/wf-design-base/fonts/bpmn.08b5f281.eot 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/dist/cdn/nutflow/wf-design-base/fonts/bpmn.3c4c9f45.woff2 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/dist/cdn/nutflow/wf-design-base/fonts/bpmn.acbc6cbd.woff 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/dist/cdn/nutflow/wf-design-base/fonts/bpmn.f922519e.ttf 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/dist/cdn/nutflow/wf-design-base/fonts/codicon.22349029.ttf 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/dist/cdn/nutflow/wf-design-base/fonts/fontawesome-webfont.674f50d2.eot 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/dist/cdn/nutflow/wf-design-base/fonts/fontawesome-webfont.af7ae505.woff2 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/dist/cdn/nutflow/wf-design-base/fonts/fontawesome-webfont.b06871f2.ttf 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/dist/cdn/nutflow/wf-design-base/fonts/fontawesome-webfont.fee66e71.woff 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/dist/cdn/nutflow/wf-design-base/img/bpmn.1381b44e.svg 224 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/dist/cdn/nutflow/wf-design-base/img/fontawesome-webfont.912ec66d.svg 2671 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/dist/cdn/nutflow/wf-design-base/index.umd.min.js 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/dist/cdn/vue-router/3.0.1/vue-router.min.js 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/dist/cdn/vue/2.6.10/vue.min.js 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/dist/cdn/vuex/3.1.1/vuex.min.js 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/dist/cdn/xlsx/FileSaver.min.js 106 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/dist/cdn/xlsx/xlsx.full.min.js 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/dist/css/app.af2d3747.css 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/dist/css/chunk-5c036774.99dbf335.css 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/dist/css/chunk-vendors.06e716ef.css 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/dist/css/fontSize.css 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/dist/css/page.e84a6fd9.css 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/dist/css/views.e99249a9.css 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/dist/favicon.png 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/dist/img/bg/403.svg 508 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/dist/img/bg/404.svg 314 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/dist/img/bg/500.svg 208 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/dist/img/bg/bg.jpg 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/dist/img/bg/bg1.jpg 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/dist/img/bg/bg2.jpg 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/dist/img/bg/bg3.jpg 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/dist/img/bg/bg4.jpg 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/dist/img/bg/cloud.jpg 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/dist/img/bg/img-logo.png 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/dist/img/bg/login.png 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/dist/img/bg/logo.png 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/dist/img/bg/star-squashed.jpg 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/dist/img/bg/vip1.png 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/dist/img/bg/vip2.png 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/dist/img/bg/vip3.png 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/dist/img/bg/vip4.png 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/dist/img/logo.png 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/dist/img/mock/card/card-1.jpg 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/dist/img/mock/card/card-2.jpg 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/dist/img/mock/card/card-3.jpg 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/dist/img/mock/card/card-4.jpg 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/dist/img/mock/cli/1.png 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/dist/img/mock/cli/2.png 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/dist/img/mock/cli/3.png 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/dist/img/mock/iconfont.png 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/dist/img/pageLogo.jpeg 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/dist/index.html 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/dist/js/app.93b4f7c0.js 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/dist/js/chunk-2d0e4caf.ad4e1649.js 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/dist/js/chunk-5c036774.93a3e0c0.js 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/dist/js/chunk-vendors.ad9074df.js 315 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/dist/js/page.40fb2624.js 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/dist/js/views.10975736.js 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/dist/src/router/avue-router.js 199 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/dist/svg/loading-spin.svg 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/dist/util/aes.js 105 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/dist/util/font_4017492_2d1qk52m7xp.ttf 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/dist/util/font_4017492_2d1qk52m7xp.woff 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/dist/util/font_4017492_2d1qk52m7xp.woff2 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/dist/util/screen/guge.png 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/dist/util/screen/huohu.png 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/dist/util/screen/screen.css 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/dist/util/screen/screen.js 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/package.json 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/api/system/classifyAuth.js 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/api/system/menu.js 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/components/FormTemplate/FormTemplate.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/components/Master/MasterTree.vue 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/components/MasterCrud/VciMasterCrud.vue 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/components/StatisticsComponent/ColumnarChart.vue 112 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/components/StatisticsComponent/lineChart.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/components/StatisticsComponent/mixCart.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/components/StatisticsComponent/pieChart.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/components/Theme/ClassifyAuthDialog.vue 318 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/components/Theme/ThemeClassifyTrees.vue 212 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/components/advanced-query/advancedQuery.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/components/refer/vciWebRefer.vue 61 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/components/refer/vciWebReferDefalut.vue 235 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/components/refer/vciWebReferTable.vue 321 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/components/refer/vciWebReferTree.vue 124 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/const/code/codeKeyAttrRepeat.js 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/main.js 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/page/login/userlogin.vue 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/views/code/code.vue 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/views/code/codeKeyAttrRepeat.vue 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/views/integration/integrationIndex.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/views/integration/integrationTransfer.vue 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/views/statistic/statisticPage.vue 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/views/system/userinfo.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/pom.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-applyjtcodeservice-api/src/main/java/com/vci/ubcs/code/applyjtcodeservice/vo/DockingClassifyViewVO.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/feign/ICodeClassifyClient.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-system-api/src/main/java/com/vci/ubcs/system/entity/ClassifyAuth.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-system-api/src/main/java/com/vci/ubcs/system/feign/ISysClient.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-system-api/src/main/java/com/vci/ubcs/system/feign/ISysClientFallback.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-system-api/src/main/java/com/vci/ubcs/system/vo/ClassifyAuthVO.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-applyjtcodeservice/src/main/java/com/vci/ubcs/code/applyjtcodeservice/feigh/MdmInterJtClient.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-applyjtcodeservice/src/main/java/com/vci/ubcs/code/applyjtcodeservice/service/impl/GroupMdmInterServiceImpl.java 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/feign/CodeClassifyClient.java 20 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/mapper/CodeClassifyMapper.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeClassifyService.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeClassifyServiceImpl.java 83 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmEngineServiceImpl.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmIOServiceImpl.java 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/UniversalInterfaceImpl.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CodeCLassifyMapper.xml 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-system/pom.xml 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/controller/ClassifyAuthController.java 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/controller/MenuController.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/feign/SysClient.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/mapper/ClassifyAuthMapper.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/mapper/MenuMapper.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/service/IClassifyAuthService.java 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/service/IMenuService.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/service/impl/ClassifyAuthServiceImpl.java 171 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/service/impl/MenuServiceImpl.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/wrapper/ClassifyAuthWrapper.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-system/src/main/resources/mapper/ClassifyAuthMapper.xml 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-system/src/main/resources/mapper/MenuMapper.xml 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-user/src/main/java/com/vci/ubcs/system/user/service/impl/UserServiceImpl.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/dist/cdn/animate/3.5.2/animate.css
ÎļþÒÑɾ³ý
Source/UBCS-WEB/dist/cdn/avue/2.9.12/avue.min.js
ÎļþÒÑɾ³ý
Source/UBCS-WEB/dist/cdn/avue/2.9.12/index.css
ÎļþÒÑɾ³ý
Source/UBCS-WEB/dist/cdn/axios/1.0.0/axios.min.js
ÎļþÒÑɾ³ý
Source/UBCS-WEB/dist/cdn/element-ui/2.15.6/index.js
ÎļþÒÑɾ³ý
Source/UBCS-WEB/dist/cdn/element-ui/2.15.6/theme-chalk/fonts/element-icons.ttf
Binary files differ
Source/UBCS-WEB/dist/cdn/element-ui/2.15.6/theme-chalk/fonts/element-icons.woff
Binary files differ
Source/UBCS-WEB/dist/cdn/element-ui/2.15.6/theme-chalk/index.css
ÎļþÒÑɾ³ý
Source/UBCS-WEB/dist/cdn/iconfont/avue/iconfont.css
ÎļþÒÑɾ³ý
Source/UBCS-WEB/dist/cdn/iconfont/avue/iconfont.eot
Binary files differ
Source/UBCS-WEB/dist/cdn/iconfont/avue/iconfont.js
ÎļþÒÑɾ³ý
Source/UBCS-WEB/dist/cdn/iconfont/avue/iconfont.json
ÎļþÒÑɾ³ý
Source/UBCS-WEB/dist/cdn/iconfont/avue/iconfont.svg
ÎļþÒÑɾ³ý
Source/UBCS-WEB/dist/cdn/iconfont/avue/iconfont.ttf
Binary files differ
Source/UBCS-WEB/dist/cdn/iconfont/avue/iconfont.woff
Binary files differ
Source/UBCS-WEB/dist/cdn/iconfont/avue/iconfont.woff2
Binary files differ
Source/UBCS-WEB/dist/cdn/iconfont/index.css
ÎļþÒÑɾ³ý
Source/UBCS-WEB/dist/cdn/iconfont/saber/iconfont.css
ÎļþÒÑɾ³ý
Source/UBCS-WEB/dist/cdn/iconfont/saber/iconfont.eot
Binary files differ
Source/UBCS-WEB/dist/cdn/iconfont/saber/iconfont.js
ÎļþÒÑɾ³ý
Source/UBCS-WEB/dist/cdn/iconfont/saber/iconfont.json
ÎļþÒÑɾ³ý
Source/UBCS-WEB/dist/cdn/iconfont/saber/iconfont.svg
ÎļþÒÑɾ³ý
Source/UBCS-WEB/dist/cdn/iconfont/saber/iconfont.ttf
Binary files differ
Source/UBCS-WEB/dist/cdn/iconfont/saber/iconfont.woff
Binary files differ
Source/UBCS-WEB/dist/cdn/iconfont/saber/iconfont.woff2
Binary files differ
Source/UBCS-WEB/dist/cdn/nutflow/wf-design-base/fonts/bpmn.08b5f281.eot
Binary files differ
Source/UBCS-WEB/dist/cdn/nutflow/wf-design-base/fonts/bpmn.3c4c9f45.woff2
Binary files differ
Source/UBCS-WEB/dist/cdn/nutflow/wf-design-base/fonts/bpmn.acbc6cbd.woff
Binary files differ
Source/UBCS-WEB/dist/cdn/nutflow/wf-design-base/fonts/bpmn.f922519e.ttf
Binary files differ
Source/UBCS-WEB/dist/cdn/nutflow/wf-design-base/fonts/codicon.22349029.ttf
Binary files differ
Source/UBCS-WEB/dist/cdn/nutflow/wf-design-base/fonts/fontawesome-webfont.674f50d2.eot
Binary files differ
Source/UBCS-WEB/dist/cdn/nutflow/wf-design-base/fonts/fontawesome-webfont.af7ae505.woff2
Binary files differ
Source/UBCS-WEB/dist/cdn/nutflow/wf-design-base/fonts/fontawesome-webfont.b06871f2.ttf
Binary files differ
Source/UBCS-WEB/dist/cdn/nutflow/wf-design-base/fonts/fontawesome-webfont.fee66e71.woff
Binary files differ
Source/UBCS-WEB/dist/cdn/nutflow/wf-design-base/img/bpmn.1381b44e.svg
ÎļþÒÑɾ³ý
Source/UBCS-WEB/dist/cdn/nutflow/wf-design-base/img/fontawesome-webfont.912ec66d.svg
ÎļþÒÑɾ³ý
Source/UBCS-WEB/dist/cdn/nutflow/wf-design-base/index.umd.min.js
ÎļþÒÑɾ³ý
Source/UBCS-WEB/dist/cdn/vue-router/3.0.1/vue-router.min.js
ÎļþÒÑɾ³ý
Source/UBCS-WEB/dist/cdn/vue/2.6.10/vue.min.js
ÎļþÒÑɾ³ý
Source/UBCS-WEB/dist/cdn/vuex/3.1.1/vuex.min.js
ÎļþÒÑɾ³ý
Source/UBCS-WEB/dist/cdn/xlsx/FileSaver.min.js
ÎļþÒÑɾ³ý
Source/UBCS-WEB/dist/cdn/xlsx/xlsx.full.min.js
ÎļþÒÑɾ³ý
Source/UBCS-WEB/dist/css/app.af2d3747.css
ÎļþÒÑɾ³ý
Source/UBCS-WEB/dist/css/chunk-5c036774.99dbf335.css
ÎļþÒÑɾ³ý
Source/UBCS-WEB/dist/css/chunk-vendors.06e716ef.css
ÎļþÒÑɾ³ý
Source/UBCS-WEB/dist/css/fontSize.css
ÎļþÒÑɾ³ý
Source/UBCS-WEB/dist/css/page.e84a6fd9.css
ÎļþÒÑɾ³ý
Source/UBCS-WEB/dist/css/views.e99249a9.css
ÎļþÒÑɾ³ý
Source/UBCS-WEB/dist/favicon.png
Binary files differ
Source/UBCS-WEB/dist/img/bg/403.svg
ÎļþÒÑɾ³ý
Source/UBCS-WEB/dist/img/bg/404.svg
ÎļþÒÑɾ³ý
Source/UBCS-WEB/dist/img/bg/500.svg
ÎļþÒÑɾ³ý
Source/UBCS-WEB/dist/img/bg/bg.jpg
Binary files differ
Source/UBCS-WEB/dist/img/bg/bg1.jpg
Binary files differ
Source/UBCS-WEB/dist/img/bg/bg2.jpg
Binary files differ
Source/UBCS-WEB/dist/img/bg/bg3.jpg
Binary files differ
Source/UBCS-WEB/dist/img/bg/bg4.jpg
Binary files differ
Source/UBCS-WEB/dist/img/bg/cloud.jpg
Binary files differ
Source/UBCS-WEB/dist/img/bg/img-logo.png
Binary files differ
Source/UBCS-WEB/dist/img/bg/login.png
Binary files differ
Source/UBCS-WEB/dist/img/bg/logo.png
Binary files differ
Source/UBCS-WEB/dist/img/bg/star-squashed.jpg
Binary files differ
Source/UBCS-WEB/dist/img/bg/vip1.png
Binary files differ
Source/UBCS-WEB/dist/img/bg/vip2.png
Binary files differ
Source/UBCS-WEB/dist/img/bg/vip3.png
Binary files differ
Source/UBCS-WEB/dist/img/bg/vip4.png
Binary files differ
Source/UBCS-WEB/dist/img/logo.png
Binary files differ
Source/UBCS-WEB/dist/img/mock/card/card-1.jpg
Binary files differ
Source/UBCS-WEB/dist/img/mock/card/card-2.jpg
Binary files differ
Source/UBCS-WEB/dist/img/mock/card/card-3.jpg
Binary files differ
Source/UBCS-WEB/dist/img/mock/card/card-4.jpg
Binary files differ
Source/UBCS-WEB/dist/img/mock/cli/1.png
Binary files differ
Source/UBCS-WEB/dist/img/mock/cli/2.png
Binary files differ
Source/UBCS-WEB/dist/img/mock/cli/3.png
Binary files differ
Source/UBCS-WEB/dist/img/mock/iconfont.png
Binary files differ
Source/UBCS-WEB/dist/img/pageLogo.jpeg
Binary files differ
Source/UBCS-WEB/dist/index.html
ÎļþÒÑɾ³ý
Source/UBCS-WEB/dist/js/app.93b4f7c0.js
ÎļþÒÑɾ³ý
Source/UBCS-WEB/dist/js/chunk-2d0e4caf.ad4e1649.js
ÎļþÒÑɾ³ý
Source/UBCS-WEB/dist/js/chunk-5c036774.93a3e0c0.js
ÎļþÒÑɾ³ý
Source/UBCS-WEB/dist/js/chunk-vendors.ad9074df.js
ÎļþÒÑɾ³ý
Source/UBCS-WEB/dist/js/page.40fb2624.js
ÎļþÒÑɾ³ý
Source/UBCS-WEB/dist/js/views.10975736.js
ÎļþÒÑɾ³ý
Source/UBCS-WEB/dist/src/router/avue-router.js
ÎļþÒÑɾ³ý
Source/UBCS-WEB/dist/svg/loading-spin.svg
ÎļþÒÑɾ³ý
Source/UBCS-WEB/dist/util/aes.js
ÎļþÒÑɾ³ý
Source/UBCS-WEB/dist/util/font_4017492_2d1qk52m7xp.ttf
Binary files differ
Source/UBCS-WEB/dist/util/font_4017492_2d1qk52m7xp.woff
Binary files differ
Source/UBCS-WEB/dist/util/font_4017492_2d1qk52m7xp.woff2
Binary files differ
Source/UBCS-WEB/dist/util/screen/guge.png
Binary files differ
Source/UBCS-WEB/dist/util/screen/huohu.png
Binary files differ
Source/UBCS-WEB/dist/util/screen/screen.css
ÎļþÒÑɾ³ý
Source/UBCS-WEB/dist/util/screen/screen.js
ÎļþÒÑɾ³ý
Source/UBCS-WEB/package.json
@@ -30,6 +30,7 @@
    "portfinder": "1.0.23",
    "save": "2.9.0",
    "script-loader": "0.7.2",
    "uuid": "^9.0.1",
    "vue": "2.6.10",
    "vue-axios": "^2.1.2",
    "vue-clipboard2": "^0.3.3",
Source/UBCS-WEB/src/api/system/classifyAuth.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,29 @@
import request from '@/router/axios';
export const getClassifyAuthList = (params) => {
  return request({
    url: '/api/ubcs-system/classifyAuth/list',
    method: 'get',
    params: {
      ...params
    }
  })
}
export const saveOrUpdate = (data) => {
    return request({
      url: '/api/ubcs-system/classifyAuth/saveOrUpdate',
      method: 'post',
      data: data
    })
}
export const getAuthButtonList = (params) => {
  return request({
    url: '/api/ubcs-system/classifyAuth/getAuthButtonList',
    method: 'get',
    params: {
      ...params
    }
  })
}
Source/UBCS-WEB/src/api/system/menu.js
@@ -36,6 +36,16 @@
  })
}
export const getButtonByParentCode = (params) => {
  return request({
    url: '/api/ubcs-system/menu/getButtonByParentCode',
    method: 'get',
    params: {
      ...params
    }
  })
}
export const getMenuList = (current, size, params) => {
  return request({
    url: '/api/ubcs-system/menu/menu-list',
Source/UBCS-WEB/src/components/FormTemplate/FormTemplate.vue
@@ -25,6 +25,7 @@
      <template v-for="item in slotColumnList" :slot="item.prop + ''">
        <vciWebRefer
          v-if="item.type == 'refer'" :key="item.dataKey"
          referType="master"
          :data-key="item.dataKey"
          :disabled="item.disabled"
          :display="item.display"
Source/UBCS-WEB/src/components/Master/MasterTree.vue
@@ -3,8 +3,9 @@
    <avue-tree ref="tree" v-model="CloneTreeAvueform" v-loading="loading" :data="Treedata" :defaultExpandAll="false"
               :option="Treeoption" style="width: fit-content;" @node-click="nodeClick">
      <template slot-scope="{ node }">
        <el-tooltip class="item" effect="dark"  open-delay="350" :content="$createElement('div', { domProps: { innerHTML: node.label } })"  placement="right-start">
          <span id="labelSize" v-html="node.label" ></span>
        <el-tooltip :content="$createElement('div', { domProps: { innerHTML: node.label } })" class="item" effect="dark"
                    open-delay="350" placement="right-start">
          <span id="labelSize" v-html="node.label"></span>
        </el-tooltip>
      </template>
    </avue-tree>
@@ -101,6 +102,7 @@
      const index = this.$route.query.id.indexOf('@');
      const result = this.$route.query.id.substring(0, index);
      this.idData = result;
      this.removeList();
      getTreeList({'conditionMap[id]': this.idData}).then(res => {
        if (res) {
          if (res.data.length === 0) {
@@ -126,7 +128,13 @@
        this.$message.error(res)
      });
    },
    removeList() {
      this.$emit('tableHeadDataFateher', []);
      this.$emit('tableHeadFindData', []);
      this.$emit('tableHeadBttoms', []);
      this.$emit('tableDataArray', [])
      this.$emit('total', null)
    },
    //定义一个修改数据属性名的方法
    ModifyProperties(obj, oldName, newName) {
      for (let key in obj) {
@@ -180,10 +188,11 @@
          List.forEach(item => {
            let columnItem = {
              label: item.title,
              prop: item.queryField,
              prop: item.field,
              // type: this.columnType[item.type],
              sortable: item.sort,
              width: item.minWidth
              width: item.minWidth,
              query: item.queryField
            };
            this.tableHeadFindData.push(Object.assign(item, columnItem))
          })
@@ -246,7 +255,8 @@
  margin-left: 6px;
  font-size: 18px;
}
#labelSize{
#labelSize {
  font-size: 14px !important;
}
</style>
Source/UBCS-WEB/src/components/MasterCrud/VciMasterCrud.vue
@@ -17,20 +17,21 @@
              </el-button>
              <span v-if="tableHeadFindData.length > 0 ">
              <el-select slot="prepend" v-model="keyWordFind" placeholder="请选择" size="small" @change="searchChange">
                <el-option v-for="item in tableHeadFindData" :key="item.id" :label="item.label" :value="item.prop" ></el-option>
                <el-option v-for="item in tableHeadFindData" :key="item.id" :label="item.label"
                           :value="item.query"></el-option>
              </el-select>
              <el-input v-model="WupinFindValue" placeholder="请输入关键字按回车查询"
                        size="small" style="width: 180px; margin-left: 5px; margin-top: 10px" v-if="!isTimeStatus"
              <el-input v-if="!isTimeStatus" v-model="WupinFindValue"
                        placeholder="请输入关键字按回车查询" size="small" style="width: 180px; margin-left: 5px; margin-top: 10px"
                        @keyup.enter.native="tableFindInp"></el-input>
              </span>
              <span class="block"  v-if="tableHeadFindData.length > 0  && isTimeStatus">
              <span v-if="tableHeadFindData.length > 0  && isTimeStatus" class="block">
                <el-date-picker
                  v-model="dateValue"
                  placeholder="选择日期"
                  size="small"
                  type="date"
                  style="margin-left: 5px"
                  @change="dateChange"
                  placeholder="选择日期">
                  type="date"
                  @change="dateChange">
                </el-date-picker>
              </span>
              <span v-if="tableHeadFindData.length > 0" style="margin-left: 10px">
@@ -265,9 +266,9 @@
  },
  data() {
    return {
      isTimeStatus:false,
      isTimeName:'',
      dateValue:"",
      isTimeStatus: false,
      isTimeName: '',
      dateValue: "",
      //批量编辑对话框
      bulkeditvisible: false,
      LinkVisible: false,
@@ -317,7 +318,6 @@
        key: "oid",
        label: "name",
      },
      tableHeadFindDatas: [],
      applyvisible: false,
      amendvisible: false,
      addvisible: false,
@@ -395,7 +395,10 @@
    },
    tableHeadDataFateher: {
      handler(newval, oldval) {
        this.options = newval.tableDefineVO.seniorQueryColumns
        // console.log(newval)
        if (newval.length > 0) {
          this.options = newval.tableDefineVO.seniorQueryColumns
        }
      }
    },
    codeClassifyOid: {
@@ -407,16 +410,20 @@
    tableDataArray: {
      handler(newval, oldval) {
        this.tableData = newval;
        this.searchResults = newval
        this.searchResults = newval;
        this.doLayout();
        this.fileOptions = {
          ownbizOid: "0",
          ownbizBtm: "0",
          fileDocClassify: '!=processAuditSuggest',
          fileDocClassifyName: '',
          hasDownload: true,
          hasUpload: true,
          height: 'auto'
        if (newval.length > 0) {
          this.fileOptions = {
            ownbizOid: "0",
            ownbizBtm: "0",
            fileDocClassify: '!=processAuditSuggest',
            fileDocClassifyName: '',
            hasDownload: true,
            hasUpload: true,
            height: 'auto'
          }
        } else {
          this.fileOptions = {};
        }
      },
    },
@@ -439,14 +446,14 @@
          if (_index == 0) {
            this.keyWordFind = record.queryField;
          };
          }
          ;
          // if(record.fieldType === "datetime"){
          //       this.isTimeStatus = true;
          //       console.log(this.isTimeStatus)
          //       console.log(record)
          // }
        })
        this.tableHeadFindDatas = newval;
        if (newval) {
          this.CodeArray = [];
          if (newval.find(item => item.prop === 'id')) {
@@ -1029,7 +1036,7 @@
          templateOid: this.templateOid,
          codeClassifyOid: this.codeClassifyOid,
          ...val,
          page: this.page.currentPage = 1,/** æ¯æ¬¡ç‚¹å‡»é«˜çº§æŸ¥è¯¢éƒ½åº”该从第一页开始*/
          page: this.page.currentPage = 1, /** æ¯æ¬¡ç‚¹å‡»é«˜çº§æŸ¥è¯¢éƒ½åº”该从第一页开始*/
          limit: this.page.pageSize
        });
        this.tableData = res.data.data;
@@ -1118,8 +1125,8 @@
      });
      // console.log(this.isTimeStatus)
    },
    dateChange(val){
      if(val){
    dateChange(val) {
      if (val) {
        const momentDate = moment(this.dateValue);
        const dateString = momentDate.format("yyyy-MM-DD");
        this.isLoading = true;
@@ -1129,7 +1136,7 @@
            codeClassifyOid: this.codeClassifyOid,
            page: this.page.currentPage,
            limit: this.page.pageSize,
            ['conditionMap[' + this.keyWordFind + ']']:  dateString
            ['conditionMap[' + this.keyWordFind + ']']: dateString
          }).then(res => {
            this.tableData = res.data.data;
            this.page.total = res.data.total;
@@ -1143,8 +1150,10 @@
    tableFindInp() {
      this.isLoading = true;
      try {
        this.conditionMap = {};
        // å­˜å‚¨æŸ¥è¯¢æ¡ä»¶ï¼Œä¸»è¦æ˜¯ä¸ºäº†ç‚¹å‡»é¡µç æ—¶å¸¦ä¸Šè¿™ä¸ªæ¡ä»¶
        this.conditionMap["conditionMap[" + this.keyWordFind + "]"] = '*' + this.WupinFindValue + '*';
        console.log(this.conditionMap)
        TableData({
          templateOid: this.templateOid,
          codeClassifyOid: this.codeClassifyOid,
Source/UBCS-WEB/src/components/StatisticsComponent/ColumnarChart.vue
@@ -2,7 +2,7 @@
  <basic-container>
    <v-chart id="chart" :auto-resize="true" :options="chartOptions"></v-chart>
    <div style="display: inline-block;float: right;margin-bottom: 10px;margin-right: 60px">
      <el-button size="small" type="primary" plain @click="delHandler">删除</el-button>
      <el-button size="small" type="danger" plain @click="delHandler">删除</el-button>
    </div>
  </basic-container>
</template>
@@ -12,94 +12,66 @@
import 'echarts/lib/component/tooltip'
import 'echarts/lib/component/title'
import 'echarts/lib/component/legend'
import {deleteChartId} from "@/api/statistic/chart"
import { deleteChartId } from "@/api/statistic/chart"
export default {
  name: "ColumnarChart",
  props:{
    columnarData:{
      type:Array,
      default:[]
  props: {
    columnarData: {
      type: Array,
      default: []
    },
    chartName:{
      type:String,
    chartName: {
      type: String,
      default: ""
    },
    btmname :{
    btmname: {
      type: String
    }
  },
  watch:{
    columnarData:{
      immediate:true,
      handler(newval,oldval){
        if(newval && newval.length > 0){
          const minValues = newval[0].map(function (_, i) {
            return Math.min.apply(
              null,
              newval.map(function (item) {
                return item[i];
              })
            );
          });
          let colors = ['#84C9E5', '#F68686'];
          const seriesData = [];
          for (let i = 0; i < newval.length; i++) {
            let curSeriesData = [];
            for (let j = 0; j < newval[i].length; j++) {
              let borderRadius = [0, 0, 0, 0];
              if (newval[i][j] === minValues[j]) {
                borderRadius = [50, 50, 0, 0];
              }
              curSeriesData.push({
                value: newval[i][j],
                itemStyle: {
                  normal: {
                    // barBorderRadius: borderRadius,  // è®¾ç½®åœ†è§’
                    color: colors[i],
                  }
                },
              });
            }
            let seriesName = (i === 0 ? "总量" : "新增")
            seriesData.push({
              name: seriesName,
              type: "bar",
              stack: "总量",
              barWidth: 60,
              data: curSeriesData,
  watch: {
    columnarData: {
      immediate: true,
      handler(newval, oldval) {
        if (newval && newval.length > 0) {
          let seriesData = newval.map((data, index) => {
            let name = index === 0 ? "总量" : "新增";
            return {
              name: name,
              type: 'bar',
              data: data,
              barWidth: '40%',
              label: {
                show: true,
                position: 'top',
                formatter: function (params) {
                  return params.value === 0 ? '' : params.value; // å€¼ä¸º 0 ä¸æ˜¾ç¤ºï¼Œå…¶ä»–情况显示
                }
                // formatter: function (params) {
                //   if (params.value !== 0) {
                //     return params.value;
                //   } else {
                //     return '';
                //   }
                // }
              },
              emphasis: {
                focus: "series",
              },
            });
            this.chartOptions.series=seriesData
          }
            };
          });
          this.chartOptions.series = seriesData;
        }
      }
    },
    chartName:{
      handler(newval,oldval){
        if(newval){
    chartName: {
      handler(newval, oldval) {
        if (newval) {
          this.chartOptions.title.text = newval + "数据统计"
        }
      },
      immediate:true,
      deep:true
      immediate: true,
      deep: true
    }
  },
  data() {
    return {
      chartOptions: {
        color:['#84C9E5', '#F68686'],
        color: ['#84C9E5', '#F68686'],
        title: {
          text: "",
        },
@@ -148,12 +120,12 @@
  },
  created() {
  },
  methods:{
    delHandler(){
      deleteChartId({btmname:this.btmname,chartId:'2'}).then(res=>{
        this.$message.success('删除成功')
  methods: {
    delHandler() {
      deleteChartId({ btmname: this.btmname, chartId: '2' }).then(res => {
        this.$message.success(this.chartName+'柱状图,删除成功!')
        this.$emit('refresh');
      }).catch(error=>{
      }).catch(error => {
        this.$message.error(error)
      })
    }
Source/UBCS-WEB/src/components/StatisticsComponent/lineChart.vue
@@ -3,7 +3,7 @@
    <basic-container>
      <v-chart id="chart" :auto-resize="true" :options="chartOptions"></v-chart>
      <div style="display: inline-block;float: right;margin-bottom: 10px;margin-right: 60px">
        <el-button size="small" type="primary" plain @click="delHandler">删除</el-button>
        <el-button size="small" type="danger" plain @click="delHandler">删除</el-button>
      </div>
    </basic-container>
  </div>
@@ -96,7 +96,7 @@
  methods:{
    delHandler(){
      deleteChartId({btmname:this.btmname,chartId:'0'}).then(res=>{
        this.$message.success('删除成功')
        this.$message.success(this.chartName+'折线图,删除成功!')
        this.$emit('refresh');
      }).catch(error=>{
        this.$message.error(error)
Source/UBCS-WEB/src/components/StatisticsComponent/mixCart.vue
@@ -2,7 +2,7 @@
  <basic-container>
    <v-chart id="chart" :auto-resize="true" :options="chartOptions"></v-chart>
    <div style="display: inline-block;float: right;margin-bottom: 10px;margin-right: 60px">
      <el-button size="small" type="primary" plain @click="delHandler">删除</el-button>
      <el-button size="small" type="danger" plain @click="delHandler">删除</el-button>
    </div>
  </basic-container>
</template>
@@ -120,7 +120,7 @@
  methods:{
    delHandler(){
      deleteChartId({btmname:this.btmname,chartId:'3'}).then(res=>{
        this.$message.success('删除成功')
        this.$message.success(this.chartName+'堆叠折线图,删除成功!')
        this.$emit('refresh');
      }).catch(error=>{
        this.$message.error(error)
Source/UBCS-WEB/src/components/StatisticsComponent/pieChart.vue
@@ -2,7 +2,7 @@
  <basic-container style="width: 100%">
    <v-chart :options="chartOptions" :auto-resize="true" id="chart"></v-chart>
    <div style="display: inline-block;float: right;margin-bottom: 10px;margin-right: 60px">
      <el-button size="small" type="primary" plain @click="delHandler">删除</el-button>
      <el-button size="small" type="danger" plain @click="delHandler">删除</el-button>
    </div>
  </basic-container>
</template>
@@ -106,7 +106,7 @@
  methods:{
    delHandler(){
      deleteChartId({btmname:this.btmname,chartId:'1'}).then(res=>{
        this.$message.success('删除成功')
        this.$message.success(this.chartName+'饼状图,删除成功!')
        this.$emit('refresh');
      }).catch(error=>{
        this.$message.error(error)
Source/UBCS-WEB/src/components/Theme/ClassifyAuthDialog.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,318 @@
<template>
  <el-dialog
    v-dialogDrag
    :close-on-click-modal="false"
    :visible.sync="isShowDialog"
    append-to-body
    class="avue-dialog avue-dialog--top"
    title="分类授权"
    top="-45px" @close="closeDialog">
    <el-table
      ref="dataTable"
      v-loading="isLoading"
      :data="classifyAuthData"
      :header-cell-style="{ background: '#FAFAFA', color: '#505050' }"
      :height="tableHeight"
      border
      class="cus-table"
      @select="handleSelection"
      @row-click="handleRowClick"
      @select-all="handleSelectionAll"
      @selection-change="handleSelectionChange"
      @sort-change="sortChange"
    >
      <el-table-column
        type="selection"
        width="55"
      ></el-table-column>
      <el-table-column
        v-for="(item, index) in classifyAuthHeader"
        v-if="classifyAuthHeader.length !== 0"
        :key="index"
        :label="item.label"
        :prop="item.prop"
        :show-overflow-tooltip="true"
        :width="item.width"
        align="center"
      >
        <template slot-scope="{ row }">
          <el-select
            v-if="item.type === 'select'"
            slot="prepend"
            v-model="row[item.prop]"
          >
            <el-option
              v-for="optionItem in roleList"
              :key="optionItem.id"
              :label="optionItem.roleName"
              :value="optionItem.id"
            >
            </el-option>
          </el-select>
          <el-input
            v-if="item.type === 'text'"
            v-model="row[item.prop]"
            readonly
            type="text"
          >
          </el-input>
          <el-checkbox
            v-if="item.type === 'checkbox'"
            v-model="row[item.prop]">
          </el-checkbox>
        </template>
      </el-table-column>
    </el-table>
    <div slot="footer" class="dialog-footer">
      <el-button class="el-icon-plus" type="success" plain @click="addClassifyAuth"></el-button>
      <el-button class="el-icon-minus" type="warning" plain @click="subClassifyAuth"></el-button>
      <el-button type="primary" plain @click="submit">提 äº¤</el-button>
      <el-button type="danger" plain @click="isShowDialog = false">关 é—­</el-button>
    </div>
  </el-dialog>
</template>
<script>
import {getButtonByParentCode} from "@/api/system/menu"
import {getPage} from "@/api/system/role"
import {saveOrUpdate, getClassifyAuthList} from "@/api/system/classifyAuth"
import {v4 as uuidv4} from 'uuid';
export default {
  name: "classifyAuthDialog.vue",
  props: {
    classifyData: {
      type: "Object",
      default: "",
    },
    /**对话框显示隐藏控制*/
    visible: {
      type: "Boolean",
      default: false,
    },
  },
  data() {
    return {
      // å¯¹è¯æ¡†æ˜¾ç¤ºæŽ§åˆ¶
      isShowDialog: this.visible,
      isLoading: false,
      tableHeight: 'calc(100vh - 550px)',
      classifyAuthData: [],
      //列头
      classifyAuthHeader: [],
      //按钮数据
      classifyAuthButton: [],
      //角色列表
      roleList: [],
      //当前选中的表格行
      selectList: [],
    };
  },
  watch: {
    // ç›‘听父组件传的窗口显示隐藏的值
    visible() {
      if (this.visible) {
        this.isShowDialog = this.visible;
        return new Promise((resolve, reject) => {
          getButtonByParentCode({code: "classifyTree"}).then(res => {
            // è®°å½•按钮数据
            this.classifyAuthButton = res.data.data;
            const list = res.data.data;
            let tempData = [];
            // è§’色列
            tempData.push({
              label: "角色",
              prop: "roleData",
              type: "select",
              width: 150,
            });
            // ç¼–码项分类授权
            tempData.push({
              label: "编码项分类授权",
              prop: "classifyItem",
              type: "text",
              width: 180,
            });
            list.forEach(item => {
              let columnItem = {
                label: item.name,
                prop: item.id,
                type: "checkbox",
                width: 180,
              };
              tempData.push(columnItem);
            })
            this.classifyAuthHeader = tempData
            resolve();
          }).catch(err => {
            reject(err)
          });
          // èŽ·å–è§’è‰²åˆ—è¡¨
          getPage(1, -1, null).then(res => {
            this.roleList = res.data.data.records;
          });
          // èŽ·å–è¯¥åˆ†ç±»ä¸‹å·²æŽˆæƒçš„åˆ†ç±»æŽˆæƒä¿¡æ¯
          getClassifyAuthList({classifyId: this.classifyData.oid}).then(res => {
            //console.log(res.data.data);
            let authDatas = res.data.data;
            if (authDatas.length > 0) {
              authDatas.forEach(authData => {
                let item = {
                  oid: authData.oid,
                  roleData: authData.roleId,
                  classifyItem: this.classifyData.label,
                  uuid: uuidv4(),//生成唯一的id
                }
                //将按钮设置进去
                authData.buttonIdList.forEach(data => {
                  Vue.set(item, data, true);
                });
                //console.log(item)
                this.classifyAuthData.push(item);
              })
            }
          });
        });
      }
    },
  },
  computed: {},
  mounted() {
  },
  created() {
  },
  methods: {
    // å…³é—­å¯¹è¯æ¡†
    closeDialog() {
      this.$emit('update:visible', false);
      this.classifyAuthData = [];
    },
    // å¢žåŠ è¡Œ
    addClassifyAuth() {
      let item = {
        roleData: this.roleList[0].id,
        classifyItem: this.classifyData.label,
        uuid: uuidv4(),//生成唯一的id
      }
      //将按钮设置进去
      this.classifyAuthButton.forEach(data => {
        Vue.set(item, data.id, false);
      })
      //console.log(item)
      this.classifyAuthData.push(item)
      // console.log(this.classifyAuthData);
    },
    // åˆ é™¤è¡Œ
    subClassifyAuth() {
      for (let item of this.selectList) {
        let index = this.classifyAuthData.findIndex(data => data.index === item.index);
        if (index !== -1) {
          this.classifyAuthData.splice(index, 1);
        }
      }
    },
    handleRowClick(row, column) {
      this.selectList.push(row);
      this.$refs.dataTable.toggleRowSelection(row);
    },
    // å¤šé€‰
    handleSelectionChange(list) {
      this.selectList = list;
      //console.log("多选");
    },
    // é€‰æ‹©å…¨éƒ¨
    handleSelectionAll(list) {
      this.selectList = list;
    },
    // ä¿å­˜åˆ†ç±»æŽˆæƒä¿¡æ¯
    submit() {
      if (this.classifyAuthData.length <= 0) {
        this.$message.warning('授权列表为空!')
        return;
      }
      let isRepeat = false;
      // éåŽ†æ•°ç»„ï¼Œæ¯”è¾ƒåŽé¢çš„å¯¹è±¡çš„roleData是否与前面的对象相等
      for (let i = 0; i < this.classifyAuthData.length - 1; i++) {
        let currentRoleId = this.classifyAuthData[i].roleData;
        for (let j = i + 1; j < this.classifyAuthData.length; j++) {
          if (currentRoleId === this.classifyAuthData[j].roleData) {
            isRepeat = true;
            break;
          }
        }
        if (isRepeat) {
          break;
        }
      }
      if (isRepeat) {
        this.$message.warning("角色和分类已经存在,请重新配置!");
        return;
      }
      let form = [];
      let flag = false;
      this.classifyAuthData.forEach(item => {
        let itemButtonList = [];
        //筛选出按钮勾选为true的列
        for (let key in item) {
          if (item[key] === true) {
            itemButtonList.push(key);
          }
        }
        /**如果itemButtonList为空证明是,
         æ·»åŠ äº†è§’è‰²ä½†æ˜¯æ²¡å‹¾é€‰ä»»ä½•çš„æŒ‰é’®*/
        if (itemButtonList.length <= 0) {
          flag = true;
          return;
        }
        let data = {
          oid: item.oid,
          roleId: item.roleData,
          classifyId: this.classifyData.oid,
          buttonIds: itemButtonList.join(","),
        }
        form.push(data);
      });
      if (flag) {
        this.$message.warning('有未勾选操作的权限,不允许授权')
        return;
      }
      // console.log(form)
      // è°ƒç”¨ä¿å­˜åˆ†ç±»æŽˆæƒçš„æŽ¥å£
      saveOrUpdate(form).then(res => {
        this.$message({
          type: "success",
          message: res.data.msg,
        });
        // this.isShowDialog = false
      }, (error) => {
        window.console.log(error);
      })
    },
  },
};
</script>
<style lang="scss" scoped>
// æ»šåŠ¨æ¡æ ·å¼ä¿®æ”¹
// æ»šåŠ¨æ¡çš„å®½åº¦
/deep/ .el-table__body-wrapper::-webkit-scrollbar {
  height: 15px; // çºµå‘滚动条 å¿…写
  background: white;
  border: white;
  width: 10px;
}
// æ»šåŠ¨æ¡çš„æ»‘å—
/deep/ .el-table__body-wrapper::-webkit-scrollbar-thumb {
  background-color: #ececec;
  border-radius: 20px;
  border: #ececec;
}
/deep/ .el-table__body-wrapper {
  height: calc(100% - 50px) !important;
}
</style>
Source/UBCS-WEB/src/components/Theme/ThemeClassifyTrees.vue
@@ -32,88 +32,98 @@
              </div>
            </div>
            <div style="display: flex;margin-top: 5px;margin-bottom: 5px">
              <el-button v-if="permissionList.flowingBtnStuatus" plain size="mini" type="primary" @click="testHandler">流水处理
              <el-button v-if="permissionList.flowingBtnStuatus" plain size="mini" type="primary"
                         @click="flowingDependHandler">流水处理
              </el-button>
              <el-button v-if="permissionList.classifyAuth" plain size="mini" type="primary"
                         @click="classifyAuthHandler">分类授权
              </el-button>
            </div>
          </div>
        </div>
          <!--          å·¦ä¾§æ ‘-->
          <div style="height: calc(100vh - 230px);overflow: auto">
            <avue-tree ref="tree" v-model="CloneTreeAvueform" v-loading="loading" :data="CloneTreedata"
                       :defaultExpandAll="false"
                       :option="Treeoption"
                       class="classifyTree"
                       style="height: calc(100vh - 290px)"
                       @node-click="nodeClick"
            >
              <template slot-scope="{ node, data }" class="el-tree-node__label">
                <el-tooltip :content="$createElement('div', { domProps: { innerHTML: node.label } })" class="item" effect="dark"
                            open-delay="500"
                            placement="right-start">
        <!-- å·¦ä¾§æ ‘-->
        <div style="height: calc(100vh - 230px);overflow: auto">
          <avue-tree ref="tree" v-model="CloneTreeAvueform" v-loading="loading" :data="CloneTreedata"
                     :defaultExpandAll="false"
                     :option="Treeoption"
                     class="classifyTree"
                     style="height: calc(100vh - 290px)"
                     @node-click="nodeClick"
          >
            <template slot-scope="{ node, data }" class="el-tree-node__label">
              <el-tooltip :content="$createElement('div', { domProps: { innerHTML: node.label } })" class="item"
                          effect="dark"
                          open-delay="500"
                          placement="right-start">
                <span style="font-size: 14px;">
                {{ (node || {}).label }}
              </span>
                </el-tooltip>
              </template>
            </avue-tree>
          </div>
              </el-tooltip>
            </template>
          </avue-tree>
        </div>
          <!--        æ ‘节点添加对话框-->
          <el-dialog v-loading="AddLoading" :before-close="TreeEscHandler"
                     :title="this.TreeFlag ? '添加分类' :'添加主题库'" :visible.sync="TreeAddFormVisible" append-to-body
                     style="width: 1700px;margin: auto">
            <el-form ref="myForm" :model="TreeAddform" :rules=  "rules">
              <el-form-item :label="this.TreeFlag ? '分类编号:' :'主题库编号:'" label-width="150px" prop="id"
                            style="display: inline-block">
                <el-input v-model="TreeAddform.id" autocomplete="off" style="width: 170px"></el-input>
              </el-form-item>
              <el-form-item :label="this.TreeFlag ? '分类名称:' :'主题库名称:'" label-width="110px" prop="name"
                            style="display: inline-block">
                <el-input v-model="TreeAddform.name" autocomplete="off" style="width: 170px"></el-input>
              </el-form-item>
              <el-form-item v-if="TreeFlagCode" label="存储的业务类型:" label-width="150px" prop="btmTypeName">
                <el-input v-model="TreeAddform.btmTypeName" autocomplete="off" style="width: 585px"
                          @focus="btmFoucus"></el-input>
              </el-form-item>
              <el-form-item label="描述:" label-width="150px">
                <el-input v-model="TreeAddform.description" autocomplete="off" style="width: 585px"></el-input>
              </el-form-item>
              <el-form-item label="编码规则:" label-width="150px">
                <el-input v-model="TreeAddform.codeRuleOidName" autocomplete="off" style="width: 585px"
                          @focus="CodeFoucus"></el-input>
              </el-form-item>
              <el-form-item label="关键属性查询规则:" label-width="150px">
                <el-input v-model="TreeAddform.codeKeyAttrRepeatOidName" autocomplete="off" style="width: 585px"
                          @focus="Keyfouce"></el-input>
              </el-form-item>
              <el-form-item label="是否参与关键属性校验:" label-width="170px">
                <el-switch
                  v-model="TreeAddform.codeKeyAttrValue"
                  active-color="#13ce66"
                  active-text="是"
                  inactive-color="#ff4949"
                  inactive-text="否"
                  @change="switchChange">
                </el-switch>
              </el-form-item>
              <el-form-item label="相似查询规则:" label-width="150px">
                <el-input v-model="TreeAddform.codeResembleRuleOidName" autocomplete="off" style="width: 585px"
                          @focus="simFouce"></el-input>
              </el-form-item>
            </el-form>
            <div slot="footer" class="dialog-footer">
              <el-button @click="TreeEscHandler">取 æ¶ˆ</el-button>
              <el-button type="primary" @click="TreeAddHandler">ç¡® å®š</el-button>
            </div>
          </el-dialog>
          <!--        ä¿®æ”¹å¯¹è¯æ¡†-->
          <el-dialog :visible.sync="TreeEditFormVisible" append-to-body title="修改分类">
            <classifyTreeform ref="childForm" :Editclose=" ()=>{TreeEditFormVisible=false}" :TreeFlag="editTreeFLagCode"
                              :flag="'edit'"
                              :loneTreeNewForm="TreeList" :nodeClickList="nodeClickList"
                              :nodeList="nodeList" @MasterHandler="MasterHandler" @flushed="flushed"
                              @referTreeForm="referTreeForm"></classifyTreeform>
          </el-dialog>
        <!-- æ ‘节点添加对话框-->
        <el-dialog v-loading="AddLoading" :before-close="TreeEscHandler"
                   :title="this.TreeFlag ? '添加分类' :'添加主题库'" :visible.sync="TreeAddFormVisible" append-to-body
                   style="width: 1700px;margin: auto">
          <el-form ref="myForm" :model="TreeAddform" :rules="rules">
            <el-form-item :label="this.TreeFlag ? '分类编号:' :'主题库编号:'" label-width="150px" prop="id"
                          style="display: inline-block">
              <el-input v-model="TreeAddform.id" autocomplete="off" style="width: 170px"></el-input>
            </el-form-item>
            <el-form-item :label="this.TreeFlag ? '分类名称:' :'主题库名称:'" label-width="110px" prop="name"
                          style="display: inline-block">
              <el-input v-model="TreeAddform.name" autocomplete="off" style="width: 170px"></el-input>
            </el-form-item>
            <el-form-item v-if="TreeFlagCode" label="存储的业务类型:" label-width="150px" prop="btmTypeName">
              <el-input v-model="TreeAddform.btmTypeName" autocomplete="off" style="width: 585px"
                        @focus="btmFoucus"></el-input>
            </el-form-item>
            <el-form-item label="描述:" label-width="150px">
              <el-input v-model="TreeAddform.description" autocomplete="off" style="width: 585px"></el-input>
            </el-form-item>
            <el-form-item label="编码规则:" label-width="150px">
              <el-input v-model="TreeAddform.codeRuleOidName" autocomplete="off" style="width: 585px"
                        @focus="CodeFoucus"></el-input>
            </el-form-item>
            <el-form-item label="关键属性查询规则:" label-width="150px">
              <el-input v-model="TreeAddform.codeKeyAttrRepeatOidName" autocomplete="off" style="width: 585px"
                        @focus="Keyfouce"></el-input>
            </el-form-item>
            <el-form-item label="是否参与关键属性校验:" label-width="170px">
              <el-switch
                v-model="TreeAddform.codeKeyAttrValue"
                active-color="#13ce66"
                active-text="是"
                inactive-color="#ff4949"
                inactive-text="否"
                @change="switchChange">
              </el-switch>
            </el-form-item>
            <el-form-item label="相似查询规则:" label-width="150px">
              <el-input v-model="TreeAddform.codeResembleRuleOidName" autocomplete="off" style="width: 585px"
                        @focus="simFouce"></el-input>
            </el-form-item>
          </el-form>
          <div slot="footer" class="dialog-footer">
            <el-button @click="TreeEscHandler">取 æ¶ˆ</el-button>
            <el-button type="primary" @click="TreeAddHandler">ç¡® å®š</el-button>
          </div>
        </el-dialog>
        <!-- ä¿®æ”¹å¯¹è¯æ¡†-->
        <el-dialog :visible.sync="TreeEditFormVisible" append-to-body title="修改分类">
          <classifyTreeform ref="childForm" :Editclose=" ()=>{TreeEditFormVisible=false}" :TreeFlag="editTreeFLagCode"
                            :flag="'edit'"
                            :loneTreeNewForm="TreeEditObj" :nodeClickList="nodeClickList"
                            :nodeList="nodeList" @MasterHandler="MasterHandler" @flushed="flushed"
                            @referTreeForm="referTreeForm"></classifyTreeform>
        </el-dialog>
        <!-- åˆ†ç±»æŽˆæƒå¯¹è¯æ¡†-->
        <classify-auth-dialog
          :classifyData="classifyData"
          :visible.sync="classifyAuthVisible"
        ></classify-auth-dialog>
      </basic-container>
    </el-aside>
    <el-main>
@@ -121,7 +131,7 @@
        <!--        å³ä¾§è¡¨æ ¼-->
        <avue-tabs :option="tabOption" @change="handleChange"></avue-tabs>
        <span v-if="type.prop==='tab1'">
           <classifyTreeform ref="childForm" :flag="'renonly'" :loneTreeNewForm="TreeList"
           <classifyTreeform ref="childForm" :flag="'renonly'" :loneTreeNewForm="TreeEditObj"
                             :nodeList="nodeList"></classifyTreeform>
        </span>
        <span v-else-if="type.prop==='tab2'">
@@ -440,8 +450,10 @@
import {defaultReferDataGrid, referDataGrid} from '@/api/MasterData/master'
import func from "@/util/func";
import {mapGetters} from "vuex";
import ClassifyAuth from './ClassifyAuthDialog.vue';
export default {
  components: {ClassifyAuth},
  name: "classifyTrees.vue",
  data() {
    return {
@@ -485,7 +497,7 @@
      masterOption: {
        addBtn: false,
        index: true,
        refreshBtn:false,
        refreshBtn: false,
        columnBtn: false,
        border: true,
        menu: false,
@@ -515,7 +527,7 @@
        addBtn: false,
        index: true,
        columnBtn: false,
        refreshBtn:false,
        refreshBtn: false,
        border: true,
        menu: false,
        height: 380,
@@ -607,6 +619,8 @@
      TreeEditFormVisible: false,
      //添加对话框
      TreeAddFormVisible: false,
      //分类授权对话框
      classifyAuthVisible: false,
      //当前点击项
      nodeClickList: "",
      ClonenodeClickList: "",
@@ -778,7 +792,7 @@
        }
      ],
      //传递给子组件动态渲染的数据
      TreeList: {},
      TreeEditObj: {},
      codeClassifyOid: "",
      upAndStopAndStartData: {
        upVersion: {
@@ -802,6 +816,8 @@
      },
      //模板管理编辑
      showEditBtn: false,
      //传递给分类授权子组件对话框的当前选中的分类节点信息
      classifyData: "",
    }
  },
  watch: {},
@@ -811,9 +827,8 @@
    const treeEle = this.$refs.tree.$el
    treeEle.addEventListener('click', (e) => {
      if (e.target.nodeName !== 'SPAN') {
        this.$refs.tree.setCurrentKey(null)
        this.nodeClickList = {}
        this.TreeList = []
        this.$refs.tree.setCurrentKey(null);
        this.nodeClickList = {};
        this.TreeFlagCode = true;
      }
    }, true)
@@ -834,6 +849,7 @@
        TemRefreshStatus: this.vaildData(this.permission.classifyTree.manage_break, false),
        CloneBtnStuatus: this.vaildData(this.permission.classifyTree.manage_clone, false),
        flowingBtnStuatus: this.vaildData(this.permission.classifyTree.tree_flowing, false),
        classifyAuth: this.vaildData(this.permission.classifyTree.classify_auth, false),
      }
    },
    crudTreeOption() {
@@ -896,11 +912,17 @@
  created() {
  },
  methods: {
    handleTabClick(){
    // åˆ†ç±»æŽˆæƒå¯¹è¯æ¡†æ‰“å¼€
    classifyAuthHandler() {
      if (this.nodeClickList.oid === '' || this.nodeClickList.oid === undefined) {
        this.$message.warning('请至少选择一条数据!')
        return;
      }
      this.classifyData = this.nodeClickList;
      this.classifyAuthVisible = true;
    },
    testHandler(){
      if(this.nodeClickList.length <=0 ){
    flowingDependHandler() {
      if (this.nodeClickList.length <= 0) {
        this.$message.warning('请至少选择一条数据!')
        return;
      }
@@ -1133,7 +1155,7 @@
    },
    //子传父
    MasterHandler(val) {
      this.TreeList = val;
      this.TreeEditObj = val;
    },
    rowHandle(row, column) {
      this.selectRow = row.$index;
@@ -1313,11 +1335,11 @@
    },
    //树刷新
    async flushed() {
        await this.getAttr()
        this.$refs.tree.setCurrentKey(null);
        this.nodeClickList = {}
        this.TreeList = []
        this.TreeFlagCode = true;
      await this.getAttr()
      this.$refs.tree.setCurrentKey(null);
      this.nodeClickList = {};
      this.TreeEditObj = {};
      this.TreeFlagCode = true;
    },
    //启用和停用都先判断状态
    //启用
@@ -1435,9 +1457,9 @@
          this.ProData = [];
          this.crudOid = ''
        }
        this.TreeList = res3.data.data;
        if (this.TreeList.isParticipateCheck === null || this.TreeList.isParticipateCheck === undefined || this.TreeList.isParticipateCheck === "") {
          this.$set(this.TreeList, "isParticipateCheck", 1)
        this.TreeEditObj = res3.data.data;
        if (this.TreeEditObj.isParticipateCheck === null || this.TreeEditObj.isParticipateCheck === undefined || this.TreeEditObj.isParticipateCheck === "") {
          this.$set(this.TreeEditObj, "isParticipateCheck", 1)
          return
        }
      } catch (error) {
@@ -1474,7 +1496,7 @@
    //基本信息表单刷新
    referTreeForm() {
      getObjectByOid(this.nodeClickList.oid).then(res => {
        this.TreeList = res.data.data;
        this.TreeEditObj = res.data.data;
      }).catch(res => {
        this.$message.error(res)
      })
Source/UBCS-WEB/src/components/advanced-query/advancedQuery.vue
@@ -329,7 +329,7 @@
                        condtionParam['conditionMap['+searchConditions[index].queryField+searchConditions[index].condition+']'] = searchConditions[index].fieldValue;
                    }
                }
            }
            // æŸ¥è¯¢æ¡ä»¶æ²¡æœ‰å‡ºçŽ°é‡å¤å±žæ€§ï¼Œå¹¶ä¸”è¿‡æ»¤æŽ‰äº†ç©ºå€¼ï¼Œå°±ä¼ é€’ç»™çˆ¶ç»„ä»¶
            //console.log(condtionParam);
Source/UBCS-WEB/src/components/refer/vciWebRefer.vue
@@ -1,8 +1,40 @@
<template>
  <div v-if="display">
    <vciWebReferTree :key="key" :data-key="key" ref="vciWebReferTree" v-if="refertype=='tree'" @setValue="setValue" :value="value" :text="text" :title="title" :disabled="disabled" :referConfig="referConfig"></vciWebReferTree>
    <vciWebReferTable :key="key" :data-key="key" v-else-if="refertype=='table'" @setValue="setValue" :value="value" :text="text" :title="title" :disabled="disabled" :referConfig="referConfig"></vciWebReferTable>
    <vciWebReferDefalut :key="key" :data-key="key" v-else  @setValue="setValue" :value="value" :text="text" :title="title" :disabled="disabled" :referConfig="referConfig"></vciWebReferDefalut>
    <vciWebReferTree
      v-if="refertype=='tree'"
      :key="key" ref="vciWebReferTree"
      :data-key="key"
      :disabled="disabled"
      :referConfig="referConfig"
      :text="text"
      :title="title"
      :value="value"
      @setValue="setValue">
    </vciWebReferTree>
    <vciWebReferTable
      v-else-if="refertype=='table'"
      :key="key" :data-key="key"
      :disabled="disabled"
      :referConfig="referConfig"
      :referType="referType"
      :text="text"
      :title="title"
      :value="value"
      @setValue="setValue">
    </vciWebReferTable>
    <vciWebReferDefalut
      v-else
      :key="key"
      :data-key="key"
      :disabled="disabled"
      :referConfig="referConfig"
      :referType="referType"
      :text="text" :title="title"
      :value="value"
      @setValue="setValue">
    </vciWebReferDefalut>
  </div>
</template>
@@ -11,22 +43,23 @@
import vciWebReferTree from "./vciWebReferTree.vue";
import vciWebReferTable from "./vciWebReferTable.vue";
import vciWebReferDefalut from "./vciWebReferDefalut.vue";
export default {
  name: "vciWebRefer",
  props: ["referConfig","value","text","disabled","display",'key'],
  props: ["referConfig", "value", "text", "disabled", "display", 'key', 'referType'],
  components: {vciWebReferTree, vciWebReferTable, vciWebReferDefalut},
  data() {
    return {
      reterTypeLeavl:'213',
      reterTypeLeavl: '213',
      refertype: this.referConfig.options.type,
      emitData:{},
      title:'',
      display:this.display || true,
      disabled:this.disabled || false
      emitData: {},
      title: '',
      display: this.display || true,
      disabled: this.disabled || false
    };
  },
  created() {
    if (!this.referConfig.options && this.referConfig.options.isMuti==undefined) {
    if (!this.referConfig.options && this.referConfig.options.isMuti == undefined) {
      this.referConfig.options = {
        isMuti: this.referConfig.options.muti || false
      }
@@ -36,21 +69,21 @@
    var title = this.referConfig.title || '';
    title = title.replace(":", "");
    title = title ? ('为【' + title + '】选取值') : ('为【' + this.referConfig.showField + '】选取值');
    this.title=title;
    this.title = title;
  },
  methods: {
    setValue(value) {
      this.emitData = value;
    }
  },
  watch:{
  watch: {
    // ä¿®æ”¹åé¦ˆåˆ°çˆ¶ç»„ä»¶
    emitData: {
      deep: true,
      immediate: true,
      handler(newV) {
        this.text=newV.text;
        this.value=newV.value;
        this.text = newV.text;
        this.value = newV.value;
        this.$emit("setReferValue", newV);
      }
    },
Source/UBCS-WEB/src/components/refer/vciWebReferDefalut.vue
@@ -1,18 +1,19 @@
<template>
  <div>
    <el-dialog :title="title"
               v-dialogDrag append-to-body="true"
    <el-dialog v-dialogDrag
               :height="options.height|| 'auto'" :title="title"
               :visible.sync="visible"
               top="0"
               class="avue-dialog avue-dialog--top"
               :width="options.width|| '80%'"
               :height="options.height|| 'auto'">
      <avue-crud :option="option"
                 :table-loading="loading"
                 :data="data"
                 :page.sync="page"
               append-to-body="true"
               class="avue-dialog avue-dialog--top"
               top="0"
               @close="dialogClose">
      <avue-crud ref="referDefalutCrud"
                 v-model="value"
                 ref="referDefalutCrud"
                 :data="data"
                 :option="option"
                 :page.sync="page"
                 :table-loading="loading"
                 @search-change="searchChange"
                 @search-reset="searchReset"
                 @selection-change="selectionChange"
@@ -24,25 +25,27 @@
      </avue-crud>
      <div class="avue-dialog__footer">
        <div class="avue-dialog__footer--left valueInfo">{{ valueInfo }}</div>
        <el-button @click="visible=false">取 æ¶ˆ</el-button>
        <el-button @click="setValue" type="primary">ç¡® å®š</el-button>
        <el-button @click="escHandler">取 æ¶ˆ</el-button>
        <el-button type="primary" @click="setValue">ç¡® å®š</el-button>
      </div>
    </el-dialog>
    <avue-input v-model="text" :disabled="disabled" :readonly="true" :placeholder="title" @click="!disabled && (visible=true)" ></avue-input>
    <avue-input v-model="text" :disabled="disabled" :placeholder="title" :readonly="true"
                @click="!disabled && (visible=true)"></avue-input>
  </div>
</template>
<script>
import { validatenull } from "@/util/validate";
import {getList,getLazyList,getTableDefinedUrl} from "@/api/refer/table";
import {validatenull} from "@/util/validate";
import {getList, getLazyList, getTableDefinedUrl} from "@/api/refer/table";
export default {
  name: "vciWebReferDefalut",
  props:["referConfig","value","text","title","disabled"],
  props: ["referConfig", "value", "text", "title", "disabled", "referType"],
  data() {
    return {
      visible: false,
      options: this.referConfig.options||{},
      options: this.referConfig.options || {},
      isMuti: ("true" == this.referConfig.options.isMuti || this.referConfig.options.isMuti == true || this.referConfig.options.muti == true) ? true : false,
      props: {
        value: this.referConfig.valueField || this.referConfig.options.valueField || 'oid',
@@ -50,31 +53,32 @@
      },
      url: this.referConfig.options.url || '/api/ubcs-code/mdmEngineController/defaultReferDataGrid',
      method: this.referConfig.options.method || 'GET',
      tableDefinedUrl:'',//平台表格地址
      copyParam: ['referBo', 'textField', 'valueField', 'displayTable', 'whereSql',  'queryScheme'],
      tableDefinedUrl: '',//平台表格地址
      copyParam: ['referBo', 'textField', 'valueField', 'displayTable', 'whereSql', 'queryScheme'],
      query: {},
      loading: false,
      page: {
        layout: this.referType === "master" ? "total,pager,prev, next,jumper" : "total,pager,prev, next,jumper,sizes",
        pageSize: 10,
        currentPage: 1,
        total: this.referConfig.options.data?this.referConfig.options.data.length :0
        total: this.referConfig.options.data ? this.referConfig.options.data.length : 0
      },
      data:this.referConfig.options.data || [],
      data: this.referConfig.options.data || [],
      selectionList: [],
      option: {
        addBtn: false,
        columnBtn:false,
        columnBtn: false,
        //height: this.referConfig.options.height ? this.referConfig.options.height : 475,
        calcHeight: 30,
        tip: false,
        menu:false,
        menu: false,
        searchShow: true,
        searchMenuSpan: 6,
        searchLabelWidth: 90,
        border: true,
        index: true,
        selection: true,
        reserveSelection:true,
        reserveSelection: true,
        dialogClickModal: false,
        highlightCurrentRow: true,
        column: []
@@ -85,22 +89,30 @@
    this.getParams();
  },
  mounted() {
    if(this.referConfig.options.tableConfig.page){
      this.page.pageSize=this.referConfig.options.tableConfig.page.limit || this.referConfig.options.tableConfig.page.pageSize;
      this.page.currentPage=this.referConfig.options.tableConfig.page.page || this.referConfig.options.tableConfig.page.currentPage;
    }else if(!validatenull(this.referConfig.options.limit)){
      this.page.pageSize=this.referConfig.options.limit
    }else if(!validatenull(this.referConfig.options.tableConfig.limit)){
      this.page.pageSize=this.referConfig.options.tableConfig.limit
    if (this.referConfig.options.tableConfig && this.referConfig.options.tableConfig.page) {
      this.page.pageSize = this.referConfig.options.tableConfig.page.limit || this.referConfig.options.tableConfig.page.pageSize;
      this.page.currentPage = this.referConfig.options.tableConfig.page.page || this.referConfig.options.tableConfig.page.currentPage;
    } else if (!validatenull(this.referConfig.options.limit)) {
      this.page.pageSize = this.referConfig.options.limit;
    } else if (this.referConfig.options.tableConfig && !validatenull(this.referConfig.options.tableConfig.limit)) {
      this.page.pageSize = this.referConfig.options.tableConfig.limit;
    }
  },
  computed:{
    valueInfo:function (){
      return this.text ? ("已设置的值为[" + this.text + "]"): '未设置值'
  computed: {
    valueInfo: function () {
      return this.text ? ("已设置的值为[" + this.text + "]") : '未设置值'
    }
  },
  methods: {
    getParams:function () {
    escHandler() {
      this.visible = false;
      this.$refs.referDefalutCrud.refreshTable()
    },
    dialogClose() {
      this.visible = false;
      this.$refs.referDefalutCrud.refreshTable()
    },
    getParams: function () {
      var queryParams = {};
      if (this.options.extraParams) {
        queryParams = this.options.extraParams;
@@ -127,10 +139,10 @@
        queryParams['order'] = this.options.initSort.type;//方法
        queryParams['sort'] = this.options.initSort.field;//字段
      }
      if(this.options.sortField){
      if (this.options.sortField) {
        queryParams['sort'] = this.options.sortField;//字段
      }
      if(this.options.sortType){
      if (this.options.sortType) {
        queryParams['order'] = this.options.sortType;//方法
      }
      if (this.options.conditionParams) {
@@ -168,7 +180,7 @@
          sortable: true,
          width: 150,
          search: true,
          formatter:function (d){
          formatter: function (d) {
            return d.id || d.data.id
          }
        }, {
@@ -177,14 +189,14 @@
          sortable: true,
          width: 150,
          search: true,
          formatter:function (d){
          formatter: function (d) {
            return d.name || d.data.name
          }
        }, {
          prop: 'description',
          label: '描述',
          width: 250,
          formatter:function (d){
          formatter: function (d) {
            return d.description || d.data.description
          }
        }, {
@@ -193,23 +205,23 @@
          width: 60,
          hidden: (!this.controllerSecret),
          hide: (!this.controllerSecret),
          formatter:function (d){
          formatter: function (d) {
            return d.secretGradeText || d.data.secretGradeText
          }
        }];
      } else {
        this.option.column = this.options.tableConfig.cols.map(item => {
          if (item.field != 'LAY_TABLE_INDEX' && item.field != 'LAY_CHECKED') {
            let formatter=item.template || item.templet;
            if(typeof formatter == "string" && formatter !=''){
              formatter=eval("(" + formatter + ")")
            }else{
              formatter=function (d){
                if(d[item.field]!=undefined){
            let formatter = item.template || item.templet;
            if (typeof formatter == "string" && formatter != '') {
              formatter = eval("(" + formatter + ")")
            } else {
              formatter = function (d) {
                if (d[item.field] != undefined) {
                  return d[item.field]
                }else if(d.data[item.field] !=undefined){
                } else if (d.data[item.field] != undefined) {
                  return d.data[item.field]
                }else {
                } else {
                  return ''
                }
              }
@@ -218,11 +230,11 @@
              ...item,
              label: item.title,
              prop: item.field,
              formatter:formatter,
              sortable:item.sort,
              hide:item.hidden,
              search:this.options.tableConfig.queryColumns.some(qItem=>{
                return qItem.field==item.field
              formatter: formatter,
              sortable: item.sort,
              hide: item.hidden,
              search: this.options.tableConfig.queryColumns.some(qItem => {
                return qItem.field == item.field
              })
            }
          }
@@ -239,67 +251,74 @@
      }
      this.params = paramsData;
    },
    setValue(){
      if(this.selectionList.length==0){
        this.$message.warning( '没有选择数据');
    setValue() {
      if (this.selectionList.length == 0) {
        this.$message.warning('没有选择数据');
        return false;
      }else if(this.selectionList.length>1 && !this.isMuti){
        this.$message.warning( '每次只能选择一条数据');
      } else if (this.selectionList.length > 1 && !this.isMuti) {
        this.$message.warning('每次只能选择一条数据');
        return false;
      }
      var value = [];
      var text = [];
      var isMutiValue = (this.props.value.indexOf(",")>-1);
      var isMutiRaw = (this.props.label.indexOf(",")>-1);
      var _that=this
      this.selectionList.forEach((item,_index) =>{
        if(isMutiValue){
      var isMutiValue = (this.props.value.indexOf(",") > -1);
      var isMutiRaw = (this.props.label.indexOf(",") > -1);
      var _that = this
      this.selectionList.forEach((item, _index) => {
        if (isMutiValue) {
          var valueFieldArray = _that.props.value.split(",");
          valueFieldArray.forEach((_itemField,_indexField)=>{
            let itemValue=item[_itemField];
            if(itemValue==undefined || itemValue == null){
              itemValue=item['data'][_itemField]
          valueFieldArray.forEach((_itemField, _indexField) => {
            let itemValue = item[_itemField];
            if (itemValue == undefined || itemValue == null) {
              itemValue = item['data'][_itemField]
            }
            value.push( itemValue + (_that.referConfig.valueSep?_that.referConfig.valueSep:' '));
            value.push(itemValue + (_that.referConfig.valueSep ? _that.referConfig.valueSep : ' '));
          })
        }else {
          let itemValue=item[_that.props.value];
          if(itemValue==undefined || itemValue == null){
            itemValue=item['data'][_that.props.value]
        } else {
          let itemValue = item[_that.props.value];
          if (itemValue == undefined || itemValue == null) {
            itemValue = item['data'][_that.props.value]
          }
          value.push(itemValue);
        }
        if(isMutiRaw) {
        if (isMutiRaw) {
          var rawFieldArray = _that.props.label.split(",");
          rawFieldArray.forEach((_itemField,_indexField)=>{
            let itemText=item[_itemField];
            if(itemText==undefined || itemText == null){
              itemText=item['data'][_itemField]
          rawFieldArray.forEach((_itemField, _indexField) => {
            let itemText = item[_itemField];
            if (itemText == undefined || itemText == null) {
              itemText = item['data'][_itemField]
            }
            text.push(itemText + (_that.referConfig.textSep?_that.referConfig.textSep:' ')) ;
            text.push(itemText + (_that.referConfig.textSep ? _that.referConfig.textSep : ' '));
          })
        }else{
          let itemText=item[_that.props.label];
          if(itemText==undefined || itemText == null){
            itemText=item['data'][_that.props.label]
        } else {
          let itemText = item[_that.props.label];
          if (itemText == undefined || itemText == null) {
            itemText = item['data'][_that.props.label]
          }
          text.push(itemText);
        }
      })
      let mapFields =this.referConfig.fieldMap || {};
      let mapFields = this.referConfig.fieldMap || {};
      try {
        if(!validatenull(this.options.mapFields)){
          mapFields =Object.assign(this.referConfig.fieldMap,JSON.parse(this.options.mapFields)) ;
        if (!validatenull(this.options.mapFields)) {
          mapFields = Object.assign(this.referConfig.fieldMap, JSON.parse(this.options.mapFields));
        }
      }catch (e) {
      } catch (e) {
      }
      this.value=value.join(',');
      this.text=text.join(',')
      this.$emit("setValue", {field:this.referConfig.field,showField:this.referConfig.showField,value:this.value,text:this.text,rawData:this.selectionList,fieldMap:mapFields});
      this.visible=false;
      this.value = value.join(',');
      this.text = text.join(',')
      this.$emit("setValue", {
        field: this.referConfig.field,
        showField: this.referConfig.showField,
        value: this.value,
        text: this.text,
        rawData: this.selectionList,
        fieldMap: mapFields
      });
      this.visible = false;
    },
    searchReset() {
      this.query = {};
@@ -311,16 +330,16 @@
      this.onLoad(this.page);
      done();
    },
    currentChange(currentPage){
    currentChange(currentPage) {
      this.page.currentPage = currentPage;
    },
    sizeChange(pageSize){
    sizeChange(pageSize) {
      this.page.pageSize = pageSize;
    },
    rowClick (row) {
    rowClick(row) {
      this.$refs.referDefalutCrud.toggleSelection();
      this.$refs.referDefalutCrud.toggleRowSelection(row); //选中当前行
      this.selectionList=[row]
      this.selectionList = [row]
    },
    selectionChange(list) {
      if (!this.isMuti && list.length > 1) {
@@ -336,33 +355,33 @@
    refreshChange() {
      this.onLoad(this.page, this.query);
    },
    onLoad(page, params={}) {
      if(this.url){
    onLoad(page, params = {}) {
      if (this.url) {
        this.loading = true;
        var query={}
        var query = {}
        if (this.query) {
          for (var key in this.query) {
            query['conditionMap["' + key + '"]'] = this.query[key];
          }
        }
        getList(Object.assign(params,this.params,this.query, query),page.currentPage, page.pageSize, this.url, this.method).then(res => {
          let data=[]
          if(res.data.records){
        getList(Object.assign(params, this.params, this.query, query), page.currentPage, page.pageSize, this.url, this.method).then(res => {
          let data = []
          if (res.data.records) {
            data = res.data.records
            this.page.total=res.data.total ;
          }else{
            this.page.total = res.data.total;
          } else {
            data = res.data.data.records;
            this.page.total=res.data.data.total;
            this.page.total = res.data.data.total;
          }
          this.data=data.map(item => {
            item.data=item.data || {}
          this.data = data.map(item => {
            item.data = item.data || {}
            return {
              ...item
            }
          })
          this.loading = false;
          this.selectionClear();
        }).catch(error=>{
        }).catch(error => {
          this.$message.error(error);
          this.loading = false;
        });
@@ -374,7 +393,7 @@
</script>
<style scoped>
.valueInfo{
.valueInfo {
  float: left;
  border: 1px solid #E9E7E7;
  display: inline-block;
Source/UBCS-WEB/src/components/refer/vciWebReferTable.vue
@@ -1,18 +1,19 @@
<template>
  <div>
    <el-dialog :title="title"
               v-dialogDrag append-to-body="true"
    <el-dialog v-dialogDrag
               :height="options.height|| 'auto'" :title="title"
               :visible.sync="visible"
               top="0"
               class="avue-dialog avue-dialog--top"
               :width="options.width|| '80%'"
               :height="options.height|| 'auto'">
      <avue-crud :option="option"
                 :table-loading="loading"
                 :data="data"
                 :page.sync="page"
               append-to-body="true"
               class="avue-dialog avue-dialog--top"
               top="0"
               @close="dialogClose">
      <avue-crud ref="referCrud"
                 v-model="value"
                 ref="referCrud"
                 :data="data"
                 :option="option"
                 :page.sync="page"
                 :table-loading="loading"
                 @search-change="searchChange"
                 @search-reset="searchReset"
                 @selection-change="selectionChange"
@@ -26,22 +27,24 @@
        </template>
      </avue-crud>
      <div class="avue-dialog__footer">
        <div class="avue-dialog__footer--left valueInfo">{{ valueInfo }} </div>
        <el-button @click="visible=false">取 æ¶ˆ</el-button>
        <el-button @click="setValue" type="primary">ç¡® å®š</el-button>
        <div class="avue-dialog__footer--left valueInfo">{{ valueInfo }}</div>
        <el-button @click="escHandler">取 æ¶ˆ</el-button>
        <el-button type="primary" @click="setValue">ç¡® å®š</el-button>
      </div>
    </el-dialog>
    <avue-input v-model="text" :disabled="disabled" :readonly="true" :placeholder="title" @click="!disabled && (visible=true)"></avue-input>
    <avue-input v-model="text" :disabled="disabled" :placeholder="title" :readonly="true"
                @click="!disabled && (visible=true)"></avue-input>
  </div>
</template>
<script>
import { validatenull } from "@/util/validate";
import {getList,getLazyList,getTableDefinedUrl} from "@/api/refer/table";
import {validatenull} from "@/util/validate";
import {getList, getLazyList, getTableDefinedUrl} from "@/api/refer/table";
export default {
  name: "vciWebReferTable",
  props:["referConfig","value","text","title","disabled"],
  props: ["referConfig", "value", "text", "title", "disabled", "referType"],
  data() {
    return {
      visible: false,
@@ -52,35 +55,36 @@
        label: this.referConfig.textField || this.referConfig.options.textField || "name"
      },
      url: this.referConfig.options.url || '/api/ubcs-code/mdmEngineController/defaultReferDataGrid',
      tableDefinedUrl:'',//平台表格地址
      copyParam: ['referBo', 'textField', 'valueField', 'displayTable', 'whereSql',  'queryScheme'],
      tableDefinedUrl: '',//平台表格地址
      copyParam: ['referBo', 'textField', 'valueField', 'displayTable', 'whereSql', 'queryScheme'],
      query: {},
      loading: false,
      page: {
        layout: this.referType === "master" ? "total,pager,prev, next,jumper" : "total,pager,prev, next,jumper,sizes",
        pageSize: 10,
        currentPage: 1,
        total: this.referConfig.options.data?this.referConfig.options.data.length :0
        total: this.referConfig.options.data ? this.referConfig.options.data.length : 0
      },
      data:this.referConfig.options.data || [],
      data: this.referConfig.options.data || [],
      selectionList: [],
      option: {
        addBtn: false,
        columnBtn:false,
        columnBtn: false,
        height: this.referConfig.options.height ? this.referConfig.options.height : 475,
        calcHeight: 30,
        tip: false,
        menu:false,
        menu: false,
        searchShow: true,
        searchMenuSpan: 6,
        searchLabelWidth: 90,
        border: true,
        index: true,
        selection: true,
        reserveSelection:true,
        reserveSelection: true,
        dialogClickModal: false,
        highlightCurrentRow: true,
        rowKey:'oid',
        rowParentKey:'parentSaleProduct',
        rowKey: 'oid',
        rowParentKey: 'parentSaleProduct',
        column: []
      }
    };
@@ -89,56 +93,64 @@
    this.getParams();
  },
  mounted() {
    if(this.referConfig.options.page){
      this.page.pageSize=this.referConfig.options.tableConfig.page.limit || this.referConfig.options.tableConfig.page.pageSize;
      this.page.currentPage=this.referConfig.options.tableConfig.page.page || this.referConfig.options.tableConfig.page.currentPage;
    }else if(!validatenull(this.referConfig.options.limit)){
      this.page.pageSize=this.referConfig.options.limit
    }else if(!validatenull(this.referConfig.options.tableConfig.limit)){
      this.page.pageSize=this.referConfig.options.tableConfig.limit
    if (this.referConfig.options.tableConfig && this.referConfig.options.tableConfig.page) {
      this.page.pageSize = this.referConfig.options.tableConfig.page.limit || this.referConfig.options.tableConfig.page.pageSize;
      this.page.currentPage = this.referConfig.options.tableConfig.page.page || this.referConfig.options.tableConfig.page.currentPage;
    } else if (!validatenull(this.referConfig.options.limit)) {
      this.page.pageSize = this.referConfig.options.limit;
    } else if (this.referConfig.options.tableConfig && !validatenull(this.referConfig.options.tableConfig.limit)) {
      this.page.pageSize = this.referConfig.options.tableConfig.limit;
    }
    this.$nextTick(() => {
      this.$refs.referCrud.doLayout()
    })
  },
  computed:{
    valueInfo:function (){
      return this.text ? ("已设置的值为[" + this.text + "]"): '未设置值'
  computed: {
    valueInfo: function () {
      return this.text ? ("已设置的值为[" + this.text + "]") : '未设置值'
    }
  },
  methods: {
    getParams:function (){
    escHandler() {
      this.visible = false;
      this.$refs.referDefalutCrud.refreshTable()
    },
    dialogClose() {
      this.visible = false;
      this.$refs.referDefalutCrud.refreshTable()
    },
    getParams: function () {
      var queryParams = {};
      if(this.options.extraParams){
      if (this.options.extraParams) {
        queryParams = this.options.extraParams;
      }
      if(this.options.useFormKey && this.options.formValues){
      if (this.options.useFormKey && this.options.formValues) {
        //使用表单上的字段来过滤
        queryParams['conditionMap["' + (this.options.paramForFormKey?this.options.paramForFormKey:this.options.useFormKey)  + '"]'] = this.options.formValues[this.options.useFormKey];
        queryParams['conditionMap["' + (this.options.paramForFormKey ? this.options.paramForFormKey : this.options.useFormKey) + '"]'] = this.options.formValues[this.options.useFormKey];
      }
      if(this.options.where ) {
      if (this.options.where) {
        for (var key in this.options.where) {
          queryParams['conditionMap["' + key + '"]'] = this.options.where[key];//新
        }
      }
      for(var i= 0 ; i < this.copyParam.length ; i ++){
      for (var i = 0; i < this.copyParam.length; i++) {
        queryParams[this.copyParam[i]] = this.options[this.copyParam[i]];
      }
      queryParams["isMuti"]=this.isMuti;
      queryParams.muti =this.isMuti;
      if(!queryParams['referBo']){
      queryParams["isMuti"] = this.isMuti;
      queryParams.muti = this.isMuti;
      if (!queryParams['referBo']) {
        queryParams['referBo'] = this.options['referBo'] || this.options['referType'];
      }
      queryParams['referType']= queryParams['referBo']
      queryParams['referType'] = queryParams['referBo']
      if (this.options.initSort) {
        queryParams['order'] = this.options.initSort.type;//方法
        queryParams['sort'] = this.options.initSort.field;//字段
      }
      if(this.options.sortField){
      if (this.options.sortField) {
        queryParams['sort'] = this.options.sortField;//字段
      }
      if(this.options.sortType){
      if (this.options.sortType) {
        queryParams['order'] = this.options.sortType;//方法
      }
      if (this.options.conditionParams) {
@@ -163,36 +175,40 @@
      }
      var paramsData = {};
      //为了处理单引号和双引号的
      if(queryParams){
        for (var key in queryParams){
      if (queryParams) {
        for (var key in queryParams) {
          paramsData[key.replace(/"/g, "'")] = queryParams[key];
        }
      }
      if(this.options.displayTable){
      if (this.options.displayTable) {
        //说明是使用平台的表格
        getTableDefinedUrl({btmType:(this.options.referBo||this.options.referType),code:this.options.displayTable,isMuti:this.isMuti},this.tableDefinedUrl).then(result => {
          console.log('result',result)
          if(result.success){
        getTableDefinedUrl({
          btmType: (this.options.referBo || this.options.referType),
          code: this.options.displayTable,
          isMuti: this.isMuti
        }, this.tableDefinedUrl).then(result => {
          console.log('result', result)
          if (result.success) {
            var queryScheme = result.querySchema;
            if(!validatenull(queryScheme) && validatenull(this.options.queryScheme)){
            if (!validatenull(queryScheme) && validatenull(this.options.queryScheme)) {
              this.options.queryScheme = queryScheme;
            }
            paramsData['queryScheme'] = this.options.queryScheme;
            if(result.showIndex){
            if (result.showIndex) {
              this.option.index = true;
            }
            if(result.showCheckbox){
            if (result.showCheckbox) {
              this.option.selection = true
            }
            var referColumn = "";
            if(result.columns){
              this.option.column= result.columns.map(item => {
                if(item.field.indexOf(".")>-1){
            if (result.columns) {
              this.option.column = result.columns.map(item => {
                if (item.field.indexOf(".") > -1) {
                  referColumn += item.field + ",";
                  item.field = item.field.replace(".","_");
                  item.field = item.field.replace(".", "_");
                }
                if(!validatenull(item.enumCode)) {
                if (!validatenull(item.enumCode)) {
                  //是枚举的内容
                  item.type = 'select';
                  item.dicUrl = "/api/ubcs-omd/enum/dictionary?code=" + item.enumCode;
@@ -209,12 +225,12 @@
                    trigger: "blur"
                  }];
                }
                item.formatter=function(d){
                  if(d[item.field]!=undefined){
                item.formatter = function (d) {
                  if (d[item.field] != undefined) {
                    return d[item.field]
                  }else if(d.data[item.field] !=undefined){
                  } else if (d.data[item.field] != undefined) {
                    return d.data[item.field]
                  }else {
                  } else {
                    return ''
                  }
                };
@@ -227,48 +243,48 @@
              })
            }
            paramsData['referColumn'] = referColumn;
            if(result.limit>0){
            if (result.limit > 0) {
              this.page.pageSize = result.limit;
              this.page.currentPage=1
              this.page.currentPage = 1
            }
            if(this.options.isTreeGrid){
            if (this.options.isTreeGrid) {
              //表格树加上配置
            }
            this.params=paramsData;
          }else{
            this.params = paramsData;
          } else {
            this.$message.error(result.msg);
          }
        });
      }else{
      } else {
        //说明是自定义的表格
        var tableConfig = this.options.tableConfig;
        if(!tableConfig){
          this.$message.error( '没有定义参照的表格配置');
        if (!tableConfig) {
          this.$message.error('没有定义参照的表格配置');
        }
        if(!paramsData){
        if (!paramsData) {
          paramsData = {
            currentUserReferModelKey:this.options.currentUserReferModelKey,
            currentUserReferMethodKey:this.options.currentUserReferMethodKey
            currentUserReferModelKey: this.options.currentUserReferModelKey,
            currentUserReferMethodKey: this.options.currentUserReferMethodKey
          };
        }else{
        } else {
          paramsData['currentUserReferModelKey'] = this.options.currentUserReferModelKey;
          paramsData['currentUserReferMethodKey'] = this.options.currentUserReferMethodKey;
        }
        if(this.options.tableConfig && this.options.tableConfig.cols && this.options.tableConfig.cols.length>0) {
        if (this.options.tableConfig && this.options.tableConfig.cols && this.options.tableConfig.cols.length > 0) {
          //说明传递了的
          this.option.column= this.options.tableConfig.cols.map(item => {
          this.option.column = this.options.tableConfig.cols.map(item => {
            if (item.field != 'LAY_TABLE_INDEX' && item.field != 'LAY_CHECKED') {
              let formatter=item.template || item.templet;
              if(typeof formatter == "string" && formatter !=''){
                formatter=eval("(" + formatter + ")")
              }else{
                formatter=function (d){
                  if(d[item.field]!=undefined){
              let formatter = item.template || item.templet;
              if (typeof formatter == "string" && formatter != '') {
                formatter = eval("(" + formatter + ")")
              } else {
                formatter = function (d) {
                  if (d[item.field] != undefined) {
                    return d[item.field]
                  }else if(d.data[item.field] !=undefined){
                  } else if (d.data[item.field] != undefined) {
                    return d.data[item.field]
                  }else {
                  } else {
                    return ''
                  }
                }
@@ -277,82 +293,89 @@
                ...item,
                label: item.title,
                prop: item.field,
                formatter:formatter,
                sortable:item.sort,
                hide:item.hidden,
                search: this.options.tableConfig.queryColumns.some(qItem=>{
                  return qItem.field==item.field
                formatter: formatter,
                sortable: item.sort,
                hide: item.hidden,
                search: this.options.tableConfig.queryColumns.some(qItem => {
                  return qItem.field == item.field
                })
              }
            }
          })
        }
        if(this.options.isTreeGrid){
        if (this.options.isTreeGrid) {
          //表格树加上配置
        }
      }
      this.params=paramsData;
      this.params = paramsData;
    },
    setValue(){
      if(this.selectionList.length==0){
        this.$message.warning( '没有选择数据');
    setValue() {
      if (this.selectionList.length == 0) {
        this.$message.warning('没有选择数据');
        return false;
      }else if(this.selectionList.length>1 && !this.isMuti){
        this.$message.warning( '每次只能选择一条数据');
      } else if (this.selectionList.length > 1 && !this.isMuti) {
        this.$message.warning('每次只能选择一条数据');
        return false;
      }
      var value = [];
      var text = [];
      var isMutiValue = (this.props.value.indexOf(",")>-1);
      var isMutiRaw = (this.props.label.indexOf(",")>-1);
      var _that=this
      this.selectionList.forEach((item,_index) =>{
        if(isMutiValue){
      var isMutiValue = (this.props.value.indexOf(",") > -1);
      var isMutiRaw = (this.props.label.indexOf(",") > -1);
      var _that = this
      this.selectionList.forEach((item, _index) => {
        if (isMutiValue) {
          var valueFieldArray = _that.props.value.split(",");
          valueFieldArray.forEach((_itemField,_indexField)=>{
            let itemValue=item[_itemField];
            if(itemValue==undefined || itemValue == null){
              itemValue=item['data'][_itemField]
          valueFieldArray.forEach((_itemField, _indexField) => {
            let itemValue = item[_itemField];
            if (itemValue == undefined || itemValue == null) {
              itemValue = item['data'][_itemField]
            }
            value.push( itemValue + (_that.referConfig.valueSep?_that.referConfig.valueSep:' '));
            value.push(itemValue + (_that.referConfig.valueSep ? _that.referConfig.valueSep : ' '));
          })
        }else {
          let itemValue=item[_that.props.value];
          if(itemValue==undefined || itemValue == null){
            itemValue=item['data'][_that.props.value]
        } else {
          let itemValue = item[_that.props.value];
          if (itemValue == undefined || itemValue == null) {
            itemValue = item['data'][_that.props.value]
          }
          value.push(itemValue);
        }
        if(isMutiRaw) {
        if (isMutiRaw) {
          var rawFieldArray = _that.props.label.split(",");
          rawFieldArray.forEach((_itemField,_indexField)=>{
            let itemText=item[_itemField];
            if(itemText==undefined || itemText == null){
              itemText=item['data'][_itemField]
          rawFieldArray.forEach((_itemField, _indexField) => {
            let itemText = item[_itemField];
            if (itemText == undefined || itemText == null) {
              itemText = item['data'][_itemField]
            }
            text.push(itemText + (_that.referConfig.textSep?_that.referConfig.textSep:' ')) ;
            text.push(itemText + (_that.referConfig.textSep ? _that.referConfig.textSep : ' '));
          })
        }else{
          let itemText=item[_that.props.label];
          if(itemText==undefined || itemText == null){
            itemText=item['data'][_that.props.label]
        } else {
          let itemText = item[_that.props.label];
          if (itemText == undefined || itemText == null) {
            itemText = item['data'][_that.props.label]
          }
          text.push(itemText);
        }
      })
      let mapFields =this.referConfig.fieldMap || {};
      let mapFields = this.referConfig.fieldMap || {};
      try {
        if(!validatenull(this.options.mapFields)){
          mapFields =Object.assign(this.referConfig.fieldMap,JSON.parse(this.options.mapFields)) ;
        if (!validatenull(this.options.mapFields)) {
          mapFields = Object.assign(this.referConfig.fieldMap, JSON.parse(this.options.mapFields));
        }
      }catch (e) {
      } catch (e) {
      }
      this.value=value.join(',');
      this.text=text.join(',')
      this.$emit("setValue", {field:this.referConfig.field,showField:this.referConfig.showField,value:this.value,text:this.text,rawData:this.selectionList,fieldMap:mapFields});
      this.visible=false;
      this.value = value.join(',');
      this.text = text.join(',')
      this.$emit("setValue", {
        field: this.referConfig.field,
        showField: this.referConfig.showField,
        value: this.value,
        text: this.text,
        rawData: this.selectionList,
        fieldMap: mapFields
      });
      this.visible = false;
    },
    searchReset() {
      this.query = {};
@@ -364,16 +387,16 @@
      this.onLoad(this.page);
      done();
    },
    currentChange(currentPage){
    currentChange(currentPage) {
      this.page.currentPage = currentPage;
    },
    sizeChange(pageSize){
    sizeChange(pageSize) {
      this.page.pageSize = pageSize;
    },
    rowClick (row) {
    rowClick(row) {
      this.$refs.referCrud.toggleSelection();
      this.$refs.referCrud.toggleRowSelection(row); //选中当前行
      this.selectionList=[row]
      this.selectionList = [row]
    },
    selectionChange(list) {
      if (!this.isMuti && list.length > 1) {
@@ -389,33 +412,33 @@
    refreshChange() {
      this.onLoad(this.page, this.query);
    },
    onLoad(page, params={}) {
      if(this.url){
    onLoad(page, params = {}) {
      if (this.url) {
        this.loading = true;
        var query={}
        var query = {}
        if (this.query) {
          for (var key in this.query) {
            query['conditionMap["' + key + '"]'] = this.query[key];
          }
        }
        getList(Object.assign(params,this.params,this.query, query),page.currentPage, page.pageSize, this.url).then(res => {
          let data=[]
          if(res.data.records){
        getList(Object.assign(params, this.params, this.query, query), page.currentPage, page.pageSize, this.url).then(res => {
          let data = []
          if (res.data.records) {
            data = res.data.records
            this.page.total=res.data.total ;
          }else{
            this.page.total = res.data.total;
          } else {
            data = res.data.data.records;
            this.page.total=res.data.data.total;
            this.page.total = res.data.data.total;
          }
          this.data=data.map(item => {
            item.data=item.data || {}
          this.data = data.map(item => {
            item.data = item.data || {}
            return {
              ...item
            }
          })
          this.loading = false;
          this.selectionClear();
        }).catch(error=>{
        }).catch(error => {
          this.$message.error(error);
          this.loading = false;
        });
@@ -427,7 +450,7 @@
</script>
<style scoped>
.valueInfo{
.valueInfo {
  float: left;
  border: 1px solid #E9E7E7;
  display: inline-block;
Source/UBCS-WEB/src/components/refer/vciWebReferTree.vue
@@ -1,34 +1,44 @@
<template>
  <avue-input-tree ref="referTree" :props="props" :disabled="disabled" :lazy="lazy" :tree-load="treeLoad" :node-click="nodeClick" :checked="checked"
                   :leaf-only="referConfig.onlyLeaf" :multiple="isMuti" v-model="value" :placeholder="title" :dic="treeData"></avue-input-tree>
  <avue-input-tree ref="referTree"
                   v-model="value"
                   :checked="checked"
                   :dic="treeData"
                   :disabled="disabled"
                   :lazy="lazy"
                   :leaf-only="referConfig.onlyLeaf"
                   :multiple="isMuti"
                   :node-click="nodeClick"
                   :placeholder="title"
                   :props="props"
                   :tree-load="treeLoad"></avue-input-tree>
</template>
<script>
import {getTree,getLazyTree} from "@/api/refer/tree";
import {getTree, getLazyTree} from "@/api/refer/tree";
import {validatenull} from "@/util/validate";
export default {
  name: "vciWebReferTree",
  props:["referConfig","value","text","title","disabled"],
  props: ["referConfig", "value", "text", "title", "disabled"],
  data() {
    return {
      visible: false,
      options: this.referConfig.options,
      lazy: this.referConfig.options.loadType == 'node',
      isMuti:("true" == this.referConfig.options.isMuti || this.referConfig.options.isMuti == true || this.referConfig.options.muti == true) ? true : false,
      isMuti: ("true" == this.referConfig.options.isMuti || this.referConfig.options.isMuti == true || this.referConfig.options.muti == true) ? true : false,
      props: {
        value: 'oid',
        label: "name"
      },
      config:{
      config: {
        valueField: this.referConfig.valueField || this.referConfig.options.valueField || 'oid',
        textField:this.referConfig.textField || this.referConfig.options.textField || "name",
        textSep:this.referConfig.textSep || ' '
        textField: this.referConfig.textField || this.referConfig.options.textField || "name",
        textSep: this.referConfig.textSep || ' '
      },
      treeUrl: this.referConfig.options.url || '/api/ubcs-code/mdmEngineController/defaultReferTree',
      treeData: [],
      checkedData:[],
      currentNode:{},
      checkedData: [],
      currentNode: {},
      params: {},
      loadType: {'all': 'all', 'node': 'node'},
      copyParam: ['btmType', 'lnType', 'toBtmType', 'textField', 'valueField', 'parentFieldName', 'parentValue', 'sort', 'order', 'isDirection', 'whereSql', 'isMuti', 'queryScheme', 'isQueryAllColumn', 'queryColumn', 'split', 'loadType', 'onlyLeaf', 'onlyLeafText', 'parentUsedField']
@@ -38,44 +48,44 @@
    this.getParams();
  },
  mounted() {
    if(!this.lazy){
      if(this.options.data){//如果是固定数据的情况下
        this.treeData=this.options.data
      }else{
    if (!this.lazy) {
      if (this.options.data) {//如果是固定数据的情况下
        this.treeData = this.options.data
      } else {
        this.getTree()
      }
    }
  },
  computed:{},
  computed: {},
  methods: {
    getParams:function (){
    getParams: function () {
      var queryParams = {};
      if(this.options.extraParams){
      if (this.options.extraParams) {
        queryParams = this.options.extraParams;
      }
      for(var i= 0 ; i < this.copyParam.length ; i ++){
        if(this.copyParam[i] == "btmType") {
      for (var i = 0; i < this.copyParam.length; i++) {
        if (this.copyParam[i] == "btmType") {
          queryParams[this.copyParam[i]] = this.options['referBo'] || this.options['referType'];
        }else if(this.copyParam[i] in this.options){
        } else if (this.copyParam[i] in this.options) {
          queryParams[this.copyParam[i]] = this.options[this.copyParam[i]];
        }
      }
      queryParams['referBo'] = this.options['referBo'] || this.options['referType'];
      queryParams['referType']= queryParams['referBo']
      queryParams['selectAllLevel'] = (this.options.loadType == this.loadType.all?true:false);//true时后台会报错
      queryParams['referType'] = queryParams['referBo']
      queryParams['selectAllLevel'] = (this.options.loadType == this.loadType.all ? true : false);//true时后台会报错
      queryParams.muti =this.isMuti;
      if(queryParams.isQueryAllColumn =="true"){
      queryParams.muti = this.isMuti;
      if (queryParams.isQueryAllColumn == "true") {
        queryParams.isQueryAllColumn = true;
      }
      if(this.options.useFormKey && this.options.formValues){
      if (this.options.useFormKey && this.options.formValues) {
        //使用表单上的字段来过滤
        queryParams['conditionMap["' + (this.options.paramForFormKey?this.options.paramForFormKey:this.options.useFormKey)  + '"]'] = this.options.formValues[this.options.useFormKey];
        queryParams['conditionMap["' + (this.options.paramForFormKey ? this.options.paramForFormKey : this.options.useFormKey) + '"]'] = this.options.formValues[this.options.useFormKey];
      }
      if (!this.options.loadType) {
        this.options.loadType = this.loadType.node;
      }
      queryParams['queryAllLevel'] = this.options.loadType == this.loadType.node? false : true;//默认逐级展开
      queryParams['queryAllLevel'] = this.options.loadType == this.loadType.node ? false : true;//默认逐级展开
      queryParams['loadType'] = this.options.loadType;
      queryParams['multipleSelect'] = this.isMuti;
      queryParams['isMuti'] = queryParams['multipleSelect'];
@@ -83,10 +93,10 @@
        queryParams['order'] = this.options.initSort.type;//方法
        queryParams['sort'] = this.options.initSort.field;//字段
      }
      if(this.options.sortField){
      if (this.options.sortField) {
        queryParams['sort'] = this.options.sortField;//字段
      }
      if(this.options.sortType){
      if (this.options.sortType) {
        queryParams['order'] = this.options.sortType;//方法
      }
      if (this.options.rootParams) {
@@ -100,7 +110,7 @@
          queryParams['conditionMap["' + key + '"]'] = this.options.conditionParams[key];//新的方式
        }
      }
      if(this.options.where ) {
      if (this.options.where) {
        for (var key in this.options.where) {
          queryParams['conditionMap["' + key + '"]'] = this.options.where[key];//新
        }
@@ -125,7 +135,7 @@
          queryParams['replaceMap["' + key + '"]'] = this.options.replaceParams[key];//新的方式
        }
      }
      this.params=queryParams;
      this.params = queryParams;
    },
    getTree() {
@@ -150,24 +160,24 @@
    treeLoad: function (treeNode, resolve) {
      //逐级加载
      const parentOid = (treeNode.level === 0) ? 0 : treeNode.data.oid;
      this.params.parentOid=parentOid.indexOf('@vcitreesep@') > -1 ? parentOid.split('@vcitreesep@')[1] : parentOid;
      this.params.parentValue=this.params.parentOid;
      this.params.parentBtmName=treeNode.data.attributes.btmName || treeNode.data.attributes.btmname;
      this.params.parentBtmType=this.params.parentBtmName;
      this.params.parentOid = parentOid.indexOf('@vcitreesep@') > -1 ? parentOid.split('@vcitreesep@')[1] : parentOid;
      this.params.parentValue = this.params.parentOid;
      this.params.parentBtmName = treeNode.data.attributes.btmName || treeNode.data.attributes.btmname;
      this.params.parentBtmType = this.params.parentBtmName;
      if (this.options.rootParams && treeNode.level !== 0) {
        for (var key in this.options.rootParams) {
          delete this.params[key]
        }
      }
      getLazyTree(this.params,this.treeUrl).then(res => {
      getLazyTree(this.params, this.treeUrl).then(res => {
        resolve(res.data.data.map(item => {
          if(!item.attributes){
            item.attributes={
              data:{}
          if (!item.attributes) {
            item.attributes = {
              data: {}
            }
          }else{
            item.attributes.data=item.attributes.data || {}
          } else {
            item.attributes.data = item.attributes.data || {}
          }
          return {
            ...item,
@@ -176,39 +186,39 @@
        }))
      });
    },
    nodeClick(data, node, nodeComp){
      if(!this.isMuti) {
        this.setValue({checkedNodes:[data]})
    nodeClick(data, node, nodeComp) {
      if (!this.isMuti) {
        this.setValue({checkedNodes: [data]})
      }
    },
    checked(checkedNode, checkedData) {
      this.setValue(checkedData)
    },
    setValue:function (checkedData){
      this.checkedData=checkedData
    setValue: function (checkedData) {
      this.checkedData = checkedData
      var value = [];
      var text = [];
      const textSep =this.config.textSep;
      for(var j =0;j<checkedData.checkedNodes.length;j++){
        const item=checkedData.checkedNodes[j];
        var v=this.config.valueField.indexOf("attribute.")>=0?(item.attributes[this.config.valueField.replace("attribute.","")] || item.attributes.data[this.config.valueField.replace("attribute.","")]):(item.attributes[this.config.valueField] || item[this.config.valueField] || item.attributes.data[this.config.valueField])
      const textSep = this.config.textSep;
      for (var j = 0; j < checkedData.checkedNodes.length; j++) {
        const item = checkedData.checkedNodes[j];
        var v = this.config.valueField.indexOf("attribute.") >= 0 ? (item.attributes[this.config.valueField.replace("attribute.", "")] || item.attributes.data[this.config.valueField.replace("attribute.", "")]) : (item.attributes[this.config.valueField] || item[this.config.valueField] || item.attributes.data[this.config.valueField])
        value.push(v);
        var tempRaw = [];
        var textFieldArray = this.config.textField.split(",");
        for (var i = 0; i < textFieldArray.length; i++) {//显示的字段可能有多个
          if (!validatenull(textFieldArray[i])) {
            var t=textFieldArray[i].indexOf("attribute.")>=0?(item.attributes[textFieldArray[i].replace("attribute.","")] ||item.attributes.data[textFieldArray[i].replace("attribute.","")]):(item.attributes[textFieldArray[i]] || item[textFieldArray[i]] || item.attributes.data[textFieldArray[i]])
            var t = textFieldArray[i].indexOf("attribute.") >= 0 ? (item.attributes[textFieldArray[i].replace("attribute.", "")] || item.attributes.data[textFieldArray[i].replace("attribute.", "")]) : (item.attributes[textFieldArray[i]] || item[textFieldArray[i]] || item.attributes.data[textFieldArray[i]])
            tempRaw.push(t);
          }
        }
        text.push(tempRaw.join(textSep));
      }
      let mapFields =this.referConfig.fieldMap || {};
      let mapFields = this.referConfig.fieldMap || {};
      try {
        if(!validatenull(this.options.mapFields)){
          mapFields =Object.assign(this.referConfig.fieldMap,JSON.parse(this.options.mapFields)) ;
        if (!validatenull(this.options.mapFields)) {
          mapFields = Object.assign(this.referConfig.fieldMap, JSON.parse(this.options.mapFields));
        }
      }catch (e) {
      } catch (e) {
      }
      this.value = value.join(',');
@@ -218,9 +228,9 @@
        showField: this.referConfig.showField,
        value: this.value,
        text: this.text || '',
        isTreeMuti:this.isMuti,
        isTreeMuti: this.isMuti,
        rawData: checkedData.checkedNodes,
        fieldMap:mapFields
        fieldMap: mapFields
      });
    }
  }
Source/UBCS-WEB/src/const/code/codeKeyAttrRepeat.js
@@ -329,5 +329,14 @@
        trigger: "blur"
      }],
    },
    {
      required: true,
      label: '混淆字符转换',
      prop:'confound',
      labelWidth : 110,
      search: false,
      formslot:true,
      display:true
    }
  ]
}
Source/UBCS-WEB/src/main.js
@@ -37,6 +37,7 @@
import originalLink from "@/views/modeling/originalLink"
import classifyTrees from "@/components/Theme/ThemeClassifyTrees"
import classifyTreeform from "@/components/Theme/ThemeClassifyTreeform"
import classifyAuthDialog from "@/components/Theme/ClassifyAuthDialog"
import TemplatePro from "@/components/Theme/ThemeTemplatePro"
import attrCrud from "@/components/Theme/ThemeAttrCrud"
import formulaEditor from "@/components/code-dialog-page/formulaEditor"
@@ -98,6 +99,7 @@
Vue.component('originalRange',originalRange)
Vue.component('originalLink',originalLink)
Vue.component('classifyTrees',classifyTrees)
Vue.component('classifyAuthDialog',classifyAuthDialog)
Vue.component('classifyTreeform',classifyTreeform)
Vue.component('TemplatePro',TemplatePro)
Vue.component('formulaEditor',formulaEditor)
Source/UBCS-WEB/src/page/login/userlogin.vue
@@ -52,13 +52,13 @@
               @closed="closehandle">
      <el-form :model="form" :rules="rules">
        <el-form-item :label-width="formLabelWidth" label="原密码" prop="oldPassword">
          <el-input v-model="form.oldPassword" autocomplete="off"></el-input>
          <el-input v-model="form.oldPassword" autocomplete="off" type="password"></el-input>
        </el-form-item>
        <el-form-item :label-width="formLabelWidth" label="新密码" prop="newPassword">
          <el-input v-model="form.newPassword" autocomplete="off"></el-input>
          <el-input v-model="form.newPassword" autocomplete="off" type="password"></el-input>
        </el-form-item>
        <el-form-item :label-width="formLabelWidth" label="确认密码" prop="newPassword1">
          <el-input v-model="form.newPassword1" autocomplete="off"></el-input>
          <el-input v-model="form.newPassword1" autocomplete="off" type="password"></el-input>
        </el-form-item>
      </el-form>
      <div slot="footer" class="dialog-footer">
@@ -314,7 +314,7 @@
    addHandler() {
      this.dialogFormVisible = false
      updatePassword(md5(this.form.oldPassword), this.form.newPassword, this.form.newPassword1).then(res => {
        console.log(res)
        //console.log(res)
        if (res.data.code == 200) {
          this.$message({
            type: "success",
Source/UBCS-WEB/src/views/code/code.vue
@@ -1292,8 +1292,7 @@
      </refer-config-dialog>
    </el-dialog>
    <!--    è‡ªå®šä¹‰æµæ°´å‚照组件-->
    <!--自定义流水参照组件-->
  </basic-container>
</template>
Source/UBCS-WEB/src/views/code/codeKeyAttrRepeat.vue
@@ -27,6 +27,9 @@
                   @click="handleDelete">删 é™¤
        </el-button>
      </template>
      <template slot-scope="scope" slot="confoundForm">
        <el-input placeholder="请输入混淆字符以逗号隔开" v-model="confoundValue"></el-input>
      </template>
    </avue-crud>
  </basic-container>
</template>
@@ -49,7 +52,8 @@
        },
        selectionList: [],
        option: option,
        data: []
        data: [],
        confoundValue:''
      };
    },
    computed: {
Source/UBCS-WEB/src/views/integration/integrationIndex.vue
@@ -268,7 +268,7 @@
    // æŽ¥å£èŽ·å–é›†å›¢åˆ†ç±»æ ‘
    async referTree(oid, checked) {
      this.groupTreeData = []
      const response = await referTree({'conditionMap[codeclsfid]': oid, parentOid: null})
      const response = await referTree({'conditionMap[codeclsfid]': oid, parentOid:'0'})
      if (response.status === 200) {
        if (checked) {
          let items = response.data.map(item => {
@@ -331,7 +331,7 @@
        const findRow = that.mappingData.findIndex(item => item.metaListId === that.mappingForm.metaListId)
        that.mappingData[findRow].targetAttrName = transferValue[0].name
        that.mappingData[findRow].targetAttrId = transferValue[0].oid
        this.dialogPush = false
        this.dialogPush = false;
      }
    },
Source/UBCS-WEB/src/views/integration/integrationTransfer.vue
@@ -78,12 +78,6 @@
    dialogVisible(n) {
      this.$emit('update:visible', n)
    },
    data(n) {
      console.log('n', n)
    },
    newdata(n) {
      console.log('newdata', n)
    }
  },
  computed: {
    newdata() {
Source/UBCS-WEB/src/views/statistic/statisticPage.vue
@@ -7,7 +7,7 @@
    <!--新增对话框-->
    <el-dialog :visible.sync="addVisible" append-to-body class="avue-dialog avue-dialog--top" title="配置数据统计分析"
               top="-50px">
      <el-table ref="table" :data="tableData" border style="width: 100%" @selection-change="selectChange">
      <el-table ref="table" :data="tableData" border style="width: 100%" @selection-change="selectChange" @row-click="rowHandlerClick">
        <el-table-column type="selection" width="55"></el-table-column>
        <el-table-column align="center" label="主数据库名" prop="menuName" width="300"></el-table-column>
        <el-table-column align="center" label="类型" prop="codeType">
@@ -63,7 +63,8 @@
import pieChart from "../../components/StatisticsComponent/pieChart"
import ColumnarChart from "../../components/StatisticsComponent/ColumnarChart"
import mixCart from "../../components/StatisticsComponent/mixCart"
import {getStatisticAnalysis, getBtmAndChart, saveStatisticAnalysis, deleteChartId} from "@/api/statistic/chart"
import {getStatisticAnalysis, getBtmAndChart, saveStatisticAnalysis} from "@/api/statistic/chart"
//配置表单主数据列表接口
import {getList} from "@/api/system/statistic";
export default {
@@ -129,8 +130,6 @@
    async getEcharts() {
      try {
        const firstResponse = await getBtmAndChart();
        this.ResponseData = await getBtmAndChart();
        this.loading = false;
        const btmNames = Object.keys(firstResponse.data.data).join(',');
        const btmValue = Object.values(firstResponse.data.data);
        if (!btmNames) {
@@ -138,36 +137,23 @@
          this.pieList = [];
          this.columnarList = [];
          this.mixList = [];
          this.loading = false;
          return;
        }
        for (const value of btmValue) {
          if (value.includes('0')) {
            await this.handleStatisticAnalysis('lineList', btmNames, firstResponse);
          } else {
            this.lineList = [];
          }
          if (value.includes('1')) {
            await this.handleStatisticAnalysis('pieList', btmNames, firstResponse);
          } else {
            this.pieList = [];
          }
          if (value.includes('2')) {
            await this.handleStatisticAnalysis('columnarList', btmNames, firstResponse);
          } else {
            this.columnarList = [];
          }
          if (value.includes('3')) {
            await this.handleStatisticAnalysis('mixList', btmNames, firstResponse);
          } else {
            this.mixList = [];
          }
        }
        const typeList = {
          '0': 'lineList',
          '1': 'pieList',
          '2': 'columnarList',
          '3': 'mixList'
        };
        await this.handleStatisticAnalysis(btmNames, firstResponse);
        this.loading = false;
      } catch (error) {
        this.loading = false;
        console.error('Error:', error);
        // console.error('Error:', error);
      }
    },
    async handleStatisticAnalysis(type, btmNames, firstResponse) {
    async handleStatisticAnalysis(btmNames, firstResponse) {
      const secondResponse = await getStatisticAnalysis({btmNames});
      const secondData = secondResponse.data.data;
      const typeList = {
@@ -176,6 +162,10 @@
        "2": "columnarList",
        "3": "mixList"
      };
      this.lineList = [];
      this.pieList = [];
      this.columnarList = [];
      this.mixList = [];
      const firstData = firstResponse.data.data;
      //Object.keys导致对象顺序不一致,使用sort排序与后端返回格式一致
      Object.keys(firstData).sort().forEach((key, index) => {
@@ -190,7 +180,6 @@
                btmname: key
              };
            });
            this[listType] = [];
            this.$nextTick(() => {
              list.forEach((i, j) => {
                if (index === j) {
@@ -234,12 +223,12 @@
        this.$message.warning('请至少选择一条数据!');
        return;
      }
      let codeStatus = this.selectData.every(key => key.codeType)
      let codeStatus = this.selectData.every(key => key.codeType.length > 0);
      if (!codeStatus) {
        this.$message.warning("请检查已勾选数据类型是否为空!");
        return;
      }
      const newArray = this.selectData.map(item => {
        return {
          btmname: item.code,
@@ -281,9 +270,12 @@
    },
    //表格多选
    selectChange(selection) {
      console.log('selection', selection)
      this.selectData = selection;
    },
    rowHandlerClick(row){
      this.selectData = row;
      this.$refs.table.toggleRowSelection(row);
    }
  }
}
Source/UBCS-WEB/src/views/system/userinfo.vue
@@ -32,7 +32,7 @@
          updateInfo(form).then(res => {
            if (res.data.success) {
              if( form.oldPassword != undefined || form.newPassword1 != undefined || form.newPassword != undefined){
                updatePassword(form.oldPassword, form.newPassword, form.newPassword1).then(res => {
                updatePassword(md5(form.oldPassword), form.newPassword, form.newPassword1).then(res => {
                  if (res.data.success) {
                    this.$message({
                      type: "success",
Source/UBCS/pom.xml
@@ -108,11 +108,11 @@
            <resource>
                <directory>src/main/resources</directory>
                <excludes>
                    <exclude>bootstrap.yml</exclude>
                   <!-- <exclude>bootstrap.yml</exclude>
                    <exclude>application.yml</exclude>
                    <exclude>application-dev.yml</exclude>
                    <exclude>application-test.yml</exclude>
                    <exclude>application-prop.yml</exclude>
                    <exclude>application-prop.yml</exclude>-->
                </excludes>
            </resource>
            <resource>
Source/UBCS/ubcs-service-api/ubcs-applyjtcodeservice-api/src/main/java/com/vci/ubcs/code/applyjtcodeservice/vo/DockingClassifyViewVO.java
@@ -17,7 +17,7 @@
    /***
     * å½±å“ç¼–码项的数据
     */
    private String impactList;
    private List<List<String>> impactList;
    /**
     * æ¨¡åž‹è§†å›¾å±žæ€§é›†åˆ
@@ -35,10 +35,10 @@
    public void setMetaList(List<DockingClassifyMetaAttrVO> metaList) {
        this.metaList = metaList;
    }
    public String getImpactList() {
    public List<List<String>> getImpactList() {
        return impactList;
    }
    public void setImpactList(String impactList) {
    public void setImpactList(List<List<String>> impactList) {
        this.impactList = impactList;
    }
}
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/feign/ICodeClassifyClient.java
@@ -21,7 +21,9 @@
import com.vci.ubcs.code.vo.pagemodel.CodeClassifyTemplateAttrVO;
import com.vci.ubcs.starter.revision.model.TreeQueryObject;
import com.vci.ubcs.starter.web.pagemodel.Tree;
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.PostMapping;
@@ -37,7 +39,7 @@
 * @since 2023-04-06
 */
@FeignClient(
    value = "ubcs-code"
    value = AppConstant.APPLICATION_NAME_CODE
)
public interface ICodeClassifyClient {
@@ -45,7 +47,9 @@
    String TOP = API_PREFIX + "/top";
    String CODE_CLASSIFY_TREE=API_PREFIX+"/referCodeClassifyTree";
    String CODE_ATTRIBUTE_LIST=API_PREFIX+"/listCodeAttributeByClassId";
    String CODE_ALL_PARENT_OID=API_PREFIX+"/selectAllParentOid";
    String CODE_GETBYID="/getById";
    /**
     * èŽ·å–ä¸»é¢˜åº“å®šä¹‰è¡¨åˆ—è¡¨
     *
@@ -64,6 +68,14 @@
    @PostMapping(CODE_CLASSIFY_TREE)
    public List<Tree> referCodeClassifyTree(@RequestBody TreeQueryObject treeQueryObject);
    /**
     * èŽ·å–æ‰€æœ‰ä¸Šçº§èŠ‚ç‚¹çš„oid
     * @param oid
     * @return
     */
    @PostMapping(CODE_ALL_PARENT_OID)
    public R<List<String> > selectAllParentOid(@RequestParam("oid") String oid);
    /***
     * èŽ·å–ä¸»æ•°æ®æ¨¡æ¿å±žæ€§ä¿¡æ¯
     * @param codeClassifyId
Source/UBCS/ubcs-service-api/ubcs-system-api/src/main/java/com/vci/ubcs/system/entity/ClassifyAuth.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,43 @@
package com.vci.ubcs.system.entity;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
 * åˆ†ç±»æŽˆæƒå‚数对象
 * @author ludc
 * @date 2023/12/25 15:36
 */
@Data
@TableName("PL_ORG_CLASSIFYAUTH")
@AllArgsConstructor
@NoArgsConstructor
public class ClassifyAuth {
    /**
     * ä¸»é”®
     */
    @TableId("oid")
    private String oid;
    /**
     * è§’色id
     */
    private String roleId;
    /**
     * åˆ†ç±»id
     */
    private String classifyId;
    /**
     * åˆ†ç±»ä¸‹çš„æŒ‰é’®
     */
    private String buttonIds;
}
Source/UBCS/ubcs-service-api/ubcs-system-api/src/main/java/com/vci/ubcs/system/feign/ISysClient.java
@@ -78,6 +78,7 @@
    String STRATEGYBYID = API_PREFIX + "/query-userid";
    String REGEX = API_PREFIX + "/combination-regex";
    String REGEXONE = API_PREFIX + "/combination-regex-one";
    String GETVIEWCLASSIFY = API_PREFIX + "/get-view-classify";
    /**
     * èŽ·å–èœå•
@@ -390,4 +391,7 @@
    @PostMapping(REGEXONE)
    R<List<String>> getRegexByList(@RequestBody List<String> combinationIds);
    @GetMapping(GETVIEWCLASSIFY)
    R<List<String>> getViewClassByRoleIds(@RequestParam("roleIds") List<String> roleIds);
}
Source/UBCS/ubcs-service-api/ubcs-system-api/src/main/java/com/vci/ubcs/system/feign/ISysClientFallback.java
@@ -199,5 +199,10 @@
        return R.fail("获取数据失败");
    }
    @Override
    public R<List<String>> getViewClassByRoleIds(List<String> roleIds) {
        return R.fail("获取数据失败");
    }
}
Source/UBCS/ubcs-service-api/ubcs-system-api/src/main/java/com/vci/ubcs/system/vo/ClassifyAuthVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,35 @@
package com.vci.ubcs.system.vo;
import com.vci.ubcs.system.entity.ClassifyAuth;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
 * åˆ†ç±»æŽˆæƒå¯¹è±¡
 * @author ludc
 * @date 2023/12/25 15:41
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ClassifyAuthVO extends ClassifyAuth {
    /**
     * è§’色名
     */
    private String roleIdName;
    /**
     * åˆ†ç±»å
     */
    private String classifyName;
    /**
     * åˆ†ç±»ä¸‹çš„æŒ‰é’®
     */
    private List<String> buttonIdList;
}
Source/UBCS/ubcs-service/ubcs-applyjtcodeservice/src/main/java/com/vci/ubcs/code/applyjtcodeservice/feigh/MdmInterJtClient.java
@@ -305,7 +305,7 @@
            for (DockingClassifyViewVO viewInfo : list) {
                String viewName =StringUtils.isBlank(viewInfo.getViewName())?"":viewInfo.getViewName();
                String impactList = StringUtils.isBlank(viewInfo.getImpactList())?"":viewInfo.getImpactList();
                String impactList = viewInfo.getImpactList() == null ? "" : viewInfo.getImpactList().get(0).get(0);
                log.info("VilewMode:-------------->视图名称:"+viewName);
                log.info("VilewMode:-------------->影响编码项:"+impactList);
                log.info("VilewMode:--------------> é›†å›¢åˆ†ç±»ä¸»é”®:"+jclassId);
Source/UBCS/ubcs-service/ubcs-applyjtcodeservice/src/main/java/com/vci/ubcs/code/applyjtcodeservice/service/impl/GroupMdmInterServiceImpl.java
@@ -238,6 +238,11 @@
        //List<BaseModelVO> codeWupins=mdmEngineService.listByIds(VciBaseUtil.str2List(oids));
        List<BaseModel> dataModelList = new ArrayList<>();
        try {
            R<List<BaseModel>> listR = mdmEngineClient.selectByTypeAndOid(btmName, oids);
            if(listR.getData().size() == 0){
                return R.fail("为查询到相关业务数据!");
            }
            dataModelList = listR.getData();
            if (!CollectionUtils.isEmpty(dataModelList)) {
                DockingGroupDataVO dockingGroupDataVO = new DockingGroupDataVO();
                //申请单和申请单对象关系
@@ -582,9 +587,9 @@
     */
    private boolean saveDatas(DockingQueryClassModelVO dockingQueryClassifyModelVO) throws Throwable {
        try {
            DockingClassifyMainVO mainData = dockingQueryClassifyModelVO.getMainData();
            List<DockingClassifyVO> classList = mainData.getClassList();
            Map<String,List<DockingClassifyViewVO>>classInfoMap = mainData.getClassInfos();
            DockingClassifyMainVO data = dockingQueryClassifyModelVO.getData();
            List<DockingClassifyVO> classList = data.getClassList();
            Map<String,List<DockingClassifyViewVO>>classInfoMap = data.getClassInfos();
            ////initVCIInvocationInfo("1");
            List<DockingPreClassify> dockingPreClassifyArrayList=new ArrayList<>();
            for (DockingClassifyVO jclassObject : classList) {
@@ -643,14 +648,14 @@
            Map<String, DockingPreViewModel> jviewmodelMap = new HashMap<String, DockingPreViewModel>();
            //Map<String, String> condtionMa = new HashMap<String, String>();
            //    condtionMa.put("jsourceclsfid", jclassId);
            List<DockingPreViewModel> dockingPreViewModelList= dockingPreViewModelService.list(Wrappers.<DockingPreViewModel>query().lambda().eq(DockingPreViewModel::getSourceClassifyId,false));// æ ¹æ®åˆ†ç±»æŸ¥è¯¢æ¨¡åž‹è§†å›¾å¯¹è±¡
            List<DockingPreViewModel> dockingPreViewModelList= dockingPreViewModelService.list(Wrappers.<DockingPreViewModel>query().lambda().eq(DockingPreViewModel::getSourceClassifyId,jclassId));// æ ¹æ®åˆ†ç±»æŸ¥è¯¢æ¨¡åž‹è§†å›¾å¯¹è±¡
            for (DockingPreViewModel dockingPreViewModel : dockingPreViewModelList) {
                jviewmodelMap.put(dockingPreViewModel.getViewName(),dockingPreViewModel);
            }
            for (DockingClassifyViewVO viewInfo : list) {
                String viewName = com.alibaba.cloud.commons.lang.StringUtils.isBlank(viewInfo.getViewName())?"":viewInfo.getViewName();
                String impactList = com.alibaba.cloud.commons.lang.StringUtils.isBlank(viewInfo.getImpactList())?"":viewInfo.getImpactList();
                String impactList = viewInfo.getImpactList() == null ? "" : viewInfo.getImpactList().get(0).get(0);
                log.info("VilewMode:-------------->视图名称:"+viewName);
                log.info("VilewMode:-------------->影响编码项:"+impactList);
                log.info("VilewMode:--------------> é›†å›¢åˆ†ç±»ä¸»é”®:"+jclassId);
@@ -743,6 +748,8 @@
                    List<DockingClassifyMetaAttrVO> childMetaList = new ArrayList<>();
                    childMetaList.add(compositeMeta);
                    getMetaAttrObject(childMetaList, jclassId,jviewModelObject, pid,allDockingPreMetaAttrList);
                }else{
                    allDockingPreMetaAttrList.add(dockingPreMetaAttr);
                }
            }
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/feign/CodeClassifyClient.java
@@ -32,6 +32,7 @@
import org.springblade.core.mp.support.Condition;
import org.springblade.core.mp.support.Query;
import com.vci.ubcs.code.service.ICodeClassifyService;
import org.springblade.core.tool.api.R;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
@@ -51,11 +52,9 @@
@AllArgsConstructor
public class CodeClassifyClient implements ICodeClassifyClient {
    private final ICodeClassifyService plCodeClassifyService;
    private final ICodeClassifyTemplateAttrService codeClassifyTemplateAttrService;
    private final ICodeClassifyService codeClassifyService;
    private final  MdmEngineService engineService;
    CodeClassifyMapper codeClassifyMapper;
    private final CodeClassifyMapper codeClassifyMapper;
    @Override
    @GetMapping(TOP)
@@ -67,6 +66,15 @@
        return BladePage.of(page);
    }
    /**
     * èŽ·å–æ‰€æœ‰ä¸Šçº§èŠ‚ç‚¹çš„oid
     * @param oid
     * @return
     */
    public R<List<String>> selectAllParentOid(String oid){
        return R.data(codeClassifyService.selectAllParentOid(oid));
    }
    /***
     * èŽ·å–ä¸»é¢˜åº“åˆ†ç±»å±‚çº§æ ‘
     * @param treeQueryObject
@@ -75,7 +83,7 @@
    @Override
    @PostMapping(CODE_CLASSIFY_TREE)
    public List<Tree> referCodeClassifyTree(TreeQueryObject treeQueryObject) {
        return plCodeClassifyService.treeCodeClassify(treeQueryObject);
        return codeClassifyService.treeCodeClassify(treeQueryObject);
    }
    @Override
@@ -94,7 +102,7 @@
    @Override
    @GetMapping(CODE_GETBYID)
    public CodeClassify getById(String classifyId) {
        return plCodeClassifyService.getById(classifyId);
        return codeClassifyService.getById(classifyId);
    }
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/mapper/CodeClassifyMapper.java
@@ -53,6 +53,13 @@
    Map<String,String> selectAllLevelChildOid(@Param("oid") String oid);
    /**
     * æŸ¥è¯¢æ‰€æœ‰ä¸Šå±‚父节点的oid
     * @param oid
     * @return
     */
    List<String> selectAllParentOid(@Param("oid") String oid);
    /**
     * æ ¡éªŒæ˜¯å¦åŒ…含子节点
     *
     * @param oid åˆ†ç±»çš„主键
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeClassifyService.java
@@ -224,6 +224,13 @@
    List<CodeClassify> selectAllLevelParents(String oid);
    /**
     * èŽ·å–æ‰€æœ‰ä¸Šçº§èŠ‚ç‚¹çš„oid
     * @param oid
     * @return
     */
    List<String> selectAllParentOid(String oid);
    /**
     * ä¸»é”®èŽ·å–ä¸»é¢˜åº“åˆ†ç±»
     * @param oid ä¸»é”®
     * @return ä¸»é¢˜åº“分类显示对象
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeClassifyServiceImpl.java
@@ -49,6 +49,7 @@
import com.vci.ubcs.starter.web.util.LangBaseUtil;
import com.vci.ubcs.starter.web.util.VciBaseUtil;
import com.vci.ubcs.system.cache.NacosConfigCache;
import com.vci.ubcs.system.feign.ISysClient;
import org.apache.poi.hssf.util.HSSFColor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -92,7 +93,7 @@
    private IBtmTypeClient btmTypeClient;
    @Resource
    private CommonsMapper commonsMapper;
    private ISysClient sysClient;
    /**
     * æ—¥å¿—
@@ -582,18 +583,67 @@
            return s.getId() + " " + s.getName() + (FrameworkDataLCStatus.DISABLED.getValue().equalsIgnoreCase(s
                .getLcStatus()) ? (" ã€åœç”¨ã€‘ ") : "");
        });
        Iterator var6 =  tree.listIterator();
        while(var6.hasNext()){
            Tree trees = (Tree) var6.next();
            boolean checkHasChild=codeClassifyMapper.checkHasChild(trees.getOid());
            if(checkHasChild){
                trees.setLeaf(false);
            }else{
                trees.setLeaf(true);
        //超管显示所有分类
        if(VciBaseUtil.checkAdminTenant()){
            Iterator var6 =  tree.listIterator();
            while(var6.hasNext()){
                Tree trees = (Tree) var6.next();
                boolean checkHasChild=codeClassifyMapper.checkHasChild(trees.getOid());
                if(checkHasChild){
                    trees.setLeaf(false);
                }else{
                    trees.setLeaf(true);
                }
            }
        }else {
            // é‚£äº›åˆ†ç±»å…·å¤‡æŸ¥çœ‹æƒé™
            R<List<String>> viewClassByRoleIds = sysClient.getViewClassByRoleIds(Arrays.asList(AuthUtil.getUser().getRoleId().split(",")));
            // è¯·æ±‚失败或者请求得到的具备查看权限的分类id集合为空
            if(!viewClassByRoleIds.isSuccess() && !viewClassByRoleIds.getData().isEmpty()){
                return new ArrayList<>();
            }
            // è¿‡æ»¤
            filterTreeNodes(tree,viewClassByRoleIds.getData());
        }
        return tree;
    }
    /**
     * åˆ†ç±»æŽˆæƒè¿‡æ»¤æŽ‰æ²¡æœ‰æƒé™çš„分类
     * @param trees
     * @param classifyIds
     */
    private void filterTreeNodes(List<Tree> trees, List<String> classifyIds) {
        Iterator<Tree> iterator = trees.iterator();
        while (iterator.hasNext()) {
            Tree tree = iterator.next();
            Boolean checkHasChild = codeClassifyMapper.checkHasChild(tree.getOid());
            tree.setLeaf(!checkHasChild);
            if (classifyIds.contains(tree.getOid())) {
                // å¦‚果顶层节点存在于 classifyIds ä¸­ï¼Œç›´æŽ¥ä¿ç•™å…¶å­èŠ‚ç‚¹é›†åˆ
                continue;
            }
            if (tree.getChildren() != null && !tree.getChildren().isEmpty()) {
                filterTreeNodes(tree.getChildren(), classifyIds);
            }
            if (!hasMatchingChild(tree, classifyIds)) {
                iterator.remove();
            }
        }
    }
    private boolean hasMatchingChild(Tree tree, List<String> classifyIds) {
        if (classifyIds.contains(tree.getOid())) {
            return true;
        }
        if (tree.getChildren() != null) {
            for (Tree child : tree.getChildren()) {
                if (hasMatchingChild(child, classifyIds)) {
                    return true;
                }
            }
        }
        return false;
    }
    /**
@@ -1408,6 +1458,19 @@
    }
    /**
     * æŸ¥è¯¢æ‰€æœ‰ä¸Šå±‚父节点的oid
     * @param oid
     * @return
     */
    @Override
    public List<String> selectAllParentOid(String oid){
        if(Func.isBlank(oid)){
            return new ArrayList<>();
        }
        return this.codeClassifyMapper.selectAllParentOid(oid);
    }
    /**
     * ä½¿ç”¨åˆ†ç±»ä¸»é”®èŽ·å–åˆ†ç±»ç›¸å…³çš„æ‰€æœ‰ä¿¡æ¯
     *
     * @param codeClassifyOid åˆ†ç±»çš„主键
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmEngineServiceImpl.java
@@ -1191,6 +1191,7 @@
                if(i>nowmonth){
                    monthCount.add(0);
                    month.add(0);
                    continue;
                }
                //当前月份之前之和
                Integer count = 0;
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmIOServiceImpl.java
@@ -2740,7 +2740,7 @@
        //cboOidMap.put("id", QueryOptionConstant.IN + "(" + VciBaseUtil.toInSql(codeDataMap.keySet().toArray(new String[0])) + ")");
        String tableName ="";
        try {
            R<BtmTypeVO> r = btmTypeClient.getAllAttributeByBtmId(templateVO.getBtmTypeId());
            R<BtmTypeVO> r = btmTypeClient.getAllAttributeByBtmId(classifyFullInfo.getTopClassifyVO().getBtmTypeId());
            if(!r.isSuccess()) {
                throw new Throwable(r.getMsg());
            }
@@ -2838,7 +2838,17 @@
                cbo.setDescription(StringUtils.isBlank(orderDTO.getDescription())?"":orderDTO.getDescription());
                cbo.setName(orderDTO.getName());
                try {
                    cbo.setAttributeValueWithNoCheck("description", orderDTO.getDescription());
                    //主要处理大小写问题,将data里面的数据的key都转为小写
                    HashMap<String,String> lowerData = new HashMap<>();
                    Iterator<Map.Entry<String, String>> iterator = cbo.getData().entrySet().iterator();
                    while (iterator.hasNext()){
                        Map.Entry<String, String> next = iterator.next();
                        lowerData.put(next.getKey().toLowerCase(Locale.ROOT),next.getValue());
                    }
                    cbo.getData().clear();
                    cbo.getData().putAll(lowerData);
                    cbo.setAttributeValueWithNoCheck("description", (StringUtil.isNotBlank(orderDTO.getData()
                        .get("description")) ? orderDTO.getData().get("description") : orderDTO.getDescription() ));
                //    cbo.setAttributeValue("name", orderDTO.getName());
                    //  if(finalIsProcess){//在流程中不允许更改
                    //     errorMap.put(code,errorMap.getOrDefault(code, errorMap.getOrDefault(code,"")+";数据"+code+"在流程中,不允许更改!"));
@@ -2901,7 +2911,7 @@
                    List<CodeAllCode>newCodeAllCodeList= codeAllCodeService.selectByWrapper(Wrappers.<CodeAllCode>query().lambda().eq(CodeAllCode::getCreateCodeOid, cbo.getOid()));
                    if (!CollectionUtils.isEmpty(newCodeAllCodeList)) {
                        CodeAllCode codeCbo = codeAllCodeList.get(0);
                        CodeAllCode codeCbo = newCodeAllCodeList.get(0);
                        log.info("codeCbos code:" + codeCbo.getId());
                        codeCbo.setLcStatus(status);
                        codeAllCodeList.add(codeCbo);
@@ -2939,7 +2949,7 @@
                engineService.updateBatchByBaseModel(classifyFullInfo.getTopClassifyVO().getBtmTypeId(),updateList);
                codeAllCodeService.saveOrUpdateBatch(codeAllCodeList);
                if(deleteList.size()>0) {
                    commonsMapper.deleteByTaleAndOid(tableName, VciBaseUtil.array2String(deleteList.toArray(new String[]{})));
                    commonsMapper.deleteByTaleAndOid(tableName, VciBaseUtil.toInSql(deleteList.toArray(new String[]{})));
                }
                //是否调用集团接口申请接口
                if(isCodeOrGroupCode){
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/UniversalInterfaceImpl.java
@@ -368,7 +368,7 @@
                            xmlResultDataObjectDetailDO.setCode("");
                            xmlResultDataObjectDetailDO.setId(applyDataVO.getId());
                            xmlResultDataObjectDetailDO.setErrorid(objerrorCode);
                            xmlResultDataObjectDetailDO.setMsg("编码申请失败:" + e.getMessage());
                            xmlResultDataObjectDetailDO.setMsg("编码维护失败:" + e.getMessage());
                            resultDataObjectDetailDOs.add(xmlResultDataObjectDetailDO);
                        });
                    }else{
@@ -377,7 +377,7 @@
                        xmlResultDataObjectDetailDO.setCode("");
                        xmlResultDataObjectDetailDO.setId("");
                        xmlResultDataObjectDetailDO.setErrorid(objerrorCode);
                        xmlResultDataObjectDetailDO.setMsg("编码申请失败:" + e.getMessage());
                        xmlResultDataObjectDetailDO.setMsg("编码维护失败:" + e.getMessage());
                        resultDataObjectDetailDOs.add(xmlResultDataObjectDetailDO);
                    }
                    e.printStackTrace();
Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CodeCLassifyMapper.xml
@@ -60,6 +60,13 @@
            PRIOR OID = parentCodeClassifyOid
    </select>
    <select id="selectAllParentOid" resultType="java.lang.String">
        SELECT oid
        FROM PL_CODE_CLASSIFY
                 START WITH oid = #{oid}
        CONNECT BY PRIOR PARENTCODECLASSIFYOID = oid
    </select>
    <select id="checkHasChild" resultType="java.lang.Boolean">
        <![CDATA[select count(oid)
        from PL_CODE_CLASSIFY
Source/UBCS/ubcs-service/ubcs-system/pom.xml
@@ -55,6 +55,12 @@
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.vci.ubcs</groupId>
            <artifactId>ubcs-code-api</artifactId>
            <version>3.0.1.RELEASE</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>
    <build>
Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/controller/ClassifyAuthController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,62 @@
package com.vci.ubcs.system.controller;
import com.vci.ubcs.system.entity.ClassifyAuth;
import com.vci.ubcs.system.entity.Menu;
import com.vci.ubcs.system.service.IClassifyAuthService;
import com.vci.ubcs.system.vo.ClassifyAuthVO;
import io.swagger.annotations.Api;
import lombok.AllArgsConstructor;
import org.springblade.core.tenant.annotation.NonDS;
import org.springblade.core.tool.api.R;
import org.springframework.web.bind.annotation.*;
import springfox.documentation.annotations.ApiIgnore;
import java.util.List;
import java.util.Map;
/**
 * åˆ†ç±»æŽˆæƒ
 * @author ludc
 * @date 2023/12/20 11:33
 */
@NonDS
@RestController
@AllArgsConstructor
@RequestMapping("/classifyAuth")
@ApiIgnore
@Api(value = "分类授权", tags = "接口")
public class ClassifyAuthController {
    private final IClassifyAuthService classifyAuthService;
    /**
     * åˆ†ç±»æŽˆæƒä¿å­˜æŽ¥å£
     * @param classifyAuthList
     * @return
     */
    @PostMapping("saveOrUpdate")
    public R saveOrUpdate(@RequestBody List<ClassifyAuth> classifyAuthList) {
        return classifyAuthService.submit(classifyAuthList);
    }
    /**
     * èŽ·å–åˆ†ç±»æŽˆæƒé›†åˆ
     * @param classifyAuthVO
     * @return
     */
    @GetMapping("list")
    public R<List<ClassifyAuthVO>> getClassifyAuthList(ClassifyAuthVO classifyAuthVO) {
        return R.data(classifyAuthService.getClassifyAuthList(classifyAuthVO));
    }
    /**
     * æŸ¥è¯¢è¯¥åˆ†ç±»ä¸‹ï¼Œå½“前登录的角色有哪些按钮权限
     * @param classifyId
     * @return
     */
    @GetMapping("getAuthButtonList")
    public R<Map<String,Boolean>> getAuthButtonList(String classifyId){
        return R.data(classifyAuthService.getAuthButtonList(classifyId));
    }
}
Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/controller/MenuController.java
@@ -33,6 +33,7 @@
import org.springblade.core.cache.utils.CacheUtil;
import org.springblade.core.boot.ctrl.BladeController;
import org.springblade.core.log.annotation.ApiLog;
import org.springblade.core.log.exception.ServiceException;
import org.springblade.core.mp.support.Condition;
import org.springblade.core.mp.support.Query;
import org.springblade.core.secure.BladeUser;
@@ -92,6 +93,25 @@
    public R<List<MenuVO>> list(@ApiIgnore @RequestParam Map<String, Object> menu) {
        List<Menu> list = menuService.list(Condition.getQueryWrapper(menu, Menu.class).lambda().orderByAsc(Menu::getSort));
        return R.data(MenuWrapper.build().listNodeVO(list));
    }
    /**
     * æ ¹æ®çˆ¶èœå•çš„code获取,下面的按钮
     * @param menu
     * @return
     */
    @GetMapping("/getButtonByParentCode")
    @ApiImplicitParams({
        @ApiImplicitParam(name = "code", value = "菜单编号", paramType = "query", dataType = "string"),
        @ApiImplicitParam(name = "category", value = "菜单类型", paramType = "query", dataType = "string")
    })
    @ApiOperationSupport(order = 3)
    @ApiOperation(value = "列表", notes = "传入menu")
    public R<List<MenuVO>> getButtonByParentCode(@ApiIgnore @RequestParam Map<String, Object> menu){
        if(Func.isBlank(menu.getOrDefault("code","").toString())){
            throw new ServiceException("必填参数菜单code不能为空!");
        }
        return R.data(MenuWrapper.build().listNodeVO(menuService.getButtonByParentCode(menu.getOrDefault("code","").toString())));
    }
    /**
@@ -160,7 +180,6 @@
        }
        return R.fail("操作失败");
    }
    /**
     * åˆ é™¤
Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/feign/SysClient.java
@@ -62,6 +62,8 @@
    private final IMdmCountConfigService mdmCountConfigService;
    private final IClassifyAuthService classifyAuthService;
    @Override
    @GetMapping(MENU)
    public R<Menu> getMenu(Long id) {
@@ -262,4 +264,8 @@
        return R.data(mdmCountConfigService.getMdmCountConfig(userId));
    }
    public R<List<String>> getViewClassByRoleIds(List<String> roleIds){
        return R.data(classifyAuthService.getViewClassByRoleIds(roleIds));
    }
}
Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/mapper/ClassifyAuthMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,19 @@
package com.vci.ubcs.system.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.vci.ubcs.system.entity.ClassifyAuth;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
 * @author ludc
 * @date 2023/12/25 15:50
 */
public interface ClassifyAuthMapper extends BaseMapper<ClassifyAuth> {
    List<ClassifyAuth> getClassifyAuthList(@Param("classifyId") String classifyId);
    List<String> getViewClassByRoleIds(@Param("roleIds") List<String> roleIds);
}
Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/mapper/MenuMapper.java
@@ -18,6 +18,7 @@
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.apache.ibatis.annotations.Param;
import org.springblade.core.tool.node.TreeNode;
import com.vci.ubcs.system.dto.MenuDTO;
import com.vci.ubcs.system.entity.Menu;
@@ -134,6 +135,13 @@
    List<Menu> selectMenuChildByBtnType(String btmType,List<String> roleIds);
    /**
     * æ ¹æ®çˆ¶èœå•code查询菜单的子按钮
     *
     * @return
     */
    List<Menu> getButtonByParentCode(@Param("code") String code);
    /**
     * æƒé™é…ç½®èœå•
     *
     * @param roleId
Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/service/IClassifyAuthService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,47 @@
package com.vci.ubcs.system.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.vci.ubcs.system.entity.ClassifyAuth;
import com.vci.ubcs.system.entity.Menu;
import com.vci.ubcs.system.vo.ClassifyAuthVO;
import org.springblade.core.tool.api.R;
import java.util.List;
import java.util.Map;
/**
 * åˆ†ç±»æŽˆæƒ
 * @author ludc
 * @date 2023/12/25 15:34
 */
public interface IClassifyAuthService extends IService<ClassifyAuth> {
    /**
     * åˆ†ç±»æŽˆæƒä¿å­˜æŽ¥å£
     * @param classifyAuthList
     * @return
     */
    R submit(List<ClassifyAuth> classifyAuthList);
    /**
     * èŽ·å–åˆ†ç±»æŽˆæƒé›†åˆ
     * @param classifyAuthVO
     * @return
     */
    List<ClassifyAuthVO> getClassifyAuthList(ClassifyAuthVO classifyAuthVO);
    /**
     * æŸ¥è¯¢è¯¥åˆ†ç±»ä¸‹ï¼Œå½“前登录的角色有哪些按钮权限
     * @param classifyId
     * @return
     */
    Map<String,Boolean> getAuthButtonList(String classifyId);
    /**
     * æ ¹æ®è§’色id查看有哪些分类具备查看权限
     * @param roleIds
     * @return
     */
    List<String> getViewClassByRoleIds(List<String> roleIds);
}
Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/service/IMenuService.java
@@ -189,6 +189,13 @@
    List<Menu> getMenuByCodes(List<String> codes,Long userId);
    /**
     * æ ¹æ®çˆ¶çº§èœå•çš„code查询按钮信息
     * @param code
     * @return
     */
    List<Menu> getButtonByParentCode(String code);
    /**
     * å¯¹KeepAlive值转换成布尔类型进行封装
     *
     * @param childMenu
@@ -204,4 +211,10 @@
     */
    R cloneMenuButton(Long menuId, List<String> buttonIds);
    /**
     * æ ¹æ®ä¸»é”®èŽ·å–èœå•ä¿¡æ¯
     * @param ids
     * @return
     */
    List<Menu> getMenuListById(List<String> ids,String parentId);
}
Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/service/impl/ClassifyAuthServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,171 @@
package com.vci.ubcs.system.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.vci.ubcs.code.feign.ICodeClassifyClient;
import com.vci.ubcs.starter.web.util.VciBaseUtil;
import com.vci.ubcs.system.entity.ClassifyAuth;
import com.vci.ubcs.system.entity.Menu;
import com.vci.ubcs.system.mapper.ClassifyAuthMapper;
import com.vci.ubcs.system.service.IClassifyAuthService;
import com.vci.ubcs.system.service.IMenuService;
import com.vci.ubcs.system.vo.ClassifyAuthVO;
import com.vci.ubcs.system.vo.MenuVO;
import com.vci.ubcs.system.wrapper.ClassifyAuthWrapper;
import lombok.AllArgsConstructor;
import org.springblade.core.log.exception.ServiceException;
import org.springblade.core.secure.utils.AuthUtil;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.Func;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.*;
import java.util.stream.Collectors;
/**
 * åˆ†ç±»æŽˆæƒ
 * @author ludc
 * @date 2023/12/25 15:35
 */
@Service
@AllArgsConstructor
public class ClassifyAuthServiceImpl extends ServiceImpl<ClassifyAuthMapper,ClassifyAuth> implements IClassifyAuthService {
    private final ClassifyAuthMapper classifyAuthMapper;
    private final IMenuService menuService;
    private final ICodeClassifyClient codeClassifyClient;
    /**
     * åˆ†ç±»æŽˆæƒä¿å­˜æŽ¥å£
     * @param classifyAuthList
     * @return
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public R submit(List<ClassifyAuth> classifyAuthList) {
        if(classifyAuthList.isEmpty()){
            R.fail("授权列表不能为空!");
        }
        // åˆ¤é‡ï¼ŒæŸ¥çœ‹æ˜¯å¦å­˜åœ¨åŒä¸€ä¸ªclassid下配置了相同的角色
        Map<String, Long> roleidCounts = classifyAuthList.stream()
            .collect(Collectors.groupingBy(ClassifyAuth::getRoleId, Collectors.counting()));
        // æ£€æŸ¥æ˜¯å¦æœ‰roleid出现次数大于1的情况
        boolean hasDuplicateRoleid = roleidCounts.values().stream()
            .anyMatch(count -> count > 1);
        if(hasDuplicateRoleid){
            R.fail("角色和分类已经存在,请重新配置!");
        }
        // å¦‚果传过来的集合中该分类id下删除了部分角色的授权,就需要将该库中classifyId下不存在的数据删掉
        List<String> roleIds = classifyAuthList.stream().map(ClassifyAuth::getRoleId).collect(Collectors.toList());
        // åˆ é™¤
        LambdaUpdateWrapper<ClassifyAuth> updateWrapper = Wrappers.<ClassifyAuth>update()
            .lambda().eq(ClassifyAuth::getClassifyId, classifyAuthList.get(0).getClassifyId())
            .notIn(ClassifyAuth::getRoleId, roleIds);
        try {
            this.classifyAuthMapper.delete(updateWrapper);
        }catch (Exception e){
            throw new ServiceException("分类授权过程中出现错误,错误原因:"+e.getMessage());
        }
        return R.status(saveOrUpdateBatch(classifyAuthList));
    }
    /**
     * èŽ·å–åˆ†ç±»æŽˆæƒé›†åˆ
     * @param classifyAuthVO
     * @return
     */
    @Override
    public List<ClassifyAuthVO> getClassifyAuthList(ClassifyAuthVO classifyAuthVO) {
        if(Func.isBlank(classifyAuthVO.getClassifyId())){
            throw new ServiceException("缺少必传参数分类id");
        }
        LambdaQueryWrapper<ClassifyAuth> wrapper = Wrappers.<ClassifyAuth>query()
            .lambda().eq(ClassifyAuth::getClassifyId,classifyAuthVO.getClassifyId());
        List<ClassifyAuth> classifyAuths = this.classifyAuthMapper.selectList(wrapper);
        if(classifyAuths.isEmpty()){
            return new ArrayList<ClassifyAuthVO>();
        }
        return ClassifyAuthWrapper.build().listVO(classifyAuths);
    }
    /**
     * æŸ¥è¯¢è¯¥åˆ†ç±»ä¸‹ï¼Œå½“前登录的角色有哪些按钮权限
     * @param classifyId
     * @return
     */
    public Map<String,Boolean> getAuthButtonList(String classifyId){
        if(Func.isBlank(classifyId)){
            return new HashMap<>();
        }
        //查询分类节点的所有父级节点
        R<List<String>> listR = codeClassifyClient.selectAllParentOid(classifyId);
        if (!listR.isSuccess() && !listR.getData().isEmpty()) {
            throw new ServiceException("获取分类信息失败!");
        }
        // è¿”回的分类oid是当前节点为第一个,后面依次是他的上层节点
        List<String> classifyOidList = listR.getData();
        final String roleIds = AuthUtil.getUser().getRoleId();
        // å…ˆæŸ¥è¯¢æŒ‰é’®id列表
        LambdaQueryWrapper<ClassifyAuth> wrapper = Wrappers.<ClassifyAuth>query()
            .lambda().eq(ClassifyAuth::getClassifyId, classifyId)
            .in(ClassifyAuth::getRoleId, roleIds);
        List<ClassifyAuth> classifyAuths = this.classifyAuthMapper.selectList(wrapper);
        //如果当前分类没有找到授权配置,就依次从当前节点往上层节点找授权配置,找到了就停止,没找到就一直找到最后
        if(classifyAuths.isEmpty()){
            // ä¸‹æ ‡ä»Ž1开始因为当前节点0已经查询过
            for (int i = 1; i < classifyOidList.size(); i++) {
                classifyAuths = this.classifyAuthMapper.selectList(
                    Wrappers.<ClassifyAuth>query()
                        .lambda().eq(ClassifyAuth::getClassifyId, classifyOidList.get(i))
                        .in(ClassifyAuth::getRoleId, roleIds)
                );
                if(!classifyAuths.isEmpty()){
                    break;
                }
            }
        }
        //出现了错误数据,同一个角色和同一个分类id存在多条授权记录
        if(classifyAuths.size()>1){
            throw new ServiceException("角色和分类配置存在多条记录,请联系管理人员清理错误配置!");
        }
        // æ˜¯å¦ä¸ºè¶…管
        Boolean isAdmin = VciBaseUtil.checkAdminTenant();
        // æœªé…ç½®æŒ‰é’®æƒé™
        if(!isAdmin && (classifyAuths.isEmpty() || Func.isBlank(classifyAuths.get(0).getButtonIds()))){
            return new HashMap<>();
        }
        List<String> condition1 = new ArrayList<>();
        // å¦‚果不是超管用户
        if(!isAdmin){
            condition1.addAll(Arrays.asList(classifyAuths.get(0).getButtonIds().split(",")));
        }
        List<Menu> menuList = menuService.getMenuListById(condition1,"1648879284590858241");
        if(menuList.isEmpty()){
            return new HashMap<>();
        }
        Map<String, Boolean> buttonMaps = menuList.stream()
            .collect(Collectors.toMap(Menu::getCode, menu -> true));
        return buttonMaps;
    }
    /**
     * æ ¹æ®è§’色id查看有哪些分类具备查看权限
     * @param roleIds
     * @return
     */
    @Override
    public List<String> getViewClassByRoleIds(List<String> roleIds) {
        if(roleIds.isEmpty()){
            return new ArrayList<>();
        }
        return this.classifyAuthMapper.getViewClassByRoleIds(roleIds);
    }
}
Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/service/impl/MenuServiceImpl.java
@@ -68,6 +68,7 @@
    private final IRoleMenuService roleMenuService;
    private final IRoleScopeService roleScopeService;
    private final MenuMapper menuMapper;
    private final ITopMenuSettingService topMenuSettingService;
    private final static String PARENT_ID = "parentId";
    private final static Integer MENU_CATEGORY = 1;
@@ -89,7 +90,6 @@
        return baseMapper.lazyMenuPage(parentId, param, Condition.getPage(query));
    }
    @Override
    public List<MenuVO> routes(String roleId, Long topMenuId) {
        if (StringUtil.isBlank(roleId)) {
@@ -103,7 +103,7 @@
            roleMenus = allMenus;
        }
        // éžè¶…级管理员并且不是顶部菜单请求则返回对应角色权限菜单
        else if (!AuthUtil.isAdministrator() && Func.isEmpty(topMenuId)) {
        else if (!VciBaseUtil.checkAdminTenant() && Func.isEmpty(topMenuId)) {
            roleMenus = tenantPackageMenu(baseMapper.roleMenuByRoleId(Func.toLongList(roleId)));
        }
        // é¡¶éƒ¨èœå•请求返回对应角色权限菜单
@@ -353,7 +353,7 @@
        LambdaQueryWrapper<Menu> wrapper = Wrappers.<Menu>query()
            .lambda()
            .in(Menu::getCode, codes)
            .eq(Menu::getIsDeleted,0) /*未被删除*/
            .eq(Menu::getIsDeleted,BladeConstant.DB_NOT_DELETED) /*未被删除*/
            .eq(Menu::getCategory,1) /*菜单类型不能为按钮*/
            .orderByAsc(Menu::getCode);  /*根据code排序与classify的btmtypeid对应*/
        // è¶…管不用根据角色来查询
@@ -372,6 +372,17 @@
            }
        }
        return this.list(wrapper);
    }
    /**
     * æ ¹æ®çˆ¶çº§èœå•çš„code查询按钮信息
     * @param code
     * @return
     */
    @Override
    public List<Menu> getButtonByParentCode(String code) {
        List<Menu> buttonList = menuMapper.getButtonByParentCode(code);
        return buttonList;
    }
    /**
@@ -430,4 +441,23 @@
        return this.saveBatch(newButtons) ? R.success("按钮克隆成功!"):R.fail("按钮克隆失败!");
    }
    /**
     * æ ¹æ®ä¸»é”®èŽ·å–èœå•ä¿¡æ¯
     * @param ids
     * @return
     */
    @Override
    public List<Menu> getMenuListById(List<String> ids,String parentId) {
        LambdaQueryWrapper<Menu> wrapper = Wrappers.<Menu>query()
            .lambda().eq(Menu::getCategory, "2")
            .eq(Menu::getIsDeleted,BladeConstant.DB_NOT_DELETED);
        if(VciBaseUtil.checkAdminTenant()){
            wrapper.eq(Menu::getParentId,parentId);
        }else {
            wrapper.in(Menu::getId, ids);
        }
        List<Menu> menuList = this.list(wrapper);
        return menuList;
    }
}
Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/wrapper/ClassifyAuthWrapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,50 @@
/*
 *      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.system.wrapper;
import com.vci.ubcs.system.cache.DictCache;
import com.vci.ubcs.system.entity.ApiScope;
import com.vci.ubcs.system.entity.ClassifyAuth;
import com.vci.ubcs.system.enums.DictEnum;
import com.vci.ubcs.system.vo.ApiScopeVO;
import com.vci.ubcs.system.vo.ClassifyAuthVO;
import org.springblade.core.mp.support.BaseEntityWrapper;
import org.springblade.core.tool.utils.BeanUtil;
import java.util.Arrays;
import java.util.Objects;
/**
 * åŒ…装类,返回视图层所需的字段
 *
 * @author Chill
 */
public class ClassifyAuthWrapper extends BaseEntityWrapper<ClassifyAuth, ClassifyAuthVO> {
    public static ClassifyAuthWrapper build() {
        return new ClassifyAuthWrapper();
    }
    @Override
    public ClassifyAuthVO entityVO(ClassifyAuth classifyAuth) {
        ClassifyAuthVO classifyAuthVO = Objects.requireNonNull(BeanUtil.copy(classifyAuth, ClassifyAuthVO.class));
        classifyAuthVO.setButtonIdList(Arrays.asList(classifyAuth.getButtonIds().split(",")));
        return classifyAuthVO;
    }
}
Source/UBCS/ubcs-service/ubcs-system/src/main/resources/mapper/ClassifyAuthMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,35 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.vci.ubcs.system.mapper.ClassifyAuthMapper">
    <resultMap id="classifyAuthMap" type="com.vci.ubcs.system.entity.ClassifyAuth">
        <result column="oid" property="oid"/>
        <result column="ROLE_ID" property="roleId"/>
        <result column="CLASSIFY_ID" property="classifyId"/>
        <result column="BUTTON_IDS" property="buttonIds"/>
    </resultMap>
    <select id="getClassifyAuthList" resultMap="classifyAuthMap">
        SELECT *
            FROM PL_ORG_CLASSIFYAUTH
        WHERE CLASSIFY_ID = #{classifyId};
    </select>
    <select id="getViewClassByRoleIds" resultType="java.lang.String">
        SELECT CLASSIFY_ID
        FROM PL_ORG_CLASSIFYAUTH
        WHERE
        <if test="roleIds != null and ! roleIds.isEmpty() and roleIds.size() > 0">
          ROLE_ID IN
            <foreach item="item" index="index" collection="roleIds" open="(" separator="," close=")">
                #{item}
            </foreach>
        </if>
          AND BUTTON_IDS LIKE CONCAT('%', CONCAT((SELECT ID
                                                  FROM PL_SYS_MENU
                                                  WHERE CODE = 'classify_view'), '%'))
    </select>
</mapper>
Source/UBCS/ubcs-service/ubcs-system/src/main/resources/mapper/MenuMapper.xml
@@ -197,7 +197,6 @@
                        #{item}
                    </foreach>
                  ) ) )
            UNION ALL
            SELECT
@@ -220,6 +219,32 @@
        ) menu ORDER BY sort
    </select>
    <select id="getButtonByParentCode" resultMap="menuResultMap">
        SELECT
            id,
            parent_id,
            code,
            name,
            alias,
            PATH,
            SOURCE,
            ACTION,
            sort
        FROM
            PL_SYS_MENU
        WHERE
            "CATEGORY" = '2'
          AND IS_DELETED = 0
          AND PARENT_ID IN (
            SELECT
            ID
            FROM
            PL_SYS_MENU
            WHERE
            CODE = #{code})
        ORDER BY SORT
    </select>
    <select id="grantTree" resultMap="treeNodeResultMap">
        select
               id,
Source/UBCS/ubcs-service/ubcs-user/src/main/java/com/vci/ubcs/system/user/service/impl/UserServiceImpl.java
@@ -389,8 +389,8 @@
            throw new ServiceException("密码中必须含有【"+strategy.getCombinationNames()+"】中的【"+strategy.getRequiredType()+"】种密码组合方式,且密码长度必须在【"+strategy.getMinPwdLen()+"-"+strategy.getMaxPwdLen()+"】范围内");
        }
        oldPassword = DigestUtil.hex(DigestUtils.md5DigestAsHex((oldPassword).getBytes()));
        if (!user.getPassword().equals(oldPassword)) {
        String hexOldPassword = DigestUtil.hex(oldPassword);
        if (!user.getPassword().equals(hexOldPassword)) {
            throw new ServiceException("原密码不正确!");
        }
        List<String> regexs = sysClient.getRegexByList(Arrays.asList(strategy.getCombinationIds().split(","))).getData();