fujunling
2023-06-15 426cd61c707f13a471b56330b3ba7b588b6cb245
Merge branch 'master' of http://dev.vci-tech.com:1065/r/ubcs
已修改210个文件
已删除2个文件
已添加68个文件
54558 ■■■■ 文件已修改
Source/UBCS-WEB/public/src/option/user/info.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/api/code/codebasic.js 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/api/code/mdmrule.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/api/integration/sysInfo.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/api/omd/OmdAttribute.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/api/omd/status.js 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/api/refer/table.js 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/api/template/flowpath.js 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/api/template/setPersonnel.js 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/api/template/templateAttr.js 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/components/FormTemplate/FormTempalte.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/components/Tree/TemplatePro.vue 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/components/Tree/attrCrud.vue 484 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/components/Tree/classifyTrees.vue 21 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/components/advanced-query/advancedQuery.vue 45 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/components/refer/vciWebRefer.vue 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/components/refer/vciWebReferDefalut.vue 293 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/components/refer/vciWebReferTable.vue 372 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/components/refer/vciWebReferTree.vue 75 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/components/template/Business.vue 206 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/components/template/FlowPath.vue 209 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/components/template/SetPersonnel.vue 210 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/components/template/Stage.vue 244 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/components/template/TableTransfer.vue 326 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/const/code/cloneBasicDialogOption.js 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/const/code/cloneCodeRuleDialogOption.js 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/const/code/cloneOption.js 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/const/code/codeKeyAttrRepeat.js 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/const/code/codeSynonym.js 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/const/code/codebasic.js 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/const/code/codebutton.js 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/const/code/fixedValueMgrDialog.js 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/const/code/mdmrule.js 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/const/code/parentClassifyParentOptionDialog.js 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/const/code/referBtmDialog.js 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/const/code/selectAttrOptionDialog.js 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/main.js 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/option/user/info.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/router/axios.js 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/util/param2CondMapUtil.js 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/views/authority/role.vue 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/views/code/code.vue 44 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/views/flow/flowPath.vue 187 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/views/integration/applicationForm.vue 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/views/integration/systemInfo.vue 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/views/modeling/Business.vue 94 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/views/modeling/LinkType.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/views/modeling/Version.vue 57 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/views/modeling/original.vue 41 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/views/modeling/originalAdd.vue 167 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/views/modeling/status.vue 96 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/views/system/tenant.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/views/system/user.vue 24 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/vue.config.js 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-auth/src/main/java/com/vci/ubcs/auth/service/BladeUserDetails.java 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-auth/src/main/java/com/vci/ubcs/auth/service/BladeUserDetailsServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-auth/src/main/java/com/vci/ubcs/auth/support/BladeJwtTokenEnhancer.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-common/src/main/java/com/vci/ubcs/common/constant/LauncherConstant.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-ops-api/ubcs-flow-api/pom.xml 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-ops-api/ubcs-resource-api/pom.xml 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-ops-api/ubcs-resource-api/src/main/java/com/vci/ubcs/resource/bo/FileObjectBO.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-ops-api/ubcs-resource-api/src/main/java/com/vci/ubcs/resource/constant/FileBusConstant.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-ops-api/ubcs-resource-api/src/main/java/com/vci/ubcs/resource/constant/FileLifeConstant.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-ops-api/ubcs-resource-api/src/main/java/com/vci/ubcs/resource/dto/FileObjectDTO.java 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-ops-api/ubcs-resource-api/src/main/java/com/vci/ubcs/resource/dto/FileReleaseDTO.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-ops-api/ubcs-resource-api/src/main/java/com/vci/ubcs/resource/dto/FileShareDTO.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-ops-api/ubcs-resource-api/src/main/java/com/vci/ubcs/resource/entity/FileObject.java 90 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-ops-api/ubcs-resource-api/src/main/java/com/vci/ubcs/resource/life/FileLife.java 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-ops-api/ubcs-resource-api/src/main/java/com/vci/ubcs/resource/query/FileQuery.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-ops-api/ubcs-resource-api/src/main/java/com/vci/ubcs/resource/utils/FileDownloadUtil.java 80 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-ops-api/ubcs-resource-api/src/main/java/com/vci/ubcs/resource/utils/FileUtil.java 388 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-ops-api/ubcs-resource-api/src/main/java/com/vci/ubcs/resource/utils/ZipUtil.java 155 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-ops-api/ubcs-resource-api/src/main/java/com/vci/ubcs/resource/vo/FileObjectVO.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/business/controller/WorkController.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/business/service/impl/FlowBusinessServiceImpl.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/controller/FlowModelController.java 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/controller/FlowProcessController.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/controller/FlowTaskUserController.java 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/controller/ProcessTSController.java 112 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/entity/FlowTaskUser.java 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/entity/FlowTaskUserC.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/entity/ProcessStageAttr.java 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/entity/ProcessTemplate.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/mapper/FlowMapper.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/mapper/FlowTaskUserMapper.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/mapper/ProcessStageAttrMapper.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/mapper/ProcessTemplateMapper.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/service/FlowEngineService.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/service/FlowTaskUserService.java 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/service/ProcessStageAttrService.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/service/ProcessTemplateService.java 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/service/impl/FlowEngineServiceImpl.java 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/service/impl/FlowTaskUserServiceImpl.java 146 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/service/impl/ProcessStageAttrServiceImpl.java 81 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/service/impl/ProcessTemplateServiceImpl.java 107 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-ops/ubcs-resource/src/main/java/com/vci/ubcs/resource/controller/AttachController.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-ops/ubcs-resource/src/main/java/com/vci/ubcs/resource/controller/FileController.java 170 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-ops/ubcs-resource/src/main/java/com/vci/ubcs/resource/endpoint/OssEndpoint.java 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-ops/ubcs-resource/src/main/java/com/vci/ubcs/resource/mapper/FileObjectMapper.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-ops/ubcs-resource/src/main/java/com/vci/ubcs/resource/service/IFileService.java 111 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-ops/ubcs-resource/src/main/java/com/vci/ubcs/resource/service/impl/FileServiceImpl.java 536 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/pom.xml 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/bo/AttributeValue.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/CodeBasicSecDTO.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/CodeButtonDTO.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/CodeClassifyDTO.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/CodeClassifyProcessTempDTO.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/CodeClassifyTempMapItemDTO.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/CodeClassifyTemplateAttrDTO.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/CodeClassifyTemplateButtonDTO.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/CodeClassifyTemplateDTO.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/CodeClassifyTemplateMapDTO.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/CodeClassifyValueDTO.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/CodeFixedValueDTO.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/CodeKeyAttrRepeatRuleDTO.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/CodePhaseAttrDTO.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/CodeResembleRuleDTO.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/CodeSynonymDTO.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/CodeTemplatePhaseDTO.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/DockingLogeDTO.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/DockingPreApplyDataDTO.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/DockingPreApplyDataInfoDTO.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/DockingSystemConfigDTO.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/DockingSystemDTO.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/DockingTaskDTO.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/SysIntAuthorityDTO.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/SysIntHeaderDTO.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/SysIntInfoBseDTO.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/SysIntParamDTO.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeAllCode.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeBasicSec.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeButton.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeClassify.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeClassifyProcessTemp.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeClassifyTemplate.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeClassifyTemplateAttr.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeClassifyTemplateButton.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeClassifyValue.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeFixedValue.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeKeyAttrRepeat.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodePhaseAttr.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeReferConfig.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeRule.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeSerialValue.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeShowFieldConfig.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeSrchCondConfig.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeSynonymEntity.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeTemplatePhase.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeTempphaseEntity.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeWupin.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/DockingLog.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/DockingSystem.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/DockingSystemConfig.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/CodeReferConfigVO.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/CodeShowFieldConfigVO.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/CodeSrchCondConfigVO.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/BaseModelVO.java 332 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/CodeAllCodeVO.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/CodeBasicSecVO.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/CodeButtonVO.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/CodeClassifyAttributeVO.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/CodeClassifyProcessTempVO.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/CodeClassifyTempMapItemVO.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/CodeClassifyTemplateAttrVO.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/CodeClassifyTemplateMapVO.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/CodeClassifyTemplateVO.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/CodeClassifyVO.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/CodeClassifyValueVO.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/CodeFixedValueVO.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/CodeImportTemplateVO.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/CodeKeyAttrRepeatRuleVO.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/CodePhaseAttrVO.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/CodeResembleRuleVO.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/CodeRuleVO.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/CodeSynonymVO.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/DockingLogeVO.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/DockingPreApplyDataInfoVO.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/DockingPreApplyDataVO.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/DockingSystemConfigVO.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/DockingSystemVO.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/DockingTaskVO.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/SmUserVO.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/SysIntAuthorityVO.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/SysIntHeaderVO.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/SysIntParamVO.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-dict-api/src/main/java/com/vci/ubcs/system/feign/IDictBizClient.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-omd-api/pom.xml 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/enums/EnumEnum.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/feign/IAttributeClient.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/feign/IAttributeFallback.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/feign/IBtmTypeClient.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/feign/ILinkTypeClient.java 136 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/feign/ILinkTypeFallback.java 104 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/feign/IWebSecretClient.java 184 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/feign/IWebSecretFallback.java 101 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/util/Tool.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/utils/VciOmdUtil.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-user-api/src/main/java/com/vci/ubcs/system/user/entity/User.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-util-api/pom.xml 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/constant/CodeTableNameConstant.java 125 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/enumpack/CodeTableNameEnum.java 161 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/exception/VciBaseException.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/poi/util/ExcelUtil.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/revision/model/BaseModel.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/revision/model/TreeQueryObject.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/util/DefaultAttrAssimtUtil.java 71 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/util/UBCSSqlKeyword.java 30 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/web/constant/FrameWorkBusLangCodeConstant.java 519 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/web/enumpck/BaseEnum.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/web/enumpck/DataSecretEnum.java 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/web/enumpck/NewAppConstantEnum.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/web/enumpck/ProcessTemplateTypeEnum.java 134 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/web/pagemodel/BladeQueryObject.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/web/util/VciBaseUtil.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/web/util/WebUtil.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service-api/ubcs-workflow-api/src/main/java/com/vci/ubcs/code/constant/FlowConstant.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/pom.xml 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/config/UBCSTenantSqlParser.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/CodeBasicSecController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/CodeRuleController.java 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/MdmEngineController.java 26 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/mapper/CommonsMapper.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeClassifyService.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeRuleService.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/MdmEngineService.java 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeAllCodeServiceImpl.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeBasicSecServiceImpl.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeClassifyServiceImpl.java 77 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeClassifyTemplateAttrServiceImpl.java 85 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeClstemplateServiceImpl.java 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeRuleServiceImpl.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmEngineServiceImpl.java 473 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmIOServiceImpl.java 1161 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/util/AttributeChecker.java 115 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/util/ClientBusinessObject.java 110 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/wrapper/CodeClassifyTemplateAttrWrapper.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/resources/application-dev.yml 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CodeRuleMapper.xml 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CommonsMapper.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-omd/pom.xml 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/controller/AttributeController.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/controller/RevisionRuleController.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/controller/StatusController.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/feign/AttributeClient.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/feign/BtmTypeClient.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/feign/LinkTypeClient.java 183 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/feign/RevisionRuleClient.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/feign/StatusClient.java 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/feign/WebSecretClient.java 111 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/mapper/RevisionRuleMapper.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/mapper/StatusMapper.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/IAttributeService.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/ILinkTypeService.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/IRevisionRuleService.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/IStatusService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/IWebSecretService.java 120 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/AttributeServiceImpl.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/LinkTypeServiceImpl.java 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/RevisionRuleServiceImpl.java 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/StatusServiceImpl.java 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/WebSecretServiceImpl.java 376 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-omd/src/main/resources/mapper/RevisionRuleMapper.xml 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-omd/src/main/resources/mapper/StatusMapper.xml 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/controller/UserPwdstrategyController.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/service/impl/MenuServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-system/src/main/resources/mapper/CombinationMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-user/src/main/java/com/vci/ubcs/system/user/controller/UserController.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-user/src/main/java/com/vci/ubcs/system/user/service/impl/UserServiceImpl.java 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-user/src/main/java/com/vci/ubcs/system/user/wrapper/UserWrapper.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-user/src/main/resources/mapper/UserMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-webservice/src/main/java/com/vci/ubcs/code/webservice/controller/DockingPreApplyCodeController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/data/applogs/xxl-job/xxl-job-admin.log 40739 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/data/applogs/xxl-job/xxl-job-admin.log.2023-06-07.zip 补丁 | 查看 | 原始文档 | blame | 历史
Source/data/applogs/xxl-job/xxl-job-admin.log.2023-06-08.zip 补丁 | 查看 | 原始文档 | blame | 历史
Source/data/applogs/xxl-job/xxl-job-admin.log.2023-06-09.zip 补丁 | 查看 | 原始文档 | blame | 历史
Source/data/applogs/xxl-job/xxl-job-executor-sample-springboot.log 1197 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/data/applogs/xxl-job/xxl-job-executor-sample-springboot.log.2023-06-07.zip 补丁 | 查看 | 原始文档 | blame | 历史
Source/data/applogs/xxl-job/xxl-job-executor-sample-springboot.log.2023-06-09.zip 补丁 | 查看 | 原始文档 | blame | 历史
Source/更改过的jar包.zip 补丁 | 查看 | 原始文档 | blame | 历史
Source/更改过的jar包(有更新).zip 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/public/src/option/user/info.js
@@ -45,7 +45,7 @@
      }]
    },
    {
      label: '修改密码',
      label: '',
      prop: 'password',
      column: [{
        label: '原密码',
Source/UBCS-WEB/src/api/code/codebasic.js
@@ -8,6 +8,9 @@
      ...params,
      page,
      limit,
    },
    paramsSerializer: function(params) {
      return qs.stringify(params, { encode: false });
    }
  })
}
Source/UBCS-WEB/src/api/code/mdmrule.js
@@ -8,7 +8,7 @@
      page,
      limit,
      ...params,
    }
    },
  })
}
Source/UBCS-WEB/src/api/integration/sysInfo.js
@@ -16,7 +16,7 @@
    data: params
  })
}
 // é›†æˆç³»ç»Ÿä¿¡æ¯ç®¡ç†æ–°å¢ž
 // é›†æˆç³»ç»Ÿä¿¡æ¯ç®¡ç†ä¿®æ”¹
 export const sysInfoEdit = (params) => {
    return request({
      url: '/api/ubcs-code/dockingManagement/editSave',
@@ -24,7 +24,7 @@
      data: params
    })
  }
   // é›†æˆç³»ç»Ÿä¿¡æ¯ç®¡ç†æ–°å¢ž
   // é›†æˆç³»ç»Ÿä¿¡æ¯ç®¡ç†åˆ é™¤
export const sysInfoDel = (params) => {
    return request({
      url: '/api/ubcs-code/dockingManagement/deleteDataById',
Source/UBCS-WEB/src/api/omd/OmdAttribute.js
@@ -24,12 +24,12 @@
  })
}
export const remove = (ids) => {
export const remove = (oid) => {
  return request({
    url: '/api/ubcs-omd/attribute/remove',
    method: 'post',
    params: {
      ids,
      oid,
    }
  })
}
Source/UBCS-WEB/src/api/omd/status.js
@@ -72,4 +72,14 @@
            pageSize
        }
    })
}
}
export const getApplyRange = (id) => {
  return request({
    url: '/api/ubcs-omd/status/get-apply-range',
    method: 'get',
    params: {
      id
    }
  })
}
Source/UBCS-WEB/src/api/refer/table.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,32 @@
import request from "@/router/axios";
export const getList = (params,page, limit, url) => {
  return request({
    url: url,
    method: 'get',
    params: {
      ...params,
      page,
      limit,
    }
  })
}
export const getLazyList = (params,url) => {
  return request({
    url: url,
    method: 'get',
    params: {
      ...params
    }
  })
}
export const getTableDefinedUrl = (params,url) => {
  return request({
    url: url,
    method: 'get',
    params: {
      ...params
    }
  })
}
Source/UBCS-WEB/src/api/template/flowpath.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,66 @@
import request from '@/router/axios';
// æ¨¡æ¿æµç¨‹åˆ—表
export const getFlowpathList = (params) => {
  return request({
    url: '/api/ubcs-flow/processTS/tlist',
    method: 'get',
    params: params
  })
}
// æ¨¡æ¿æµç¨‹èŽ·å–é€‰é¡¹
export const getStartList = () => {
  return request({
    url: '/api/ubcs-flow/work/start-list',
    method: 'get',
    params: { mode: '1', current: 1, size: 100 }
  })
}
// æ¨¡æ¿æµç¨‹æ–°å¢ž
export const flowpathSave = (params) => {
  return request({
    url: '/api/ubcs-flow/processTS/tsou',
    method: 'post',
    data: params
  })
}
// æ¨¡æ¿æµç¨‹åˆ é™¤
export const flowpathDelete = (params) => {
  return request({
    url: '/api/ubcs-flow/processTS/dt',
    method: 'delete',
    params: params
  })
}
// æ¨¡æ¿é˜¶æ®µåˆ—表
export const stagelist = (params) => {
  return request({
    url: '/api/ubcs-flow/processTS/sslist',
    method: 'get',
    params: params
  })
}
// å±žæ€§åˆ—表
export const attributeList = (params) => {
  return request({
    url: '/api/ubcs-code/codeTempPhaseController/gridUnUsedAttribute',
    method: 'get',
    params: params
  })
}
// å±žæ€§åˆ—表左侧
export const attributeListRight = (params) => {
  return request({
    url: '/api/ubcs-flow/processTS/ssslist',
    method: 'get',
    params: params
  })
}
// æ¨¡æ¿é˜¶æ®µåˆ—表
export const attributeSave = (params) => {
  return request({
    url: '/api/ubcs-flow/processTS/sasou',
    method: 'post',
    data: params
  })
}
Source/UBCS-WEB/src/api/template/setPersonnel.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,43 @@
import request from '@/router/axios';
// äººå‘˜è®¾ç½®åˆå§‹åŒ–
export const personnelInit = (params) => {
  return request({
    url: '/api/ubcs-flow/taskUser/list',
    method: 'get',
    params: params
  })
}
// äººå‘˜è®¾ç½®æ”¶è—
export const personnelCollect = (params) => {
  return request({
    url: '/api/ubcs-flow/taskUser/su',
    method: 'post',
    data: params
  })
}
// äººå‘˜è®¾ç½®å–消收藏
export const cancelCollect = (params) => {
  return request({
    url: '/api/ubcs-flow/taskUser/du',
    method: 'post',
    data: params
  })
}
// äººå‘˜è®¾ç½®ä¿å­˜
export const personnelSave = (params) => {
  return request({
    url: '/api/ubcs-flow/vciflow/start',
    method: 'get',
    params: params
  })
}
// äººå‘˜è®¾ç½®ä¿å­˜
export const personnelDict = (params) => {
    return request({
      url: '/api/ubcs-user/allPage',
      method: 'get',
      params: params
    })
  }
Source/UBCS-WEB/src/api/template/templateAttr.js
@@ -148,3 +148,29 @@
    }
  })
}
// ä¿å­˜æŽ¥å£
export const  batchAddSave = (data) =>{
  return request({
    url:'/api/ubcs-code/codeClassifyTempAttrController/batchAddSave',
    method: 'post',
    data:data
  })
}
//同步到其他模板
export const  copyto = (data) =>{
  return request({
    url:'/api/ubcs-code/codeClassifyTempAttrController/copyto',
    method: 'post',
    data:data
  })
}
//编码申请预览
export const  getFormDefineByTemplate = (params) =>{
  return request({
    url:'/api/ubcs-code/mdmEngineController/getFormDefineByTemplateOid',
    method: 'get',
    params:{
      ...params
    }
  })
}
Source/UBCS-WEB/src/components/FormTemplate/FormTempalte.vue
@@ -558,7 +558,7 @@
          maxlength: formItem.maxlength,
          filterable: true,
          referConfig:formItem.type=='refer'?{
            title:formItem.text,
            title:formItem.text ,
            showField:formItem.showField || formItem.field,
            field: formItem.field,
            placeholder: formItem.inputTip,
Source/UBCS-WEB/src/components/Tree/TemplatePro.vue
@@ -2,10 +2,15 @@
  <basic-container>
    <avue-tabs :option="Taboption" @change="handleChange"></avue-tabs>
    <span v-if="type.prop==='tab1'">
      <attrCrud :ProData="ProData" :crudOid="crudOid" :crudArray="crudArray" :Formlist="Formlist"></attrCrud>
      <attrCrud :ProData="ProData" :crudOid="crudOid" :crudArray="crudArray" :Formlist="Formlist" :codeClassifyOid="codeClassifyOid"></attrCrud>
    </span>
    <span v-else-if="type.prop==='tab2'">模板流程</span>
    <span v-else-if="type.prop==='tab3'">模板阶段</span>
    <span v-else-if="type.prop==='tab2'">
       <FlowPath code="8b5e2017-990f-454a-9c39-4c4eeeb57553"></FlowPath>
    </span>
    <span v-else-if="type.prop==='tab3'">
<!--          <stage :visible.sync="visibleStage" code="8b5e2017-990f-454a-9c39-4c4eeeb57553"></stage>-->
    </span>
  </basic-container>
</template>
@@ -13,7 +18,7 @@
<script>
export default {
  name: "TemplatePro.vue",
  props: ['ProData','crudOid','crudArray','Formlist'],
  props: ['ProData','crudOid','crudArray','Formlist','codeClassifyOid'],
  data: function () {
    return {
      type: {},
Source/UBCS-WEB/src/components/Tree/attrCrud.vue
@@ -1,10 +1,10 @@
<template>
  <avue-crud :data="ProData" :option="option" @sort-change="sortChange" @row-update="addUpdate"
             @cell-click="handleRowClick" @select="selectHandle">
             @cell-click="handleRowClick" @select="selectHandle" @row-del="CrudRowDel">
    <template slot="menuLeft">
      <el-button v-if="attrEditVisible == false" size="small" type="primary" @click="busineHandle">+ æ·»åŠ  {{msg}}</el-button>
      <el-dialog :visible.sync="addVisible" append-to-body title="从业务类型中选择属性">
        <avue-crud :data="businessData" :option="businessOption">
      <el-button v-if="attrEditVisible == false && attrFlagChiledren==false" size="small" type="primary" @click="busineHandle">+ æ·»åŠ  {{msg}}</el-button>
      <el-dialog :visible.sync="addVisible" append-to-body title="从业务类型中选择属性" >
        <avue-crud :data="businessData" :option="businessOption" @select="businessSelect">
          <template slot="menuLeft">
            <div style="display: flex;">
              <el-select>
@@ -18,23 +18,23 @@
          </template>
        </avue-crud>
       <div style="display: flex;justify-content: flex-end;margin-top: 15px">
         <el-button size="small" type="primary">保存</el-button>
         <el-button size="small" type="primary" @click="busineAddHandle">保存</el-button>
         <el-button size="small" type="primary">取消</el-button>
       </div>
      </el-dialog>
    </template>
    <!--        å…¨å±ç¼–辑-->
    <template slot="menuLeft">
      <el-button v-if="attrEditVisible == false" size="small" @click="attrEditVisible=true">全屏编辑</el-button>
      <!--      <el-button @click.native="attrEditVisible=false" size="small">退出全屏编辑</el-button>-->
      <el-button v-if=" attrEditVisible == false && attrFlagChiledren==false" size="small" @click="fullscreenHandle">全屏编辑</el-button>
<!--      <el-button v-if="attrFlagChiledren !=false" size="small" plain type="success" @click="escEdit">退出全屏编辑</el-button>-->
      <el-dialog :visible.sync="attrEditVisible" append-to-body fullscreen="true">
        <attrCrud></attrCrud>
       <attrCrud :ProData="this.ProData" :attrFlagChiledren="this.attrFlag"></attrCrud>
      </el-dialog>
    </template>
<!--    ç»„合规则-->
    <template slot="menuLeft">
      <el-button size="small" @click="isShowformulaEdit=true">组合规则</el-button>
        <formula-editor :visible="isShowformulaEdit" :systemVariableTableData="systemVariableTableData" :thisSceneTableData="thisSceneTableData"></formula-editor>
        <formula-editor :visible.sync="isShowformulaEdit" :systemVariableTableData="systemVariableTableData" :thisSceneTableData="thisSceneTableData"></formula-editor>
    </template>
    <!--        éªŒè¯è§„则-->
@@ -83,16 +83,24 @@
    </template>
    <!--        å±žæ€§åˆ†ç»„-->
    <template slot="menuLeft">
      <el-button icon="el-icon-menu" size="small" @click="attrVisible=true">属性分组</el-button>
      <el-button icon="el-icon-menu" size="small" @click="attrVisibleHandle">属性分组</el-button>
      <el-dialog :visible.sync="attrVisible" append-to-body style="width: 800px; left:30vw;top: 10vh ;"
                 title="输入分组的名称">
        <avue-form :option="attrOption"></avue-form>
        <el-form ref="form"  label-width="70px">
          <el-form-item label="属性分组">
            <el-input v-model="attrModel"></el-input>
          </el-form-item>
            <div style="display: flex;justify-content: flex-end">
              <el-button type="primary" @click="attrHandle" size="small">提交</el-button>
              <el-button size="small" @click="attrRemove">清空</el-button>
            </div>
        </el-form>
      </el-dialog>
    </template>
    <!--        åˆ†ç±»æ³¨å…¥-->
    <template slot="menuLeft">
      <el-button icon="el-icon-magic-stick" size="small" @click="injectVisible=true">分类注入</el-button>
      <el-button icon="el-icon-magic-stick" size="small" @click="injectBtn">分类注入</el-button>
      <el-dialog :visible.sync="injectVisible" append-to-body class="mydialog"
                 style="width: 1400px; left:14vw ;top: 10vh;" title="分类注入">
        <div class="injectBox">
@@ -102,38 +110,63 @@
            <br/>4:层级必须是大于0的整数值
          </div>
          <div style="padding-top: 15px;padding-left: 35px">
            <avue-form :option="injectOption" @reset-change="injectHandleReset">
              <template slot="menuForm">
                <el-button icon="el-icon-user" @click="injectRemove">取消</el-button>
              </template>
            </avue-form>
            <el-form ref="injectForm"  label-width="80px">
              <el-form-item label="注入类型">
                <el-radio-group v-model="injectOption.type">
                  <el-radio label="分类名称"></el-radio>
                  <el-radio label="分类代号"></el-radio>
                </el-radio-group>
              </el-form-item>
              <el-form-item label="层级设置">
                <el-radio-group v-model="injectOption.set">
                  <el-radio label="最小层"></el-radio>
                  <el-radio label="指定层"></el-radio>
                  <el-input-number v-model="injectOption.injectNum" controls-position="right"  :min="0" :max="10" v-if="this.injectOption.set == '指定层'"></el-input-number>
                </el-radio-group>
              </el-form-item>
              <el-form-item label="可修改">
                <el-radio-group v-model="injectOption.change">
                  <el-radio label="是"></el-radio>
                  <el-radio label="否"></el-radio>
                </el-radio-group>
              </el-form-item>
            </el-form>
          </div>
        </div>
        <div style="display: flex;justify-content: flex-end">
          <el-button size="small" type="primary" @click="injectAddHandle">确定</el-button>
          <el-button size="small" @click="injectHandleReset">清除内容</el-button>
          <el-button size="small" @click="injectRemove">取消</el-button>
        </div>
      </el-dialog>
    </template>
    <!--        æžšä¸¾æ³¨å…¥-->
    <template slot="menuLeft">
      <el-button size="small" @click="enumVisible=true">枚举注入</el-button>
      <el-button size="small" @click="enmuVisHandle">枚举注入</el-button>
      <el-dialog :visible.sync="enumVisible" append-to-body title="枚举注入">
        <!-- æ¸²æŸ“表格及按钮 -->
        <!-- æ¸²æŸ“表格及按钮 -->
        <div>
          <el-button icon="el-icon-plus" type="primary" @click="addRow">新增</el-button>
          <el-table :data="tableData" style="width: 100%" @cell-click="handleCellClick" @cell-dblclick="dbclick">
          <el-table :data="tableData" style="width: 100%" @cell-click="handleCellClick" @selection-change="handleSelectionChange">
            <!-- æ¸²æŸ“表格列及传参 -->
            <el-table-column label="序号" type="index"></el-table-column>
            <el-table-column label="选项值" prop="name">
            <el-table-column
              type="selection"
              width="55">
            </el-table-column>
            <el-table-column label="选项值" prop="key">
              <template slot-scope="{ row }">
                <!-- ç¼–辑和展示逻辑 -->
                <el-input v-if="editingRow === row && editShow == 'name'" v-model="row.name" @blur="saveRow"></el-input>
                <span v-else>{{ row.name }}</span>
                <el-input v-if="editingRow === row && editShow == 'key'" v-model="row.key" @blur="saveRow"></el-input>
                <span v-else>{{ row.key }}</span>
              </template>
            </el-table-column>
            <el-table-column label="选项中文标签" prop="age">
            <el-table-column label="选项中文标签" prop="value">
              <template slot-scope="{ row }">
                <!-- ç¼–辑和展示逻辑 -->
                <el-input v-if="editingRow === row && editShow == 'age'" v-model="row.age" @blur="saveRow"></el-input>
                <span v-else>{{ row.age }}</span>
                <el-input v-if="editingRow === row && editShow == 'value'" v-model="row.value" @blur="saveRow"></el-input>
                <span v-else>{{ row.value }}</span>
              </template>
            </el-table-column>
            <el-table-column fixed="right" label="操作" width="120">
@@ -146,7 +179,7 @@
          </el-table>
          <template>
            <div style="display: flex;justify-content: right;margin-top: 15px">
              <el-button type="primary"  size="small">保存</el-button>
              <el-button type="primary"  size="small" @click="enumAddHandle">保存</el-button>
              <el-button size="small" @click="enumVisible=false">取消</el-button>
            </div>
          </template>
@@ -166,7 +199,7 @@
          </template>
        </avue-crud>
        <div style="display: flex ;padding-top: 18px;justify-content: right">
          <el-button size="small" type="primary">确定</el-button>
          <el-button size="small" type="primary" @click="CascadeAddHandle">确定</el-button>
          <el-button size="small" style="margin-left: 10px" @click="casRemove">清除内容</el-button>
          <el-button size="small" style="margin-left: 10px" @click="CascadeVisible=false">取消</el-button>
        </div>
@@ -182,26 +215,71 @@
    </template>
    <!--    åˆ é™¤-->
    <template slot="menuLeft">
      <el-button size="small">删除</el-button>
      <el-button size="small" @click="CrudRemove">删除</el-button>
    </template>
    <!--    é‡ç½®-->
    <template slot="menuLeft">
      <el-button size="small">重置</el-button>
      <el-button size="small" @click="reset">重置</el-button>
    </template>
    <!--    åŒæ­¥åˆ°å…¶ä»–模板-->
    <template slot="menuLeft">
      <el-button size="small" style="margin-top: 10px">同步到其他模板</el-button>
      <el-button size="small" style="margin-top: 10px" @click="syncHandle">同步到其他模板</el-button>
    </template>
<!--    ç¼–码申请预览-->
    <template slot="menuLeft">
      <el-button size="small" style="margin-top: 10px" @click="applicationHandle">编码申请预览</el-button>
        <FormTemplateDialog
          :visible.sync="addvisible"
          :type="add"
          :templateOid="this.crudOid"
          :codeClassifyOid="this.codeClassifyOid"
        >
        </FormTemplateDialog>
    </template>
  </avue-crud>
</template>
<script>
import {AttrByBtm,gridCodeClassifyTemplateAttr} from '@/api/template/templateAttr'
import {AttrByBtm,gridCodeClassifyTemplateAttr,batchAddSave,copyto} from '@/api/template/templateAttr'
export default {
  name: "attrCrud .vue",
  props: ['ProData','crudOid','crudArray','Formlist'],
  // props: ['ProData','crudOid','crudArray','Formlist','codeClassifyOid'],
  props:{
    ProData:{
      type:Array,
    },
    crudOid:{
      type:String,
      default:''
    },
    crudArray:{
      type:Array,
    },
    Formlist:{
      type:Array,
    },
    codeClassifyOid:{
      type:String,
      default:''
    },
    attrFlagChiledren:{
      type:Boolean,
      default:false
    },
  },
  data() {
    return {
      attrFlag:false,
      //编码申请预览option
      applicationoption:{
        column:[]
      },
      // ç¼–码申请预览data
      applicationData:[],
      //业务类型单选数组
      busineSelectList:[],
      //业务类型添加数据
      busineAddList:{},
      //表格单选数组
      CrudSelect:[],
      //表格oid
@@ -573,6 +651,8 @@
      editShow: "",
      //枚举注入
      enumVisible: false,
      //枚举注入多选保存数组
      enumRow:[],
      // åˆ†ç±»æ³¨å…¥å¼¹å‡ºæ¡†
      injectVisible: false,
      // æ·»åŠ å¼¹å‡ºæ¡†
@@ -581,67 +661,19 @@
      rulesVisible: false,
      //属性分组弹出框
      attrVisible: false,
      //属性分组option
      attrOption: {
        column: [
          {
            label: "属性分组",
            span: 24,
            prop: "attrIN"
          }
        ]
      },
      //属性分组输入框
      attrModel:"",
      //当前单选模板属性
      attrRow:{},
      //编码申请预览弹出框
      addvisible:false,
      //分类注入option
      injectOption: {
        column: [
          {
            label: "注入类型",
            type: 'radio',
            prop: "injection",
            span: 24,
            value: 0,
            dicData: [
              {
                label: '分类名称',
                value: 0
              }, {
                label: '分类代号',
                value: 1
              },
            ]
          },
          {
            label: "层级设置",
            type: 'radio',
            prop: "Level",
            span: 24,
            value: 0,
            dicData: [
              {
                label: '最小层',
                value: 0
              }, {
                label: '指定层',
                value: 1
              },
            ]
          },
          {
            label: "可修改",
            type: 'radio',
            prop: "revise",
            value: 0,
            dicData: [
              {
                label: '是',
                value: 0
              }, {
                label: '否',
                value: 1
              },
            ]
          }
        ]
        type:"分类名称",
        set:"最小层",
        change:"是",
        //分类注入计数器
        injectNum:0,
      },
      // å±žæ€§éªŒè¯è¾“入框
      RulesForm: {
@@ -682,6 +714,8 @@
        border: true,
        addBtn: false,
        menu:false,
        selection:true,
        height:500,
        column: [
          {
            label: "属性英文名称",
@@ -731,26 +765,6 @@
      },
      //模板属性
      data: [
        {
          id: "测试一",
          name: "测试name1",
          attributegroup: "测试一",
          attributeDataTypeText: "测试一",
        },
        {
          id: "测试二",
          name: "测试name2",
          attributegroup: "测试二",
          attributeDataTypeText: "测试二"
        },
        {
          id: "测试三",
          name: "测试name3",
          attributegroup: "测试三",
          attributeDataTypeText: "测试三",
          keyattrflag: false
        }
      ],
      // å½“前行
      rowList: [],
@@ -791,7 +805,7 @@
          },
          {
            label: "属性分组",
            prop: "attributegroup",
            prop: "attributeGroup",
            cell: false,
            sortable: true,
            width: 125,
@@ -811,101 +825,101 @@
          },
          {
            label: "关键属性",
            prop: "keyattrflag",
            prop: "keyAttrFlag",
            cell: false,
            type: "switch",
          },
          {
            label: "查询属性",
            prop: "queryattrflag",
            prop: "queryAttrFlag",
            cell: false,
          },
          {
            label: "高级查询属性",
            prop: "seniorqueryattrflag",
            prop: "seniorQueryAttrFlag",
            width: 95,
            cell: false,
          },
          {
            label: "相似查询属性",
            prop: "samerepeatattrflag",
            prop: "sameRepeatAttrFlag",
            width: 95,
            cell: false,
          },
          {
            label: "必输",
            prop: "requireflag",
            prop: "requireFlag",
            cell: false,
          },
          {
            label: "表单显示",
            prop: "formdisplayflag",
            prop: "formDisplayFlag",
            cell: false,
          },
          {
            label: "列表显示",
            prop: "tabledisplayflag",
            prop: "tableDisplayFlag",
            cell: false,
          },
          {
            label: "只读",
            prop: "readonlyflag",
            prop: "readonlyFlag",
            cell: false,
          },
          {
            label: "列表排序",
            prop: "sortattrflag",
            prop: "sortAttrFlag",
            cell: false,
          },
          {
            label: "多行文本",
            prop: "textareaflag",
            prop: "textareaFlag",
            cell: false,
          },
          {
            label: "默认值",
            prop: "defaultvalue",
            prop: "defaultValue",
            sortable: true,
            cell: false,
            width: 95,
          },
          {
            label: "前缀",
            prop: "prefixvalue",
            prop: "prefixValue",
            sortable: true,
            cell: false,
          },
          {
            label: "后缀",
            prop: "suffixvalue",
            prop: "suffixValue",
            sortable: true,
            cell: false,
          },
          {
            label: "组合规则",
            prop: "componentrule",
            prop: "componentRule",
            sortable: true,
            cell: false,
            width: 105,
          },
          {
            label: "验证规则",
            prop: "verifyrule",
            prop: "verifyRule",
            sortable: true,
            cell: false,
            width: 105,
          },
          {
            label: "时间格式",
            prop: "codedateformat",
            prop: "codeDateFormat",
            sortable: true,
            width: 105,
            cell: false,
          },
          {
            label: "分类注入",
            prop: "classifyinvokelevel",
            prop: "classifyInvokeLevel",
            cell: false,
          },
          {
@@ -942,60 +956,110 @@
          },
          {
            label: "表单显示样式",
            prop: "formdisplaystyle",
            prop: "formDisplayStyle",
            width: 105,
            cell: false,
          },
          {
            label: "表格显示样式",
            prop: "tabledisplaystyle",
            prop: "tableDisplayStyle",
            width: 105,
            cell: false,
          },
          {
            label: "表单超链接",
            prop: "formhref",
            prop: "formHref",
            width: 95,
            cell: false,
          },
          {
            label: "表格超链接",
            prop: "tablehref",
            prop: "tableHref",
            width: 95,
            cell: false,
          },
          {
            label: "表格显示js",
            prop: "tabledisplayjs",
            prop: "tableDisplayJs",
            width: 95,
            cell: false,
          },
          {
            label: "长度",
            prop: "controllength",
            prop: "controlLength",
            cell: false,
          },
          {
            label: "小数精度",
            prop: "precisionlength",
            prop: "precisionLength",
            cell: false,
          },
          {
            label: "取值范围",
            prop: "valuearea",
            prop: "valueArea",
            sortable: true,
            cell: false,
            width: 105,
          },
        ],
        List:[]
      }
    }
  },
  mounted() {
    console.log(this.attrEditVisible)
    console.log(this.ProData)
  },
  created() {
  },
  methods: {
    //属性分组按钮
    attrVisibleHandle(){
      if(this.CrudSelect.length>1){
        this.$message.warning('只能选择一条模板属性')
      }else if(this.CrudSelect<1){
        this.$message.warning('请选择一条模板属性')
      }else if(this.CrudSelect.length === 1){
        this.attrVisible=true;
      }
    },
    //属性分组提交
    attrHandle(){
      this.$set(this.attrRow,'attributeGroup',this.attrModel)
      this.attrModel=""
      this.attrVisible=false
    },
    //属性分组清空
    attrRemove(){
      this.attrModel=""
    },
    //表格数据
    CrudRend(){
      if(this.crudOid != ''){
        gridCodeClassifyTemplateAttr({'conditionMap[classifyTemplateOid]': this.crudOid}).then(res => {
          this.ProData = res.data.data;
        }).catch(res => {
          this.$message.error(res)
        })
      }
    },
    //业务类型保存
    busineAddHandle(){
      if(this.busineSelectList.length>1){
        this.$message.warning('请选择一条业务类型数据')
      }else {
        this.$set(this.busineAddList,'classifytemplateoid',this.crudOid)
        this.$set(this.busineAddList,'oid','')
        this.ProData.push(JSON.parse(JSON.stringify(this.busineAddList)))
        console.log(this.busineAddList)
        this.addVisible=false;
        console.log('prodata',this.ProData)
      }
    },
    //业务类型单选
    businessSelect(selection,row){
      this.busineSelectList=selection
      this.busineAddList=row
    },
    // ä»Žä¸šåŠ¡ç±»åž‹ä¸­é€‰æ‹©æ•°æ®
    busineHandle(){
      if(this.crudArray.length<1){
@@ -1008,36 +1072,42 @@
        })
      }
    },
    // çº§è”属性
    // çº§è”属性按钮
    CascadeHandle(){
      if(this.CrudSelect.length >0){
      if(this.CrudSelect.length >1){
       this.$message.warning('只能选择一条模板属性')
      }else if(this.CrudSelect.length<1){
        this.$message.warning('请选择一条模板属性')
      }else if(this.CrudSelect.length === 1){
        this.CascadeVisible=true;
        gridCodeClassifyTemplateAttr({'conditionMap[classifyTemplateOid]': this.Formlist[0].oid,
          'conditionMap[oid_notequal]':this.CrudOid
        }).then(res=>{
         this.CascadeData=res.data.data
          this.CascadeData=res.data.data;
        })
      }else {
        this.$message.warning('请选择一条模板属性')
      }
    },
    //表格单选
    selectHandle(selection,row){
      this.CrudOid=row.oid;
      this.CrudSelect=selection
      this.CrudSelect=selection;
      this.attrRow=row;
      console.log(selection.length)
    },
    //保存
    addsHandler(){
      batchAddSave(this.ProData).then(res=>{
        console.log(res)
        this.$message.success('保存成功')
      })
    },
    // screenEdit(){
    //   debugger
    //   this.attrEditVisible=true;
    // },
    // outEdit(){
    //   debugger
    //   this.attrEditVisible=false;
    // },
    //级联保存
    CascadeAddHandle(){
      let CascadeString="";
      CascadeString=this.attrRow.id+(this.attrRow.name);
      this.$set(this.attrRow,'parentCode',CascadeString)
      this.CascadeVisible=false;
    },
    //级联属性清除
    casRemove() {
      this.selectRow = ""
@@ -1046,14 +1116,13 @@
    CascaderowClick(row) {
      this.selectRow = row.$index
      console.log(row)
      this.$message.success('选择序号' + row.$index)
    },
    // æžšä¸¾æ³¨å…¥æ·»åŠ ä¸€è¡Œç©ºæ•°æ®
    addRow() {
      this.tableData.push({
        name: "",
        age: ""
      });
      this.tableData.push(JSON.parse(JSON.stringify({
        key: "",
        value: ""
      })));
    },
    // æžšä¸¾æ³¨å…¥ç›‘听单元格点击事件并存储正在编辑的行
    handleCellClick(row, column) {
@@ -1064,6 +1133,31 @@
    enumDeleteRow(row) {
      console.log(row)
      this.tableData.splice(row, 1)
    },
    //枚举注入按钮
    enmuVisHandle(){
      if(this.CrudSelect.length>1){
        this.$message.warning('只能选择一条模板属性')
      }else if(this.CrudSelect<1){
        this.$message.warning('请选择一条模板属性')
      }else if(this.CrudSelect.length === 1){
        this.enumVisible=true;
      }
    },
    //枚举注入多选框
    handleSelectionChange(row){
      console.log(row)
      this.enumRow=JSON.parse(JSON.stringify(row));
    },
    //枚举注入保存
    enumAddHandle(){
      console.log(this.enumRow)
      if(this.enumRow.length<1){
        this.$message.warning('请至少选择一条数据')
      }else {
        this.$set(this.attrRow,'enumString',this.enumRow);
        this.enumVisible=false;
      }
    },
    // å°†æ­£åœ¨ç¼–辑的行的状态变为 null ï¼Œå³é€€å‡ºç¼–辑状态
    saveRow() {
@@ -1086,9 +1180,27 @@
    rulesExamine() {
    },
    //点击分类注入按钮
    injectBtn(){
      if(this.CrudSelect.length>1){
        this.$message.warning('只能选择一条模板数据')
      }else if(this.CrudSelect.length<1){
        this.$message.warning('请选择一条模板数据')
      }else if(this.CrudSelect.length === 1){
        this.injectVisible=true
      }
    },
    //分类注入保存
    injectAddHandle(){
      this.$set(this.attrRow,'classifyInvokeLevel',this.injectOption);
      this.injectVisible=false
    },
    //分类注入清空
    injectHandleReset() {
      console.log("清空")
      this.injectOption.type="";
      this.injectOption.set="";
      this.injectOption.change="";
      this.injectOption.injectNum="";
    },
    // åˆ†ç±»æ³¨å…¥å–消
    injectRemove() {
@@ -1128,6 +1240,56 @@
      //加上done关闭保存后不可编辑的状态
      done()
    },
    //表格操作栏删除
    CrudRowDel(row){
      this.ProData.splice(row.$index,1)
    },
    //表格删除
    CrudRemove(){
      this.ProData.splice(this.attrRow.$index,1)
    },
    //表格重置
    reset(){
      this.CrudRend()
    },
    //同步到其他模板
    syncHandle(){
      if(this.CrudSelect.length>1){
        this.$message.warning('只能选择一条模板属性数据')
      }else if(this.CrudSelect.length<1){
        this.$message.warning('请选择一条模板属性数据')
      }else if(this.CrudSelect.length === 1){
        copyto({oid:this.attrRow.oid}).then(res=>{
          this.$message.success('同步成功')
        })
      }
    },
    //编码申请预览
    applicationHandle(){
      this.addvisible=true;
      console.log('temp',this.crudOid)
      console.log('code',this.codeClassifyOid)
      // getFormDefineByTemplate({templateOid:this.crudOid,codeClassifyOid:this.codeClassifyOid}).then(res=>{
      //   console.log(res)
      // })
    },
    //全屏编辑
    fullscreenHandle(){
      if(this.crudArray.length<1){
        this.$message.warning('请选择一个模板')
      }else {
        this.attrEditVisible=true;
        this.attrFlag=true;
        console.log(this.attrEditVisible)
      }
    },
    //退出全屏编辑
    escEdit(){
      this.attrFlagChiledren=false;
      this.attrEditVisible=false;
      console.log(this.attrEditVisible)
    },
    // æŽ’序
    sortChange(val) {
      console.log(val)
Source/UBCS-WEB/src/components/Tree/classifyTrees.vue
@@ -169,7 +169,7 @@
          </avue-crud>
          </basic-container>
          <templatePro :ProData="this.ProData" :crudOid="this.crudOid" :crudArray="this.crudArray" :Formlist="this.Formlist"></templatePro>
          <templatePro :ProData="this.ProData" :crudOid="this.crudOid" :crudArray="this.crudArray" :Formlist="this.Formlist" :codeClassifyOid="this.codeClassifyOid"></templatePro>
        </span>
      </basic-container>
    </el-main>
@@ -437,8 +437,14 @@
  methods: {
    //行单选事件
    selectHandle(selection,row){
      this.crudOid=row.oid
      this.crudArray=selection
      this.crudOid=row.oid;
      this.crudArray=selection;
      gridCodeClassifyTemplateAttr({'conditionMap[classifyTemplateOid]': this.Formlist[0].oid}).then(res => {
        this.ProData = res.data.data;
        console.log(this.ProData)
      }).catch(res => {
        this.$message.error(res)
      })
    },
    //分类树数据处理
    getAttr() {
@@ -634,6 +640,7 @@
      //定义一个模板属性id,数据是模板管理表格里面的oid
      this.nodeClickList = data
      console.log(data.oid)
      this.ProData=[]
      try {
        await TreeObjcet(data.oid).then(res => {
          this.FlagObj = res.data.data
@@ -648,14 +655,6 @@
              return item.codeclassifyoid == this.nodeClickList.oid
            }
          })
          if(this.Formlist.length >0){
            gridCodeClassifyTemplateAttr({'conditionMap[classifyTemplateOid]': this.Formlist[0].oid}).then(res => {
              this.ProData = res.data.data;
              console.log(this.ProData)
            }).catch(res => {
              this.$message.error(res)
            })
          }
        }).catch(res => {
          console.log(res)
        })
Source/UBCS-WEB/src/components/advanced-query/advancedQuery.vue
@@ -52,7 +52,8 @@
                        <div class="grid-content">
                            <el-select placeholder="请选择" v-model="searchFormArrays[index].condition">
                                <el-option
                                    v-for="condition in item.fieldType=='text' ? searchConditions:switchSearchConditions"
                                    v-for="condition in item.fieldType==='text' || item.fieldType==='combox' ?
                                    item.fieldType==='text' ? searchConditions:switchSearchConditions:dateConditions"
                                    :key="condition.value"
                                    :label="condition.label"
                                    :value="condition.value">
@@ -71,7 +72,12 @@
                                    :value="option.itemValue">
                                </el-option>
                            </el-select>
                            <el-switch  v-else-if="item.fieldType==='truefalse'" v-model="searchFormArrays[index].fieldValue"></el-switch>
                            <el-switch v-else-if="item.fieldType==='truefalse'" v-model="searchFormArrays[index].fieldValue"></el-switch>
                            <el-date-picker v-else-if="item.fieldType==='date'"
                                v-model="searchFormArrays[index].fieldValue"
                                type="date"
                                placeholder="选择日期">
                            </el-date-picker>
                        </div>
                    </el-col>
                    <el-col :span="2">
@@ -106,7 +112,7 @@
            // å¯¹è¯æ¡†æ˜¾ç¤ºæŽ§åˆ¶
            isShowDialog: this.visible,
            initOptions: [],
            // å­—段是输入框类型的条件数组
            // å­—段类型是输入框类型的条件数组
            searchConditions: [
                {
                    value: "_equal",
@@ -120,15 +126,9 @@
                },{
                    value: "_notlike",
                    label: "不包含",
                },{
                    value: "_ge", //大于,默认为大于等于
                    label: "大于",
                },{
                    value: "_le", //小于,默认为小于等于
                    label: "小于",
                },
                }
            ],
            // å­—段是单选或下拉框类型的条件数组
            // å­—段类型是单选或下拉框类型的条件数组
            switchSearchConditions: [
                {
                    value: "_equal",
@@ -137,6 +137,22 @@
                    value: "_notequal",
                    label: "不等于",
                }
            ],
            // å­—段类型是日期
            dateConditions: [
                {
                    value: "_equal",
                    label: "等于",
                },{
                    value: "_notequal",
                    label: "不等于",
                },{
                    value: "_ge", //大于,默认为大于等于
                    label: "大于",
                },{
                    value: "_le", //小于,默认为小于等于
                    label: "小于",
                },
            ],
            searchFormArrays: [],
            fieldValue: '',
@@ -236,7 +252,7 @@
            const searchConditions = this.searchFormArrays;
            for(let index = 0; index < searchConditions.length; index++) {
                //console.log(condtionParam['conditionMap['+searchConditions[index].queryField+']']+'' == 'undefined');
                if(searchConditions[index].fieldValue.trim() != '' || searchConditions[index].fieldValue+''==='false') {
                if(searchConditions[index].fieldValue+'' != '' || searchConditions[index].fieldValue+''==='false') {
                    // å­˜åœ¨ç›¸åŒçš„æŸ¥è¯¢æ¡ä»¶
                    if(condtionParam['conditionMap['+searchConditions[index].queryField+']']+'' != 'undefined' ) {
                        this.$message.warning("存在重复查询条件,请仔细核对!");
@@ -247,7 +263,7 @@
                    condtionParam['conditionMap['+searchConditions[index].queryField+searchConditions[index].condition+']'] = searchConditions[index].fieldValue;
                }
            }
            // æŸ¥è¯¢æ¡ä»¶æ²¡æœ‰å‡ºçŽ°é‡å¤å±žæ€§ï¼Œå¹¶ä¸”è¿‡æ»¤æŽ‰äº†ç©ºå€¼ï¼Œä¼ é€’ç»™çˆ¶ç»„ä»¶
            // æŸ¥è¯¢æ¡ä»¶æ²¡æœ‰å‡ºçŽ°é‡å¤å±žæ€§ï¼Œå¹¶ä¸”è¿‡æ»¤æŽ‰äº†ç©ºå€¼ï¼Œå°±ä¼ é€’ç»™çˆ¶ç»„ä»¶
            // console.log(condtionParam);
            this.$emit('echoContion',condtionParam)
            this.isShowDialog = false;
@@ -316,6 +332,9 @@
        line-height: 40px;
        height: 40px;
    }
    .grid-content > .el-date-editor.el-input, .el-date-editor.el-input__inner{
        width: 100%;
    }
</style>
Source/UBCS-WEB/src/components/refer/vciWebRefer.vue
@@ -1,14 +1,13 @@
<template>
  <vciWebReferTree v-if="refertype=='tree'" @setValue="setValue" :value="value" :text="text" :referConfig="referConfig"></vciWebReferTree>
  <vciWebReferTable v-else-if="refertype=='table'" @setValue="setValue" :value="value" :text="text" :referConfig="referConfig"></vciWebReferTable>
  <vciWebReferDefalut v-else  @setValue="setValue" :value="value" :text="text" :referConfig="referConfig"></vciWebReferDefalut>
  <vciWebReferTree v-if="refertype=='tree'" @setValue="setValue" :value="value" :text="text" :title="title" :referConfig="referConfig"></vciWebReferTree>
  <vciWebReferTable v-else-if="refertype=='table'" @setValue="setValue" :value="value" :text="text" :title="title" :referConfig="referConfig"></vciWebReferTable>
  <vciWebReferDefalut v-else  @setValue="setValue" :value="value" :text="text" :title="title" :referConfig="referConfig"></vciWebReferDefalut>
</template>
<script>
import vciWebReferTree from "./vciWebReferTree.vue";
import vciWebReferTable from "./vciWebReferTable.vue";
import vciWebReferDefalut from "./vciWebReferTable.vue";
import {validatenull} from "@/util/validate";
import vciWebReferDefalut from "./vciWebReferDefalut.vue";
export default {
  name: "vciWebRefer",
  props: ["referConfig","value","text"],
@@ -16,20 +15,17 @@
  data() {
    return {
      refertype: this.referConfig.options.type,
      isMuti: ("true" == this.referConfig.options.isMuti || this.referConfig.options.isMuti == true || this.referConfig.options.muti == true) ? true : false,
      emitData:{}
      emitData:{},
      title:''
    };
  },
  created() {
  created() {},
  mounted() {
    var title = this.referConfig.title || '';
    title = title.replace(":", "");
    if (title) {
      title = validatenull(this.referConfig.title) ? ('为【' + title + '】选取值') : this.referConfig.title;
    } else {
      title = validatenull(this.referConfig.title) ? ('为【' + this.referConfig.showField + '】选取值') : this.referConfig.title;
    }
    this.referConfig.title = title;
    this.referConfig.isMuti = this.isMuti;
    title = title ? ('为【' + title + '】选取值') : ('为【' + this.referConfig.showField + '】选取值');
    this.title=title;
  },
  methods: {
    setValue(value) {
@@ -45,9 +41,6 @@
        this.$emit("setReferValue", newV);
      },
    }
  },
  mounted() {
  }
}
</script>
Source/UBCS-WEB/src/components/refer/vciWebReferDefalut.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,293 @@
<template>
  <div>
    <el-dialog :title="title"
               v-dialogDrag append-to-body="true"
               :visible.sync="visible"
               top="0"
               class="avue-dialog avue-dialog--top"
               :width="referConfig.options.width|| '80%'">
      <avue-crud :option="option"
                 :table-loading="loading"
                 :data="data"
                 :page.sync="page"
                 v-model="value"
                 ref="referDefalutCrud"
                 @search-change="searchChange"
                 @search-reset="searchReset"
                 @selection-change="selectionChange"
                 @current-change="currentChange"
                 @size-change="sizeChange"
                 @refresh-change="refreshChange"
                 @on-load="onLoad">
      </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>
    </el-dialog>
    <avue-input v-model="text" :placeholder="title" @click="visible=true"></avue-input>
    <!--<avue-input-table ref="referTable"  :props="props"  :column="column" :on-load="onLoad" v-model="value"  :placeholder="title" ></avue-input-table>
  -->
  </div>
</template>
<script>
import { validatenull } from "@/util/validate";
import {getList,getLazyList,getTableDefinedUrl} from "@/api/refer/table";
export default {
  name: "vciWebReferDefalut",
  props:["referConfig","value","text","title"],
  data() {
    return {
      visible: false,
      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',
        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'],
      query: {},
      loading: false,
      page: {
        pageSize: 10,
        currentPage: 1,
        total: this.referConfig.options.data?this.referConfig.options.data.length :0
      },
      data:this.referConfig.options.data || [],
      selectionList: [],
      option: {
        addBtn: false,
        height: this.referConfig.options.height ? this.referConfig.options.height : 475,
        calcHeight: 30,
        tip: false,
        menu:false,
        searchShow: true,
        searchMenuSpan: 6,
        searchLabelWidth: 90,
        border: true,
        index: true,
        selection: true,
        dialogClickModal: false,
        highlightCurrentRow: true,
        column: []
      }
    };
  },
  created() {
    this.getParams();
    console.log('referConfig:')
    console.log(this.referConfig)
  },
  mounted() {
    if(this.referConfig.options.page){
      this.page.pageSize=this.referConfig.options.page.limit || this.referConfig.options.page.pageSize;
      this.page.currentPage=this.referConfig.options.page.page || this.referConfig.options.page.currentPage;
    }
  },
  computed:{
    valueInfo:function (){
      return this.text ? ("已设置的值为[" + this.text + "]"): '未设置值'
    }
  },
  methods: {
    getParams:function () {
      var queryParams = {};
      if (this.options.extraParams) {
        queryParams = this.options.extraParams;
      }
      if (this.options.useFormKey && this.options.formValues) {
        //使用表单上的字段来过滤
        queryParams['conditionMap["' + (this.options.paramForFormKey ? this.options.paramForFormKey : this.options.useFormKey) + '"]'] = this.options.formValues[this.options.useFormKey];
      }
      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++) {
        queryParams[this.copyParam[i]] = this.options[this.copyParam[i]];
      }
      queryParams["isMuti"] = this.isMuti;
      queryParams.muti = this.isMuti;
      if (!queryParams['referBo']) {
        queryParams['referBo'] = this.options['referBo'] || this.options['referType'];
      }
      queryParams['referType'] = queryParams['referBo']
      if (this.options.remoteSort && this.options.initSort) {
        queryParams['order'] = this.options.initSort.type;//方法
        queryParams['sort'] = this.options.initSort.field;//字段
      }
      if (this.options.conditionParams) {
        //说明是扩展属性
        for (var key in this.options.conditionParams) {
          queryParams['conditionMap["' + key + '"]'] = this.options.conditionParams[key];//新的方式
        }
      }
      if (this.options.sourceDataParams) {
        //说明是扩展属性
        for (var key in this.options.sourceDataParams) {
          if (key && key.constructor === Object) return;
          queryParams['sourceData["' + key + '"]'] = this.options.sourceDataParams[key];//新的方式
        }
      }
      if (this.options.replaceParams) {
        //说明是扩展属性
        for (var key in this.options.replaceParams) {
          if (key && key.constructor === Object) return;
          queryParams['replaceMap["' + key + '"]'] = this.options.replaceParams[key];//新的方式
        }
      }
      var paramsData = {};
      //为了处理单引号和双引号的
      if (queryParams) {
        for (var key in queryParams) {
          paramsData[key.replace(/"/g, "'")] = queryParams[key];
        }
      }
      if (!this.options.tableConfig || !this.options.tableConfig.cols || this.options.tableConfig.cols.length == 0) {
        this.option.column = [{
          prop: 'id',
          label: '英文名称',
          sort: true,
          width: 150,
          search: true
        }, {
          prop: 'name',
          label: '中文名称',
          sort: true,
          width: 150,
          search: true
        }, {
          prop: 'description',
          label: '描述',
          width: 250
        }, {
          prop: 'secretGradeText',
          label: '密级',
          width: 60,
          hidden: (!this.controllerSecret)
        }];
      } else {
        this.option.column = this.options.tableConfig.cols.map(item => {
          if (item.field != 'LAY_TABLE_INDEX' && item.field != 'LAY_CHECKED') {
            return {
              ...item,
              label: item.title,
              prop: item.field,
              search: true
            }
          }
        })
      }
      if (!paramsData) {
        paramsData = {
          currentUserReferModelKey: this.options.currentUserReferModelKey,
          currentUserReferMethodKey: this.options.currentUserReferMethodKey
        };
      } else {
        paramsData['currentUserReferModelKey'] = this.options.currentUserReferModelKey;
        paramsData['currentUserReferMethodKey'] = this.options.currentUserReferMethodKey;
      }
      this.params = paramsData;
    },
    setValue(){
      if(this.selectionList.length==0){
        this.$message.warning( '没有选择数据');
        return false;
      }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 valueFieldArray = _that.props.value.split(",");
          valueFieldArray.forEach((_indexField,_itemField)=>{
            value.push( item[_itemField] + (_that.referConfig.valueSep?_that.referConfig.valueSep:' '));
          })
        }else {
          value.push(item[_that.props.value]);
        }
        if(isMutiRaw) {
          var rawFieldArray = _that.props.label.split(",");
          rawFieldArray.forEach((_indexField,_itemField)=>{
            text.push(item[_itemField] + (_that.referConfig.textSep?_that.referConfig.textSep:' ')) ;
          })
        }else{
          text.push(item[_that.props.label]);
        }
      })
      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});
      this.visible=false;
    },
    searchReset() {
      this.query = {};
      this.onLoad(this.page);
    },
    searchChange(params, done) {
      this.query = params;
      this.page.currentPage = 1;
      this.onLoad(this.page, params);
      done();
    },
    currentChange(currentPage){
      this.page.currentPage = currentPage;
    },
    sizeChange(pageSize){
      this.page.pageSize = pageSize;
    },
    selectionChange(list) {
      if (!this.isMuti && list.length > 1) {
        const nowVal = list.shift();
        this.$refs.referCrud.toggleRowSelection(nowVal, false);
      }
      this.selectionList = list
    },
    selectionClear() {
      this.selectionList = [];
      this.$refs.referCrud.clearSelection();
    },
    refreshChange() {
      this.onLoad(this.page, this.query);
    },
    onLoad(page, params = this.params) {
      if(this.url){
        this.loading = true;
        getList(Object.assign(params, this.query),page.currentPage, page.pageSize, this.url).then(res => {
          const data = res.data.data;
          this.page.total = data.total;
          this.data = data.records;
          this.loading = false;
          this.selectionClear();
        });
      }
    }
  }
}
</script>
<style scoped>
.valueInfo{
  float: left;
  border: 1px solid #E9E7E7;
  display: inline-block;
  vertical-align: middle;
  padding: 9px 15px;
  line-height: 1;
}
</style>
Source/UBCS-WEB/src/components/refer/vciWebReferTable.vue
@@ -1,71 +1,353 @@
<template>
  <avue-input-table :props="props"  :column="column" :on-load="onLoad" v-model="value"  :placeholder="placeholder" ></avue-input-table>
  <div>
    <el-dialog :title="title"
               v-dialogDrag append-to-body="true"
               :visible.sync="visible"
               top="0"
               class="avue-dialog avue-dialog--top"
               :width="referConfig.options.width|| '80%'">
      <avue-crud :option="option"
                 :table-loading="loading"
                 :data="data"
                 :page.sync="page"
                 v-model="value"
                 ref="referCrud"
                 @search-change="searchChange"
                 @search-reset="searchReset"
                 @selection-change="selectionChange"
                 @current-change="currentChange"
                 @size-change="sizeChange"
                 @refresh-change="refreshChange"
                 @on-load="onLoad">
        <template slot="icon" slot-scope="scope">
          <i :class="scope.row.icon" style="font-size:24px"></i>
        </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>
    </el-dialog>
    <avue-input v-model="text" :placeholder="title" @click="visible=true"></avue-input>
    <!--<avue-input-table ref="referTable"  :props="props"  :column="column" :on-load="onLoad" v-model="value"  :placeholder="title" ></avue-input-table>
  -->
  </div>
</template>
<script>
import { validatenull } from "@/util/validate";
import {getList,getLazyList,getTableDefinedUrl} from "@/api/refer/table";
export default {
  name: "vciWebReferTable",
  props:["referConfig","value"],
  props:["referConfig","value","text","title"],
  data() {
    return {
      placeholder:this.referConfig.placeholder || '请选择数据',
      column:{
        children:{
          border: true,
          column: [{
            label: '姓名',
            width: 120,
            search:true,
            prop: 'name'
          }, {
            label: '性别',
            search:true,
            prop: 'sex'
          }],
        },
      },
      visible: false,
      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',
        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'],
      query: {},
      loading: false,
      page: {
        pageSize: 10,
        currentPage: 1,
        total: this.referConfig.options.data?this.referConfig.options.data.length :0
      },
      data:this.referConfig.options.data || [],
      selectionList: [],
      option: {
        addBtn: false,
        height: this.referConfig.options.height ? this.referConfig.options.height : 475,
        calcHeight: 30,
        tip: false,
        menu:false,
        searchShow: true,
        searchMenuSpan: 6,
        searchLabelWidth: 90,
        border: true,
        index: true,
        selection: true,
        dialogClickModal: false,
        highlightCurrentRow: true,
        rowKey:'oid',
        rowParentKey:'parentSaleProduct',
        column: []
      }
    };
  },
  created() {
    this.getParams();
    console.log('referConfig:')
    console.log(this.referConfig)
  },
  mounted() {
    if(this.referConfig.options.page){
      this.page.pageSize=this.referConfig.options.page.limit || this.referConfig.options.page.pageSize;
      this.page.currentPage=this.referConfig.options.page.page || this.referConfig.options.page.currentPage;
    }
  },
  computed:{
    valueInfo:function (){
      return this.text ? ("已设置的值为[" + this.text + "]"): '未设置值'
    }
  },
  methods: {
    onLoad({page, value, data}, callback) {
      //首次加载去查询对应的值
      if (value) {
        this.$message.success('首次查询' + value)
        callback({
          id: '0',
          name: '张三',
          sex: '男'
        })
        return
    getParams:function (){
      var queryParams = {};
      if(this.options.extraParams){
        queryParams = this.options.extraParams;
      }
      if (data) {
        this.$message.success('搜索查询参数' + JSON.stringify(data))
      if(this.options.useFormKey && this.options.formValues){
        //使用表单上的字段来过滤
        queryParams['conditionMap["' + (this.options.paramForFormKey?this.options.paramForFormKey:this.options.useFormKey)  + '"]'] = this.options.formValues[this.options.useFormKey];
      }
      if (page) {
        this.$message.success('分页参数' + JSON.stringify(page))
      if(this.options.where ) {
        for (var key in this.options.where) {
          queryParams['conditionMap["' + key + '"]'] = this.options.where[key];//新
        }
      }
      //分页查询信息
      callback({
        total: 2,
        data: [{
          id: '0',
          name: '张三',
          sex: '男'
        }, {
          id: '1',
          name: '李四',
          sex: '女'
        }]
      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['referBo'] = this.options['referBo'] || this.options['referType'];
      }
      queryParams['referType']= queryParams['referBo']
      if (this.options.remoteSort && this.options.initSort) {
        queryParams['order'] = this.options.initSort.type;//方法
        queryParams['sort'] = this.options.initSort.field;//字段
      }
      if (this.options.conditionParams) {
        //说明是扩展属性
        for (var key in this.options.conditionParams) {
          queryParams['conditionMap["' + key + '"]'] = this.options.conditionParams[key];//新的方式
        }
      }
      if (this.options.sourceDataParams) {
        //说明是扩展属性
        for (var key in this.options.sourceDataParams) {
          if (key && key.constructor === Object) return;
          queryParams['sourceData["' + key + '"]'] = this.options.sourceDataParams[key];//新的方式
        }
      }
      if (this.options.replaceParams) {
        //说明是扩展属性
        for (var key in this.options.replaceParams) {
          if (key && key.constructor === Object) return;
          queryParams['replaceMap["' + key + '"]'] = this.options.replaceParams[key];//新的方式
        }
      }
      var paramsData = {};
      //为了处理单引号和双引号的
      if(queryParams){
        for (var key in queryParams){
          paramsData[key.replace(/"/g, "'")] = queryParams[key];
        }
      }
      if(this.options.displayTable){
        //说明是使用平台的表格
        getTableDefinedUrl({btmType:(this.options.referBo||this.options.referType),code:this.options.displayTable,isMuti:this.isMuti},this.tableDefinedUrl).then(result => {
          if(result.success){
            var queryScheme = result.querySchema;
            if(!validatenull(queryScheme) && validatenull(this.options.queryScheme)){
              this.options.queryScheme = queryScheme;
            }
            paramsData['queryScheme'] = this.options.queryScheme;
            if(result.showIndex){
              this.option.index = true;
            }
            if(result.showCheckbox){
              this.option.selection = true
            }
            var referColumn = "";
            if(result.columns){
              this.option.column= result.columns.map(item => {
                if(item.field.indexOf(".")>-1){
                  referColumn += item.field + ",";
                  item.field = item.field.replace(".","_");
                }
                if(!validatenull(item.enumCode)) {
                  //是枚举的内容
                  item.type = 'select';
                  item.dicUrl = "/api/ubcs-omd/enum/dictionary?code=" + item.enumCode;
                  item.dicData = item.enumMap;
                  item.dataType = "String";
                  item.search = true;
                  item.props = {
                    label: "itemName",
                    value: "itemValue"
                  };
                  item.rules = [{
                    required: true,
                    message: "请输入" + item.field,
                    trigger: "blur"
                  }];
                  /*item.formatter=function(d,thisItem){
                    var vciWebComboxStore = layui.vciWebComboxStore;
                    return vciWebComboxStore.getComboxText(thisItem.enumCode,d[thisItem.field]);
                  };*/
                }
                return {
                  ...item,
                  label: item.title,
                  prop: item.field,
                  search: true
                }
              })
            }
            paramsData['referColumn'] = referColumn;
            if(result.limit>0){
              this.page.pageSize = result.limit;
              this.page.currentPage=1
            }
            if(this.options.isTreeGrid){
              //表格树加上配置
            }
            this.params=paramsData;
          }else{
            this.$message.error(result.msg);
          }
        });
      }else{
        //说明是自定义的表格
        var tableConfig = this.options.tableConfig;
        if(!tableConfig){
          this.$message.error( '没有定义参照的表格配置');
        }
        this.page.pageSize=tableConfig.page.limit || 10;
        if(!paramsData){
          paramsData = {
            currentUserReferModelKey:this.options.currentUserReferModelKey,
            currentUserReferMethodKey:this.options.currentUserReferMethodKey
          };
        }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) {
          //说明传递了的
          this.option.column= this.options.tableConfig.cols.map(item => {
            if (item.field != 'LAY_TABLE_INDEX' && item.field != 'LAY_CHECKED') {
              return {
                ...item,
                label: item.title,
                prop: item.field,
                formatter:item.template,
                search: true
              }
            }
          })
        }
        if(this.options.isTreeGrid){
          //表格树加上配置
        }
      }
      this.params=paramsData;
    },
    setValue(){
      if(this.selectionList.length==0){
        this.$message.warning( '没有选择数据');
        return false;
      }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 valueFieldArray = _that.props.value.split(",");
          valueFieldArray.forEach((_indexField,_itemField)=>{
            value.push( item[_itemField] + (_that.referConfig.valueSep?_that.referConfig.valueSep:' '));
          })
        }else {
          value.push(item[_that.props.value]);
        }
        if(isMutiRaw) {
          var rawFieldArray = _that.props.label.split(",");
          rawFieldArray.forEach((_indexField,_itemField)=>{
            text.push(item[_itemField] + (_that.referConfig.textSep?_that.referConfig.textSep:' ')) ;
          })
        }else{
          text.push(item[_that.props.label]);
        }
      })
      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});
      this.visible=false;
    },
    searchReset() {
      this.query = {};
      this.onLoad(this.page);
    },
    searchChange(params, done) {
      this.query = params;
      this.page.currentPage = 1;
      this.onLoad(this.page, params);
      done();
    },
    currentChange(currentPage){
      this.page.currentPage = currentPage;
    },
    sizeChange(pageSize){
      this.page.pageSize = pageSize;
    },
    selectionChange(list) {
      if (!this.isMuti && list.length > 1) {
        const nowVal = list.shift();
        this.$refs.referCrud.toggleRowSelection(nowVal, false);
      }
      this.selectionList = list
    },
    selectionClear() {
      this.selectionList = [];
      this.$refs.referCrud.clearSelection();
    },
    refreshChange() {
      this.onLoad(this.page, this.query);
    },
    onLoad(page, params = this.params) {
      if(this.url){
        this.loading = true;
        getList(Object.assign(params, this.query),page.currentPage, page.pageSize, this.url).then(res => {
          debugger;
          this.page.total = res.total;
          this.data = res.data;
          this.loading = false;
          this.selectionClear();
        });
      }
    }
  }
}
</script>
<style scoped>
.valueInfo{
  float: left;
  border: 1px solid #E9E7E7;
  display: inline-block;
  vertical-align: middle;
  padding: 9px 15px;
  line-height: 1;
}
</style>
Source/UBCS-WEB/src/components/refer/vciWebReferTree.vue
@@ -1,27 +1,31 @@
<template>
  <avue-input-tree ref="referTree" :props="props" :lazy="lazy" :tree-load="treeLoad" :node-click="nodeClick" :leaf-only="!referConfig.onlyLeaf" :multiple="isMuti" v-model="value" :placeholder="placeholder" :dic="treeData"></avue-input-tree>
  <avue-input-tree ref="referTree" :props="props" :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>
</template>
<script>
import {getTree,getLazyTree} from "@/api/refer/tree";
import {validatenull} from "@/util/validate";
export default {
  name: "vciWebReferTree",
  props:["referConfig","value","text"],
  props:["referConfig","value","text","title"],
  data() {
    return {
      options: this.referConfig.options,
      lazy: this.referConfig.options.loadType == 'node',
      isMuti: this.referConfig.isMuti,
      placeholder: this.referConfig.placeholder || '请选择内容',
      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',
        label: this.referConfig.textField || this.referConfig.options.textField || "name"
        //value:"value",
        //label:"title"
        value: 'oid',
        label: "name"
      },
      treeUrl: this.referConfig.options.url || '/api/ubcs-code/codeClassify/treeCodeClassify',
      config:{
        valueField: this.referConfig.valueField || this.referConfig.options.valueField || 'oid',
        textField:this.referConfig.textField || this.referConfig.options.textField || "name",
        textSep:this.referConfig.textSep || ' '
      },
      treeUrl: this.referConfig.options.url || '/api/ubcs-code/mdmEngineController/defaultReferTree',
      treeData: [],
      selectionList: [],
      currentNode:{},
      params: {},
      loadType: {'all': 'all', 'node': 'node'},
@@ -42,6 +46,7 @@
      }
    }
  },
  computed:{},
  methods: {
    getParams:function (){
      var queryParams = {};
@@ -56,10 +61,10 @@
        }
      }
      queryParams['referBo'] = this.options['referBo'] || this.options['referType'];
      queryParams['referType']= queryParams['referBo']
      queryParams['selectAllLevel'] = (this.options.loadType == this.loadType.all?true:false);//true时后台会报错
      if(queryParams.isMuti =="true"){
        queryParams.muti =true;
      }
      queryParams.muti =this.isMuti;
      if(queryParams.isQueryAllColumn =="true"){
        queryParams.isQueryAllColumn = true;
      }
@@ -114,6 +119,7 @@
          queryParams['replaceMap["' + key + '"]'] = this.options.replaceParams[key];//新的方式
        }
      }
      queryParams['parentValue']='\\IN(SELECT oid from PL_CODE_CLASSIFY where id =\'hesuanfenlei\')'
      this.params=queryParams;
    },
@@ -143,16 +149,45 @@
        }))
      });
    },
    nodeClick(data){
      //不要用watch监听value值,会找不到text
      this.value=data[this.props.value];
      this.text=data[this.props.label];
      this.currentNode=data;
      this.$emit("setValue", {field:this.referConfig.field,showField:this.referConfig.showField,value:this.value,text:this.text,rawData:this.currentNode});
    nodeClick(data, node, nodeComp){
      if(!this.isMuti) {
        this.setValue({checkedNodes:[data]})
      }
     },
    checked(checkedNode, checkedData) {
      this.setValue(checkedData)
    },
    setValue:function (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[this.config.valueField] || item[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[textFieldArray[i]] || item[textFieldArray[i]])
            tempRaw.push(t);
          }
        }
        text.push(tempRaw.join(textSep));
      }
      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 || '',
        isTreeMuti:this.isMuti,
        rawData: checkedData.checkedNodes
      });
    }
  },
  watch:{
  }
  watch:{}
}
</script>
Source/UBCS-WEB/src/components/template/Business.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,206 @@
<template>
    <el-dialog :title="`执行${title}`" width="90%" append-to-body="true" :visible.sync="visible">
        <div class="dialogwarp">
            <div class="dialogwarp_tab">
                <el-card class="dialogwarp_tab_card">
                    <el-tabs v-model="activeName" @tab-click="handleClick">
                        <el-tab-pane label="业务数据信息" name="first">
                        </el-tab-pane>
                        <el-tab-pane label="流程跟踪" name="second">
                            <avue-crud :data="data" :option="option" ref="crud">
                            </avue-crud>
                            <div style="padding: 10px 0; width: 100%; height: 100% ">
                                <el-image :src="url" flt="fill"></el-image>
                            </div>
                        </el-tab-pane>
                    </el-tabs>
                </el-card>
            </div>
            <div class="dialogwarp_card">
                <el-card class="box-card">
                    <div slot="header" class="clearfix">
                        <span>当前任务:</span>
                        <span>{{ title }}</span>
                    </div>
                    <div style="width: 100%;">
                        <p>请在下方输入您的审批意见:</p>
                        <el-input type="textarea" :rows="4" placeholder="请输入内容" show-word-limit v-model="opinionVal">
                        </el-input>
                    </div>
                    <div style="width: 100%;">
                        <p>审批意见附件:</p>
                        <el-upload drag action="https://jsonplaceholder.typicode.com/posts/" multiple style="width: 100%;">
                            <i class="el-icon-upload"></i>
                            <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
                        </el-upload>
                    </div>
                    <div style="width: 100%;">
                        <p>已上传审批文件:</p>
                        <el-card class="box-card">
                            <el-table :data="tableData" stripe style="width: 100%">
                                <el-table-column prop="date" label="文件名">
                                </el-table-column>
                                <el-table-column prop="name" label="上传人  ">
                                </el-table-column>
                                <el-table-column prop="address" label="操作">
                                </el-table-column>
                            </el-table>
                        </el-card>
                    </div>
                    <div style="margin-top: 20px;">
                        <el-button v-if="!isRefuse" type="primary" size="mini" @click="handelAgree">同意</el-button>
                        <el-button v-if="!isAgree" type="primary" size="mini" @click="handelRefuse">不同意</el-button>
                        <el-button v-if="isAgree && !isRefuse" type="primary" size="mini" @click="handelRevert"
                            v-for="item in btnList" :key="item">{{ item }}</el-button>
                        <el-button v-if="isRefuse" type="primary" size="mini" @click="handelExecute">执行</el-button>
                    </div>
                </el-card>
            </div>
        </div>
    </el-dialog>
</template>
<script>
export default {
    name:'FlowBusiness',
    props: {
        // æ˜¯å¦æ‰“å¼€
        visible: {
            typeof: Boolean,
            default: false
        }
    },
    watch: {
        visible(n) {
            this.dialogVisible = n;
        },
        dialogVisible(n) {
            this.$emit('update:visible', n)
        },
    },
    data() {
        return {
            dialogVisible: this.visible,
            destroyClose: true,
            activeName: 'first',
            fits: ['fill', 'contain', 'cover', 'none', 'scale-down'],
            url: 'https://fuss10.elemecdn.com/e/5d/4a731a90594a4af544c0c25941171jpeg.jpeg',
            title: '业务测试-申请-物品-审核',
            data: [
                {
                    name: '张三',
                    sex: '男'
                }, {
                    name: '李四',
                    sex: '女'
                }, {
                    name: '李四',
                    sex: '女'
                }, {
                    name: '李四',
                    sex: '女'
                }
            ],
            btnList: ['返回1', '返回1', '返回1'],
            isAgree: false,
            isRefuse: false,
            opinionVal: '',
            option: {
                menu: false,
                addBtn: false,
                refreshBtn: false,
                columnBtn: false,
                index: true,
                header: false,
                stripe: true,
                indexLabelClassName: '序号',
                column: [
                    { label: '任务名称', prop: 'name', minWidth: 120 },
                    { label: '执行操作', prop: 'sex', minWidth: 80 },
                    { label: '任务开始时间', prop: 'sex', minWidth: 140 },
                    { label: '审批意见', prop: 'sex', minWidth: 220, overHidden: true },
                    { label: '执行人', prop: 'sex', minWidth: 80 },
                    { label: '任务完成时间', prop: 'sex', minWidth: 140 },
                    { label: '已上传审批文件', prop: 'sex', minWidth: 220, overHidden: true },
                ]
            },
        }
    },
    methods: {
        closeDialog() {
            this.destroyClose = true
            this.outerVisible = false
        },
        handleClick(tab, event) {
            console.log(event)
        },
        handelAgree() {
            this.isAgree = !this.isAgree
            this.outerVisible = false
            console.log(this.isAgree)
        },
        handelRefuse() {
            if (!this.opinionVal) {
                this.$alert('当处理方式为不同意时,需要填写审批意见', '提示信息', {
                    confirmButtonText: '确定',
                }).then(() => {
                });
            } else {
                this.isRefuse = true
                this.isAgree = true
                this.outerVisible = false
                this.opinionVal = ''
            }
        },
        handelExecute() {
            this.outerVisible = false
            this.isAgree = false
            this.isRefuse = false
        },
        handelRevert() {
            this.outerVisible = false
            this.isAgree = false
        }
    }
}
</script>
<style lang="scss" scoped>
.dialogwarp {
    display: -webkit-box;
    display: -ms-flexbox;
    display: flex;
    justify-content: space-between;
    height: 70vh;
    &_tab {
        width: 79%;
        &_card {
            width: 100%;
            height: 100%;
        }
    }
    &_card {
        // margin-left: 20px;
        width: 20%;
    }
}
::v-deep(.el-upload) {
    width: 100%;
    height: 120px;
}
::v-deep(.el-upload-dragger) {
    width: 100%;
    height: 120px;
}
::v-deep(.el-upload-dragger .el-icon-upload) {
    margin: 15px 0 16px;
}
</style>
Source/UBCS-WEB/src/components/template/FlowPath.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,209 @@
<template>
        <avue-crud ref="crud" :table-loading="loading" :data="data" v-model="form" :option="option" :page.sync="page"
            :search.sync="search" @on-load="getDataList" @row-save="handleSave" @row-del="handleDelete"
            @row-update="handleEdit" @refresh-change="handleRefresh" @size-change="handleSizePage"
            @current-change="handleCurrentPage">
        </avue-crud>
</template>
<script>
import { getFlowpathList, getStartList, flowpathSave, flowpathDelete } from '@/api/template/flowpath.js'
export default {
    name: 'FlowPath',
    props: {
        code: {
            typeof: String,
            required: true,
            default: ""
        }
    },
    data() {
        return {
            loading: false,
            page: {
                currentPage: 1,
                pageSize: 10,
                total: 0
            },
            search: {},
            delIds: [],
            data: [],
            startData: [],
            form: {},
            option: {
                height: "auto",
                border: true,
                align: 'center',
                menuAlign: 'center',
                index: true,
                searchMenuSpan: 8,
                searchBtn: false,
                emptyBtn: false,
                columnBtn: false,
                defaultSort: {
                    prop: 'id,name,description,version',
                    order: 'descending'
                },
                column: [
                    {
                        label: '模板key',
                        prop: 'modelKey',
                        width:120,
                        sortable: true,
                        type: 'tree',
                        dicData: [],
                        props: {
                            label: "key",
                            value: "key"
                        },
                        rules: [{
                            required: true,
                            message: '模板key不能为空',
                            trigger: 'blur'
                        }],
                        nodeClick: (data) => {
                            console.log(data)
                            // èŠ‚ç‚¹ç‚¹å‡»çš„æ—¶å€™ä¼šèŽ·å–åˆ°æ•°æ®
                            this.form.modelName = data.name
                        }
                    }, {
                        label: '模板名称',
                        prop: 'modelName',
                        sortable: true,
                        width:220,
                        addDisabled: true,
                        editDisabled: true,
                    },
                    {
                        label: '模板用途',
                        prop: 'buttonTypeKey',
                        type: 'tree',
                        width:120,
                        dicUrl: '/api/ubcs-flow/processTS/tt',
                        dicMethod: 'post',
                        props: {
                            value: "codee",
                            label: "namee",
                        },
                    },
                    {
                        label: '模板描述',
                        prop: 'description',
                        type:'textarea'
                    },
                ]
            },
        }
    },
    created() {
        this.getStart()
    },
    methods: {
        async getStart() {
            const response = await getStartList()
            if (response.status === 200) {
                console.log(response.data.data.records)
                const data = response.data.data.records
                let newData = data.map(item => {
                    const { key, name, version } = item
                    return { key, name, version }
                })
                this.option.column[0].dicData = newData
            }
        },
        // èŽ·å–åˆ—è¡¨
        async getDataList() {
            this.loading = false
            console.log(this.search)
            const { pageSize, currentPage } = this.page
            let param = { size: pageSize, current: currentPage }
            const response = await getFlowpathList({ ...param, ...{ templateId: this.code } })
            if (response.status === 200) {
                console.log(response)
                this.loading = false
                const data = response.data.data
                this.data = data.records
                this.page.total = data.total
            } else this.loading = false
        },
        // æ–°å¢ž
        async handleSave(row, done, loading) {
            console.log(row)
            const response = await flowpathSave({ ...row, ...{ templateId: this.code } })
            if (response.status === 200) {
                loading()
                console.log(response)
                this.$message({
                    type: 'success',
                    message: '新增数据成功!'
                })
                done()
                this.getDataList()
            }
        },
        // ç¼–辑
        async handleEdit(row, index, done, loading) {
            console.log(row)
            const { modelName, modelKey, buttonTypeKey, id ,description} = row
            let param = { modelName, modelKey, buttonTypeKey, id,description }
            const response = await flowpathSave({ ...param, ...{ templateId: this.code } })
            if (response.status === 200) {
                loading()
                this.$message({
                    type: 'success',
                    message: '修改数据成功!'
                })
                done()
                this.getDataList()
            }
        },
        // åˆ é™¤å•条
        handleDelete(row) {
            console.log(row)
            const { id } = row
            this.deleteSysInfo({ id: id })
        },
        // åˆ é™¤æŽ¥å£
        deleteSysInfo(param) {
            this.$confirm('是否确定删除选择的模板流程?', '提示', {
                confirmButtonText: '确定',
                cancelButtonText: '取消',
                type: 'warning'
            }).then(async () => {
                // æŽ¥å£
                const response = await flowpathDelete(param)
                if (response.status === 200) {
                    console.log(response)
                    this.$message({
                        type: 'success',
                        message: '删除成功!'
                    });
                    this.getDataList()
                }
            })
        },
        // enter搜索
        handleEnter() {
            if (this.search[this.selectValue] === '') return
            else this.getDataList()
        },
        // è¾“入框清空
        handleClear() {
        },
        // åˆ·æ–°æŒ‰é’®
        handleRefresh() {
            this.getDataList()
        },
        handleSizePage(event) {
            this.page.pageSize = event
        },
        handleCurrentPage(event) {
            this.page.currentPage = event
        },
    }
}
</script>
Source/UBCS-WEB/src/components/template/SetPersonnel.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,210 @@
<template>
    <el-dialog :title="title" :visible.sync="dialogVisible" append-to-body="true">
        <div>
            <el-tag v-for="tag in tags" :key="tag" closable disable-transitions effect="dark" @click="handleClickTag(tag)"
                @close="handleCloseTag(tag)">
                <span> {{ tag.name }}</span>
            </el-tag>
        </div>
        <el-divider v-if="tags.length !== 0"></el-divider>
        <div class="btns-icon">
            <el-button type="primary" icon="el-icon-star-off" @click="handleCollect"></el-button>
            <!-- <el-button type="primary" icon="el-icon-refresh" ></el-button> -->
        </div>
        <el-form :model="saveParam" class="demo-form-inline" label-position="left">
            <el-form-item :label="item.taskName" v-for="(item, index) in initFrom" :key="index">
                <el-select style="width: 50%;" v-model="saveParam.flowTaskUsers[index]['userId']"
                    :placeholder="item.taskName" @change="handleSelect($event, index)">
                    <el-option :label="key.userNames" :value="key.userId" v-for="(key, keyi) in typeName"
                        :key="keyi"></el-option>
                </el-select>
            </el-form-item>
        </el-form>
        <div slot="footer" class="dialog-footer">
            <el-button @click="handleCancel">取 æ¶ˆ</el-button>
            <el-button type="primary" @click="handleConfirm">ç¡® å®š</el-button>
        </div>
    </el-dialog>
</template>
<script>
import { personnelInit, personnelCollect, cancelCollect, personnelSave, personnelDict } from '@/api/template/setPersonnel.js'
export default {
    name: 'SetPersonnel',
    props: {
        // æ˜¯å¦æ‰“å¼€
        visible: {
            typeof: Boolean,
            default: false
        },
        // æ ‡é¢˜
        title: {
            typeof: String,
            default: '人员设置'
        },
        // æ¨¡æ¿id
        code: {
            typeof: String,
            default: ''
        },
        // æ¨¡æ¿ç”¨é€”
        type: {
            typeof: String,
            default: ''
        }
    },
    watch: {
        visible(n) {
            this.dialogVisible = n;
        },
        dialogVisible(n) {
            this.$emit('update:visible', n)
        },
    },
    data() {
        return {
            dialogVisible: this.visible,
            initFrom: [],
            tags: [],
            typeName: [],
            saveParam: {},
            users: [],
        }
    },
    mounted() {
        this.apiInit()
        this.apiDict()
    },
    methods: {
        async apiInit() {
            const response = await personnelInit({ type: this.type, templateId: this.code })
            if (response.status === 200) {
                console.log(response)
                this.initFrom = response.data.data.user
                this.tags = response.data.data.collect
                const { modelKey, templateId } = response.data.data.flow
                let flowTaskUsers = response.data.data.user
                this.saveParam = { modelKey, templateId, flowTaskUsers: flowTaskUsers }
                this.handleClickTag(this.tags[0])
            }
        },
        async apiDict() {
            const response = await personnelDict()
            if (response.status === 200) {
                console.log(response)
                const data = response.data.data
                this.typeName = data.map(item => {
                    const { account, deptName, id, realName } = item
                    let userNames = `${deptName} - ${realName} - ${account}`
                    return { userId: id, userName: realName, userNames: userNames }
                })
            }
        },
        handleCollect() {
            this.$prompt('请输入一个名字', '操作', {
                confirmButtonText: '确定',
                cancelButtonText: '取消',
            }).then(async ({ value }) => {
                console.log(this.users)
                this.saveParam.flowTaskUsers = this.users
                this.saveParam = { ...this.saveParam, name: value }
                console.log(this.saveParam)
                const response = await personnelCollect(this.saveParam)
                if (response.status === 200) {
                    this.$nextTick(() => {
                        this.apiInit()
                    })
                    console.log(response)
                }
            }).catch(() => {
            });
        },
        async canCollect(name) {
            const response = await cancelCollect({ name: name })
            if (response.status === 200) {
                console.log(response)
                this.apiInit()
                this.$message({
                    type: 'success',
                    message: response.data.msg
                });
            }
        },
        async apiSave() {
            try {
                const { modelKey, templateId } = this.saveParam
                const response = await personnelSave({ modelKey, templateId })
                if (response.status === 200) {
                    console.log(response)
                    this.$message({
                    type: 'success',
                    message: response.data.msg
                });
                    this.done()
                }
            } catch {
                console.error('接口调用失败')
            }
        },
        handleClickTag(event) {
            console.log(event)
            const flowTaskUsers = event.flowTaskUsers
            this.saveParam.flowTaskUsers = flowTaskUsers.map(item => {
                const { taskId, taskName, userId, userName } = item
                return { taskId, taskName, userId, userName }
            })
        },
        handleCloseTag(event) {
            console.log(event)
            this.canCollect(event.name)
        },
        handleSelect(event, index) {
            const res = this.typeName.find(item => item.userId === event)
            const { userName } = res
            let users = { ... this.saveParam.flowTaskUsers[index], userName }
            console.log(users)
            this.users[index] = users
        },
        done() {
            this.dialogVisible = false
        },
        handleCancel() {
            this.done()
        },
        handleConfirm() {
            console.log(this.users)
            console.log(this.saveParam)
            this.apiSave()
        }
    }
}
</script>
<style lang="scss">
.el-tag+.el-tag {
    margin-left: 10px;
    margin-top: 10px;
}
.button-new-tag {
    margin-left: 10px;
    height: 32px;
    line-height: 30px;
    padding-top: 0;
    padding-bottom: 0;
}
.input-new-tag {
    width: 90px;
    margin-left: 10px;
    vertical-align: bottom;
}
.btns-icon {
    display: flex;
    justify-content: end;
    padding-bottom: 10px;
}
</style>
Source/UBCS-WEB/src/components/template/Stage.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,244 @@
<template>
    <div>
        <avue-crud ref="crud" :table-loading="loading" :data="data" :option="option" :page.sync="page"
            @on-load="getDataList" @size-change="handleSizePage" @current-change="handleCurrentPage"
            @row-click="handleRowClick">
            <template slot-scope="{type,size,row,index}" slot="menu">
                <el-button icon="el-icon-check" :size="size" :type="type"
                    @click="handleMaintenance(row, index)">维护</el-button>
            </template>
        </avue-crud>
        <el-dialog title="模板阶段" width="50%" append-to-body="true" :visible.sync="dialogNode">
            <avue-crud ref="crud" :table-loading="loading" :data="stageData" :option="stageOption" @on-load="getStagelist"
                @row-click="handleRowStageClick">
                <template slot-scope="{type,size,row,index}" slot="menu">
                    <el-button icon="el-icon-check" :size="size" :type="type"
                        @click="handleMaintenanceTransfer(row, index)">维护</el-button>
                </template>
            </avue-crud>
        </el-dialog>
        <table-transfer v-if="flag" :visible.sync="dialogTransfer" v-model="attributeValue" :dataList="attributeData"
            :columns="columns" keyName="oid" @save="handleSave" @close="handelClose"></table-transfer>
    </div>
</template>
<script>
import { getFlowpathList, stagelist, attributeListRight, attributeList, attributeSave } from '@/api/template/flowpath.js'
import TableTransfer from '@/components/template/TableTransfer'
export default {
    name: 'Stage',
    components: {
        TableTransfer
    },
    props: {
        code: {
            typeof: String,
            required: true,
            default: ""
        }
    },
    watch: {
    },
    data() {
        const options = {
            height: "auto",
            border: true,
            addBtn: false,
            align: 'center',
            menuAlign: 'center',
            index: true,
            searchMenuSpan: 8,
            searchBtn: false,
            emptyBtn: false,
            columnBtn: false,
            delBtn: false,
            refreshBtn: false,
            header: false,
            editBtn: false,
        }
        return {
            attributeData: [],
            attributeValue: [],
            flag: false,
            dialogTransfer: false,
            dialogNode: false,
            visibleTable: false,
            loading: false,
            page: {
                currentPage: 1,
                pageSize: 10,
                total: 0
            },
            modelKey: '',
            data: [],
            stageData: [],
            saveParam: {},
            columns: [
                {
                    key: "oid",
                    label: "oid",
                    visible: false,
                },
                {
                    key: "id",
                    label: "属性编号",
                    visible: true,
                },
                {
                    key: "name",
                    label: "属性名称",
                    visible: true,
                },
                {
                    key: "attributeGroup",
                    label: "属性分组",
                    visible: true,
                },
            ],
            option: {
                ...options,
                column: [
                    { label: '模板编号', prop: 'modelKey' },
                    { label: '模板名称', prop: 'modelName' },
                    { label: '描述', prop: 'buttonTypeValue' },
                ]
            },
            stageOption: {
                ...options,
                column: [
                    { label: '阶段编号', prop: 'taskId' },
                    { label: '阶段名称', prop: 'taskName' },
                ]
            },
        }
    },
    methods: {
        setTable(data, list) {
            return data.map(item => {
                if (list.length !== 0) {
                    list.forEach(element => {
                        if (item.id === element.attrId) item.checked = true
                    });
                }
                return item
            })
        },
        // èŽ·å–åˆ—è¡¨
        async getDataList() {
            this.loading = false
            const { pageSize, currentPage } = this.page
            let param = { size: pageSize, current: currentPage }
            const response = await getFlowpathList({ ...param, ...{ templateId: this.code } })
            if (response.status === 200) {
                console.log(response)
                this.loading = false
                const data = response.data.data
                this.data = data.records
                this.page.total = data.total
            } else this.loading = false
        },
        // èŽ·å–é˜¶æ®µåˆ—è¡¨
        async getStagelist() {
            this.loading = false
            console.log(this.modelKey)
            const response = await stagelist({ modelKey: this.modelKey })
            if (response.status === 200) {
                this.loading = false
                console.log(response.data)
                this.stageData = response.data.data
            } else this.loading = false
        },
        // èŽ·å–å…¨éƒ¨å±žæ€§
        async getAttributeList() {
            const response = await attributeList({ 'conditionMap[classifyTemplateOid]': this.code })
            const responseRight = await attributeListRight({ templateId: this.code, modelKey: this.modelKey, taskId: this.saveParam.taskId })
            if (response.status === 200 && responseRight.status === 200) {
                let datas = response.data.data.records
                let dataRight = responseRight.data.data
                datas = datas.map(item => {
                    const { oid, id, name, attributeGroup } = item
                    item = { oid, id, name, attributeGroup, ...{ checked: false } }
                    if (dataRight.length !== 0) {
                        dataRight.forEach(element => { if (item.id === element.attrId) item.checked = true });
                        return item
                    }
                })
                let dataValue = datas.map(item => item.checked ? item.oid : undefined)
                this.attributeValue = dataValue.filter(item => item)
                this.attributeData = datas
                this.flag = true
            }
        },
        // èŽ·å–å·²ä¿å­˜å±žæ€§
        async getAttributeListRight() {
            const response = await attributeListRight({ templateId: this.code, modelKey: this.modelKey, taskId: this.saveParam.taskId })
            if (response.status === 200) {
                let data = response.data.data
                data = data.map(item => {
                    const { attrId, attrName, attrGroup } = item
                    return { attrId, attrName, attrGroup }
                })
                this.listRight = data
            }
        },
        // ç»´æŠ¤
        handleMaintenance(row) {
            console.log(row)
            this.dialogNode = true
            this.saveParam.modelKey = row.modelKey
        },
        handleMaintenanceTransfer(row) {
            this.saveParam.taskId = row.taskId
            this.saveParam.taskName = row.taskName
            this.getAttributeList()
            this.$nextTick(() => {
                this.dialogTransfer = true
            })
        },
        handleRowClick(row) {
            console.log(row)
            this.modelKey = row.modelKey
            this.saveParam.modelKey = row.modelKey
            this.dialogNode = true
        },
        handleRowStageClick(row) {
            this.saveParam.taskId = row.taskId
            this.saveParam.taskName = row.taskName
            this.getAttributeList()
            this.$nextTick(() => {
                this.dialogTransfer = true
            })
        },
        async handleSave(event) {
            console.log(event)
            const data = event.map(item => {
                const { id, name, attributeGroup } = item
                return { attrId: id, attrName: name, attrGroup: attributeGroup }
            })
            let param = {
                templateId: this.code,
                processStageAttr: data,
                ...this.saveParam
            }
            console.log(this.saveParam)
            console.log(data)
            const response = await attributeSave(param)
            if (response.status === 200) {
                // loading()
                console.log(response)
                this.$message({
                    type: 'success',
                    message: '新增数据成功!'
                })
                this.flag = false
                // done()
                // this.getDataList()
            }
        },
        handelClose() {
            this.flag = false
        }
    }
}
</script>
Source/UBCS-WEB/src/components/template/TableTransfer.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,326 @@
<template>
    <el-dialog :title="title" width="70%" append-to-body="true" :visible.sync="dialogVisible" @close="handelClose">
        <el-row :gutter="20">
            <el-col :span="11">
                <el-card class="box-card">
                    <div slot="header" class="clearfix">
                        <span>初始数据</span>
                        <el-input class="input" v-if="showSearch" v-model="searchLeft" placeholder="请输入搜索内容"
                            @keyup.enter.native="handleEnter"></el-input>
                    </div>
                    <el-table ref="transferTable" :data="leftData" height="500" highlight-current-row tooltip-effect="dark"
                        @selection-change="handleLeftSelectionChange" @row-click="handleLeftRowClick">
                        <el-table-column type="selection" width="50" align="center" fixed="left" />
                        <div v-for="(item, index) in columns" :key="index">
                            <el-table-column v-if="item.visible" :label="item.label" align="center" :prop="item.key" />
                        </div>
                    </el-table>
                </el-card>
            </el-col>
            <el-col :span="2" class="btns" :style="{ height: '500px' }">
                <el-button class="btn" :disabled="leftMultiple" type="primary" icon="el-icon-arrow-right"
                    @click="moveToRight" circle></el-button>
                <el-button class="btn" :disabled="rightMultiple" type="primary" @click="moveToLeft"
                    icon="el-icon-arrow-left" circle></el-button>
            </el-col>
            <el-col :span="11">
                <el-card class="box-card">
                    <div slot="header" class="clearfix">
                        <span>改变数据</span>
                        <el-input class="input" v-if="showSearch" v-model="searchRight" placeholder="请输入搜索内容"></el-input>
                    </div>
                    <el-table ref="transferRightTable" :data="rightData" height="500" highlight-current-row
                        tooltip-effect="dark" @selection-change="handleRightSelectionChange"
                        @row-click="handleRightRowClick">
                        <el-table-column type="selection" width="50" align="center" fixed="left" />
                        <div v-for="(item, index) in columns" :key="index">
                            <el-table-column v-if="item.visible" :label="item.label" align="center" :prop="item.key" />
                        </div>
                    </el-table>
                </el-card>
            </el-col>
        </el-row>
        <div slot="footer" class="dialog-footer">
            <el-button @click="dialogVisible = false">取 æ¶ˆ</el-button>
            <el-button type="primary" @click="tableTransferSave">保存</el-button>
        </div>
    </el-dialog>
</template>
<script>
export default {
    name: 'TableTransfer',
    model: {
        prop: "value",
        event: "change",
    },
    props: {
        // æ˜¯å¦æ‰“å¼€
        visible: {
            typeof: Boolean,
            default: false
        },
        title: {
            typeof: String,
            default: '模板阶段维护'
        },
        //绑定数据
        value: {
            type: Array,
            default: () => {
                return [];
            },
        },
        //主键key值
        keyName: {
            type: String,
            default: "oid",
        },
        columns: {
            type: Array,
            default: () => {
                return [];
            },
        },
        dataList: {
            type: Array,
            default: () => {
                return [];
            },
        },
        /**
         * æ˜¯å¦æ˜¾ç¤ºæœç´¢æ¡†
         */
        showSearch: {
            type: Boolean,
            default: true,
        },
    },
    watch: {
        visible(n) {
            this.dialogVisible = n;
        },
        dialogVisible(n) {
            this.$emit('update:visible', n)
        },
        searchLeft: {
            handler: function () {
                this.handleQueryLeft();
            },
            deep: true,
        },
        searchRight: {
            handler: function () {
                this.handleQueryRight();
            },
            deep: true,
        },
    },
    data() {
        return {
            dialogVisible: this.visible,
            indeterminate: false,
            isCheck: false,
            searchLeft: "",
            leftIds: [],
            leftMultiple: true,
            leftDataList: [],
            leftData: [],
            searchRight: "",
            rightIds: [],
            rightMultiple: true,
            rightDataList: [],
            rightData: [],
        }
    },
    mounted() {
        this.init();
        console.log(this.$refs.transferTable)
    },
    methods: {
        init() {
            let that = this
            that.rightIds = that.value;
            for (let i = 0; i < that.dataList.length; i++) {
                if (that.value.some((item) => item == that.dataList[i][that.keyName])) {
                    that.rightDataList.push(that.dataList[i]);
                }
                // else{
                //     that.leftDataList.push(that.dataList[i])
                // }
                that.leftDataList.push(that.dataList[i])
            }
            that.leftData = [...that.leftDataList];
            that.rightData = [...that.rightDataList];
        },
        // left多选框选中数据
        handleLeftSelectionChange(selection) {
            this.leftIds = selection.map((item) => item[this.keyName]);
            this.leftMultiple = !selection.length;
        },
        // right多选框选中数据
        handleRightSelectionChange(selection) {
            this.rightIds = selection.map((item) => item[this.keyName]);
            this.rightMultiple = !selection.length;
        },
        // æŒ‰é’®ç‚¹å‡»
        moveToRight() {
            for (let i = 0; i < this.leftDataList.length; i++) {
                let a = this.leftIds.findIndex(
                    (item) => item == this.leftDataList[i][this.keyName]
                );
                if (a !== -1) {
                    let moveLefti = this.leftDataList[i];//左边罗过来的
                    let moveLeftiKey = moveLefti['id'];
                    let isMove = true;
                    for (let j = 0; j < this.rightDataList.length; j++) {
                        let rifhtDataListi = this.rightDataList[j];//右边循环出来的每一个
                        let rightDataListiKey = rifhtDataListi['id'];//每一个key
                        if (rightDataListiKey == moveLeftiKey) {
                            isMove = false;
                            break;
                        }
                    }
                    if (isMove) {
                        this.rightDataList.push(this.leftDataList[i]);
                        this.leftDataList[i].checked = true
                        // this.$delete(this.leftDataList, i);
                        // i--;
                    }
                }
            }
            this.leftData = this.setData(this.leftDataList, this.searchLeft);
            this.rightData = this.setData(this.rightDataList, this.searchRight);
            this.$emit(
                "change",
                this.rightDataList.map((item) => item[this.keyName])
            );
        },
        // æŒ‰é’®ç‚¹å‡»
        moveToLeft() {
            for (let i = 0; i < this.rightDataList.length; i++) {
                let a = this.rightIds.findIndex(
                    (item) => item == this.rightDataList[i][this.keyName]
                );
                if (a !== -1) {
                    this.leftDataList[i].checked = false
                    // this.leftDataList.push(this.rightDataList[i]);
                    this.$delete(this.rightDataList, i);
                    i--;
                }
            }
            console.log(this.rightDataList)
            this.leftData = this.setData(this.leftDataList, this.searchLeft);
            this.rightData = this.setData(this.rightDataList, this.searchRight);
            this.$emit(
                "change",
                this.rightDataList.map((item) => item[this.keyName])
            );
        },
        handleQueryLeft() {
            this.leftData = this.setData(this.leftDataList, this.searchLeft);
        },
        handleQueryRight() {
            this.rightData = this.setData(this.rightDataList, this.searchRight);
        },
        // å•选
        handleLeftRowClick(row) {
            if (this.leftData) {
                this.$refs.transferTable.toggleRowSelection(row)
            } else {
                this.$refs.transferTable.clearSelection()
            }
        },
        // å•选
        handleRightRowClick(row) {
            if (this.rightData) {
                this.$refs.transferRightTable.toggleRowSelection(row)
            } else {
                this.$refs.transferRightTable.clearSelection()
            }
        },
        setData(dataList, search) {
            if (search != null || search != "") {
                let list = [];
                for (let i = 0; i < dataList.length; i++) {
                    if (
                        this.columns.some((item) =>
                            dataList[i][item.key].toLowerCase().includes(search.toLowerCase())
                        )
                    ) {
                        list.push(dataList[i]);
                    }
                }
                return list;
            } else {
                return dataList;
            }
        },
        change(val) {
            console.log(val);
            console.log(this.value)
        },
        done() {
            this.leftData = []
            this.leftDataList = []
            this.rightDataList = []
            this.rightData = []
            this.dialogVisible = false
        },
        tableTransferSave() {
            this.$emit('save', this.rightData)
            this.done()
        },
        // å…³é—­æ¸…除所有数据
        handelClose() {
            this.$emit('close')
            this.done()
        },
    },
}
</script>
<style lang="scss" scoped>
::v-deep(.el-col>.el-card >.el-card__header) {
    background: #fff
}
.box-card {
    background: #fff;
}
.clearfix {
    display: -webkit-box;
    display: flex;
    display: -ms-flexbox;
    -webkit-box-pack: justify;
    -ms-flex-pack: justify;
    justify-content: space-between;
    -webkit-box-align: center;
    -ms-flex-align: center;
    align-items: center;
}
.input {
    float: right;
    padding: 3px 0;
    max-width: 400px;
}
.btns {
    display: flex;
    align-items: center;
    flex-direction: column;
    justify-content: center;
    .btn {
        margin: 20px 0;
    }
}
</style>
Source/UBCS-WEB/src/const/code/cloneBasicDialogOption.js
@@ -18,6 +18,7 @@
    columnBtn: false,
    dialogClickModal: false,
    highlightCurrentRow: true, //行选中时高亮
    rowKey: "oid", //行数据的 Key,用来优化 Table çš„æ¸²æŸ“
    column: [
      {
        label: "码段编号",
Source/UBCS-WEB/src/const/code/cloneCodeRuleDialogOption.js
@@ -17,6 +17,7 @@
    columnBtn: false,
    dialogClickModal: false,
    highlightCurrentRow: true, //行选中时高亮
    rowKey: "oid", //行数据的 Key,用来优化 Table çš„æ¸²æŸ“
    column: [
      {
        label: "编号",
Source/UBCS-WEB/src/const/code/cloneOption.js
@@ -17,6 +17,7 @@
    columnBtn: false,
    dialogClickModal: false,
    highlightCurrentRow: true, //行选中时高亮
    rowKey: "oid", //行数据的 Key,用来优化 Table çš„æ¸²æŸ“
    column: [
      {
        label: "码段编号",
Source/UBCS-WEB/src/const/code/codeKeyAttrRepeat.js
@@ -11,6 +11,7 @@
  selection: true,
  dialogClickModal: false,
  highlightCurrentRow: true,
  rowKey: "oid", //行数据的 Key,用来优化 Table çš„æ¸²æŸ“
  column: [
    {
      label: "",
Source/UBCS-WEB/src/const/code/codeSynonym.js
@@ -11,6 +11,7 @@
  selection: true,
  dialogClickModal: false,
  highlightCurrentRow: true, //行选中时高亮
  rowKey: "oid", //行数据的 Key,用来优化 Table çš„æ¸²æŸ“
  column: [
    {
      label: "",
Source/UBCS-WEB/src/const/code/codebasic.js
@@ -17,6 +17,7 @@
    columnBtn: true,
    searchShowBtn: false,
    highlightCurrentRow: true, //行选中时高亮
    rowKey: "oid", //行数据的 Key,用来优化 Table çš„æ¸²æŸ“
    column: [
      {
        label: "码段编号",
Source/UBCS-WEB/src/const/code/codebutton.js
@@ -12,6 +12,7 @@
  selection: true,
  dialogClickModal: false,
  highlightCurrentRow: true, //行选中时高亮
  rowKey: "oid", //行数据的 Key,用来优化 Table çš„æ¸²æŸ“
  column: [
    {
      label: "",
Source/UBCS-WEB/src/const/code/fixedValueMgrDialog.js
@@ -18,6 +18,7 @@
    columnBtn: false,
    dialogClickModal: false,
    highlightCurrentRow: true,
    rowKey: "oid", //行数据的 Key,用来优化 Table çš„æ¸²æŸ“
    column: [
      {
        label: "码值",
Source/UBCS-WEB/src/const/code/mdmrule.js
@@ -11,6 +11,7 @@
  selection: true,
  dialogClickModal: false,
  highlightCurrentRow: true,
  rowKey: "oid", //行数据的 Key,用来优化 Table çš„æ¸²æŸ“
  column: [
    {
      label: "编号",
Source/UBCS-WEB/src/const/code/parentClassifyParentOptionDialog.js
@@ -14,6 +14,7 @@
    menu: false,
    dialogClickModal: false,
    highlightCurrentRow: true,
    rowKey: "oid", //行数据的 Key,用来优化 Table çš„æ¸²æŸ“
    column: [
      {
        label: "英文名称",
Source/UBCS-WEB/src/const/code/referBtmDialog.js
@@ -16,6 +16,7 @@
    searchShowBtn: false, //    è¡¨æ ¼æœç´¢æ˜¾éšæŒ‰é’®
    dialogClickModal: false,
    highlightCurrentRow: true,
    rowKey: "oid", //行数据的 Key,用来优化 Table çš„æ¸²æŸ“
    column: [
      {
        label: "业务类型编号",
Source/UBCS-WEB/src/const/code/selectAttrOptionDialog.js
@@ -16,6 +16,7 @@
    searchShowBtn: false, //    è¡¨æ ¼æœç´¢æ˜¾éšæŒ‰é’®
    dialogClickModal: false,
    highlightCurrentRow: true,
    rowKey: "oid", //行数据的 Key,用来优化 Table çš„æ¸²æŸ“
    column: [
      {
        label: "属性英文名称",
Source/UBCS-WEB/src/main.js
@@ -48,9 +48,12 @@
import FormTemplateDialog from "@/components/FormTemplate/index"
import linkTypeAdd from "@/views/modeling/LinkTypeAdd"
import MasterTree from "@/components/Master/MasterTree";
import FlowPath from "@/components/template/FlowPath";
import Stage from "@/components/template/Stage";
// å°†å·¥å…·å‡½æ•°æ·»åŠ åˆ°å…¨å±€
import utilFunc from './util/func'
import flowPath from "@/views/flow/flowPath";
Vue.prototype.$utilFunc = utilFunc
// æ³¨å†Œå…¨å±€crud驱动
window.$crudCommon = crudCommon;
@@ -97,6 +100,8 @@
Vue.component('FormTemplateDialog',FormTemplateDialog)
Vue.component('LinkTypeAdd',linkTypeAdd)
Vue.component('MasterTree',MasterTree)
Vue.component('FlowPath',FlowPath)
Vue.component('Stage',Stage)
// åŠ è½½ç›¸å…³url地址
Object.keys(urls).forEach(key => {
Source/UBCS-WEB/src/option/user/info.js
@@ -45,7 +45,7 @@
      }]
    },
    {
      label: '修改密码',
      label: '',
      prop: 'password',
      column: [{
        label: '原密码',
Source/UBCS-WEB/src/router/axios.js
@@ -15,6 +15,7 @@
import {Base64} from 'js-base64';
import NProgress from 'nprogress';
import 'nprogress/nprogress.css';
import qs from 'qs';
//默认超时时间
axios.defaults.timeout = 20000;
@@ -51,6 +52,12 @@
  if (config.method === 'post' && meta.isSerialize === true) {
    config.data = serialize(config.data);
  }
  // get请求特殊字符汉字序列化,否则会导致后端无法转码
  if(config.method === 'get'){
    config.paramsSerializer =  function(params) {
      return qs.stringify(params, { encode: true })
    };
  }
  return config
}, error => {
  return Promise.reject(error)
Source/UBCS-WEB/src/util/param2CondMapUtil.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,5 @@
/**
 * Param转conditionMap条件的工具类
*/
Source/UBCS-WEB/src/views/authority/role.vue
@@ -35,10 +35,11 @@
      </template>
    </avue-crud>
    <el-dialog title="角色权限配置"
               append-to-body
               :visible.sync="box"
               width="345px">
      <el-tabs type="border-card">
      append-to-body
      :visible.sync="box"
      width="350px"
      style="height: 115vh; margin-top: -13vh; overflow: hidden">
      <el-tabs type="border-card" style="overflow-y: auto; height: 72vh">
        <el-tab-pane label="菜单权限">
          <el-tree :data="menuGrantList"
                   show-checkbox
@@ -307,6 +308,13 @@
      },
      selectionChange(list) {
        this.selectionList = list;
        this.$refs.crud.setCurrentRow(this.selectionList[list.length-1]);
      },
      clickRowChange(row){
        this.selectionList = row;
        this.$refs.crud.toggleSelection();
        this.$refs.crud.setCurrentRow(row);
        this.$refs.crud.toggleRowSelection(row); //选中当前行
      },
      selectionClear() {
        this.selectionList = [];
@@ -363,6 +371,7 @@
      },
      currentChange(currentPage) {
        this.page.currentPage = currentPage;
      },
      sizeChange(pageSize) {
        this.page.pageSize = pageSize;
Source/UBCS-WEB/src/views/code/code.vue
@@ -1173,7 +1173,6 @@
        refreshParentClassifyDataChange() {
          this.parentClassifyOnLoad(this.parentClsfyParams.parentClassifyDataPage, this.parentClsfyParams.parentClassifyQuery);
        },
        // TODO:待修改
        parentClassifyOnLoad(page, params = {}) {
          let parentClsParam = this.parentClsfyParams;
          parentClsParam.classifyDialogLoading = true;
@@ -1204,22 +1203,25 @@
        loadlistClassifyLinkAttr() {
          let attrParam = this.selectAttrParams;
          //console.log(this.currentSelectTreeData);
          attrParam.selectAttrOptionLoading = true;
          this.selectAttrParams.selectAttrOptionLoading = true;
          let conditionMaps = {};
          if(attrParam.selectAttrQeury){
            Object.keys(attrParam.selectAttrQeury).forEach(key=>{
              conditionMaps['conditionMap['+key+']'] = attrParam.selectAttrQeury[key];
              conditionMaps['conditionMap['+key+']'] = attrParam.selectAttrQeury[key].trim();
            });
          }
          conditionMaps['conditionMap[codeClassifyOid]'] = this.currentSelectTreeData.oid;
          conditionMaps['conditionMap[btmTypeOid]'] = this.currentSelectTreeData.btmTypeOid;
          listClassifyLinkAttr(conditionMaps).then(res=>{
            //console.log(res.data.data);
            attrParam.selectAttrData = res.data.data;
            attrParam.selectAttrOptionLoading = false;
            const data = res.data;
            this.$nextTick(() => {
                this.$refs[attrParam.ref].doLayout()
              this.$refs[attrParam.ref].doLayout()
            });
            //console.log(data.data);
            this.selectAttrParams.selectAttrData = data.data;
            this.selectAttrParams.selectAttrOptionLoading = false;
            // å°†æœç´¢æ¡†å†…容置空
            this.selectAttrParams.selectAttrQeury = {};
          })
        },
        // ç‚¹å‡»æœç´¢åŽè§¦å‘该事件
@@ -1727,7 +1729,7 @@
              return false;
            }
          }else if(this.form.secType==='codeserialsec'){
            console.log(form.codeFillType);
            //console.log(form.codeFillType);
            //流水码段
            if(form.codeSecLength == ''){
              this.$message.warning('(码段的长度)'+tipsMsg);
@@ -1899,7 +1901,7 @@
          //存储当前关联的编码规则相关信息
          this.currentCodeRuleOid = row.oid;
          this.currentRuleLcStatus = row.lcStatus;
          this.sendGridCodeBasicSec({"pkCodeRule_equal":row.oid},false);
          this.sendGridCodeBasicSec({"pkCodeRule":row.oid},false);
        },
        // å‘送加载基础码段的请求
        sendGridCodeBasicSec(condition,isAdancedQuery/** æ˜¯å¦é«˜çº§æŸ¥è¯¢ */){
@@ -1910,11 +1912,11 @@
          let conditionMaps = {};
          if(condition && !isAdancedQuery){
            Object.keys(condition).forEach(key=>{
              conditionMaps['conditionMap[t.'+key+']'] = condition[key];
              conditionMaps['conditionMap[pl_code_basicsec.'+key+']'] = condition[key].trim();
            });
          }
          if(isAdancedQuery){
            condition['conditionMap[t.pkCodeRule_equal]'] = this.currentCodeRuleOid == null || this.currentCodeRuleOid == ''
            condition['conditionMap[pl_code_basicsec.pkCodeRule]'] = this.currentCodeRuleOid == null || this.currentCodeRuleOid == ''
            ? this.selectionList[0].oid:this.currentCodeRuleOid;
          }
          gridCodeBasicSec(1, -1,isAdancedQuery ? condition:conditionMaps).then(res => {
@@ -1945,11 +1947,11 @@
        },
        basicSearchChange(params, done){
          //console.log(this.$refs.crudBasic);
          this.sendGridCodeBasicSec(Object.assign(params,{"pkCodeRule_equal":this.selectionList[this.selectionList.length-1].oid}),false);
          this.sendGridCodeBasicSec(Object.assign(params,{"pkCodeRule":this.selectionList[this.selectionList.length-1].oid}),false);
          done();
        },
        basicSearchReset(){
          this.sendGridCodeBasicSec({"pkCodeRule_equal":this.selectionList[this.selectionList.length-1].oid},false);
          this.sendGridCodeBasicSec({"pkCodeRule":this.selectionList[this.selectionList.length-1].oid},false);
        },
        // ä¸Šç§»ä¸‹ç§»åŸºç¡€ç æ®µ
        upOrderNum(row){
@@ -2055,7 +2057,7 @@
                fieldType: 'combox',
                queryField: 'lcStatus',
                comboxKey: 'codeSearchLCStatus',
              }
              },
            ]
          }else {
            this.advancedQueryParam.options = [
@@ -2063,22 +2065,22 @@
                data: [],
                title: '码段编号',
                fieldType: 'text',
                queryField: 't.id',
                queryField: 'pl_code_basicsec.id',
              },{
                data: [],
                title: '码段名称',
                fieldType: 'text',
                queryField: 't.name',
                queryField: 'pl_code_basicsec.name',
              },{
                data: [],
                title: '描述',
                fieldType: 'text',
                queryField: 't.description',
                queryField: 'pl_code_basicsec.description',
              },{
                data: [],
                title: '码段类型',
                fieldType: 'combox',
                queryField: 't.secType',
                queryField: 'pl_code_basicsec.secType',
                comboxKey: 'codeSecType',
              }
            ]
@@ -2355,11 +2357,13 @@
        searchChange(params, done) {
          this.page.currentPage = 1;
          // å¤šä¸ªconditionMap这样传参,快速查询默认采用模糊查询
          let requestData = {};
          if(params){
            Object.keys(params).forEach(key=>{
              this.query['conditionMap['+key+'_like]'] = params[key];
              requestData["conditionMap"+'['+key+']'] = params[key].trim();
            });
          }
          this.query = requestData;
          this.onLoad(this.page);
          done();
        }, 
@@ -2612,7 +2616,7 @@
            //可变码段
            this.form = Object.assign({}, this.form,{
              codeSecLength: row!=null&&row.codeSecLength != '' ? row.codeSecLength:'',             //码段的长度
              codeFillType: row!=null&&row.codeFillType != '' ? row.codeFillType:'code_fill_right', //编码部位方式,枚举查询
              codeFillType: row!=null&&row.codeFillType != '' ? row.codeFillType:'code_fill_left', //编码部位方式,枚举查询
              codeFillSeparatorSelect: row!=null&&row.codeFillSeparatorSelect != '' ? row.codeFillSeparatorSelect:0,  //选中的补位时的字符的下标
              codeFillSeparator: row!=null&&row.codeFillSeparator != '' ? row.codeFillSeparator:'', //补位时的字符,可输可选查询
            });
Source/UBCS-WEB/src/views/flow/flowPath.vue
@@ -1,192 +1,35 @@
<template>
    <div>
        <el-button @click="outerVisible = true">流程测试</el-button>
        <el-dialog :title="`执行${title}`" width="90%" append-to-body="true" :visible.sync="outerVisible">
            <div class="dialogwarp">
                <div class="dialogwarp_tab">
                    <el-card class="dialogwarp_tab_card">
                        <el-tabs v-model="activeName" @tab-click="handleClick">
                            <el-tab-pane label="业务数据信息" name="first">
                            </el-tab-pane>
                            <el-tab-pane label="流程跟踪" name="second">
                                <avue-crud :data="data" :option="option" ref="crud">
                                </avue-crud>
                                <div style="padding: 10px 0; width: 100%; height: 100% ">
                                    <el-image :src="url" flt="fill"></el-image>
                                </div>
                            </el-tab-pane>
                        </el-tabs>
                    </el-card>
                </div>
                <div class="dialogwarp_card">
                    <el-card class="box-card">
                        <div slot="header" class="clearfix">
                            <span>当前任务:</span>
                            <span>{{ title }}</span>
                        </div>
                        <div style="width: 100%;">
                            <p>请在下方输入您的审批意见:</p>
                            <el-input type="textarea" :rows="4" placeholder="请输入内容" show-word-limit v-model="opinionVal">
                            </el-input>
                        </div>
                        <div style="width: 100%;">
                            <p>审批意见附件:</p>
                            <el-upload drag action="https://jsonplaceholder.typicode.com/posts/" multiple
                                style="width: 100%;">
                                <i class="el-icon-upload"></i>
                                <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
                            </el-upload>
                        </div>
                        <div style="width: 100%;">
                            <p>已上传审批文件:</p>
                            <el-card class="box-card">
                                <el-table :data="tableData" stripe style="width: 100%">
                                    <el-table-column prop="date" label="文件名">
                                    </el-table-column>
                                    <el-table-column prop="name" label="上传人  ">
                                    </el-table-column>
                                    <el-table-column prop="address" label="操作">
                                    </el-table-column>
                                </el-table>
                            </el-card>
                        </div>
                        <div style="margin-top: 20px;">
                            <el-button v-if="!isRefuse" type="primary" size="mini" @click="handelAgree">同意</el-button>
                            <el-button v-if="!isAgree" type="primary" size="mini" @click="handelRefuse">不同意</el-button>
                            <el-button v-if="isAgree && !isRefuse" type="primary" size="mini" @click="handelRevert"
                                v-for="item in btnList" :key="item">{{ item }}</el-button>
                            <el-button v-if="isRefuse" type="primary" size="mini" @click="handelExecute">执行</el-button>
                        </div>
                    </el-card>
                </div>
            </div>
        </el-dialog>
        <el-button @click="handleTable">人员设置</el-button>
        <flow-business :visible.sync="outerVisible"></flow-business>
       <set-personnel :visible.sync="visibleFlow" code="8b5e2017-990f-454a-9c39-4c4eeeb57553" type="PUBLIC"></set-personnel>
    </div>
</template>
<script>
import FlowBusiness from '@/components/template/Business'
import SetPersonnel from '@/components/template/SetPersonnel'
export default {
    components: {
        FlowBusiness,
        SetPersonnel
    },
    data() {
        return {
            outerVisible: false,
            destroyClose: true,
            activeName: 'first',
            fits: ['fill', 'contain', 'cover', 'none', 'scale-down'],
            url: 'https://fuss10.elemecdn.com/e/5d/4a731a90594a4af544c0c25941171jpeg.jpeg',
            title: '业务测试-申请-物品-审核',
            data: [
                {
                    name: '张三',
                    sex: '男'
                }, {
                    name: '李四',
                    sex: '女'
                }, {
                    name: '李四',
                    sex: '女'
                }, {
                    name: '李四',
                    sex: '女'
                }
            ],
            btnList: ['返回1', '返回1', '返回1'],
            isAgree: false,
            isRefuse: false,
            opinionVal: '',
            option: {
                menu: false,
                addBtn: false,
                refreshBtn: false,
                columnBtn: false,
                index: true,
                header: false,
                stripe: true,
                indexLabelClassName: '序号',
                column: [
                    { label: '任务名称', prop: 'name', minWidth: 120 },
                    { label: '执行操作', prop: 'sex', minWidth: 80 },
                    { label: '任务开始时间', prop: 'sex', minWidth: 140 },
                    { label: '审批意见', prop: 'sex', minWidth: 220, overHidden: true },
                    { label: '执行人', prop: 'sex', minWidth: 80 },
                    { label: '任务完成时间', prop: 'sex', minWidth: 140 },
                    { label: '已上传审批文件', prop: 'sex', minWidth: 220, overHidden: true },
                ]
            },
            visibleFlow: false,
        }
    },
    methods: {
        closeDialog() {
            this.destroyClose = true
            this.outerVisible = false
        },
        handleClick(tab, event) {
        handleSave(event) {
            console.log(event)
        },
        handelAgree() {
            this.isAgree = !this.isAgree
            this.outerVisible = false
            console.log(this.isAgree)
        },
        handelRefuse() {
            if (!this.opinionVal) {
                this.$alert('当处理方式为不同意时,需要填写审批意见', '提示信息', {
                    confirmButtonText: '确定',
                }).then(() => {
                });
            } else {
                this.isRefuse = true
                this.isAgree = true
                this.outerVisible = false
                this.opinionVal = ''
            }
        },
        handelExecute() {
            this.outerVisible = false
            this.isAgree = false
            this.isRefuse = false
        },
        handelRevert() {
            this.outerVisible = false
            this.isAgree = false
        handleTable(){
            this.visibleFlow = true
        }
    }
}
</script>
<style lang="scss" scoped>
.dialogwarp {
    display: -webkit-box;
    display: -ms-flexbox;
    display: flex;
    justify-content: space-between;
    height: 70vh;
    &_tab {
        width: 79%;
        &_card {
            width: 100%;
            height: 100%;
        }
    }
    &_card {
        // margin-left: 20px;
        width: 20%;
    }
}
::v-deep(.el-upload){
    width: 100%;
    height: 120px;
}
::v-deep(.el-upload-dragger){
    width: 100%;
    height: 120px;
}
::v-deep(.el-upload-dragger .el-icon-upload) {
    margin: 15px 0 16px;
}
</style>
<style lang="scss" scoped></style>
Source/UBCS-WEB/src/views/integration/applicationForm.vue
@@ -117,9 +117,13 @@
        },
        async getDataList() {
            this.loading = true
            console.log(this.searchParam)
            const { pageSize, currentPage, total } = this.page
            let param = { size: pageSize, current: currentPage }
            console.log(this.searchParam)
            this.searchParam = Object.keys(this.searchParam)
                .filter((key) => this.searchParam[key] !== null && this.searchParam[key] !== undefined && this.searchParam[key] !== "")
                .reduce((acc, key) => ({ ...acc, [key]: this.searchParam[key] }), {});
            console.log(this.searchParam)
            const response = await getList({ ...param, ...this.searchParam })
            if (response.status === 200) {
                this.loading = false
@@ -137,8 +141,10 @@
        },
        handleReset() {
            this.searchParam = {}
            this.getDataList()
        },
        handleSearch(form, done) {
            console.log(form)
            const { id, groupCode, operationType } = form
            let dataTime = { id, groupCode, operationType }
            if (form.hasOwnProperty('createTime')) {
@@ -147,7 +153,6 @@
            if (form.hasOwnProperty('lastModifyTime')) {
                dataTime = { lastModifyTime: dateFormat(form.lastModifyTime), ...dataTime }
            }
            console.log(dataTime)
            this.searchParam = dataTime
            this.page.currentPage = 1
            this.getDataList()
Source/UBCS-WEB/src/views/integration/systemInfo.vue
@@ -5,8 +5,8 @@
            @refresh-change="handleRefresh" @size-change="handleSizePage" @current-change="handleCurrentPage"
            @selection-change="selectionChange" @row-click="handleRowClick">
            <template slot="menuLeft">
                <el-button icon="el-icon-search" size="small" type="primary" @click="handleStatus">查 è¯¢
                </el-button>
                <!-- <el-button icon="el-icon-search" size="small" type="primary" @click="handleStatus">查 è¯¢
                </el-button> -->
                <el-button icon="el-icon-delete" size="small" type="danger" @click="handleDeleteByIds">删 é™¤
                </el-button>
            </template>
@@ -68,7 +68,8 @@
                            required: true,
                            message: '系统编号不能为空',
                            trigger: 'blur'
                        }]
                        }],
                        // maxlength: 30,    //字数限制
                    }, {
                        label: '系统名称',
                        prop: 'name',
@@ -77,7 +78,8 @@
                            required: true,
                            message: '系统名称不能为空',
                            trigger: 'blur'
                        }]
                        }],
                        // maxlength: 30,    //字数限制
                    },
                    {
                        label: '系统描述',
@@ -95,6 +97,9 @@
            console.log(this.search)
            const { pageSize, currentPage } = this.page
            let param = { size: pageSize, current: currentPage }
            this.search = Object.keys(this.search)
                .filter((key) => this.search[key] !== null && this.search[key] !== undefined && this.search[key] !== "")
                .reduce((acc, key) => ({ ...acc, [key]: this.search[key] }), {});
            const response = await getSysInfoList({ ...param, ...this.search })
            if (response.status === 200) {
                console.log(response)
@@ -106,31 +111,36 @@
        },
        // æ–°å¢ž
        async handleSave(row, done, loading) {
            const response = await sysInfoAdd(row)
            if (response.status === 200) {
            try {
                const response = await sysInfoAdd(row)
                if (response.status === 200) {
                    this.$message({
                        type: 'success',
                        message: '新增数据成功!'
                    })
                    done(row)
                    // this.$refs.crud.refreshTable()
                    // this.getDataList()
                }
            } catch {
                loading()
                this.$message({
                    type: 'success',
                    message: '新增数据成功!'
                })
                done()
                this.$refs.crud.refreshTable()
                this.getDataList()
            }
        },
        // ç¼–辑
        async handleEdit(row, index, done, loading) {
            console.log(row)
            const { oid, id, name, description } = row
            const response = await sysInfoEdit({ oid, id, name, description })
            if (response.status === 200) {
            try {
                const { oid, id, name, description } = row
                const response = await sysInfoEdit({ oid, id, name, description })
                if (response.status === 200) {
                    loading()
                    this.$message({
                        type: 'success',
                        message: '修改数据成功!'
                    })
                    done(row)
                }
            } catch {
                loading()
                this.$message({
                    type: 'success',
                    message: '修改数据成功!'
                })
                done()
                this.getDataList()
            }
        },
        // åˆ é™¤å•条
Source/UBCS-WEB/src/views/modeling/Business.vue
@@ -4,7 +4,8 @@
      <el-button-group>
        <el-button type="primary" @click="businessAdd" size="small"> <i class="el-icon-plus"></i>&nbsp; æ–°å¢ž</el-button>
        <el-button type="primary" @click="businessEdit" size="small"><i class="el-icon-edit"></i>&nbsp; ä¿®æ”¹</el-button>
        <el-button type="primary" @click="selectFromTable" size="small"><i class="el-icon-thumb"></i>&nbsp; ä»Žå·²æœ‰ä¸­èŽ·å–</el-button>
        <el-button type="primary" @click="selectFromTable" size="small"><i class="el-icon-thumb"></i>&nbsp;
          ä»Žå·²æœ‰ä¸­èŽ·å–</el-button>
      </el-button-group>
    </el-header>
    <el-container>
@@ -27,14 +28,16 @@
          <basic-container>
            <p style="margin-top: 10px;font-weight: 570;font-size: 19px">基本信息</p>
            <el-descriptions class="margin-top" :column="3" :size="size" border>
              <el-descriptions-item :labelStyle="descriptionOption.labelStyle" :contentStyle="descriptionOption.contentStyle">
              <el-descriptions-item :labelStyle="descriptionOption.labelStyle"
                :contentStyle="descriptionOption.contentStyle">
                <template slot="label">
                  <i :class="icons.key"></i>
                  è‹±æ–‡åç§°
                </template>
                {{ obj.id }}
              </el-descriptions-item>
              <el-descriptions-item :labelStyle="descriptionOption.labelStyle" :contentStyle="descriptionOption.contentStyle">
              <el-descriptions-item :labelStyle="descriptionOption.labelStyle"
                :contentStyle="descriptionOption.contentStyle">
                <template slot="label">
                  <i :class="icons.name"></i>
                  ä¸­æ–‡åç§°
@@ -42,20 +45,22 @@
                {{ obj.name }}
              </el-descriptions-item>
              <el-descriptions-item>
                <template slot="label" :labelStyle="descriptionOption.labelStyle" :contentStyle="descriptionOption.contentStyle">
                <template slot="label" :labelStyle="descriptionOption.labelStyle"
                  :contentStyle="descriptionOption.contentStyle">
                  <i :class="icons.tableName"></i>
                  æ•°æ®åº“表名
                </template>
                {{ obj.tableName }}
              </el-descriptions-item>
              <el-descriptions-item :labelStyle="descriptionOption.labelStyle" :contentStyle="descriptionOption.contentStyle">
              <el-descriptions-item :labelStyle="descriptionOption.labelStyle"
                :contentStyle="descriptionOption.contentStyle">
                <template slot="label">
                  <i :class="icons.domain"></i>
                  æ‰€å±žé¢†åŸŸ
                </template>
                  <el-tag size="small">
                    {{ obj.domainText }}
                  </el-tag>
                <el-tag size="small">
                  {{ obj.domainText }}
                </el-tag>
              </el-descriptions-item>
              <!-- <el-descriptions-item>
            <template slot="label">
@@ -71,28 +76,31 @@
            </template>
            {{ obj.sss }}
          </el-descriptions-item> -->
              <el-descriptions-item :labelStyle="descriptionOption.labelStyle" :contentStyle="descriptionOption.contentStyle">
              <el-descriptions-item :labelStyle="descriptionOption.labelStyle"
                :contentStyle="descriptionOption.contentStyle">
                <template slot="label">
                  <i :class="icons.revisionRule"></i>
                  ç‰ˆæœ¬è§„则
                </template>
                {{ obj.versionRule }}
              </el-descriptions-item>
              <el-descriptions-item :labelStyle="descriptionOption.labelStyle" :contentStyle="descriptionOption.contentStyle">
              <el-descriptions-item :labelStyle="descriptionOption.labelStyle"
                :contentStyle="descriptionOption.contentStyle">
                <template slot="label">
                  <i :class="icons.lifeCycle"></i>
                  ç”Ÿå‘½å‘¨æœŸ
                </template>
                {{ obj.lifeCycleId }}
              </el-descriptions-item>
              <el-descriptions-item :labelStyle="descriptionOption.labelStyle" :contentStyle="descriptionOption.contentStyle">
              <el-descriptions-item :labelStyle="descriptionOption.labelStyle"
                :contentStyle="descriptionOption.contentStyle">
                <template slot="label">
                  <i :class="icons.view"></i>
                  è§†å›¾
                </template>
               <el-tag size="small">
                <el-tag size="small">
                  {{ obj.viewText }}
               </el-tag>
                </el-tag>
              </el-descriptions-item>
              <!-- <el-descriptions-item>
            <template slot="label">
@@ -101,7 +109,8 @@
            </template>
            {{ obj.implClass }}
          </el-descriptions-item> -->
              <el-descriptions-item :labelStyle="descriptionOption.labelStyle" :contentStyle="descriptionOption.contentStyle">
              <el-descriptions-item :labelStyle="descriptionOption.labelStyle"
                :contentStyle="descriptionOption.contentStyle">
                <template slot="label">
                  <i :class="icons.desc"></i>
                  æè¿°
@@ -114,9 +123,9 @@
          <basic-container>
            <p style="margin-top: 10px;font-weight: 570;font-size: 19px">属性列表</p>
            <avue-crud class="attributeCrud" v-model="obj" :data="obj.attributes" :option="loadOption">
              <template slot="attrDataTypeText" slot-scope="{row}" >
                    <el-tag>{{row.attrDataTypeText}}</el-tag>
                </template>
              <template slot="attrDataTypeText" slot-scope="{row}">
                <el-tag>{{ row.attrDataTypeText }}</el-tag>
              </template>
            </avue-crud>
          </basic-container>
        </el-main>
@@ -129,7 +138,8 @@
          <div class="sep" style="height:7px">
          </div>
          <avue-crud class="businessCrud" v-model="ref.form" :option="ref.option" :data="ref.data" @selection-change="selectionChange">
          <avue-crud class="businessCrud" v-model="ref.form" :option="ref.option" :data="ref.data"
            @selection-change="selectionChange">
          </avue-crud>
          <span slot="footer" class="dialog-footer">
            <el-button @click="dialoghandelfalse">取 æ¶ˆ</el-button>
@@ -138,8 +148,9 @@
        </el-dialog>
      </el-container>
    </el-container>
    <business-add ref="btmAdd" :btmType="addOption.btmType" :domainOption="domainOptions" :icons="icons" @refreshTable="initTreeOnLoad">
  </business-add>
    <business-add ref="btmAdd" :btmType="addOption.btmType" :domainOption="domainOptions" :icons="icons"
      @refreshTable="initTreeOnLoad">
    </business-add>
  </el-container>
</template>
<script>
@@ -172,8 +183,8 @@
          children: 'childList',
        }
      },
      addOption:{
        btmType:{},
      addOption: {
        btmType: {},
      },
      loadOption: {
        border: true,
@@ -182,8 +193,8 @@
        addBtn: false,
        menu: false,
        highlightCurrentRow: true,
        refreshBtn:false,
        columnBtn:false,
        refreshBtn: false,
        columnBtn: false,
        column: [
          {
            label: '英文名称',
@@ -213,12 +224,12 @@
        ]
      },
      descriptionOption: {
        labelStyle:'text-align:center;width:120px',
        labelStyle: 'text-align:center;width:120px',
        contentStyle: 'width:240px;text-align:center;word-break;break-all;'
      },
      domain: null,
      domainOptions: [],
      icons:{
      icons: {
        key: 'el-icon-finished',
        name: 'el-icon-tickets',
        tableName: 'el-icon-date',
@@ -268,9 +279,13 @@
  },
  methods: {
    nodeClick(data) {
      getDetail(data.oid).then(res => {
        this.obj = res.data.data;
      })
      if (data.oid) {
        getDetail(data.oid).then(res => {
          this.obj = res.data.data;
        })
      }else{
        this.$message.warning('请点击子节点');
      }
    },
    //  åŸºæœ¬ä¿¡æ¯æ·»åŠ 
    basicSave(row, done, loading) {
@@ -330,17 +345,17 @@
        this.initTreeOnLoad();
      })
    },
    businessAdd(){
    businessAdd() {
      this.$refs.btmAdd.showSubmitDialog = true;
      this.ifRefreshBtmAddRefresh();
    },
    businessEdit(){
    businessEdit() {
      var json = JSON.stringify(this.obj);
      this.$refs.btmAdd.btmType = JSON.parse(json);
      this.$refs.btmAdd.showSubmitDialog = true;
      this.ifRefreshBtmAddRefresh();
    },
    ifRefreshBtmAddRefresh(){
    ifRefreshBtmAddRefresh() {
      // this.$refs.btmAdd.refreshAttrTable();
    }
  },
@@ -353,13 +368,14 @@
  border-radius: 10px;
}
.businessCrud > .el-card:nth-of-type(2) > .el-card__body > .avue-crud__menu{
        display: none !important;
.businessCrud>.el-card:nth-of-type(2)>.el-card__body>.avue-crud__menu {
  display: none !important;
}
.attributeCrud > .el-card:nth-of-type(2) > .el-card__body > .avue-crud__menu{
        display: none !important;
.attributeCrud>.el-card:nth-of-type(2)>.el-card__body>.avue-crud__menu {
  display: none !important;
}
.businessTreeContainer > .el-card > .el-card__body {
.businessTreeContainer>.el-card>.el-card__body {
  height: 775px;
}
</style>
}</style>
Source/UBCS-WEB/src/views/modeling/LinkType.vue
@@ -255,7 +255,6 @@
            this.addOption.linkType = JSON.parse(json);
            this.$refs.linkAdd.linkType = this.addOption.linkType;
            this.$refs.linkAdd.showSubmitDialog = true;
            console.log(this.obj);
        },
        // ä»Žå·²æœ‰ä¸­èŽ·å–æŒ‰é’®ç‚¹å‡»äº‹ä»¶
        selectFromTable() {
Source/UBCS-WEB/src/views/modeling/Version.vue
@@ -63,20 +63,38 @@
        searchMenuSpan:5,
        highlightCurrentRow: true,
        stripe:true,
        viewBtn:false,
        columnBtn:false,
        column:[
          {
            label: '',
            label: '选择',
            prop: 'radio',
            width: 120
            width: 120,
            display:false
          },
          {
            label:'英文名称',
            prop: 'id'
            prop: 'id',
            rules: [
              {
                required: true,
                message: '英文名称不能为空',
                trigger: 'blur'
              }
            ]
          },
          {
            label:"中文名称",
            prop:"name",
            search:true,
            required: true,
            rules: [
              {
                required: true,
                message: '中文名称不能为空',
                trigger: 'blur'
              }
            ]
          },
          {
            label:"跳跃字符",
@@ -84,11 +102,25 @@
          },
          {
            label: "初始值",
            prop:"startCode"
            prop:"startCode",
            rules: [
              {
                required: true,
                message: '初始值不能为空',
                trigger: 'blur'
              }
            ]
          },
          {
            label: "步长",
            prop: "serialStep"
            prop: "serialStep",
            rules: [
              {
                required: true,
                message: '步长不能为空',
                trigger: 'blur'
              }
            ]
          },
          {
            label: "前缀",
@@ -171,11 +203,16 @@
      })
    },
    searchChange(params, done) {
      if (done) done();
      this.params = params;
      this.page.currentPage = 1;
      this.getList();
      this.$message.success('搜索成功')
      var p = {"name_like" : params.name}
      getPage(this.page.currentPage,this.page.pageSize,p).then(res => {
        const data = res.data.data
        this.loading = false;
        this.page.total = data.total;
        this.data = data.records;
      });
      if (done) {
       done();
      }
    },
    refreshChange() {
      this.getList();
Source/UBCS-WEB/src/views/modeling/original.vue
@@ -8,15 +8,18 @@
            <el-radio v-model="selectRow" :label="row.$index">&nbsp;
            </el-radio>
          </template>
          <template slot="menu">
            <el-button icon="el-icon-edit" size="small" type="text" @click="updateSave">编辑</el-button>
            <el-button icon="el-icon-delete" size="small" type="text" @click="deleteSave">删除</el-button>
          <template slot="menu" slot-scope="{row,index}">
            <el-button icon="el-icon-edit" size="small" type="text" @click="updateSave(row,index)">编辑</el-button>
            <el-button icon="el-icon-delete" size="small" type="text" @click="deleteSave(row,index)">删除</el-button>
          </template>
          <template slot="menuLeft">
            <el-button size="small" type="primary" icon="el-icon-plus" @click="addSave">新&nbsp;&nbsp;增
            </el-button>
            <el-button size="small" plain type="primary" icon="el-icon-zoom-in" @click="applyRangeOpen">查看使用范围
            </el-button>
            <el-input placeholder="按属性英文名称查询" v-model="searchId" clearable prefix-icon="el-icon-search" class="attrSearch"
              size="small" @change="doSearch" type="text"></el-input>
            <el-button size="small" plain type="primary" icon="el-icon-search" @click="doSearch">&nbsp;搜索</el-button>
          </template>
          <template slot="typeValue" slot-scope="{row}">
            <el-tag>{{ row.typeValue }}</el-tag>
@@ -126,7 +129,7 @@
        </el-tabs>
      </basic-container>
    </el-aside>
    <originalAdd ref="originalAdd" :attribute="attribute" @refreshTable="refreshChange"></originalAdd>
    <originalAdd ref="originalAdd" @refreshTable="refreshChange"></originalAdd>
  </el-container>
</template>
@@ -154,6 +157,7 @@
      attribute: {
        nullable: true
      },
      editAttibute: {},
      applyRangeData: [],
      option: {
        height: "550px",
@@ -169,6 +173,7 @@
        addBtn: false,
        editBtn: false,
        delBtn: false,
        columnBtn:false,
        column: [{
          label: "选择",
          prop: "radio",
@@ -246,7 +251,8 @@
        itemData: {},
        activeName: "referTab",
        form: {}
      }
      },
      searchId: '',
    };
  },
  created() {
@@ -259,14 +265,21 @@
      this.$refs.originalAdd.showSubmitDialog = true;
      this.$refs.originalAdd.attribute = {};
    },
    updateSave() {
    updateSave(row,index) {
      this.selectRow = index;
      var json = JSON.stringify(row);
      this.editAttibute = JSON.parse(json);
      this.editAttibute.nullable = row.nullable == 'true' ? true : false;
      this.$refs.originalAdd.attribute = this.editAttibute;
      this.$refs.originalAdd.showSubmitDialog = true;
      this.$refs.originalAdd.attribute = this.attribute;
      this.refreshChange()
    },
    deleteSave() {
      remove(this.itemForm.itemData).then(res => {
    deleteSave(row,index) {
      console.log(row);
      remove(row.oid).then(res => {
        this.$message.success("删除成功");
      });
      this.refreshChange();
    },
    onLoad(page, params = {}) {
      this.loading = true;
@@ -303,6 +316,10 @@
      });
    },
    doSearch(){
      var params = {"id_like":this.searchId};
      this.onLoad(this.page,params);
    }
  },
  components: { Versionpackage }
}
@@ -312,4 +329,10 @@
.applyRangeTable>.el-card:nth-of-type(2)>.el-card__body>.avue-crud__menu {
  display: none !important;
}
.attrSearch {
  width:201px;
}
.attrSearch > .el-input__inner {
  width: 200px;
}
</style>
Source/UBCS-WEB/src/views/modeling/originalAdd.vue
@@ -27,10 +27,12 @@
                    <el-switch v-model="attribute.nullable" active-text="允许" inactive-text="不允许"></el-switch>
                </el-form-item>
                <el-form-item label="长度" label-width="100px" prop="maxLength">
                    <el-input-number v-model="attribute.maxLength" :min="1" :max="4000" :step="1" controls-position="right"></el-input-number>
                    <el-input-number v-model="attribute.maxLength" :min="1" :max="4000" :step="1"
                        controls-position="right"></el-input-number>
                </el-form-item>
                <el-form-item label="精度" label-width="100px" v-if="attribute.typeValue == 'VTDouble'">
                    <el-input-number v-model="attribute.precision" :min="1" :max="20" :step="1" controls-position="right" @change="changeNumber"></el-input-number>
                <el-form-item label="精度" label-width="100px" v-if="attribute.typeKey == 'VTDouble'">
                    <el-input-number v-model="attribute.precision" :min="1" :max="20" :step="1" controls-position="right"
                        @change="changeNumber"></el-input-number>
                </el-form-item>
                <el-form-item label="描述" label-width="100px">
                    <el-input v-model="attribute.description" type="text"></el-input>
@@ -59,7 +61,7 @@
                            </el-input>
                        </el-form-item>
                        <el-form-item label="枚举项" label-width="100px">
                        </el-form-item>
                    </el-tab-pane>
                </el-tabs>
@@ -74,7 +76,7 @@
                <el-container>
                    <el-aside>
                        <basic-container>
                           <span class="el-dialog__title"> {{ domain.treeOption.title }} </span>
                            <span class="el-dialog__title"> {{ domain.treeOption.title }} </span>
                            <div style="height:20px;"></div>
                            <avue-tree id="domain" :data="domain.data" :option="domain.treeOption" @node-click="nodeClick"
                                class="businessTree" style="height: 418px">
@@ -89,7 +91,8 @@
                    </el-aside>
                    <el-main>
                        <basic-container>
                            <avue-crud ref="btmTable" :option="btmRefer.option" :data="btmRefer.data" class="btmTable" @row-click="btmReferClick">
                            <avue-crud ref="btmTable" :option="btmRefer.option" :data="btmRefer.data" class="btmTable"
                                @row-click="btmReferClick">
                                <template slot="radio" slot-scope="{row}">
                                    <el-radio v-model="btmRefer.selectRow" :label="row.$index">&nbsp;
                                    </el-radio>
@@ -105,9 +108,10 @@
                </div>
            </el-dialog>
            <!-- é€‰æ‹©æžšä¸¾æ—¶çš„弹窗 -->
            <el-dialog title="枚举列表" :visible.sync="enumRefer.show" append-to-body @close="closeEnumDialog" width="70%"
            <el-dialog title="枚举列表" :visible.sync="enumRefer.show" append-to-body @close="closeEnumDialog" width="70%"
                style="height: 115vh;">
                <avue-crud ref="eunmTable" :option="enumRefer.option" :data="enumRefer.data" class="enumTable" @row-click="enumReferClick" :page.sync="enumRefer.enumPage">
                <avue-crud ref="eunmTable" :option="enumRefer.option" :data="enumRefer.data" class="enumTable"
                    @row-click="enumReferClick" :page.sync="enumRefer.enumPage">
                    <template slot="radio" slot-scope="{row}">
                        <el-radio v-model="enumRefer.selectRow" :label="row.$index">&nbsp;
                        </el-radio>
@@ -124,9 +128,9 @@
</template>
<script>
import { getDictionary,getParentList } from '@/api/omd/enum'
import { initTree,btmPage } from '@/api/omd/btmType'
import { add} from '@/api/omd/OmdAttribute'
import { getDictionary, getParentList } from '@/api/omd/enum'
import { initTree, btmPage } from '@/api/omd/btmType'
import { add } from '@/api/omd/OmdAttribute'
export default {
    name: 'originalAdd',
    props: {
@@ -181,24 +185,24 @@
                    highlightCurrentRow: true,
                    column: [
                        {
                        label: '',
                        prop: 'radio',
                        width: 60,
                        hide: false
                    },
                    {
                        label: '英文名称',
                        prop: 'id',
                        align: 'center',
                        searchSpan:8,
                        search: true,
                    }, {
                        label: '中文名称',
                        prop: 'name',
                        align: 'center',
                        searchSpan:8,
                        search: true,
                    }]
                            label: '',
                            prop: 'radio',
                            width: 60,
                            hide: false
                        },
                        {
                            label: '英文名称',
                            prop: 'id',
                            align: 'center',
                            searchSpan: 8,
                            search: true,
                        }, {
                            label: '中文名称',
                            prop: 'name',
                            align: 'center',
                            searchSpan: 8,
                            search: true,
                        }]
                },
                // å‚照页面表格数据
                data: [],
@@ -231,17 +235,17 @@
                        prop: 'radio',
                        width: 60,
                        hide: false
                    },{
                    }, {
                        label: '枚举代号',
                        prop: 'name',
                        align: 'center',
                        searchSpan:8,
                        searchSpan: 8,
                        search: true,
                    }, {
                        label: '枚举名称',
                        prop: 'label',
                        align: 'center',
                        searchSpan:8,
                        searchSpan: 8,
                        search: true,
                    }]
                },
@@ -283,30 +287,36 @@
            this.referToFlag = true;
            this.$refs.form.resetFields();
        },
        submitAttribute() {
            add(this.attribute).then(res => {
                this.$message.success("保存成功");
                this.showSubmitDialog = false;
                this.attribute = {};
                this.$emit('refreshTable');
            });
        submitAttribute() {
            const that = this;
            this.$refs.form.validate(function (pass, field) {
                if (pass) {
                    add(that.attribute).then(res => {
                        that.$message.success("保存成功");
                        that.showSubmitDialog = false;
                        that.attribute = {};
                        that.$emit('refreshTable');
                    });
                } else {
                    that.$message.error('必填');
                }
            })
        },
        cancleSubmit() {
            this.closeSubmitDialog();
        },
        closeEnumDialog() {
            this.cancleEnum();
         },
        closeReferDialog() {
        },
        closeReferDialog() {
            this.cancleBtm();
        },
        confirmBtm() {
        confirmBtm() {
            this.attribute.referToId = this.btmRefer.selectItem.oid;
            this.attribute.referToName = this.btmRefer.selectItem.name;
            this.btmRefer.show = false;
        },
        cancleBtm() {
        cancleBtm() {
            this.btmRefer.selectItem = {};
            this.btmRefer.show = false;
            this.btmRefer.selectRow = '';
@@ -316,8 +326,8 @@
            this.attribute.dictCode = this.enumRefer.selectItem.name;
            this.attribute.dictValue = this.enumRefer.selectItem.label;
            this.enumRefer.show = false;
         },
        cancleEnum() {
        },
        cancleEnum() {
            this.enumRefer.selectItem = {};
            this.enumRefer.show = false;
            this.enumRefer.selectRow = '';
@@ -340,19 +350,19 @@
        // å‚照类型树的点击事件
        nodeClick(data) {
            // åŒºåˆ†ä¸šåŠ¡ç±»åž‹çš„æŸ¥è¯¢å’Œé“¾æŽ¥ç±»åž‹çš„æŸ¥è¯¢
            if(this.attribute.referTypeKey == 'btmType'){
                btmPage(this.btmRefer.btmPage.currentPage,this.btmRefer.btmPage.pageSize,{domain:data.id}).then(res => {
            if (this.attribute.referTypeKey == 'btmType') {
                btmPage(this.btmRefer.btmPage.currentPage, this.btmRefer.btmPage.pageSize, { domain: data.id }).then(res => {
                    this.btmRefer.data = res.data.data.records;
                    this.btmRefer.btmPage.total = res.data.data.total;
                })
            }
            if(this.attribute.referTypeKey == 'linkType'){
            if (this.attribute.referTypeKey == 'linkType') {
            }
        },
        // æžšä¸¾ç±»åž‹è¾“入框获得焦点时的事件
        openEnumConfig() {
            getParentList(this.enumRefer.enumPage.currentPage,this.enumRefer.enumPage.pageSize).then(res => {
            getParentList(this.enumRefer.enumPage.currentPage, this.enumRefer.enumPage.pageSize).then(res => {
                this.enumRefer.enumPage.total = res.data.data.total;
                this.enumRefer.data = res.data.data.records;
            })
@@ -361,20 +371,20 @@
        // å±žæ€§ç±»åž‹ä¸‹æ‹‰æ¡†é€‰æ‹©äº‹ä»¶
        typeSelectChange(value) {
            if (value == 'VTString') {
                this.$set(this.attribute,"maxLength",150)
                this.$set(this.attribute, "maxLength", 150)
            } else if (value == 'VTInteger') {
                this.$set(this.attribute,"maxLength",50)
                this.$set(this.attribute, "maxLength", 50)
            } else if (value == 'VTBoolean') {
                this.$set(this.attribute,"maxLength",5)
                this.$set(this.attribute, "maxLength", 5)
            } else if (value == 'VTDouble') {
                this.$set(this.attribute,"maxLength",26)
                this.$set(this.attribute,"precision",8)
                this.$set(this.attribute, "maxLength", 26)
                this.$set(this.attribute, "precision", 8)
            } else if (value == 'VTLong') {
                this.$set(this.attribute,"maxLength",150)
                this.$set(this.attribute, "maxLength", 150)
            } else if (value == 'VTDate' || value == 'VTTime' || value == 'VTDateTime') {
                this.$set(this.attribute,"maxLength",6)
                this.$set(this.attribute, "maxLength", 6)
            } else {
                this.$set(this.attribute,"maxLength",50)
                this.$set(this.attribute, "maxLength", 50)
            }
            this.attribute.typeCode = 'attributeType';
            this.attribute.typeKey = value;
@@ -395,7 +405,7 @@
                this.$message.error('属性类型没找到或者未定义')
            })
        },
        initAttributeReferTypeList(){
        initAttributeReferTypeList() {
            getDictionary({ code: 'attributeReferType' }).then(res => {
                res.data.data.forEach(element => {
                    this.btmRefer.referTypeList.push(
@@ -406,33 +416,33 @@
                this.$message.error('参照类型没找到或者未定义')
            })
        },
        btmReferClick(row){
        btmReferClick(row) {
            this.btmRefer.selectItem = row;
            this.btmRefer.selectRow = row.$index;
        },
        enumReferClick(row){
        enumReferClick(row) {
            this.enumRefer.selectItem = row;
            this.enumRefer.selectRow = row.$index;
        },
        // å‚照名称点击清除数据
        clearReferTo(){
            this.$delete(this.attribute,'referToId');
            this.$delete(this.attribute,'referToName');
        clearReferTo() {
            this.$delete(this.attribute, 'referToId');
            this.$delete(this.attribute, 'referToName');
            this.btmRefer.selectItem = {};
            this.btmRefer.selectRow = '';
        },
        handleClick(tab){
            // å› ä¸ºåªèƒ½å‚照和枚举二选一。所以在切换的时候把属性给清空。
            this.$delete(this.attribute,'referTypeCode');
            this.$delete(this.attribute,'referTypeKey');
            this.$delete(this.attribute,'referTypeValue');
            this.$delete(this.attribute,'referToId');
            this.$delete(this.attribute,'referToName');
            this.$delete(this.attribute,'dictCode');
            this.$delete(this.attribute,'dictKey');
            this.$delete(this.attribute,'dictValue');
            this.$delete(this.attribute,'usingDict');
        }
        // handleClick(tab){
        //     // å› ä¸ºåªèƒ½å‚照和枚举二选一。所以在切换的时候把属性给清空。
        //     this.$delete(this.attribute,'referTypeCode');
        //     this.$delete(this.attribute,'referTypeKey');
        //     this.$delete(this.attribute,'referTypeValue');
        //     this.$delete(this.attribute,'referToId');
        //     this.$delete(this.attribute,'referToName');
        //     this.$delete(this.attribute,'dictCode');
        //     this.$delete(this.attribute,'dictKey');
        //     this.$delete(this.attribute,'dictValue');
        //     this.$delete(this.attribute,'usingDict');
        // }
    }
}
</script>
@@ -450,7 +460,6 @@
    width: 200px;
}
.attributeForm>.el-form-item>.el-form-item__content> .el-select>.el-input>.el-input__inner {
.attributeForm>.el-form-item>.el-form-item__content>.el-select>.el-input>.el-input__inner {
    width: 200px;
}
</style>
}</style>
Source/UBCS-WEB/src/views/modeling/status.vue
@@ -11,36 +11,41 @@
                 @row-del="rowDel"
                 @refresh-change="refreshChange"
                 @search-reset="searchChange"
                 @search-change="searchChange">
                 @search-change="searchChange"
                 @row-click="rowClick">
        <template slot="menuLeft">
          <el-tooltip class="item" effect="dark" content="查找状态池使用范围" placement="top">
          <el-tooltip class="item" effect="dark" content="查找状态使用范围" placement="top">
            <el-button size="small"
                       plain
                       type="primary"
                       icon="el-icon-zoom-in"
                       @click="handleSearch">查看使用范围
                       @click="applyRangeSearch">查看使用范围
            </el-button>
          </el-tooltip>
        </template>>
        </template>
        <template slot="radio"
                  slot-scope="{row}">
          <el-radio v-model="selectRow"
                    :label="row.$index">&nbsp;
          </el-radio>
        </template>
      </avue-crud>
      <el-dialog title="查看使用范围"
                 append-to-body
                 :visible.sync="packageSearchBox"
                 width="1200px">
        <versionpackage></versionpackage>
      </el-dialog>
      <versionpackage :rangeData="applyRangeData" ref="applyRange"></versionpackage>
    </basic-container>
  </template>
  <script>
  import { getPage,add,update,remove } from '../../api/omd/status';
  import { getPage,add,update,remove,getApplyRange } from '../../api/omd/status';
  export default {
    name: "status",
    data(){
      return {
        //查看使用范围
        packageSearchBox:false,
        // ç‚¹å‡»æ•°æ®
        selectRow: '',
        selectRowData: {},
        //分页数据
        page: {
          pageSize: 10,
@@ -56,16 +61,34 @@
          border: true,
          index: true,
          searchMenuSpan:5,
          highlightCurrentRow: true,
          stripe:true,
          column:[
            {
              label: '选择',
              prop: 'radio',
              width: 120,
              display: false
            },
            {
              label:'英文名称',
              prop: 'id',
              search: true
              search: true,
              rules: [{
                required: true,
                message: '英文名称不能为空',
                trigger: 'blur'
              }]
            },
            {
              label:'中文名称',
              prop:'name',
              search:true,
              rules: [{
                required: true,
                message: '中文名称不能为空',
                trigger: 'blur'
              }]
            },
            {
              label: '描述',
@@ -73,12 +96,28 @@
              type:'textarea'
            }
          ]
        }
        },
        applyRangeData: []
      }
    },
    methods:{
      handleSearch(){
        // this.packageSearchBox=true
      rowClick(row){
        this.selectRow = row.$index;
        this.selectRowData = row;
      },
      applyRangeSearch(){
        if (!this.selectRow && this.selectRow != 0){
          console.log(this.selectRow);
          this.$message({
            type:"warning",
            message: "请先选择属性"
          })
        }
        getApplyRange(this.selectRowData.id).then(res => {
          this.applyRangeData = res.data.data;
          this.$refs.applyRange.rangeData = this.applyRangeData;
          this.$refs.applyRange.showDialog = true;
        })
      },
      getList() {
        this.loading = true;
@@ -121,10 +160,22 @@
        })
      },
      searchChange(params, done) {
        if (done) done();
        this.params = params;
        this.loading = true;
        this.page.currentPage = 1;
        this.getList();
        const p = {};
        if(params.id){
          p["id_like"] = params.id;
        }
        if(params.name){
          p["name_like"] = params.name
        }
        getPage(this.page.currentPage,this.page.pageSize,p).then(res => {
          const data = res.data.data
          this.loading = false;
          this.page.total = data.total;
          this.data = data.records;
          done();
        })
        this.$message.success('搜索成功')
      },
      refreshChange() {
@@ -134,8 +185,7 @@
    }
  }
  </script>
  <style scoped>
  </style>
Source/UBCS-WEB/src/views/system/tenant.vue
@@ -69,7 +69,7 @@
        <el-tag>{{ row.expireTime ? row.expireTime : '不限制' }}</el-tag>
      </template>
    </avue-crud>
    <el-dialog title="租户数据源配置"
               append-to-body
               :visible.sync="datasourceBox"
Source/UBCS-WEB/src/views/system/user.vue
@@ -104,18 +104,17 @@
        </avue-crud>
        </div>
        <el-dialog :visible.sync="roleBox"
                   append-to-body
                   title="用户角色配置"
                   width="345px">
            append-to-body
            title="用户角色配置"
            width="345px">
          <el-tree ref="treeRole"
                   :data="roleGrantList"
                   :default-checked-keys="roleTreeObj"
                   :props="props"
                   check-strictly
                   default-expand-all
                   node-key="id"
                   show-checkbox>
              :data="roleGrantList"
              :default-checked-keys="roleTreeObj"
              :props="props"
              check-strictly
              default-expand-all
              node-key="id"
              show-checkbox>
          </el-tree>
          <span slot="footer" class="dialog-footer">
@@ -780,8 +779,7 @@
       //要传递的id,一个是数组另一个是字符串
       this.UserPwdstrategyVO.userIds=this.selid;
       this.UserPwdstrategyVO.pwdstrategyId=this.id
      console.log("1",this.UserPwdstrategyVO)
      console.log("2",this.UserPwdstrategyVO.userIds)
      //请求
      insert(this.UserPwdstrategyVO.userIds).then(()=>{
        this.passVisible=false
Source/UBCS-WEB/vue.config.js
@@ -27,12 +27,11 @@
      '/api': {
        //本地服务接口地址
        //  target: 'http://localhost:37000',
        //  target: 'http://localhost:37000',
        // target: 'http://192.168.1.51:37000',
        // target: 'http://192.168.1.46:37000',
        // target: 'http://dev.vci-tech.com:37000',
        // target: 'http://192.168.1.51:37000/',
        //   target: 'http://localhost:37000',
          target: 'http://192.168.1.104:37000',
        // target: 'http://192.168.1.63:37000',
        //target: 'http://192.168.3.7:37000',
        target: 'http://dev.vci-tech.com:37000',
Source/UBCS/ubcs-auth/src/main/java/com/vci/ubcs/auth/service/BladeUserDetails.java
@@ -79,13 +79,19 @@
     * ç”¨æˆ·è¯¦æƒ…
     */
    private final Kv detail;
    /**
     * ç”¨æˆ·å¯†çº§
     */
    private String secretGrade;
    /**
     * å¯†ç ç­–略修改状态
     */
    private Long strategyUpdateStatus;
    public BladeUserDetails(Long userId, String tenantId, String oauthId, String name, String realName, String deptId, String postId, String roleId, String roleName, String avatar, String username, String password, Kv detail, boolean enabled, boolean accountNonExpired, boolean credentialsNonExpired, boolean accountNonLocked, Collection<? extends GrantedAuthority> authorities,Long strategyUpdateStatus) {
    public BladeUserDetails(Long userId, String tenantId, String oauthId, String name, String realName, String deptId, String postId, String roleId, String roleName, String avatar, String username, String password, Kv detail,String secretGrade, boolean enabled, boolean accountNonExpired, boolean credentialsNonExpired, boolean accountNonLocked, Collection<? extends GrantedAuthority> authorities,Long strategyUpdateStatus) {
        super(username, password, enabled, accountNonExpired, credentialsNonExpired, accountNonLocked, authorities);
        this.userId = userId;
        this.tenantId = tenantId;
@@ -99,6 +105,7 @@
        this.roleName = roleName;
        this.avatar = avatar;
        this.detail = detail;
        this.secretGrade = secretGrade;
        this.strategyUpdateStatus = strategyUpdateStatus;
    }
Source/UBCS/ubcs-auth/src/main/java/com/vci/ubcs/auth/service/BladeUserDetailsServiceImpl.java
@@ -220,7 +220,7 @@
                //填充用户信息到用户信息扩展类
                BladeUserDetails bladeUserDetails = new BladeUserDetails(user.getId(),
                    user.getTenantId(), StringPool.EMPTY, user.getName(), user.getRealName(), user.getDeptId(), user.getPostId(), user.getRoleId(), Func.join(userInfo.getRoles()), Func.toStr(user.getAvatar(), TokenUtil.DEFAULT_AVATAR),
                    username, AuthConstant.ENCRYPT + user.getPassword(), userInfo.getDetail(), true, true, true, true,
                    username, AuthConstant.ENCRYPT + user.getPassword(), userInfo.getDetail(),user.getSecretGrade(), true, true, true, true,
                    AuthorityUtils.commaSeparatedStringToAuthorityList(Func.join(result.getData().getRoles())),user.getStrategyUpdateStatus());
                return bladeUserDetails;
            } else {
Source/UBCS/ubcs-auth/src/main/java/com/vci/ubcs/auth/support/BladeJwtTokenEnhancer.java
@@ -21,6 +21,7 @@
import lombok.AllArgsConstructor;
import org.springblade.core.jwt.JwtUtil;
import org.springblade.core.jwt.props.JwtProperties;
import org.springblade.core.secure.utils.AuthUtil;
import org.springblade.core.tool.utils.Func;
import org.springframework.security.oauth2.common.DefaultOAuth2AccessToken;
import org.springframework.security.oauth2.common.OAuth2AccessToken;
@@ -46,7 +47,6 @@
    @Override
    public OAuth2AccessToken enhance(OAuth2AccessToken accessToken, OAuth2Authentication authentication) {
        BladeUserDetails principal = (BladeUserDetails) authentication.getUserAuthentication().getPrincipal();
        //token参数增强
        Map<String, Object> info = new HashMap<>(16);
        info.put(TokenUtil.CLIENT_ID, TokenUtil.getClientIdFromHeader());
Source/UBCS/ubcs-common/src/main/java/com/vci/ubcs/common/constant/LauncherConstant.java
@@ -41,7 +41,7 @@
     * nacos dev åœ°å€
     */
    //String NACOS_DEV_ADDR = "dev.vci-tech.com:38848";
    String NACOS_DEV_ADDR = "127.0.0.1:8848";
    String NACOS_DEV_ADDR = "localhost:8848";
    /**
     * nacos prod åœ°å€
Source/UBCS/ubcs-ops-api/ubcs-flow-api/pom.xml
@@ -14,6 +14,19 @@
    <version>${bladex.project.version}</version>
    <packaging>jar</packaging>
    <dependencies>
        <dependency>
            <groupId>com.vci.ubcs</groupId>
            <artifactId>ubcs-util-api</artifactId>
            <version>3.0.1.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>com.vci.ubcs</groupId>
            <artifactId>ubcs-user-api</artifactId>
            <version>3.0.1.RELEASE</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>
</project>
Source/UBCS/ubcs-ops-api/ubcs-resource-api/pom.xml
@@ -23,6 +23,12 @@
            <groupId>org.springblade</groupId>
            <artifactId>blade-starter-tenant</artifactId>
        </dependency>
        <dependency>
            <groupId>com.vci.ubcs</groupId>
            <artifactId>ubcs-util-api</artifactId>
            <version>3.0.1.RELEASE</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>
</project>
Source/UBCS/ubcs-ops-api/ubcs-resource-api/src/main/java/com/vci/ubcs/resource/bo/FileObjectBO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,29 @@
package com.vci.ubcs.resource.bo;
import com.vci.ubcs.resource.vo.FileObjectVO;
import lombok.Data;
import java.io.InputStream;
/**
 * æ–‡ä»¶çš„业务对象
 * @author weidy
 * @date 2023/6/9
 */
@Data
public class FileObjectBO extends FileObjectVO {
    /**
     * åºåˆ—化
     */
    private static final long serialVersionUID = -4887973911424096779L;
    /**
     * æ–‡ä»¶çš„æµ
     */
    private InputStream inputStream;
    /**
     * æ–‡ä»¶æœ¬åœ°çš„信息
     */
    private String fileLocalPath;
}
Source/UBCS/ubcs-ops-api/ubcs-resource-api/src/main/java/com/vci/ubcs/resource/constant/FileBusConstant.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
package com.vci.ubcs.resource.constant;
/**
 * æ–‡ä»¶æœåŠ¡éƒ¨åˆ†çš„é™æ€å€¼
 * @author weidy
 * @date 2023/6/9
 */
public class FileBusConstant {
    /**
     * æ–‡ä»¶å¯¹è±¡
     */
    public static final String FILE_OBJECT = "fileObject";
    /**
     * æ–‡ä»¶ä¸‹è½½è®°å½•
     */
    public static final String FILE_DOWNLOAD_RECORD = "fileDownloadRecord";
}
Source/UBCS/ubcs-ops-api/ubcs-resource-api/src/main/java/com/vci/ubcs/resource/constant/FileLifeConstant.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,14 @@
package com.vci.ubcs.resource.constant;
/**
 * æ–‡ä»¶çŠ¶æ€
 * @author weidy
 * @date 2023/6/9 9:07
 */
public class FileLifeConstant {
    /**
     * æ–‡ä»¶çš„状态
     */
    public static final String FILE = "fileStatus";
}
Source/UBCS/ubcs-ops-api/ubcs-resource-api/src/main/java/com/vci/ubcs/resource/dto/FileObjectDTO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,54 @@
package com.vci.ubcs.resource.dto;
import com.vci.ubcs.resource.entity.FileObject;
import com.vci.ubcs.starter.web.pagemodel.BaseModelVO;
import lombok.Data;
/**
 * æ–‡ä»¶æ•°æ®ä¼ è¾“对象
 * @author weidy
 * @date 2023/6/9
 */
@Data
public class FileObjectDTO extends FileObject {
    /**
     * åºåˆ—化
     */
    private static final long serialVersionUID = 497836915363113260L;
    /**
     * æ˜¯å¦ä¿®æ”¹æ–‡ä»¶
     */
    private Boolean updateFileFlag ;
    /**
     * æ–‡ä»¶å¤¹è·¯å¾„
     */
    private String dirPath;
    /**
     * æ–‡ä»¶ä¸Šä¼ åŽæ˜¯å¦ç«‹å³ç”Ÿæ•ˆ
     */
    private Boolean effect = true;
    /**
     * ä¸Šä¼ åŽŸæ–‡ä»¶è·¯å¾„
     */
    private String sourceFilePath;
    /**
     * æ ¡éªŒç›¸åŒçš„名称的文件,必须在ownbiz有值的情况下
     */
    private Boolean checkSameFile = false;
    /**
     * æ¡¶çš„名称
     */
    private String bucketName;
}
Source/UBCS/ubcs-ops-api/ubcs-resource-api/src/main/java/com/vci/ubcs/resource/dto/FileReleaseDTO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,33 @@
package com.vci.ubcs.resource.dto;
import lombok.Data;
import java.util.List;
/**
 * æ–‡ä»¶å‘布的数据操作对象
 * @author weidy
 * @date 2023/6/9
 */
@Data
public class FileReleaseDTO implements java.io.Serializable{
    /**
     * åºåˆ—化
     */
    private static final long serialVersionUID = -218379391237684940L;
    /**
     * æ‰€å±žæ•°æ®ä¸»é”®
     */
    private String ownbizOid;
    /**
     * æ‰€å±žæ•°æ®çš„业务类型
     */
    private String ownBtmName;
    /**
     * æ–‡ä»¶çš„主键
     */
    private List<String> oids;
}
Source/UBCS/ubcs-ops-api/ubcs-resource-api/src/main/java/com/vci/ubcs/resource/dto/FileShareDTO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,39 @@
package com.vci.ubcs.resource.dto;
import lombok.Data;
import java.util.List;
/**
 * æ–‡ä»¶åˆ†äº«çš„æ•°æ®ä¼ è¾“对象
 * @author weidy
 * @date 2023/6/9
 */
@Data
public class FileShareDTO implements java.io.Serializable{
    /**
     * åºåˆ—化
     */
    private static final long serialVersionUID = -2947163604655993790L;
    /**
     * æ¥æºä¸šåŠ¡
     */
    private String sourceBus;
    /**
     * æ¥æºä¸šåŠ¡æ•°æ®ä¸»é”®
     */
    private String sourceBusOid;
    /**
     * ç›®æ ‡çš„业务
     */
    private String targetBus;
    /**
     * ç›®æ ‡çš„业务数据主键
     */
    private String targetBusOid;
    /**
     * æºæ–‡ä»¶çš„主键
     */
    private List<String> oids;
}
Source/UBCS/ubcs-ops-api/ubcs-resource-api/src/main/java/com/vci/ubcs/resource/entity/FileObject.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,90 @@
package com.vci.ubcs.resource.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.vci.ubcs.starter.revision.model.BaseModel;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
 * æ–‡ä»¶å¯¹è±¡
 * @author weidy
 * @date 2023/6/8
 */
@Data
@TableName("PL_SYS_FILEOBJECT")
@ApiModel(value = "文件对象", description = "存储业务数据关联的文件信息")
@EqualsAndHashCode(callSuper = true)
public class FileObject extends BaseModel {
    /**
     * åºåˆ—化
     */
    private static final long serialVersionUID = -7116754635114431150L;
    /**
     * æ˜¾ç¤ºçš„名称
     */
    private String id;
    /**
     * æ–‡ä»¶åç§°
     */
    private String name;
    /**
     * åœ¨minio里的名称
     */
    private String objectName;
    /**
     * æ–‡ä»¶åŽç¼€å
     */
    private String fileExtension;
    /**
     * æ–‡æ¡£ç±»åž‹ç¼–号
     */
    private String fileDocClassify;
    /**
     * æ–‡æ¡£ç±»åž‹æ–‡æœ¬
     */
    private String fileDocClassifyName;
    /**
     * æ–‡ä»¶å¤§å°
     */
    private Long fileSize;
    /**
     * å…³é”®è¯ä¿¡æ¯
     */
    private String keyInfos;
    /**
     * æ‰€å±žæ•°æ®ä¸»é”®
     */
    private String ownbizOid;
    /**
     * æ‰€å±žæ•°æ®çš„业务类型
     */
    private String ownBtmName;
    /**
     * å…³è”的数据的信息
     */
    private String linkInfos;
    /**
     * æ–‡ä»¶çš„存储路径
     */
    private String fileLink;
    /**
     * æ¡¶çš„名称
     */
    private String bucketName;
}
Source/UBCS/ubcs-ops-api/ubcs-resource-api/src/main/java/com/vci/ubcs/resource/life/FileLife.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,84 @@
package com.vci.ubcs.resource.life;
import com.vci.ubcs.starter.web.enumpck.BaseEnum;
/**
 * æ–‡ä»¶çš„状态集合
 * @author weidy
 * @date 2023/6/11
 */
public enum FileLife implements BaseEnum {
    /**
     * åˆå§‹åŒ–
     */
    INIT("fileInit","初始化"),
    /**
     * ä¸Šä¼ ä¸­
     */
    TRANSITING("fileTransiting","上传中"),
    /**
     * ä¸Šä¼ å®Œæˆ
     */
    TRANS_FINISH("fileTransitFinish","上传完成"),
    /**
     * å·²ç”Ÿæ•ˆ
     */
    FILE_RELEASE("fileRelease","已生效");
    /**
     * æžšä¸¾å€¼
     */
    private String value;
    /**
     * æžšä¸¾æ˜¾ç¤ºå€¼
     */
    private String text;
    /**
     * èŽ·å–æžšä¸¾å€¼
     * @return æžšä¸¾å€¼
     */
    @Override
    public String getValue() {
        return value;
    }
    /**
     * è®¾ç½®æžšä¸¾å€¼
     * @param value æžšä¸¾å€¼
     */
    public void setValue(String value) {
        this.value = value;
    }
    /**
     * èŽ·å–æ˜¾ç¤ºæ–‡æœ¬
     * @return æ˜¾ç¤ºæ–‡æœ¬
     */
    @Override
    public String getText() {
        return text;
    }
    /**
     * è®¾ç½®æ˜¾ç¤ºæ–‡æœ¬
     * @param text æ˜¾ç¤ºæ–‡æœ¬
     */
    public void setText(String text) {
        this.text = text;
    }
    /**
     * æžšä¸¾å†…部构造方法
     * @param value æžšä¸¾å€¼
     * @param text æ˜¾ç¤ºæ–‡æœ¬
     */
    private FileLife(String value, String text){
        this.value = value;
        this.text = text;
    }
}
Source/UBCS/ubcs-ops-api/ubcs-resource-api/src/main/java/com/vci/ubcs/resource/query/FileQuery.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,34 @@
package com.vci.ubcs.resource.query;
import com.vci.ubcs.resource.entity.FileObject;
import com.vci.ubcs.starter.web.pagemodel.BladeQueryObject;
import lombok.Data;
import java.util.Date;
/**
 * æ–‡ä»¶çš„æŸ¥è¯¢
 * @author weidy
 * @date 2023/1/31
 */
@Data
public class FileQuery extends FileObject {
    /**
     * åºåˆ—化
     */
    private static final long serialVersionUID = 2442917107957942183L;
    /**
     * åˆ›å»ºæ—¶é—´
     */
    private Date createTime_begin;
    /**
     * åˆ›å»ºæ—¶é—´ç»“束
     */
    private Date createTime_end;
}
Source/UBCS/ubcs-ops-api/ubcs-resource-api/src/main/java/com/vci/ubcs/resource/utils/FileDownloadUtil.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,80 @@
package com.vci.ubcs.resource.utils;
import com.vci.ubcs.resource.bo.FileObjectBO;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.IOUtils;
import org.springframework.http.MediaType;
import org.springframework.http.MediaTypeFactory;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLEncoder;
/**
 * ä¸‹è½½æ–‡ä»¶çš„工具
 * @author weidy
 * @date 2023/6/9
 */
@Slf4j
public class FileDownloadUtil {
    /**
     * ä¸‹è½½æ–‡ä»¶
     * @param response å“åº”对象
     * @param fileObjectBO æ–‡ä»¶çš„信息,包含文件的输入流
     * @throws IOException ä¸‹è½½å¼‚常会抛出
     */
    public static void downloadFile(HttpServletResponse response, FileObjectBO fileObjectBO) throws IOException {
        downloadFile(response,fileObjectBO,true);
    }
    /**
     * ä¸‹è½½æ–‡ä»¶
     * @param response å“åº”对象
     * @param fileObjectBO æ–‡ä»¶çš„信息,包含文件的输入流
     * @param closeInputStream æ˜¯å¦å…³é—­æµ
     * @throws IOException ä¸‹è½½å‡ºé”™çš„æ—¶å€™æŠ›å‡ºå¼‚常
     */
    public static void downloadFile(HttpServletResponse response, FileObjectBO fileObjectBO,boolean closeInputStream) throws IOException {
        MediaType mediaType = MediaTypeFactory.getMediaType(fileObjectBO.getName() + "." + fileObjectBO.getFileExtension()).orElse(MediaType.APPLICATION_OCTET_STREAM);
        // è®¾ç½®å¼ºåˆ¶ä¸‹è½½ä¸æ‰“å¼€
        response.setContentType(mediaType.getType());
        try{
            String fileName = URLEncoder.encode(fileObjectBO.getName() + "." + fileObjectBO.getFileExtension(), "UTF8");
            response.addHeader("Content-Disposition", "attachment; filename="+ fileName+ ";filename*=utf-8''" + fileName);
        }catch(Exception e){
            if(log.isErrorEnabled()){
                log.error("设置文件的名称到响应流的时候出错",e);
            }
        }
        response.setCharacterEncoding("UTF-8");
        Cookie cookie = new Cookie("fileDownload", "true");
        cookie.setPath("/");
        response.addCookie(cookie);
        if(closeInputStream) {
            try (InputStream ins = (fileObjectBO.getInputStream() != null ? fileObjectBO.getInputStream() : new FileInputStream(fileObjectBO.getFileLocalPath()))) {
                IOUtils.copy(ins, response.getOutputStream());
            } catch (IOException e) {
                //有可能客户端的链接
                if (log.isErrorEnabled()) {
                    log.error("写入文件到响应流出错", e);
                }
                throw e;
            }
        }else{
            try {
                InputStream ins = (fileObjectBO.getInputStream() != null ? fileObjectBO.getInputStream() : new FileInputStream(fileObjectBO.getFileLocalPath()));
                IOUtils.copy(ins, response.getOutputStream());
            } catch (IOException e) {
                //有可能客户端的链接
                if (log.isErrorEnabled()) {
                    log.error("写入文件到响应流出错", e);
                }
                throw e;
            }
        }
    }
}
Source/UBCS/ubcs-ops-api/ubcs-resource-api/src/main/java/com/vci/ubcs/resource/utils/FileUtil.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,388 @@
package com.vci.ubcs.resource.utils;
import com.vci.ubcs.starter.exception.VciBaseException;
import com.vci.ubcs.starter.web.util.VciBaseUtil;
import org.apache.commons.io.IOUtils;
import org.springframework.boot.system.ApplicationHome;
import org.springframework.util.StringUtils;
import java.io.*;
import java.nio.channels.FileChannel;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
/**
 * æœ¬åœ°æ–‡ä»¶æ“ä½œç±»
 * @author weidy
 * @date 2021-04-19
 */
public class FileUtil {
    /**
     * åˆ é™¤æ–‡ä»¶å¤¹
     * @param file è¦åˆ é™¤çš„æ–‡ä»¶æˆ–者文件夹
     */
    public static void deleteFile(File file) {
        if(file == null || !file.exists()){
            return;
        }
        if (file.isDirectory()) {
            File[] files = file.listFiles();
            for (int i = 0; i < files.length; i++) {
                deleteFile(files[i]);
            }
        }
        file.delete();
    }
    /**
     * æ‹·è´æ–‡ä»¶
     * @param source æºæ–‡ä»¶
     * @param target ç›®æ ‡æ–‡ä»¶
     * @throws VciBaseException æ‹·è´æ–‡ä»¶å‡ºé”™çš„æ—¶å€™ä¼šæŠ›å‡ºå¼‚常
     */
    public static void copyFile(File source, File target) throws VciBaseException {
        try(FileInputStream is = new FileInputStream(source);
            FileOutputStream os = new FileOutputStream(target)){
            FileChannel sourceChannel = is.getChannel();
            FileChannel targetChannel = os.getChannel();
            int i=0;
            int length=2097152;
            while(true){
                if(sourceChannel.position()==sourceChannel.size()){
                    sourceChannel.close();
                    targetChannel.close();
                    break;
                }
                if((sourceChannel.size()-sourceChannel.position())<20971520) {
                    length = (int) (sourceChannel.size() - sourceChannel.position());
                }else {
                    length = 20971520;
                }
                sourceChannel.transferTo(sourceChannel.position(),length,targetChannel);
                sourceChannel.position(sourceChannel.position()+length);
                i++;
            }
        }catch(Throwable e){
            throw new VciBaseException("拷贝文件出错",new String[0],e);
        }
    }
    /**
     * ä¸´æ—¶æ–‡ä»¶å¤¹çš„前缀
     */
    public static String DEFAULT_TEMP_FOLDER_PREFIX = "";
    /**
     * èŽ·å–é»˜è®¤çš„ä¸´æ—¶æ–‡ä»¶å¤¹
     * @return ä¸´æ—¶æ–‡ä»¶å¤¹ï¼Œé»˜è®¤ä¸ºå½“前项目的运行路径下的tempFolder下的随机值
     */
    public static String getDefaultTempFolder() throws VciBaseException{
        String path = (!StringUtils.hasLength(DEFAULT_TEMP_FOLDER_PREFIX)?getProjectFolder():DEFAULT_TEMP_FOLDER_PREFIX) + File.separator + "temp" + File.separator + VciBaseUtil.getPk();
        File folder = new File(path);
        if(!folder.exists()){
            folder.mkdirs();
        }
        return path;
    }
    /**
     * èŽ·å–é¡¹ç›®çš„è·¯å¾„
     * @return é¡¹ç›®çš„路径
     * @throws VciBaseException èŽ·å–è·¯å¾„å‡ºçŽ°äº†é”™è¯¯ä¼šæŠ›å‡ºå¼‚å¸¸
     */
    public static String getProjectFolder() throws VciBaseException{
        return getProjectFolder(FileUtil.class);
    }
    /**
     * èŽ·å–æŸä¸ªclass所在项目的路径
     * @param classObj æŸä¸ªclass
     * @return é¡¹ç›®çš„路径
     * @throws VciBaseException èŽ·å–è·¯å¾„å‡ºçŽ°äº†é”™è¯¯ä¼šæŠ›å‡ºå¼‚å¸¸
     */
    public static String getProjectFolder(Class classObj) throws VciBaseException{
        String path = "";
        try {
            ApplicationHome h = new ApplicationHome(classObj == null? FileUtil.class:classObj);
            File jarF = h.getSource();
            if(jarF == null){
                jarF = h.getDir();
            }
            path =  jarF.getParentFile().toString();
            if(path.contains("!")){
                path = new File(path).getParentFile().getParent();
            }
        }catch (Throwable e){
            throw new VciBaseException("获取当前服务所在的文件夹出现了错误",new String[0],e);
        }
        if(path.startsWith("file:\\")){
            path = path.substring(6);
        }
        if (System.getProperty("os.name").toLowerCase().startsWith("win") && path.startsWith("/")) {
            path = path.substring(path.indexOf("/") + 1);
        }
        return path;
    }
    /**
     * åˆ é™¤ä¸´æ—¶æ–‡ä»¶
     * @param tempFile ä¸´æ—¶æ–‡ä»¶
     * @param deleteRandomFolder æ˜¯å¦åˆ é™¤éšæœºçš„那个文件夹
     * @throws VciBaseException åˆ é™¤å‡ºé”™çš„æ—¶å€™æŠ›å‡ºå¼‚常
     */
    public static void deleteTempFile(File tempFile,boolean deleteRandomFolder) throws VciBaseException{
        if(tempFile!=null){
            tempFile.delete();
            if(deleteRandomFolder){
                tempFile.getParentFile().delete();
            }
        }
    }
    /**
     * åˆ¤æ–­å‚数是否为空
     * @param s å‚数,第一个为参数,第二个为提示信息
     * @throws VciBaseException ä¸ºç©ºæ—¶æŠ›å‡ºè¿™ä¸ªå¼‚常
     */
    public static void alertNotNull(Object... s) throws VciBaseException{
        if(s!=null && s.length>0){
            for(int i = 0 ; i < s.length ; i ++){
                Object obj = s[i];
                if(obj==null ||!StringUtils.hasLength(obj.toString())){
                    String param = "";
                    try{
                        i++;
                        param = s[i].toString();
                    }catch(Exception e){
                    }
                    throw new VciBaseException("参数[" + param + "]不能为空");
                }
            }
        }
    }
    /**
     * èŽ·å–æ–‡ä»¶çš„åŽç¼€å
     * @param file æ–‡ä»¶å¯¹è±¡
     * @return åŽç¼€åï¼Œä¸åŒ…含.;如果文件不存在或者没有后缀名返回""
     */
    public static String getFileExtension(File file){
        if(file!=null){
            return getFileExtensionByName(file.getName());
        }
        return "";
    }
    /**
     * èŽ·å–æ–‡ä»¶ä¸å«åŽç¼€åçš„åç§°
     * @param file æ–‡ä»¶
     * @return åç§°
     */
    public static String getFileNameUnHasExtension(File file){
        if(file!=null){
            String name = file.getName();
            return name.contains(".")?name.substring(0,name.lastIndexOf(".")):name;
        }
        return "";
    }
    /**
     * èŽ·å–æ–‡ä»¶ä¸å«åŽç¼€åçš„åç§°
     * @param fileName æ–‡ä»¶åç§°
     * @return åç§°
     */
    public static String getFileNameUnHasExtensionByName(String fileName){
        if(fileName!=null){
            return fileName.contains(".")?fileName.substring(0,fileName.lastIndexOf(".")):fileName;
        }
        return "";
    }
    /**
     * èŽ·å–æ–‡ä»¶çš„åŽç¼€å
     * @param name æ–‡ä»¶åç§°
     * @return åŽç¼€åï¼Œä¸åŒ…含.;没有后缀名返回""
     */
    public static String getFileExtensionByName(String name){
        if(StringUtils.hasLength(name)){
            if(name.contains(".")){
                return name.substring(name.lastIndexOf(".")+1);
            }
        }
        return "";
    }
    /**
     * èŽ·å–ä¸Šä¼ æ–‡ä»¶çš„åç§°ï¼Œåœ¨IE浏览器上,上传会把全路径带过来
     * @param name æ–‡ä»¶çš„名称
     * @return æ›¿æ¢åŽçš„值
     */
    public static String getFileNameForIE(String name){
        if(!StringUtils.hasLength(name)){
            return name;
        }
        if(name.contains(File.separator)){
            return name.substring(name.lastIndexOf(File.separator)+1);
        }
        if(name.contains("\\")){
            return name.substring(name.lastIndexOf("\\") + 1);
        }
        return name;
    }
    /**
     * ä»Žå·¥ç¨‹ä¸­è¯»å–文件的内容
     * @param fileName æ–‡ä»¶çš„名称
     * @return æ–‡ä»¶çš„内容
     * @throws VciBaseException è¯»å–出错的时候会抛出异常
     */
    public static String readContentForFileInJar(String fileName) throws VciBaseException{
        if(!StringUtils.hasLength(fileName)){
            throw new VciBaseException("文件名为空");
        }
        if(!fileName.startsWith("/")){
            fileName = "/" + fileName;
        }
        InputStream in = null;
        ByteArrayOutputStream os = null;
        try{
            in = FileUtil.class.getResourceAsStream( fileName);
            if(in ==null){
                in=Thread.currentThread().getContextClassLoader().getResourceAsStream(fileName);
            }
            os = new ByteArrayOutputStream();
            IOUtils.copy(in,os);
            return new String(os.toByteArray(),"UTF-8");
        }catch (Throwable e){
            throw new VciBaseException("读取文件的内容出现了错误",new String[0],e);
        }finally {
            IOUtils.closeQuietly(in);
            IOUtils.closeQuietly(os);
        }
    }
    /**
     * è¯»å–文件的内容,文件不能是jar里的
     * @param fileName æ–‡ä»¶çš„名称
     * @return æ–‡ä»¶çš„内容,是UTF-8的字符集
     * @throws VciBaseException æ–‡ä»¶ä¸å­˜åœ¨ï¼Œå’Œè¯»å–出错的时候会抛出异常
     */
    public static String readContentForFile(String fileName) throws VciBaseException{
        return new String(readDataForFile(fileName),StandardCharsets.UTF_8);
    }
    /**
     * è¯»å–文件里的数据
     * @param fileName æ–‡ä»¶åç§°
     * @return æ–‡ä»¶çš„æ•°æ®
     * @throws VciBaseException æ–‡ä»¶ä¸å­˜åœ¨ï¼Œå’ŒèŽ·å–å‡ºé”™çš„æ—¶å€™ä¼šæŠ›å‡ºå¼‚å¸¸
     */
    public static byte[] readDataForFile(String fileName) throws VciBaseException{
        File file = new File(fileName);
        if(!file.exists()){
            throw new VciBaseException("文件未找到,{0}",new String[]{fileName});
        }
        try(InputStream in = new FileInputStream( file);
            ByteArrayOutputStream os = new ByteArrayOutputStream();
        ){
            IOUtils.copy(in,os);
            return os.toByteArray();
        }catch (Throwable e){
            throw new VciBaseException("读取文件的内容出现了错误",new String[0],e);
        }
    }
    /**
     * å†™å…¥å­—符串到文件
     * @param content å­—符串
     * @param fileName æ–‡ä»¶çš„名称
     * @throws VciBaseException å†™å…¥å‡ºé”™çš„æ—¶å€™ä¼šæŠ›å‡ºå¼‚常
     */
    public static void writeContentToFile(String content,String fileName) throws VciBaseException{
        File file = new File(fileName);
        if(!file.exists()){
            File parentFile = file.getParentFile();
            if(!parentFile.exists()){
                parentFile.mkdirs();
            }
            try {
                file.createNewFile();
            } catch (IOException e) {
                throw new VciBaseException("写入文件的内容时候出现了创建文件失败的问题,{}",new String[]{fileName},e);
            }
        }
        if(content == null){
            content = "";
        }
        try(OutputStream os = new FileOutputStream(file);){
            os.write(content.getBytes(StandardCharsets.UTF_8));
            os.flush();
        }catch(Throwable e){
            throw new VciBaseException("写入文件的内容时候出现了创错误,{}",new String[]{fileName},e);
        }
    }
    /**
     * ä»Žé¡¹ç›®é‡Œæˆ–者jar的文件到目标文件
     * @param fileInJar jar或者项目里的文件名称
     * @param target ç›®æ ‡æ–‡ä»¶
     * @throws VciBaseException æ‹·è´æ–‡ä»¶å‡ºçŽ°é”™è¯¯çš„æ—¶å€™ä¼šæŠ›å‡ºå¼‚å¸¸
     */
    public static void copyFileInJar(String fileInJar,String target) throws  VciBaseException{
        alertNotNull(fileInJar,"源文件",target,"目标文件");
        File targetFile = new File(target);
        File folder = targetFile.getParentFile();
        if(!folder.exists()){
            folder.mkdirs();
        }
        if(!targetFile.exists()){
            try {
                targetFile.createNewFile();
            } catch (IOException e) {
                throw new VciBaseException("创建目标文件的出现了错误",new String[0],e);
            }
        }
        if(!fileInJar.startsWith("/")){
            fileInJar = "/" + fileInJar;
        }
        InputStream in = null;
        FileOutputStream os = null;
        try{
            in =  FileUtil.class.getResourceAsStream( fileInJar);
            if(in ==null){
                in=Thread.currentThread().getContextClassLoader().getResourceAsStream(fileInJar);
            }
            os = new FileOutputStream(target);
            IOUtils.copy(in,os);
        }catch (Throwable e){
            throw new VciBaseException("拷贝文件的内容出现了错误.{0},{1}",new String[]{fileInJar,target},e);
        }finally {
            IOUtils.closeQuietly(in);
            IOUtils.closeQuietly(os);
        }
    }
    /**
     * æ–‡ä»¶è½¬æ¢ä¸ºè·¯å¾„
     * @param fileList æ–‡ä»¶åˆ—表
     * @return è·¯å¾„列表
     * @throws VciBaseException å‚数为空和文件不存在会抛出异常
     */
    public static List<String> fileToPatch(Collection<File> fileList) throws VciBaseException  {
        alertNotNull("文件列表",fileList);
        List<String> filePath = new ArrayList<>();
        for(File file : fileList){
            if(!file.exists()){
                throw new VciBaseException(file.getAbsolutePath() + "文件没有找到",new String[0]);
            }
            filePath.add(file.getAbsolutePath());
        }
        return filePath;
    }
}
Source/UBCS/ubcs-ops-api/ubcs-resource-api/src/main/java/com/vci/ubcs/resource/utils/ZipUtil.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,155 @@
package com.vci.ubcs.resource.utils;
import com.vci.ubcs.starter.exception.VciBaseException;
import com.vci.ubcs.starter.web.util.LangBaseUtil;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.nio.charset.Charset;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
/**
 * zip相关的工具类
 * @author wanghong
 * @date 2021-02-02
 */
@Component
public class ZipUtil {
    /**
     * èŽ·å–zip的字符集
     * @return é»˜è®¤ä¸ºGBK,否则需要配置
     */
    private String getZipCharset(){
        return (File.separatorChar=='\\')?"GBK":"UTF-8";
    }
    /**
     * å°†æ–‡ä»¶å¤¹åŽ‹ç¼©æˆåŽ‹ç¼©åŒ…
     * @param folder æ–‡ä»¶å¤¹è·¯å¾„
     * @param zipFileName zip文件名
     * @throws VciBaseException å‚数为空或者添加出错的会抛出异常
     */
    public void folderToZipFile(String folder, String zipFileName) throws VciBaseException {
        folderToZipFile(folder,zipFileName,getZipCharset());
    }
    /**
     * å°†æ–‡ä»¶å¤¹åŽ‹ç¼©æˆåŽ‹ç¼©åŒ…
     * @param folder æ–‡ä»¶å¤¹è·¯å¾„
     * @param zipFileName zip文件名
     * @param zipEncode zip的字符集,windows应该为GBK
     * @throws VciBaseException å‚数为空或者添加出错的会抛出异常
     */
    public void folderToZipFile(String folder, String zipFileName,String zipEncode) throws VciBaseException{
        File sourceFile = new File(folder);
        if(!sourceFile.exists()){
            throw new VciBaseException("文件{0}没有找到",new String[]{folder});
        }
        try( ZipOutputStream zos =new ZipOutputStream(new FileOutputStream(zipFileName), StringUtils.hasLength(zipEncode)?Charset.forName(zipEncode): Charset.forName(getZipCharset()));) {
            //默认是UTF-8格式的
            addFileToZip(zos, new File(folder).listFiles(),folder + File.separator);
        }catch (Throwable e){
            throw new VciBaseException(LangBaseUtil.getErrorMsg(e),new String[]{});
        }
    }
    /**
     * å°†æ–‡ä»¶å¤¹åŽ‹ç¼©æˆåŽ‹ç¼©åŒ…
     * @param zos zip输出流
     * @param files è¦åŽ‹ç¼©çš„æ–‡ä»¶
     * @param rootPath åŽ‹ç¼©çš„æ–‡ä»¶ä¸­çš„é¡¶å±‚ç›®å½•
     * @throws VciBaseException æ–‡ä»¶ä¸å­˜åœ¨ï¼Œæˆ–者内容出现错误会抛出异常
     */
    private void addFileToZip(ZipOutputStream zos,File[] files,String rootPath) throws VciBaseException{
        if(files!=null && files.length>0) {
            for (File file : files) {
                if(!StringUtils.hasLength(rootPath)){
                    try {
                        rootPath = file.getParent();
                        if (rootPath == null) {
                            rootPath = file.getPath();
                        }
                    }catch (Throwable e){
                        rootPath = file.getPath();
                    }
                }
                if (!file.exists()) {
                    throw new VciBaseException("文件{0}没有找到",new String[]{file.getAbsolutePath()});
                }
                if (file.isDirectory()) {
                    addFileToZip(zos, file.listFiles(),rootPath);
                }else{
                    try (InputStream is = new FileInputStream(file); ){
                        String entryName = file.getAbsolutePath().replace(rootPath,"");
                        if(entryName.startsWith("\\")) {
                            entryName = entryName.substring(1);
                        }
                        ZipEntry zipEntry = new ZipEntry(entryName);
                        zos.putNextEntry(zipEntry);
                        byte[] b = new byte[100];
                        int length = 0;
                        while ((length = is.read(b)) != -1) {
                            zos.write(b, 0, length);
                        }
                    } catch (Exception e) {
                        throw new VciBaseException("ZIP压缩出错{0}",new String[]{file.getAbsolutePath()},e);
                    }
                }
            }
        }
    }
    /**
     * å°†å•个文件添加到zip中
     * @param file æ–‡ä»¶
     * @param zipFile zip文件
     * @throws VciBaseException å‚数为空或者添加出错的会抛出异常
     */
    public void addFileToZip(File file, String zipFile) throws VciBaseException{
        if(file == null || !file.exists() ){
            throw new VciBaseException("文件{0}没有找到" ,new String[]{file.getAbsolutePath()});
        }
        if(!StringUtils.hasLength(zipFile)){
            throw new VciBaseException("zip文件{0}为空",new String[0]);
        }
        addFileToZip(new File[]{file},zipFile);
    }
    /**
     * å°†å¤šä¸ªä¸ªæ–‡ä»¶æ·»åŠ åˆ°zip中
     * @param files æ–‡ä»¶
     * @param zipFile zip文件
     * @throws VciBaseException å‚数为空或者添加出错的会抛出异常
     */
    public void addFileToZip(File[] files, String zipFile) throws VciBaseException{
       addFileToZip(files, zipFile,getZipCharset());
    }
    /**
     * å°†å¤šä¸ªä¸ªæ–‡ä»¶æ·»åŠ åˆ°zip中
     * @param files æ–‡ä»¶
     * @param zipFile zip文件
     * @param zipEncode zip的字符集
     * @throws VciBaseException å‚数为空或者添加出错的会抛出异常
     */
    public void addFileToZip(File[] files, String zipFile,String zipEncode) throws VciBaseException{
        if(files == null || files.length == 0){
            throw new VciBaseException("文件{0}内容是空",new String[0]);
        }
        if(!StringUtils.hasLength(zipFile)){
            throw new VciBaseException("zip文件{0}是空",new String[0]);
        }
        try (ZipOutputStream zos =new ZipOutputStream(new FileOutputStream(zipFile), StringUtils.hasLength(zipEncode)?Charset.forName(zipEncode): Charset.forName(getZipCharset()));){
            addFileToZip(zos, files,"");
        }catch (Throwable e){
            throw new VciBaseException(LangBaseUtil.getErrorMsg(e),new String[]{},e);
        }
    }
}
Source/UBCS/ubcs-ops-api/ubcs-resource-api/src/main/java/com/vci/ubcs/resource/vo/FileObjectVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,21 @@
package com.vci.ubcs.resource.vo;
import com.vci.ubcs.resource.entity.FileObject;
import lombok.Data;
/**
 * æ–‡ä»¶çš„æ˜¾ç¤ºå¯¹è±¡
 * @author weidy
 * @date 2023/6/9
 */
@Data
public class FileObjectVO extends FileObject {
    /**
     * åºåˆ—化
     */
    private static final long serialVersionUID = 2685482161288133481L;
}
Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/business/controller/WorkController.java
@@ -27,13 +27,23 @@
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.AllArgsConstructor;
import org.flowable.engine.RepositoryService;
import org.flowable.engine.RuntimeService;
import org.flowable.engine.TaskService;
import org.flowable.engine.repository.Deployment;
import org.flowable.engine.runtime.ProcessInstance;
import org.flowable.task.api.Task;
import org.springblade.core.mp.support.Condition;
import org.springblade.core.mp.support.Query;
import org.springblade.core.tenant.annotation.NonDS;
import org.springblade.core.tool.api.R;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 * æµç¨‹äº‹åŠ¡é€šç”¨æŽ¥å£
 *
Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/business/service/impl/FlowBusinessServiceImpl.java
@@ -263,6 +263,7 @@
            variables = Kv.create();
        }
        variables.put(ProcessConstant.PASS_KEY, flow.isPass());
        variables.put("yn","y");
        // å®Œæˆä»»åŠ¡
        taskService.complete(taskId, variables);
        return true;
Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/controller/FlowModelController.java
@@ -18,15 +18,20 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import com.vci.ubcs.flow.core.utils.TaskUtil;
import com.vci.ubcs.flow.engine.entity.FlowModel;
import com.vci.ubcs.flow.engine.entity.FlowTaskUser;
import com.vci.ubcs.flow.engine.service.FlowEngineService;
import com.vci.ubcs.flow.engine.service.FlowTaskUserService;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.AllArgsConstructor;
import org.springblade.core.launch.constant.FlowConstant;
import org.springblade.core.mp.support.Condition;
import org.springblade.core.mp.support.Query;
import org.springblade.core.secure.utils.AuthUtil;
import org.springblade.core.tenant.annotation.NonDS;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.Func;
@@ -44,7 +49,7 @@
@RestController
@RequestMapping("model")
@AllArgsConstructor
//@PreAuth(RoleConstant.HAS_ROLE_ADMINISTRATOR)
//@PreAuth(RoleConstant.HAS_ROLE_ADMINISTRATOR)t
public class FlowModelController {
    private final FlowEngineService flowEngineService;
@@ -63,6 +68,8 @@
        IPage<FlowModel> pages = flowEngineService.page(Condition.getPage(query), Condition.getQueryWrapper(flow, FlowModel.class)
            .select("id,model_key modelKey,name,description,version,created,last_updated lastUpdated")
            .orderByDesc("last_updated"));
        flowEngineService.getNodeByFlowableKey("process_t");
        return R.data(pages);
    }
Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/controller/FlowProcessController.java
@@ -20,6 +20,12 @@
import com.vci.ubcs.flow.engine.service.FlowEngineService;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.flowable.bpmn.model.FlowElement;
import org.flowable.bpmn.model.SubProcess;
import org.flowable.bpmn.model.UserTask;
import org.flowable.engine.*;
import org.springblade.core.tenant.annotation.NonDS;
import org.springblade.core.tool.api.R;
import org.springframework.web.bind.annotation.GetMapping;
@@ -28,7 +34,10 @@
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
/**
 * æµç¨‹é€šç”¨æŽ§åˆ¶å™¨
@@ -44,6 +53,12 @@
    private static final String IMAGE_NAME = "image";
    private final FlowEngineService flowEngineService;
    private final RepositoryService repositoryService;
    private final RuntimeService runtimeService;
    private final HistoryService historyService;
    private final TaskService taskService;
    private final ProcessEngine processEngine;
    /**
     * èŽ·å–æµè½¬åŽ†å²åˆ—è¡¨
@@ -65,6 +80,7 @@
     */
    @GetMapping(value = "model-view")
    public R modelView(String processDefinitionId, String processInstanceId) {
        return R.data(flowEngineService.modelView(processDefinitionId, processInstanceId));
    }
Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/controller/FlowTaskUserController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,56 @@
package com.vci.ubcs.flow.engine.controller;
import com.vci.ubcs.flow.engine.entity.FlowTaskUserC;
import com.vci.ubcs.flow.engine.service.FlowEngineService;
import com.vci.ubcs.flow.engine.service.FlowTaskUserService;
import lombok.AllArgsConstructor;
import org.springblade.core.tenant.annotation.NonDS;
import org.springblade.core.tool.api.R;
import org.springframework.web.bind.annotation.*;
/**
 * æµç¨‹task审批控制
 *
 * @author wang1
 */
@NonDS
@RestController
@RequestMapping("taskUser")
@AllArgsConstructor
public class FlowTaskUserController {
    private final FlowTaskUserService taskUserService;
    /**
     * æµç¨‹task审批人员列表
     * @return
     */
    @GetMapping("list")
    public R<FlowTaskUserC> list() {
        return R.data(taskUserService.getUser());
    }
    /**
     * æ–°å¢žã€ä¿®æ”¹ä»»åŠ¡å¤„ç†äººå‘˜
     * @param flowTaskUserC
     * @return
     */
    @PostMapping("su")
    public R<String> saveUser(@RequestBody FlowTaskUserC flowTaskUserC) {
        taskUserService.saveOrUpdateUser(flowTaskUserC);
        return R.success("保存成功");
    }
    /**
     * åˆ é™¤ä»»åŠ¡å¤„ç†äººå‘˜
     * @param flowTaskUserC
     * @return
     */
    @PostMapping("du")
    public R<String> deleteUser(@RequestBody FlowTaskUserC flowTaskUserC) {
        taskUserService.deleteUser(flowTaskUserC.getName());
        return R.success("删除成功");
    }
}
Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/controller/ProcessTSController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,112 @@
package com.vci.ubcs.flow.engine.controller;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.vci.ubcs.flow.engine.entity.FlowTaskUser;
import com.vci.ubcs.flow.engine.entity.FlowTaskUserC;
import com.vci.ubcs.flow.engine.entity.ProcessStageAttr;
import com.vci.ubcs.flow.engine.entity.ProcessTemplate;
import com.vci.ubcs.flow.engine.service.FlowEngineService;
import com.vci.ubcs.flow.engine.service.ProcessStageAttrService;
import com.vci.ubcs.flow.engine.service.ProcessTemplateService;
import lombok.AllArgsConstructor;
import org.springblade.core.mp.support.Condition;
import org.springblade.core.mp.support.Query;
import org.springblade.core.tenant.annotation.NonDS;
import org.springblade.core.tool.api.R;
import org.springframework.web.bind.annotation.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 *流程模板、流程阶段控制 processTemplate processStage
 *
 * @author wang1
 */
@NonDS
@RestController
@RequestMapping("processTS")
@AllArgsConstructor
public class ProcessTSController {
    private final FlowEngineService flowEngineService;
    private final ProcessTemplateService processTemplateService;
    private final ProcessStageAttrService processStageAttrService;
    /**
     * æµç¨‹æ¨¡æ¿åˆ†é¡µ
     */
    @GetMapping("/tlist")
    public R<IPage<ProcessTemplate>> tlist(@RequestParam Map<String, Object> flow, Query query) {
        IPage<ProcessTemplate> pages = processTemplateService.page(Condition.getPage(query), Condition.getQueryWrapper(flow, ProcessTemplate.class)
            .select("id,model_key modelKey,model_name modelName,button_Type_Key buttonTypeKey,button_Type_value buttonTypeValue")
            .orderByDesc("last_updated"));
        return R.data(pages);
    }
    /**
     * æµç¨‹æ¨¡æ¿ç”¨é€”属性
     * @return
     */
    @PostMapping("tt")
    public R<List<Map<String,String>>> processTemplateType() {
        return R.data(processTemplateService.processTemplateType());
    }
    /**
     * æµç¨‹æ¨¡æ¿æ–°å¢žã€ä¿®æ”¹
     * @param processTemplate
     * @return
     */
    @PostMapping("tsou")
    public R<ProcessTemplate> processTemplateSaveOrUpdate(@RequestBody ProcessTemplate processTemplate) {
        processTemplateService.saveOrUpdateUser(processTemplate);
        return R.success("保存成功");
    }
    /**
     * æµç¨‹æ¨¡æ¿åˆ é™¤
     * @param processTemplate
     * @return
     */
    @DeleteMapping("dt")
    public R<ProcessTemplate> deleteProcessTemplate(ProcessTemplate processTemplate) {
        processTemplateService.deleteProcessTemplate(processTemplate.getId());
        return R.success("删除成功");
    }
    /**
     * æµç¨‹é˜¶æ®µï¼Œè¿™ä¸ªæµç¨‹çš„各个节点
     */
    @GetMapping("/sslist")
    public R<List<Map<String,String>>> sslist(@RequestParam String modelKey) {
        return R.data(flowEngineService.getNodeByFlowableKey(modelKey));
    }
    /**
     * æµç¨‹é˜¶æ®µï¼Œè¿™ä¸ªæµç¨‹,这个节点,绑定的属性
     */
    @GetMapping("/ssslist")
    public R<List<ProcessStageAttr>> ssslist(@RequestParam String templateId,@RequestParam String modelKey,@RequestParam String taskId) {
        Map<String, Object> m = new HashMap<>();
        m.put("template_id", templateId);
        m.put("task_id", taskId);
        m.put("model_key", modelKey);
        QueryWrapper q = Condition.getQueryWrapper(m, ProcessStageAttr.class)
            .select("attr_id attrId,attr_name attrName,attr_group attrGroup");
        return R.data(processStageAttrService.list(q));
    }
    /**
     * æ¨¡æ¿é˜¶æ®µå±žæ€§æ–°å¢žã€ä¿®æ”¹
     * @param flowTaskUserC
     * @return
     */
    @PostMapping("sasou")
    public R<ProcessTemplate> stageAttributeSaveOrUpdate(@RequestBody FlowTaskUserC flowTaskUserC) {
        processStageAttrService.saveOrUpdateUser(flowTaskUserC);
        return R.success("保存成功");
    }
}
Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/entity/FlowTaskUser.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,51 @@
/*
 *      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.flow.engine.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.vci.ubcs.flow.core.utils.TaskUtil;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
 * æµç¨‹æ¯ä¸€ä¸ªèŠ‚ç‚¹å®¡æ ¸äºº
 *
 * @author wang1
 */
@Data
@TableName("ACT_DE_TASK_USER")
public class FlowTaskUser implements Serializable {
    private static final long serialVersionUID = 1L;
    private String id;
    private String name;//保存的这个收藏名称
    private String modelKey;
    private String classifyId;
    private String templateId;
    private String taskId;//流程taskid
    private String taskName;
    private String userId;
    private String userName;
    private String description;
    private Date created;
    private Date lastUpdated;
    private String createdBy;
    private String lastUpdatedBy;
}
Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/entity/FlowTaskUserC.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,43 @@
/*
 *      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.flow.engine.entity;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
/**
 * æµç¨‹èŠ‚ç‚¹å®¡æ ¸äººæ”¶è—
 *
 * @author wang1
 */
@Data
public class FlowTaskUserC implements Serializable {
    private static final long serialVersionUID = 1L;
    private String createdBy;
    private String name;//保存的这个收藏名称
    private String modelKey;
    private String classifyId;
    private String templateId;
    private String taskId;//阶段id,就是流程taskid
    private String taskName;//阶段名称
    private List<FlowTaskUser> flowTaskUsers;//每个节点收藏人
    private List<ProcessStageAttr> processStageAttr;//流程阶段保存的属性
}
Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/entity/ProcessStageAttr.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,51 @@
/*
 *      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.flow.engine.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
 * æµç¨‹é˜¶æ®µ
 *
 * @author wang1
 */
@Data
@TableName("ACT_DE_PROCESS_STAGE_ATTR")
public class ProcessStageAttr implements Serializable {
    private static final long serialVersionUID = 1L;
    private String id;
    private String modelKey;
    private String classifyId;
    private String templateId;
    private String taskId;//阶段id,就是流程taskid
    private String taskName;//阶段名称
    private String attrOid;//属性这条数据的id
    private String attrId;//属性这条数据的oid
    private String attrName;//属性中文名称
    private String attrGroup;//属性分组
    private String description;
    private Date created;
    private Date lastUpdated;
    private String createdBy;
    private String lastUpdatedBy;
}
Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/entity/ProcessTemplate.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,48 @@
/*
 *      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.flow.engine.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
/**
 * æµç¨‹æ¨¡æ¿
 *
 * @author wang1
 */
@Data
@TableName("ACT_DE_PROCESS_TEMPLATE")
public class ProcessTemplate implements Serializable {
    private static final long serialVersionUID = 1L;
    private String id;
    private String templateId;//当前模板id
    private String modelKey;//流程模型key,部署key
    private String modelName;//部署流程名称
    private String buttonTypeKey;//应用按钮,ProcessTemplateTypeEnum的key
    private String buttonTypeValue;//应用按钮,ProcessTemplateTypeEnum的value
    private String description;
    private Date created;
    private Date lastUpdated;
    private String createdBy;
    private String lastUpdatedBy;
}
Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/mapper/FlowMapper.java
@@ -19,6 +19,7 @@
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.vci.ubcs.flow.engine.entity.FlowModel;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@@ -43,4 +44,5 @@
     * @return
     */
    List<FlowModel> findByParentModelId(String parentModelId);
}
Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/mapper/FlowTaskUserMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,34 @@
/*
 *      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.flow.engine.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.vci.ubcs.flow.engine.entity.FlowModel;
import com.vci.ubcs.flow.engine.entity.FlowTaskUser;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
 * æµç¨‹é˜¶æ®µå®¡æ ¸äººå‘˜
 *
 * @author wang1
 */
public interface FlowTaskUserMapper extends BaseMapper<FlowTaskUser> {
}
Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/mapper/ProcessStageAttrMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,29 @@
/*
 *      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.flow.engine.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.vci.ubcs.flow.engine.entity.ProcessStageAttr;
/**
 * æµç¨‹é˜¶æ®µ
 *
 * @author wang1
 */
public interface ProcessStageAttrMapper extends BaseMapper<ProcessStageAttr> {
}
Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/mapper/ProcessTemplateMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,30 @@
/*
 *      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.flow.engine.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.vci.ubcs.flow.engine.entity.FlowTaskUser;
import com.vci.ubcs.flow.engine.entity.ProcessTemplate;
/**
 * æµç¨‹æ¨¡æ¿
 *
 * @author wang1
 */
public interface ProcessTemplateMapper extends BaseMapper<ProcessTemplate> {
}
Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/service/FlowEngineService.java
@@ -23,6 +23,7 @@
import com.vci.ubcs.flow.engine.entity.FlowModel;
import com.vci.ubcs.flow.engine.entity.FlowProcess;
import org.springframework.web.multipart.MultipartFile;
import org.w3c.dom.Document;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
@@ -163,4 +164,13 @@
     * @return
     */
    byte[] getModelEditorXML(FlowModel model);
    /**
     * æ ¹æ®æµç¨‹æ¨¡åž‹key获取XML中节点配置的处理人,读取节点名称和配置的值,流程模型key已经限制不重复
     *
     * @param key
     * @return
     */
    List<Map<String,String>> getNodeByFlowableKey(String key);
}
Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/service/FlowTaskUserService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,54 @@
/*
 *      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.flow.engine.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.vci.ubcs.flow.core.entity.BladeFlow;
import com.vci.ubcs.flow.engine.entity.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.Map;
/**
 * FlowService
 *
 * @author wang1
 */
public interface FlowTaskUserService extends IService<FlowTaskUser> {
    /**
     * æŸ¥è¯¢å½“前登陆人对这个流程的taskUser
     * @return
     */
    FlowTaskUserC getUser();
    /**
     * æ–°å¢ž/修改流程节点审核人配置、并且修改流程xml部署文件
     * @param flowTaskUserC
     * @return
     */
    void saveOrUpdateUser(FlowTaskUserC flowTaskUserC);
    /**
     * åˆ é™¤æµç¨‹å®¡æ ¸äººå‘˜
     * @param name
     */
    void deleteUser(String name);
}
Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/service/ProcessStageAttrService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,39 @@
/*
 *      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.flow.engine.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.vci.ubcs.flow.engine.entity.FlowTaskUserC;
import com.vci.ubcs.flow.engine.entity.ProcessStageAttr;
import java.util.List;
/**
 * æµç¨‹é˜¶æ®µæœåŠ¡
 *
 * @author wang1
 */
public interface ProcessStageAttrService extends IService<ProcessStageAttr> {
    /**
     * æ–°å¢ž/修改流程阶段
     * @param flowTaskUserC
     * @return
     */
    void saveOrUpdateUser(FlowTaskUserC flowTaskUserC);
}
Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/service/ProcessTemplateService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,56 @@
/*
 *      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.flow.engine.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.vci.ubcs.flow.engine.entity.FlowTaskUser;
import com.vci.ubcs.flow.engine.entity.FlowTaskUserC;
import com.vci.ubcs.flow.engine.entity.ProcessTemplate;
import com.vci.ubcs.starter.web.enumpck.ProcessTemplateTypeEnum;
import java.util.List;
import java.util.Map;
/**
 * æµç¨‹æ¨¡æ¿æœåŠ¡
 *
 * @author wang1
 */
public interface ProcessTemplateService extends IService<ProcessTemplate> {
    /**
     * æ–°å¢ž/修改流程模板
     * @param processTemplate
     * @return
     */
    void saveOrUpdateUser(ProcessTemplate processTemplate);
    /**
     * åˆ é™¤æµç¨‹æ¨¡æ¿
     * @param id
     * @return
     */
    void deleteProcessTemplate(String id);
    /**
     * æµç¨‹æ¨¡æ¿ç”¨é€”
     * @return
     */
    List<Map<String,String>> processTemplateType();
}
Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/service/impl/FlowEngineServiceImpl.java
@@ -16,6 +16,8 @@
 */
package com.vci.ubcs.flow.engine.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.fasterxml.jackson.databind.ObjectMapper;
@@ -34,9 +36,11 @@
import com.vci.ubcs.system.user.entity.User;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.MapUtils;
import org.apache.commons.lang3.StringUtils;
import org.flowable.bpmn.converter.BpmnXMLConverter;
import org.flowable.bpmn.model.BpmnModel;
import org.flowable.bpmn.model.*;
import org.flowable.bpmn.model.Process;
import org.flowable.common.engine.impl.util.IoUtil;
import org.flowable.common.engine.impl.util.io.StringStreamSource;
@@ -47,6 +51,7 @@
import org.flowable.engine.impl.persistence.entity.ExecutionEntityImpl;
import org.flowable.engine.impl.persistence.entity.ProcessDefinitionEntityImpl;
import org.flowable.engine.repository.Deployment;
import org.flowable.engine.repository.DeploymentQuery;
import org.flowable.engine.repository.ProcessDefinition;
import org.flowable.engine.repository.ProcessDefinitionQuery;
import org.flowable.engine.runtime.ProcessInstance;
@@ -54,6 +59,7 @@
import org.flowable.engine.task.Comment;
import org.flowable.image.ProcessDiagramGenerator;
import org.springblade.core.log.exception.ServiceException;
import org.springblade.core.mp.support.Condition;
import org.springblade.core.secure.utils.AuthUtil;
import org.springblade.core.tool.utils.DateUtil;
import org.springblade.core.tool.utils.FileUtil;
@@ -61,11 +67,17 @@
import org.springblade.core.tool.utils.StringUtil;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import org.w3c.dom.*;
import org.xml.sax.InputSource;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.StringReader;
import java.util.*;
/**
@@ -90,6 +102,12 @@
    private final HistoryService historyService;
    private final TaskService taskService;
    private final ProcessEngine processEngine;
    /**
     * æ•°æ®æ“ä½œå¯¹è±¡
     */
    @Resource
    private FlowMapper flowMapper;
    @Override
    public IPage<FlowModel> selectFlowPage(IPage<FlowModel> page, FlowModel flowModel) {
@@ -296,6 +314,7 @@
    @Override
    public boolean deployModel(String modelId, String category, List<String> tenantIdList) {
        FlowModel model = this.getById(modelId);
        if (model == null) {
            throw new ServiceException("未找到模型 id: " + modelId);
@@ -346,6 +365,12 @@
    @Override
    public FlowModel submitModel(FlowModel model) {
        //验证重复key
        if(StringUtils.isEmpty(model.getId())&&getFlowModelByKey(model.getModelKey())!=null){
            throw new ServiceException("you cannot definition repetition æµç¨‹key!");
        }
        FlowModel flowModel = new FlowModel();
        flowModel.setId(model.getId());
        flowModel.setVersion(Func.toInt(model.getVersion(), 0) + 1);
@@ -467,6 +492,33 @@
    }
    /**
     * æ ¹æ®æµç¨‹æ¨¡åž‹key获取XML中节点配置的处理人
     *
     * @param key
     * @return
     */
    @Override
    public List<Map<String,String>> getNodeByFlowableKey(String key){
        String processDefinitionId = repositoryService.createProcessDefinitionQuery().latestVersion().processDefinitionKey(key).singleResult().getId();
        BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinitionId);
        Process process = bpmnModel.getProcesses().get(0);//只有一个
        List<Map<String,String>> ll = new ArrayList<>();
        if (CollectionUtils.isNotEmpty(process.getFlowElements())) {
            for (FlowElement flowElement : process.getFlowElements()) {
                if (flowElement instanceof UserTask) {
                    Map<String,String> mi = new HashMap<>();
                    mi.put("taskId",flowElement.getId());
                    mi.put("taskName",flowElement.getName());
                    ll.add(mi);
                }
            }
        }
        return ll;
    }
    /**
     * æ˜¯å¦å·²å®Œç»“
     *
     * @param processInstanceId æµç¨‹å®žä¾‹id
@@ -476,7 +528,6 @@
        return historyService.createHistoricProcessInstanceQuery().finished()
            .processInstanceId(processInstanceId).count() > 0;
    }
    /**
     * xml转bpmn json
@@ -556,4 +607,10 @@
        }
    }
    public FlowModel getFlowModelByKey(String key){
        Map kv = new HashMap();
        kv.put("model_key",key);
        return baseMapper.selectOne(Condition.getQueryWrapper(kv, FlowModel.class));
    }
}
Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/service/impl/FlowTaskUserServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,146 @@
/*
 *      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.flow.engine.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.vci.ubcs.flow.core.entity.BladeFlow;
import com.vci.ubcs.flow.core.enums.FlowModeEnum;
import com.vci.ubcs.flow.core.utils.TaskUtil;
import com.vci.ubcs.flow.engine.constant.FlowEngineConstant;
import com.vci.ubcs.flow.engine.entity.*;
import com.vci.ubcs.flow.engine.mapper.FlowMapper;
import com.vci.ubcs.flow.engine.mapper.FlowTaskUserMapper;
import com.vci.ubcs.flow.engine.service.FlowEngineService;
import com.vci.ubcs.flow.engine.service.FlowTaskUserService;
import com.vci.ubcs.flow.engine.utils.FlowCache;
import com.vci.ubcs.system.user.cache.UserCache;
import com.vci.ubcs.system.user.entity.User;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.flowable.bpmn.converter.BpmnXMLConverter;
import org.flowable.bpmn.model.BpmnModel;
import org.flowable.bpmn.model.Process;
import org.flowable.common.engine.impl.util.IoUtil;
import org.flowable.common.engine.impl.util.io.StringStreamSource;
import org.flowable.editor.language.json.converter.BpmnJsonConverter;
import org.flowable.engine.*;
import org.flowable.engine.history.HistoricActivityInstance;
import org.flowable.engine.history.HistoricProcessInstance;
import org.flowable.engine.impl.persistence.entity.ExecutionEntityImpl;
import org.flowable.engine.impl.persistence.entity.ProcessDefinitionEntityImpl;
import org.flowable.engine.repository.Deployment;
import org.flowable.engine.repository.ProcessDefinition;
import org.flowable.engine.repository.ProcessDefinitionQuery;
import org.flowable.engine.runtime.ProcessInstance;
import org.flowable.engine.runtime.ProcessInstanceQuery;
import org.flowable.engine.task.Comment;
import org.flowable.image.ProcessDiagramGenerator;
import org.springblade.core.launch.constant.FlowConstant;
import org.springblade.core.log.exception.ServiceException;
import org.springblade.core.mp.support.Condition;
import org.springblade.core.secure.utils.AuthUtil;
import org.springblade.core.tool.utils.DateUtil;
import org.springblade.core.tool.utils.FileUtil;
import org.springblade.core.tool.utils.Func;
import org.springblade.core.tool.utils.StringUtil;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.StringReader;
import java.util.*;
/**
 * å·¥ä½œæµæœåŠ¡å®žçŽ°ç±»
 *
 * @author wang1
 */
@Slf4j
@Service
@AllArgsConstructor
public class FlowTaskUserServiceImpl extends ServiceImpl<FlowTaskUserMapper, FlowTaskUser> implements FlowTaskUserService {
    private FlowEngineService flowEngineService;
    private FlowTaskUserMapper flowTaskUserMapper;
    /**
     * æŸ¥è¯¢å½“前登陆人对这个流程的taskUser
     * @return
     */
    @Override
    public FlowTaskUserC getUser(){
        QueryWrapper<FlowTaskUser> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("CREATED_BY", AuthUtil.getUserId());
        List<FlowTaskUser> flowTaskUsers = baseMapper.selectList(queryWrapper);
        FlowTaskUserC flowTaskUserCR = new FlowTaskUserC();
        if(flowTaskUsers.size()==0){
            return flowTaskUserCR;
        }
        flowTaskUserCR.setName(flowTaskUsers.get(0).getName());//收藏名称
        flowTaskUserCR.setFlowTaskUsers(flowTaskUsers);
        return flowTaskUserCR;
    }
    @Override
    public void saveOrUpdateUser(FlowTaskUserC flowTaskUserC){
        List<FlowTaskUser> flowTaskUsers = flowTaskUserC.getFlowTaskUsers();
        String name = flowTaskUserC.getName();//收藏名称
        //新增情况下验证收藏名称不重复
        if(flowTaskUsers.get(0).getId()!=null) {
            Map<String, Object> m = new HashMap<>();
            m.put("name", name);
            QueryWrapper q = Condition.getQueryWrapper(m, FlowTaskUser.class)
                .select("id,model_key modelKey,name,description,version,created,last_updated lastUpdated");
            if(flowTaskUserMapper.selectCount(q)>0){
                throw new ServiceException("收藏名称已经存在!");
            }
        }
        for (FlowTaskUser flowTaskUseri:flowTaskUsers){
            flowTaskUseri.setName(name);
        }
        //新增、修改
        this.saveOrUpdateBatch(flowTaskUsers);
    }
    @Override
    public void deleteUser(String name){
        Map<String, Object> m = new HashMap<>();
        m.put("name", name);
        m.put("created_by", AuthUtil.getUserId());
        baseMapper.deleteByMap(m);
    }
}
Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/service/impl/ProcessStageAttrServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,81 @@
/*
 *      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.flow.engine.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.vci.ubcs.flow.engine.entity.FlowTaskUser;
import com.vci.ubcs.flow.engine.entity.FlowTaskUserC;
import com.vci.ubcs.flow.engine.entity.ProcessStageAttr;
import com.vci.ubcs.flow.engine.mapper.ProcessStageAttrMapper;
import com.vci.ubcs.flow.engine.service.ProcessStageAttrService;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springblade.core.mp.support.Condition;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 * æµç¨‹é˜¶æ®µæœåŠ¡å®žçŽ°ç±»
 *
 * @author wang1
 */
@Slf4j
@Service
@AllArgsConstructor
public class ProcessStageAttrServiceImpl extends ServiceImpl<ProcessStageAttrMapper, ProcessStageAttr> implements ProcessStageAttrService {
    /**
     * æ–°å¢ž/修改流程阶段
     * @param flowTaskUserC
     * @return
     */
    @Transactional
    public void saveOrUpdateUser(FlowTaskUserC flowTaskUserC){
        List<ProcessStageAttr> processStageAttrs = flowTaskUserC.getProcessStageAttr();
        String modelKey = flowTaskUserC.getModelKey();
        String templateId = flowTaskUserC.getTemplateId();
        String taskId = flowTaskUserC.getTaskId();
        String taskName = flowTaskUserC.getTaskName();
        //直接删除以前的
        Map<String, Object> m = new HashMap<>();
        m.put("template_id", templateId);
        m.put("model_key", modelKey);
        m.put("task_id", taskId);
        QueryWrapper q = Condition.getQueryWrapper(m, FlowTaskUser.class)
            .select("id,model_key modelKey,name,description,version,created,last_updated lastUpdated");
        int i = baseMapper.deleteByMap(m);
        System.out.println("删除的属性个数: "+i);
        List<ProcessStageAttr> processStages = flowTaskUserC.getProcessStageAttr();
        for (ProcessStageAttr processStageAttr:processStages){
            processStageAttr.setModelKey(modelKey);
            processStageAttr.setTemplateId(templateId);
            processStageAttr.setTaskId(taskId);
            processStageAttr.setTaskName(taskName);
        }
        if(processStages.size()!=0) {
            this.saveOrUpdateBatch(processStages);
        }
    }
}
Source/UBCS/ubcs-ops/ubcs-flow/src/main/java/com/vci/ubcs/flow/engine/service/impl/ProcessTemplateServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,107 @@
/*
 *      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.flow.engine.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.vci.ubcs.flow.core.utils.TaskUtil;
import com.vci.ubcs.flow.engine.entity.FlowTaskUser;
import com.vci.ubcs.flow.engine.entity.FlowTaskUserC;
import com.vci.ubcs.flow.engine.entity.ProcessTemplate;
import com.vci.ubcs.flow.engine.mapper.FlowTaskUserMapper;
import com.vci.ubcs.flow.engine.mapper.ProcessTemplateMapper;
import com.vci.ubcs.flow.engine.service.FlowEngineService;
import com.vci.ubcs.flow.engine.service.FlowTaskUserService;
import com.vci.ubcs.flow.engine.service.ProcessTemplateService;
import com.vci.ubcs.starter.web.enumpck.ProcessTemplateTypeEnum;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springblade.core.launch.constant.FlowConstant;
import org.springblade.core.log.exception.ServiceException;
import org.springblade.core.mp.support.Condition;
import org.springframework.stereotype.Service;
import java.util.*;
/**
 * æµç¨‹æ¨¡æ¿æœåŠ¡å®žçŽ°ç±»
 *
 * @author wang1
 */
@Slf4j
@Service
@AllArgsConstructor
public class ProcessTemplateServiceImpl extends ServiceImpl<ProcessTemplateMapper, ProcessTemplate> implements ProcessTemplateService {
    /**
     * æ–°å¢ž/修改流程模板
     * @param processTemplate
     * @return
     */
    public void saveOrUpdateUser(ProcessTemplate processTemplate){
        //校验这个模板下,一类按钮只能有一个模板
        QueryWrapper<ProcessTemplate> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("button_type_key", processTemplate.getButtonTypeKey());
        if(StringUtils.isNotEmpty(processTemplate.getId())) {//修改的时候,id为空就是新增
            queryWrapper.ne("id", processTemplate.getId());
        }
        if(baseMapper.selectOne(queryWrapper)!=null){
            throw new ServiceException(processTemplate.getButtonTypeValue()+"功能已经配置了流程!");
        }
        if(StringUtils.isEmpty(processTemplate.getButtonTypeValue())){
            processTemplate.setButtonTypeValue(ProcessTemplateTypeEnum.getTextByValue(processTemplate.getButtonTypeKey()));
        }
        //新增或者修改
        if(StringUtils.isEmpty(processTemplate.getId())){
            processTemplate.setCreated(Calendar.getInstance().getTime());
            processTemplate.setCreatedBy(TaskUtil.getTaskUser());
            processTemplate.setLastUpdated(Calendar.getInstance().getTime());
            processTemplate.setLastUpdatedBy(TaskUtil.getTaskUser());
        }
        this.saveOrUpdate(processTemplate);
    }
    /**
     * åˆ é™¤æµç¨‹æ¨¡æ¿
     * @param id
     * @return
     */
    public void deleteProcessTemplate(String id){
        baseMapper.deleteById(id);
    }
    /**
     * æµç¨‹æ¨¡æ¿ç”¨é€”
     * @return
     */
    public List<Map<String,String>> processTemplateType(){
        ProcessTemplateTypeEnum[] es = ProcessTemplateTypeEnum.values();
        List<Map<String,String>> ll = new ArrayList<>();
        for (ProcessTemplateTypeEnum p:es){
            Map<String,String> mi = new HashMap<>();
            String value = p.getValue();
            String text = p.getText();
            mi.put("codee",value);
            mi.put("namee",text);
            ll.add(mi);
        }
        return ll;
    }
}
Source/UBCS/ubcs-ops/ubcs-resource/src/main/java/com/vci/ubcs/resource/controller/AttachController.java
@@ -38,6 +38,8 @@
/**
 * é™„件表 æŽ§åˆ¶å™¨
 *
 *
 *
 * @author Chill
 */
@NonDS
Source/UBCS/ubcs-ops/ubcs-resource/src/main/java/com/vci/ubcs/resource/controller/FileController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,170 @@
package com.vci.ubcs.resource.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.vci.ubcs.resource.dto.FileObjectDTO;
import com.vci.ubcs.resource.dto.FileReleaseDTO;
import com.vci.ubcs.resource.dto.FileShareDTO;
import com.vci.ubcs.resource.query.FileQuery;
import com.vci.ubcs.resource.service.IFileService;
import com.vci.ubcs.resource.utils.FileDownloadUtil;
import com.vci.ubcs.resource.vo.FileObjectVO;
import com.vci.ubcs.starter.web.util.LangBaseUtil;
import com.vci.ubcs.starter.web.util.VciBaseUtil;
import org.springblade.core.mp.support.Query;
import org.springblade.core.oss.MinioTemplate;
import org.springblade.core.tool.api.R;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.util.Collection;
import java.util.List;
/**
 * æ–‡ä»¶æŽ§åˆ¶å™¨
 * @author weidy
 * @date 2023-6/9
 */
@RestController()
@RequestMapping("/fileController")
public class FileController {
    /**
     * æ–‡ä»¶æœåŠ¡
     */
    @Autowired
    private IFileService fileService;
    /**
     * minio的配置
     */
    @Autowired
    private MinioTemplate minioTemplate;
    /**
     * æ ¹æ®æ–‡ä»¶ä¸»é”®ä¸‹è½½æ–‡ä»¶
     * @param fileOids æ–‡ä»¶çš„主键
     * @param response å“åº”的对象
     * @return æ‰§è¡Œç»“果,只有下载失败的时候才会这样
     */
    @RequestMapping(value = "/downloadFilesByOids",method = {RequestMethod.GET,RequestMethod.POST})
    public R downloadFilesByOids(@RequestParam String fileOids, HttpServletResponse response){
        try{
            FileDownloadUtil.downloadFile(response, fileService.downloadFileByOids(VciBaseUtil.str2List(fileOids)));
        }catch (Throwable e){
            return R.fail(LangBaseUtil.getErrorMsg(e));
        }
        return R.success("下载完成");
    }
    /**
     * æ–‡ä»¶åˆ é™¤
     * @param oids æ–‡ä»¶çš„主键
     * @return æ–‡ä»¶å†…容
     */
    @DeleteMapping("/deleteFile")
    public R deleteFile(@RequestBody Collection<String> oids){
        fileService.deleteFiles(oids);
        return R.success("删除成功");
    }
    /**
     * å‰ç«¯é¡µé¢å•文件上传。(先数据,后文件模式上传)
     * @param file ä¸Šä¼ çš„æ–‡ä»¶
     * @param fileObjectDTO æ–‡ä»¶ä¿¡æ¯ä¼ è¾“对象
     * @return æ–‡ä»¶ä¿¡æ¯æ˜¾ç¤ºå¯¹è±¡
     */
    @PostMapping("/uploadFile")
    public R<FileObjectVO> uploadFile(MultipartFile file, FileObjectDTO fileObjectDTO){
        if (file != null ) {
            return fileService.uploadFile(file, fileObjectDTO);
        } else {
            return R.fail("无上传的文件");
        }
    }
    /**
     * åœ¨ä¸Šä¼ æ–‡ä»¶åŽï¼Œä¿å­˜æ–‡ä»¶çš„信息
     * @param fileObjectDTO æ–‡ä»¶ä¿¡æ¯ä¼ è¾“对象
     * @return æ–‡ä»¶ä¿¡æ¯æ˜¾ç¤ºå¯¹è±¡
     */
    @PostMapping("/saveFileAfterUpload")
    public R<FileObjectVO> saveFileAfterUpload( @RequestBody FileObjectDTO fileObjectDTO){
       return fileService.saveFileAfterUpload(fileObjectDTO);
    }
    /**
     * å°†åŽŸæ•°æ®ä¸‹çš„æ‰€æœ‰æ–‡ä»¶å…±äº«åˆ°å…¶ä»–çš„ä¸šåŠ¡æ•°æ®ä¸‹
     * @param shareDTO æ–‡ä»¶åˆ†äº«
     * @return æ–‡ä»¶ä¿¡æ¯æ˜¾ç¤ºå¯¹è±¡,是多个
     */
    @PostMapping("/shareFiles")
    public R<List<FileObjectVO>> shareFiles(@RequestBody FileShareDTO shareDTO){
        return fileService.shareFiles(shareDTO);
    }
    /**
     * ä¿®æ”¹æ–‡ä»¶ä¿¡æ¯(不含文件),注意objectName和filePath不会变化
     * @param fileDTOs æ–‡ä»¶çš„æ•°æ®å¯¹è±¡
     * @return æ‰§è¡Œç»“æžœ
     */
    @PostMapping("/updateFileInfos")
    public R updateFileInfos(@RequestBody Collection<FileObjectDTO> fileDTOs){
        return fileService.updateFileInfos(fileDTOs);
    }
    /**
     * æ–‡ä»¶ç”Ÿæ•ˆ
     * @param ids æ–‡ä»¶çš„主键
     * @return æ‰§è¡Œç»“æžœ
     */
    @PutMapping("/releasedFiles")
    public R releasedFiles(@RequestBody Collection<String> ids){
        return fileService.releasedFiles(ids);
    }
    /**
     * æ‰¹é‡æŒ‡å®šæ–‡ä»¶ä¸šåŠ¡æ•°æ®åŽç”Ÿæ•ˆ
     * @param releaseDTOS ç”Ÿæ•ˆçš„相关信息
     * @return æ‰§è¡Œç»“æžœ
     */
    @PutMapping("/releasedFilesForOwn")
    public R releasedFilesForOwn(@RequestBody Collection<FileReleaseDTO> releaseDTOS){
        return fileService.releasedFilesForOwn(releaseDTOS);
    }
    /**
     * ä½¿ç”¨ä¸šåŠ¡ç±»åž‹æŸ¥è¯¢æ–‡ä»¶çš„ä¿¡æ¯ï¼Œæä¾›ç»™é¡µé¢è°ƒç”¨
     * @param fileQuery æŸ¥è¯¢å¯¹è±¡
     * @return æ–‡ä»¶çš„æ˜¾ç¤ºå¯¹è±¡
     */
    @RequestMapping(value = "/listFiles",method = {RequestMethod.GET,RequestMethod.POST})
    public R<IPage<FileObjectVO>> listFiles(FileQuery fileQuery, Query query){
        return R.data(fileService.listFiles(fileQuery,query));
    }
    /**
     * ä½¿ç”¨æ–‡ä»¶ä¸»é”®èŽ·å–å¯¹è±¡
     * @param oid ä¸»é”®
     * @return æ–‡ä»¶æ˜¾ç¤ºå¯¹è±¡
     */
    @GetMapping("/get")
    public FileObjectVO get(String oid){
        return fileService.get(oid);
    }
    /**
     * ä½¿ç”¨æ–‡ä»¶çš„主键批量获取对象
     * @param oids æ–‡ä»¶çš„主键集合
     * @return æ–‡ä»¶çš„æ˜¾ç¤ºä¿¡æ¯
     */
    @GetMapping("/listFilesByOids")
    public List<FileObjectVO> listFilesByOids( Collection<String> oids){
        return fileService.listFilesByOids(oids);
    }
}
Source/UBCS/ubcs-ops/ubcs-resource/src/main/java/com/vci/ubcs/resource/endpoint/OssEndpoint.java
@@ -17,6 +17,10 @@
package com.vci.ubcs.resource.endpoint;
import com.vci.ubcs.resource.entity.Attach;
import com.vci.ubcs.resource.service.IFileService;
import com.vci.ubcs.resource.utils.FileDownloadUtil;
import com.vci.ubcs.starter.web.util.LangBaseUtil;
import com.vci.ubcs.starter.web.util.VciBaseUtil;
import io.swagger.annotations.Api;
import lombok.AllArgsConstructor;
import lombok.SneakyThrows;
@@ -28,11 +32,16 @@
import org.springblade.core.tool.utils.Func;
import com.vci.ubcs.resource.builder.oss.OssBuilder;
import com.vci.ubcs.resource.service.IAttachService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
/**
 * å¯¹è±¡å­˜å‚¨ç«¯ç‚¹
 *
 * è¿™ä¸ªç±»ä¸ä½¿ç”¨ï¼Œç»Ÿä¸€ç”¨fileController
 *
 * @author Chill
 */
@@ -41,6 +50,7 @@
@AllArgsConstructor
@RequestMapping("/oss/endpoint")
@Api(value = "对象存储端点", tags = "对象存储端点")
@Deprecated
public class OssEndpoint {
    /**
@@ -52,6 +62,7 @@
     * é™„件表服务
     */
    private final IAttachService attachService;
    /**
     * åˆ›å»ºå­˜å‚¨æ¡¶
@@ -68,7 +79,7 @@
    }
    /**
     * åˆ›å»ºå­˜å‚¨æ¡¶
     * åˆ é™¤å­˜å‚¨æ¡¶
     *
     * @param bucketName å­˜å‚¨æ¡¶åç§°
     * @return R
@@ -107,6 +118,7 @@
    public R<OssFile> statFile(@RequestParam String fileName) {
        return R.data(ossBuilder.template().statFile(fileName));
    }
    /**
     * èŽ·å–æ–‡ä»¶ç›¸å¯¹è·¯å¾„
@@ -160,37 +172,37 @@
        return R.data(bladeFile);
    }
    /**
     * ä¸Šä¼ æ–‡ä»¶å¹¶ä¿å­˜è‡³é™„件表
     *
     * @param file æ–‡ä»¶
     * @return ObjectStat
     */
    @SneakyThrows
    @PostMapping("/put-file-attach")
    public R<BladeFile> putFileAttach(@RequestParam MultipartFile file) {
        String fileName = file.getOriginalFilename();
        BladeFile bladeFile = ossBuilder.template().putFile(fileName, file.getInputStream());
        Long attachId = buildAttach(fileName, file.getSize(), bladeFile);
        bladeFile.setAttachId(attachId);
        return R.data(bladeFile);
    }
//    /**
//     * ä¸Šä¼ æ–‡ä»¶å¹¶ä¿å­˜è‡³é™„件表
//     *
//     * @param file æ–‡ä»¶
//     * @return ObjectStat
//     */
//    @SneakyThrows
//    @PostMapping("/put-file-attach")
//    public R<BladeFile> putFileAttach(@RequestParam MultipartFile file) {
//        String fileName = file.getOriginalFilename();
//        BladeFile bladeFile = ossBuilder.template().putFile(fileName, file.getInputStream());
//        Long attachId = buildAttach(fileName, file.getSize(), bladeFile);
//        bladeFile.setAttachId(attachId);
//        return R.data(bladeFile);
//    }
    /**
     * ä¸Šä¼ æ–‡ä»¶å¹¶ä¿å­˜è‡³é™„件表
     *
     * @param fileName å­˜å‚¨æ¡¶å¯¹è±¡åç§°
     * @param file     æ–‡ä»¶
     * @return ObjectStat
     */
    @SneakyThrows
    @PostMapping("/put-file-attach-by-name")
    public R<BladeFile> putFileAttach(@RequestParam String fileName, @RequestParam MultipartFile file) {
        BladeFile bladeFile = ossBuilder.template().putFile(fileName, file.getInputStream());
        Long attachId = buildAttach(fileName, file.getSize(), bladeFile);
        bladeFile.setAttachId(attachId);
        return R.data(bladeFile);
    }
//    /**
//     * ä¸Šä¼ æ–‡ä»¶å¹¶ä¿å­˜è‡³é™„件表
//     *
//     * @param fileName å­˜å‚¨æ¡¶å¯¹è±¡åç§°
//     * @param file     æ–‡ä»¶
//     * @return ObjectStat
//     */
//    @SneakyThrows
//    @PostMapping("/put-file-attach-by-name")
//    public R<BladeFile> putFileAttach(@RequestParam String fileName, @RequestParam MultipartFile file) {
//        BladeFile bladeFile = ossBuilder.template().putFile(fileName, file.getInputStream());
//        Long attachId = buildAttach(fileName, file.getSize(), bladeFile);
//        bladeFile.setAttachId(attachId);
//        return R.data(bladeFile);
//    }
    /**
     * æž„建附件表
Source/UBCS/ubcs-ops/ubcs-resource/src/main/java/com/vci/ubcs/resource/mapper/FileObjectMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,12 @@
package com.vci.ubcs.resource.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.vci.ubcs.resource.entity.FileObject;
/**
 * æ–‡ä»¶çš„æ•°æ®æ“ä½œç±»
 * @author weidy
 * @date 2023/6/9
 */
public interface FileObjectMapper extends BaseMapper<FileObject> {
}
Source/UBCS/ubcs-ops/ubcs-resource/src/main/java/com/vci/ubcs/resource/service/IFileService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,111 @@
package com.vci.ubcs.resource.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.vci.ubcs.resource.bo.FileObjectBO;
import com.vci.ubcs.resource.dto.FileObjectDTO;
import com.vci.ubcs.resource.dto.FileReleaseDTO;
import com.vci.ubcs.resource.dto.FileShareDTO;
import com.vci.ubcs.resource.entity.FileObject;
import com.vci.ubcs.resource.query.FileQuery;
import com.vci.ubcs.resource.vo.FileObjectVO;
import org.springblade.core.mp.support.Query;
import org.springblade.core.tool.api.R;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import java.util.Collection;
import java.util.List;
/**
 * æ–‡ä»¶çš„æœåŠ¡
 * @author weidy
 * @date 2023/1/31
 */
public interface IFileService extends IService<FileObject> {
    /**
     * ä¸‹è½½ï¼Œæ³¨æ„å¤šä¸ªæ–‡ä»¶çš„æ—¶å€™ï¼Œä¼šè‡ªåŠ¨ä¸‹è½½ä¸ºä¸€ä¸ªåŽ‹ç¼©åŒ…
     * @param oids ä¸»é”®é›†åˆ
     * @return æ–‡ä»¶çš„信息
     */
    FileObjectBO downloadFileByOids(Collection<String> oids);
    /**
     * åˆ é™¤æ–‡ä»¶
     * @param oids ä¸»é”®é›†åˆ
     * @return æ‰§è¡Œç»“æžœ
     */
    void deleteFiles(Collection<String> oids);
    /**
     * ä¸Šä¼ æ–‡ä»¶
     * @param file æ–‡ä»¶çš„信息
     * @param fileObjectDTO æ–‡ä»¶çš„相关信息
     * @return æ–‡ä»¶ä¸Šä¼ åŽçš„信息
     */
    R<FileObjectVO> uploadFile(MultipartFile file, FileObjectDTO fileObjectDTO);
    /**
     * ä¿®æ”¹æ–‡ä»¶çš„信息(不会改objectName和filePath)
     * @param fileDTOs æ–‡ä»¶çš„信息
     * @return ä¿®æ”¹åŽçš„信息
     */
    R<List<FileObjectVO>> updateFileInfos(Collection<FileObjectDTO> fileDTOs);
    FileObjectVO do2Vo(FileObject fileObject);
    List<FileObjectVO> do2Vos(Collection<FileObject> fileObjects);
    /**
     * åˆ†äº«æ–‡ä»¶åˆ°å…¶ä»–数据中
     *
     * @param shareDTO æ¥æºä¸šåŠ¡
     * @return åˆ†äº«åŽçš„æ–‡ä»¶ä¿¡æ¯
     */
    R<List<FileObjectVO>> shareFiles(FileShareDTO shareDTO);
    /**
     * æ–‡ä»¶åˆ—表查询
     * @param fileQuery æ–‡ä»¶æŸ¥è¯¢
     * @param query åˆ†é¡µæŸ¥è¯¢å¯¹è±¡
     * @return æ–‡ä»¶çš„æ˜¾ç¤ºä¿¡æ¯
     */
    IPage<FileObjectVO> listFiles(FileQuery fileQuery, Query query);
    /**
     * ä½¿ç”¨æ–‡ä»¶çš„主键批量获取对象
     * @param oids æ–‡ä»¶çš„主键集合
     * @return æ–‡ä»¶çš„æ˜¾ç¤ºä¿¡æ¯
     */
    List<FileObjectVO> listFilesByOids(Collection<String> oids);
    /**
     * æ–‡ä»¶ç”Ÿæ•ˆ
     * @param oids ä¸»é”®é›†åˆ
     * @return æ‰§è¡Œç»“æžœ
     */
    R releasedFiles(Collection<String> oids);
    /**
     * æ‰¹é‡æŒ‡å®šæ–‡ä»¶ä¸šåŠ¡æ•°æ®åŽç”Ÿæ•ˆ
     * @param releaseDTOS ç”Ÿæ•ˆçš„相关信息
     * @return æ‰§è¡Œç»“æžœ
     */
    R releasedFilesForOwn(Collection<FileReleaseDTO> releaseDTOS);
    /**
     * åœ¨ä¸Šä¼ æ–‡ä»¶åŽï¼Œä¿å­˜æ–‡ä»¶çš„信息
     * @param fileObjectDTO æ–‡ä»¶ä¿¡æ¯ä¼ è¾“对象
     * @return æ–‡ä»¶ä¿¡æ¯æ˜¾ç¤ºå¯¹è±¡
     */
    R<FileObjectVO> saveFileAfterUpload(FileObjectDTO fileObjectDTO);
    /**
     * èŽ·å–å¯¹è±¡
     * @param oid ä¸»é”®
     * @return æ–‡ä»¶çš„æ˜¾ç¤ºå¯¹è±¡
     */
    FileObjectVO get(String oid);
}
Source/UBCS/ubcs-ops/ubcs-resource/src/main/java/com/vci/ubcs/resource/service/impl/FileServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,536 @@
package com.vci.ubcs.resource.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.vci.ubcs.resource.bo.FileObjectBO;
import com.vci.ubcs.resource.dto.FileObjectDTO;
import com.vci.ubcs.resource.dto.FileReleaseDTO;
import com.vci.ubcs.resource.dto.FileShareDTO;
import com.vci.ubcs.resource.entity.Attach;
import com.vci.ubcs.resource.entity.FileObject;
import com.vci.ubcs.resource.life.FileLife;
import com.vci.ubcs.resource.mapper.FileObjectMapper;
import com.vci.ubcs.resource.query.FileQuery;
import com.vci.ubcs.resource.service.IFileService;
import com.vci.ubcs.resource.utils.FileUtil;
import com.vci.ubcs.resource.utils.ZipUtil;
import com.vci.ubcs.resource.vo.FileObjectVO;
import com.vci.ubcs.starter.exception.VciBaseException;
import com.vci.ubcs.starter.web.enumpck.BaseEnum;
import com.vci.ubcs.starter.web.enumpck.UserSecretEnum;
import com.vci.ubcs.starter.web.util.BeanUtil;
import com.vci.ubcs.starter.web.util.VciBaseUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.IOUtils;
import org.springblade.core.mp.support.Condition;
import org.springblade.core.mp.support.Query;
import org.springblade.core.oss.MinioTemplate;
import org.springblade.core.oss.OssTemplate;
import org.springblade.core.oss.model.BladeFile;
import org.springblade.core.oss.model.OssFile;
import org.springblade.core.oss.props.OssProperties;
import org.springblade.core.oss.rule.OssRule;
import org.springblade.core.secure.BladeUser;
import org.springblade.core.secure.utils.AuthUtil;
import org.springblade.core.tool.api.R;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.*;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.stream.Collectors;
/**
 * æ–‡ä»¶æœåŠ¡
 * @author weidy
 * @date 2023/2/1
 */
@Service
@Slf4j
public class FileServiceImpl extends ServiceImpl<FileObjectMapper, FileObject> implements IFileService {
    /**
     * æ–‡ä»¶çš„æ•°æ®æ“ä½œç±»
     */
    @Resource
    private FileObjectMapper fileObjectMapper;
    /**
     * å¯¹è±¡çš„æ¨¡ç‰ˆ
     */
    @Autowired
    private OssTemplate ossTemplate;
    /**
     * æ–‡ä»¶æœåŠ¡çš„é…ç½®
     */
    @Autowired
    private OssProperties ossProperties;
    /**
     * åŽ‹ç¼©æ–‡ä»¶çš„å·¥å…·ç±»
     */
    @Autowired
    private ZipUtil zipUtil;
    /***
     * æ–‡ä»¶çš„规则
     */
    @Autowired
    private OssRule ossRule;
    /**
     * ä¸‹è½½ï¼Œæ³¨æ„å¤šä¸ªæ–‡ä»¶çš„æ—¶å€™ï¼Œä¼šè‡ªåŠ¨ä¸‹è½½ä¸ºä¸€ä¸ªåŽ‹ç¼©åŒ…
     *
     * @param oids ä¸»é”®é›†åˆ
     * @return æ–‡ä»¶çš„信息
     */
    @Override
    public FileObjectBO downloadFileByOids(Collection<String> oids) {
        VciBaseUtil.alertNotNull(oids,"文件的主键集合");
        if(log.isDebugEnabled()){
            log.debug("下载文件,",oids.stream().collect(Collectors.joining(",")));
        }
        Collection<FileObjectVO> fileVOs = listFilesByOids(oids);
        FileObjectBO fileObjectBO = new FileObjectBO();
        if(fileVOs.size()==1){
            //只有一个
            FileObjectVO objectVO = fileVOs.stream().findFirst().get();
            BeanUtil.convert(objectVO,fileObjectBO);
            OssFile ossFile = ossTemplate.statFile(objectVO.getBucketName(), objectVO.getObjectName());
            if(ossFile == null || !StringUtils.hasLength(ossFile.getLink())){
                throw new VciBaseException("文件在存储里没有找到",oids.toArray(new String[0]));
            }
            URL url = null;
            try {
                url = new URL(ossFile.getLink());
            } catch (MalformedURLException e) {
                throw new VciBaseException("文件的获取路径有问题",new String[]{ossFile.getLink()},e);
            }
            try {
                fileObjectBO.setInputStream(url.openStream());
            }catch (Throwable e){
                throw new VciBaseException("获取文件的流有问题",new String[]{ossFile.getLink()},e);
            }
        }else{
            //有多个,需要使用zip进行压缩
            String tempFolder = FileUtil.getDefaultTempFolder();
            fileVOs.stream().forEach(fileVO->{
                String fileName = tempFolder + File.separator + fileVO.getName() + "." + fileVO.getFileExtension();
                File file = new File(fileName);
                try {
                    if(!file.exists()) {
                        file.createNewFile();
                    }
                }catch (Throwable e){
                    throw new VciBaseException("创建文件出错,{0}",new String[]{fileName});
                }
                OssFile ossFile = ossTemplate.statFile(fileVO.getBucketName(), fileVO.getObjectName());
                if(ossFile == null || !StringUtils.hasLength(ossFile.getLink())){
                    throw new VciBaseException("文件在存储里没有找到",oids.toArray(new String[0]));
                }
                URL url = null;
                try {
                    url = new URL(ossFile.getLink());
                } catch (MalformedURLException e) {
                    throw new VciBaseException("文件的获取路径有问题",new String[]{ossFile.getLink()},e);
                }
                try(OutputStream os = new FileOutputStream(file);
                    InputStream ins = url.openStream();
                ){
                    IOUtils.copy(ins,os);
                }catch (Throwable e){
                    throw new VciBaseException("下载文件到临时文件夹里出错,{0}",new String[]{fileName});
                }
            });
            String zipName = new File(tempFolder).getPath() + File.separator + fileVOs.stream().findFirst().get().getName() + "等"+fileVOs.size() + "个文件.zip";
            zipUtil.folderToZipFile(tempFolder,zipName);
            fileObjectBO.setFileLocalPath(zipName);
            if(log.isDebugEnabled()){
                log.debug("下载文件的信息,",zipName);
            }
        }
        return fileObjectBO;
    }
    /**
     * åˆ é™¤æ–‡ä»¶
     *
     * @param oids ä¸»é”®é›†åˆ
     * @return æ‰§è¡Œç»“æžœ
     */
    @Override
    @Transactional()
    public void deleteFiles(Collection<String> oids) {
        VciBaseUtil.alertNotNull(oids,"文件的主键集合");
        if(log.isDebugEnabled()){
            log.debug("删除文件,",oids.stream().collect(Collectors.joining(",")));
        }
        Collection<FileObject> fileObjects = listByIds(oids);
        if(!CollectionUtils.isEmpty(fileObjects)){
            VciBaseUtil.switchCollectionForOracleIn(fileObjects).stream().forEach(fileDOs->{
                fileObjectMapper.deleteBatchIds(fileDOs.stream().map(FileObject::getId).collect(Collectors.toList()));
            });
            //删除minio里的文件
            fileObjects.parallelStream().forEach(fileObject -> {
                ossTemplate.removeFile(fileObject.getBucketName(),fileObject.getObjectName());
            });
        }
    }
    /**
     * ä¸Šä¼ æ–‡ä»¶
     *
     * @param file          æ–‡ä»¶çš„信息
     * @param fileObjectDTO æ–‡ä»¶çš„相关信息
     * @return æ–‡ä»¶ä¸Šä¼ åŽçš„信息
     */
    @Override
    @Transactional
    public R<FileObjectVO> uploadFile(MultipartFile file, FileObjectDTO fileObjectDTO) {
        VciBaseUtil.alertNotNull(fileObjectDTO,"文件的信息");
        String sourceFileName = file.getOriginalFilename();
        String fileExtension = FileUtil.getFileExtensionByName(sourceFileName);
        String fileNameNoExtension = FileUtil.getFileNameUnHasExtensionByName(sourceFileName);
        if(fileObjectDTO.getUpdateFileFlag()==null || !fileObjectDTO.getUpdateFileFlag()) {
            return R.data(add(fileObjectDTO,file));
        }else{
            //修改,需要先获取
            VciBaseUtil.alertNotNull(fileObjectDTO.getOid(),"文件的主键");
            FileObject fileObject = getById(fileObjectDTO.getOid());
            if (StringUtils.hasLength(fileObjectDTO.getId())) {
                fileObject.setId(fileNameNoExtension);
            }
            fileObject.setName(fileNameNoExtension);
            fileObject.setFileExtension(fileExtension);
            fileObject.setFileSize(file.getSize());
            //以前的信息先获取
            String oldObjectName = fileObject.getObjectName();
            String oldBucketName = fileObject.getBucketName();
            String bucketName = StringUtils.hasLength(fileObjectDTO.getBucketName())?fileObjectDTO.getBucketName():ossProperties.getBucketName();
            BladeFile bladeFile = ossTemplate.putFile(bucketName,file.getOriginalFilename(),file);
            fileObject.setBucketName(bucketName);
            fileObject.setObjectName(bladeFile.getName());
            fileObject.setFileLink(bladeFile.getLink());
            fileObjectMapper.updateById(fileObject);
            //删除以前的
            ossTemplate.removeFile(oldBucketName,oldObjectName);
            if(log.isDebugEnabled()){
                log.debug("修改文件",fileObject.toString(),oldObjectName,oldBucketName);
            }
            FileObjectVO fileObjectVO = do2Vo(fileObject);
            return R.data(fileObjectVO);
        }
    }
    private FileObjectVO add(FileObjectDTO fileObjectDTO,MultipartFile file){
        String sourceFileName = file.getOriginalFilename();
        String fileExtension = FileUtil.getFileExtensionByName(sourceFileName);
        String fileNameNoExtension = FileUtil.getFileNameUnHasExtensionByName(sourceFileName);
        //存储业务数据与文件信息
        FileObject fileObject = new FileObject();
        BeanUtil.convert(fileObjectDTO, fileObject);
        if (!StringUtils.hasLength(fileObject.getId())) {
            fileObject.setId(fileNameNoExtension);
        }
        if (!StringUtils.hasLength(fileObject.getName())) {
            fileObject.setName(fileNameNoExtension);
        }
        fileObject.setFileExtension(fileExtension);
        fileObject.setFileSize(file.getSize());
        if (!StringUtils.hasLength(fileObject.getOid())) {
            fileObject.setOid(VciBaseUtil.getPk());
        }
        if (fileObjectDTO.getEffect() != null && fileObjectDTO.getEffect()) {
            fileObject.setLcStatus(FileLife.FILE_RELEASE.getValue());
        } else {
            fileObject.setLcStatus(FileLife.TRANS_FINISH.getValue());
        }
        if (fileObject.getSecretGrade() == null || fileObject.getSecretGrade() == 0) {
            // VciBaseUtil.getCurrentUserSecret()还需要处理,在进入服务的时候,根据当前用户的信息获取用户的对象
            fileObject.setSecretGrade( VciBaseUtil.getCurrentUserSecret());
        }
        String bucketName = StringUtils.hasLength(fileObjectDTO.getBucketName())?fileObjectDTO.getBucketName():ossProperties.getBucketName();
        //先存到Minio后再说
        BladeFile bladeFile = ossTemplate.putFile(bucketName,file.getOriginalFilename(),file);
        fileObject.setBucketName(bucketName);
        fileObject.setObjectName(bladeFile.getName());
        fileObject.setFileLink(bladeFile.getLink());
        fileObjectMapper.insert(fileObject);
        if(log.isDebugEnabled()){
            log.debug("新增文件",fileObject.toString());
        }
        FileObjectVO fileObjectVO = do2Vo(fileObject);
        return fileObjectVO;
    }
    /**
     * æ•°æ®å¯¹è±¡è½¬æ˜¾ç¤ºå¯¹è±¡
     * @param fileObject æ–‡ä»¶çš„æ•°æ®å¯¹è±¡
     * @return æ˜¾ç¤ºå¯¹è±¡
     */
    @Override
    public FileObjectVO do2Vo(FileObject fileObject) {
        FileObjectVO fileObjectVO = new FileObjectVO();
        BeanUtil.convert(fileObject,fileObjectVO);
        fileObjectVO.setLcStatusText(BaseEnum.getTextByValue(FileLife.class,fileObjectVO.getLcStatus()));
        //fileObjectVO.setSecretGradeText(UserSecretEnum);
        return fileObjectVO;
    }
    @Override
    public List<FileObjectVO> do2Vos(Collection<FileObject> fileObjects){
        List<FileObjectVO> fileObjectVOList = new ArrayList<>();
        Optional.ofNullable(fileObjects).orElseGet(ArrayList::new).stream().forEach(fo->{
            fileObjectVOList.add(do2Vo(fo));
        });
        return fileObjectVOList;
    }
    /**
     * åˆ†äº«æ–‡ä»¶åˆ°å…¶ä»–数据中
     *
     * @param shareDTO æ¥æºä¸šåŠ¡
     * @return åˆ†äº«åŽçš„æ–‡ä»¶ä¿¡æ¯
     */
    @Override
    @Transactional
    public R<List<FileObjectVO>> shareFiles(FileShareDTO shareDTO) {
        VciBaseUtil.alertNotNull(shareDTO,"分享的信息",shareDTO.getTargetBus(),"目标的业务名称",shareDTO.getTargetBusOid(),"目标的业务数据主键");
        List<FileObject> fileObjectList = new ArrayList<>();
        if(!CollectionUtils.isEmpty(shareDTO.getOids())){
            fileObjectList.addAll(listByIds(shareDTO.getOids()));
        }
        LambdaQueryWrapper<FileObject> queryWrapper = new LambdaQueryWrapper<FileObject>(FileObject.class);
        if(StringUtils.hasLength(shareDTO.getSourceBus())) {
            queryWrapper.in(FileObject::getOwnBtmName, VciBaseUtil.str2List(shareDTO.getSourceBus()));
        }
        if(StringUtils.hasLength(shareDTO.getSourceBusOid())){
            queryWrapper.in(FileObject::getOwnbizOid,VciBaseUtil.str2List(shareDTO.getSourceBusOid()));
        }
        fileObjectList.addAll(fileObjectMapper.selectList(queryWrapper));
        if(CollectionUtils.isEmpty(fileObjectList)){
            throw new VciBaseException("没有找到可以分享的文件");
        }
        BladeUser user = AuthUtil.getUser();
        Date now = new Date();
        List<FileObject> newFileObjects = new ArrayList<>();
        fileObjectList.stream().forEach(fileObject -> {
            FileObject newFileObject = new FileObject();
            BeanUtil.convert(fileObject,newFileObject);
            newFileObject.setId(VciBaseUtil.getPk());
            newFileObject.setNameOid(VciBaseUtil.getPk());
            newFileObject.setRevisionOid(VciBaseUtil.getPk());
            newFileObject.setCreator(user.getAccount());
            newFileObject.setCreateTime(now);
            newFileObject.setLastModifier(user.getAccount());
            newFileObject.setLastModifyTime(now);
            newFileObject.setTs(now);
            newFileObject.setOwnBtmName(shareDTO.getTargetBus());
            newFileObject.setOwnbizOid(shareDTO.getTargetBusOid());
            newFileObject.setObjectName(ossRule.fileName( "." + fileObject.getFileExtension()));
            //下载文件后,上传文件
            ossTemplate.copyFile(fileObject.getBucketName(),fileObject.getObjectName(),fileObject.getBucketName(),newFileObject.getObjectName());
            newFileObject.setFileLink(ossTemplate.fileLink(newFileObject.getBucketName(),newFileObject.getObjectName()));
            newFileObjects.add(newFileObject);
        });
        newFileObjects.stream().forEach(fileObject -> {
            fileObjectMapper.insert(fileObject);
        });
        return R.data(do2Vos(newFileObjects));
    }
    /**
     * ä¿®æ”¹æ–‡ä»¶çš„信息(不会改objectName和filePath)
     *
     * @param fileDTOs æ–‡ä»¶çš„信息
     * @return ä¿®æ”¹åŽçš„信息
     */
    @Override
    @Transactional
    public R<List<FileObjectVO>> updateFileInfos(Collection<FileObjectDTO> fileDTOs) {
        VciBaseUtil.alertNotNull(fileDTOs,"要更新的文件的信息");
        if(fileDTOs.stream().anyMatch(s->!StringUtils.hasLength(s.getId()))){
            throw new VciBaseException("要更新的文件信息的主键不能为空");
        }
        Map<String, FileObject> fileObjectMap = Optional.ofNullable(listByIds(fileDTOs.stream().map(FileObjectDTO::getId).collect(Collectors.toList()))).orElseGet(ArrayList::new).stream().collect(Collectors.toMap(s -> s.getOid(), t -> t, (o1, o2) -> o1));
        BladeUser user = AuthUtil.getUser();
        Date now = new Date();
        fileDTOs.stream().forEach(fileDTO->{
            if(!fileObjectMap.containsKey(fileDTO.getOid())){
                throw new VciBaseException("名称为{0}的文件在系统里不存在",new String[]{StringUtils.hasLength(fileDTO.getId())?fileDTO.getId():fileDTO.getName()});
            }
            FileObject fileObject = fileObjectMap.get(fileDTO.getId());
            String oldObjectName = fileObject.getObjectName();
            String oldBucketName = fileObject.getBucketName();
            String filePath = fileObject.getFileLink();
            BeanUtil.convert(fileDTO,fileObject);
            fileObject.setObjectName(oldObjectName);
            fileObject.setBucketName(oldBucketName);
            fileObject.setFileLink(filePath);
            fileObject.setLastModifier(user.getAccount());
            fileObject.setLastModifyTime(now);
            fileObject.setTs(now);
        });
       fileObjectMap.values().stream().forEach(fileObject -> {
           fileObjectMapper.updateById(fileObject);
        });
        return R.data(do2Vos(fileObjectMap.values()));
    }
    /**
     * æ–‡ä»¶åˆ—表查询
     *
     * @param fileQuery æ–‡ä»¶æŸ¥è¯¢
     * @return æ–‡ä»¶çš„æ˜¾ç¤ºä¿¡æ¯
     */
    @Override
    public IPage<FileObjectVO> listFiles(FileQuery fileQuery, Query query){
        IPage<FileObject> pages = page(Condition.getPage(query), Condition.getQueryWrapper(fileQuery));
        return pages.convert((fileObject -> do2Vo(fileObject)));
    }
    /**
     * ä½¿ç”¨æ–‡ä»¶çš„主键批量获取对象
     *
     * @param oids æ–‡ä»¶çš„主键集合
     * @return æ–‡ä»¶çš„æ˜¾ç¤ºä¿¡æ¯
     */
    @Override
    public List<FileObjectVO> listFilesByOids(Collection<String> oids) {
        return do2Vos(listByIds(oids));
    }
    /**
     * æ–‡ä»¶ç”Ÿæ•ˆ
     *
     * @param oids ä¸»é”®é›†åˆ
     * @return æ‰§è¡Œç»“æžœ
     */
    @Override
    @Transactional
    public R releasedFiles(Collection<String> oids) {
        Collection<FileObject> fileObjects = listByIds(oids);
        if(!CollectionUtils.isEmpty(fileObjects)){
            fileObjects.stream().forEach(obj->{
                obj.setLcStatus(FileLife.FILE_RELEASE.getValue());
                fileObjectMapper.updateById(obj);
            });
        }
        return R.success("生效成功");
    }
    /**
     * æ‰¹é‡æŒ‡å®šæ–‡ä»¶ä¸šåŠ¡æ•°æ®åŽç”Ÿæ•ˆ
     *
     * @param releaseDTOS ç”Ÿæ•ˆçš„相关信息
     * @return æ‰§è¡Œç»“æžœ
     */
    @Override
    @Transactional
    public R releasedFilesForOwn(Collection<FileReleaseDTO> releaseDTOS) {
        VciBaseUtil.alertNotNull(releaseDTOS,"发布的信息");
        List<FileObject> fileObjectList = new ArrayList<>();
        List<String> oids = new ArrayList<>();
        releaseDTOS.stream().filter(s->!CollectionUtils.isEmpty(s.getOids())).forEach(dtos->{
            oids.addAll(dtos.getOids());
        });
        if(!CollectionUtils.isEmpty(oids)){
            fileObjectList.addAll(listByIds(oids));
        }
        releaseDTOS.stream().forEach(dto->{
            LambdaQueryWrapper<FileObject> queryWrapper =   new LambdaQueryWrapper<>(FileObject.class);
            if(StringUtils.hasLength(dto.getOwnBtmName())) {
                queryWrapper.in(FileObject::getOwnBtmName, VciBaseUtil.str2List(dto.getOwnBtmName()));
            }
            if(StringUtils.hasLength(dto.getOwnbizOid())) {
                queryWrapper.in(FileObject::getOwnbizOid, VciBaseUtil.str2List(dto.getOwnbizOid()));
            }
            fileObjectList.addAll(fileObjectMapper.selectList(queryWrapper));
        });
        if(!CollectionUtils.isEmpty(fileObjectList)){
            fileObjectList.stream().forEach(objs->{
                objs.setLcStatus(FileLife.FILE_RELEASE.getValue());
                fileObjectMapper.updateById(objs);
            });
        }
        return R.success("生效成功");
    }
    /**
     * åœ¨ä¸Šä¼ æ–‡ä»¶åŽï¼Œä¿å­˜æ–‡ä»¶çš„信息
     *
     * @param fileObjectDTO æ–‡ä»¶ä¿¡æ¯ä¼ è¾“对象
     * @return æ–‡ä»¶ä¿¡æ¯æ˜¾ç¤ºå¯¹è±¡
     */
    @Override
    @Transactional
    public R<FileObjectVO> saveFileAfterUpload(FileObjectDTO fileObjectDTO) {
        if(fileObjectDTO.getEffect() !=null && fileObjectDTO.getEffect() && !StringUtils.hasLength(fileObjectDTO.getLcStatus())){
            fileObjectDTO.setLcStatus(FileLife.FILE_RELEASE.getValue());
        }
        return R.data(addOnlyInfo(fileObjectDTO));
    }
    /**
     * èŽ·å–å¯¹è±¡
     *
     * @param oid ä¸»é”®
     * @return æ–‡ä»¶çš„æ˜¾ç¤ºå¯¹è±¡
     */
    @Override
    public FileObjectVO get(String oid) {
        return do2Vo(getById(oid));
    }
    /**
     * ä»…添加信息
     * @param fileObjectDTO æ–‡ä»¶çš„æ•°æ®ä¼ è¾“对象
     * @return æ˜¾ç¤ºå¯¹è±¡
     */
    public FileObjectVO addOnlyInfo(FileObjectDTO fileObjectDTO){
        //存储业务数据与文件信息
        FileObject fileObject = new FileObject();
        BeanUtil.convert(fileObjectDTO, fileObject);
        if (!StringUtils.hasLength(fileObject.getOid())) {
            fileObject.setOid(VciBaseUtil.getPk());
        }
        if (fileObject.getSecretGrade() == null || fileObject.getSecretGrade() == 0) {
            // VciBaseUtil.getCurrentUserSecret()还需要处理,在进入服务的时候,根据当前用户的信息获取用户的对象
            fileObject.setSecretGrade( VciBaseUtil.getCurrentUserSecret());
        }
        fileObjectMapper.insert(fileObject);
        if(log.isDebugEnabled()){
            log.debug("新增文件",fileObject.toString());
        }
        return do2Vo(fileObject);
    }
}
Source/UBCS/ubcs-service-api/ubcs-code-api/pom.xml
@@ -12,7 +12,6 @@
    <name>${project.artifactId}</name>
    <version>${bladex.project.version}</version>
    <dependencies>
        <!--<dependency>
            <groupId>com.thoughtworks.xstream</groupId>
            <artifactId>xstream</artifactId>
@@ -23,7 +22,6 @@
            <version>1.0-SNAPSHOT</version>
            <scope>compile</scope>
        </dependency>-->
        <!--<dependency>
            <groupId>com.vci</groupId>
            <artifactId>vci-platform-web</artifactId>
@@ -68,7 +66,6 @@
            <groupId>com.thoughtworks.xstream</groupId>
            <artifactId>xstream</artifactId>
        </dependency>
    </dependencies>
    <packaging>jar</packaging>
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/bo/AttributeValue.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
package com.vci.ubcs.code.bo;
import org.omg.CORBA.portable.IDLEntity;
public class AttributeValue implements IDLEntity {
    public String attrName = "";
    public String attrVal = "";
    public AttributeValue() {
    }
    public AttributeValue(String attrName, String attrVal) {
        this.attrName = attrName;
        this.attrVal = attrVal;
    }
}
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/CodeBasicSecDTO.java
@@ -1,7 +1,7 @@
package com.vci.ubcs.code.dto;
import com.vci.ubcs.code.vo.pagemodel.BaseModelVO;
import com.vci.ubcs.starter.revision.model.BaseModel;
/**
 * ç æ®µåŸºç¡€ä¿¡æ¯æ•°æ®ä¼ è¾“对象
@@ -9,7 +9,7 @@
 * @author weidy
 * @date 2022-01-24
 */
public class CodeBasicSecDTO extends BaseModelVO {
public class CodeBasicSecDTO extends BaseModel {
    /**
     * ç¦æ­¢ä¿®æ”¹è¿™ä¸ªå€¼
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/CodeButtonDTO.java
@@ -1,7 +1,7 @@
package com.vci.ubcs.code.dto;
import com.vci.ubcs.code.vo.pagemodel.BaseModelVO;
import com.vci.ubcs.starter.revision.model.BaseModel;
/**
 * ä¸»æ•°æ®ä¸­çš„æŒ‰é’®æ‰©å±•数据传输对象
@@ -9,7 +9,7 @@
 * @author weidy
 * @date 2022-01-24
 */
public class CodeButtonDTO extends BaseModelVO {
public class CodeButtonDTO extends BaseModel {
    /**
     * ç¦æ­¢ä¿®æ”¹è¿™ä¸ªå€¼
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/CodeClassifyDTO.java
@@ -1,7 +1,7 @@
package com.vci.ubcs.code.dto;
import com.vci.ubcs.code.vo.pagemodel.BaseModelVO;
import com.vci.ubcs.starter.revision.model.BaseModel;
/**
 * ä¸»é¢˜åº“分类数据传输对象
@@ -9,7 +9,7 @@
 * @author weidy
 * @date 2022-01-20
 */
public class CodeClassifyDTO extends BaseModelVO {
public class CodeClassifyDTO extends BaseModel {
    /**
     * ç¦æ­¢ä¿®æ”¹è¿™ä¸ªå€¼
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/CodeClassifyProcessTempDTO.java
@@ -1,7 +1,7 @@
package com.vci.ubcs.code.dto;
import com.vci.ubcs.code.vo.pagemodel.BaseModelVO;
import com.vci.ubcs.starter.revision.model.BaseModel;
import lombok.Data;
/**
@@ -11,7 +11,7 @@
 * @date 2022-01-24
 */
@Data
public class CodeClassifyProcessTempDTO extends BaseModelVO {
public class CodeClassifyProcessTempDTO extends BaseModel {
    /**
     * ç¦æ­¢ä¿®æ”¹è¿™ä¸ªå€¼
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/CodeClassifyTempMapItemDTO.java
@@ -1,7 +1,7 @@
package com.vci.ubcs.code.dto;
import com.vci.ubcs.code.vo.pagemodel.BaseModelVO;
import com.vci.ubcs.starter.revision.model.BaseModel;
/**
 * æ˜ å°„规则的明细数据传输对象
@@ -9,7 +9,7 @@
 * @author weidy
 * @date 2022-03-10
 */
public class CodeClassifyTempMapItemDTO extends BaseModelVO {
public class CodeClassifyTempMapItemDTO extends BaseModel {
    /**
     * ç¦æ­¢ä¿®æ”¹è¿™ä¸ªå€¼
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/CodeClassifyTemplateAttrDTO.java
@@ -16,7 +16,7 @@
 */
package com.vci.ubcs.code.dto;
import com.vci.ubcs.code.vo.pagemodel.BaseModelVO;
import com.vci.ubcs.starter.revision.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
@@ -28,7 +28,7 @@
 */
@Data
@EqualsAndHashCode(callSuper = true)
public class CodeClassifyTemplateAttrDTO extends BaseModelVO {
public class CodeClassifyTemplateAttrDTO extends BaseModel {
    /**
     * ç¦æ­¢ä¿®æ”¹è¿™ä¸ªå€¼
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/CodeClassifyTemplateButtonDTO.java
@@ -1,7 +1,7 @@
package com.vci.ubcs.code.dto;
import com.vci.ubcs.code.vo.pagemodel.BaseModelVO;
import com.vci.ubcs.starter.revision.model.BaseModel;
import lombok.Data;
/**
@@ -11,7 +11,7 @@
 * @date 2022-01-24
 */
@Data
public class CodeClassifyTemplateButtonDTO extends BaseModelVO {
public class CodeClassifyTemplateButtonDTO extends BaseModel {
    /**
     * ç¦æ­¢ä¿®æ”¹è¿™ä¸ªå€¼
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/CodeClassifyTemplateDTO.java
@@ -1,7 +1,7 @@
package com.vci.ubcs.code.dto;
import com.vci.ubcs.code.vo.pagemodel.BaseModelVO;
import com.vci.ubcs.starter.revision.model.BaseModel;
/**
 * åˆ†ç±»æ¨¡æ¿å¯¹è±¡æ•°æ®ä¼ è¾“对象
@@ -9,7 +9,7 @@
 * @author weidy
 * @date 2022-01-24
 */
public class CodeClassifyTemplateDTO extends BaseModelVO {
public class CodeClassifyTemplateDTO extends BaseModel {
    /**
     * ç¦æ­¢ä¿®æ”¹è¿™ä¸ªå€¼
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/CodeClassifyTemplateMapDTO.java
@@ -1,7 +1,7 @@
package com.vci.ubcs.code.dto;
import com.vci.ubcs.code.vo.pagemodel.BaseModelVO;
import com.vci.ubcs.starter.revision.model.BaseModel;
/**
 * ä¸»é¢˜åº“模板映射规则数据传输对象
@@ -9,7 +9,7 @@
 * @author weidy
 * @date 2022-01-24
 */
public class CodeClassifyTemplateMapDTO extends BaseModelVO {
public class CodeClassifyTemplateMapDTO extends BaseModel {
    /**
     * ç¦æ­¢ä¿®æ”¹è¿™ä¸ªå€¼
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/CodeClassifyValueDTO.java
@@ -1,7 +1,7 @@
package com.vci.ubcs.code.dto;
import com.vci.ubcs.code.vo.pagemodel.BaseModelVO;
import com.vci.ubcs.starter.revision.model.BaseModel;
import lombok.Data;
/**
@@ -11,7 +11,7 @@
 * @date 2022-04-24
 */
@Data
public class CodeClassifyValueDTO extends BaseModelVO {
public class CodeClassifyValueDTO extends BaseModel {
    /**
     * ç¦æ­¢ä¿®æ”¹è¿™ä¸ªå€¼
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/CodeFixedValueDTO.java
@@ -1,7 +1,7 @@
package com.vci.ubcs.code.dto;
import com.vci.ubcs.code.vo.pagemodel.BaseModelVO;
import com.vci.ubcs.starter.revision.model.BaseModel;
/**
 * å›ºå®šç æ®µçš„码值数据传输对象
@@ -9,7 +9,7 @@
 * @author ludc
 * @date 2022-01-24
 */
public class CodeFixedValueDTO extends BaseModelVO {
public class CodeFixedValueDTO extends BaseModel {
    /**
     * ç¦æ­¢ä¿®æ”¹è¿™ä¸ªå€¼
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/CodeKeyAttrRepeatRuleDTO.java
@@ -1,7 +1,7 @@
package com.vci.ubcs.code.dto;
import com.vci.ubcs.code.vo.pagemodel.BaseModelVO;
import com.vci.ubcs.starter.revision.model.BaseModel;
/**
 * å…³é”®æ•°æ®æŸ¥é‡è§„则数据传输对象
@@ -9,7 +9,7 @@
 * @author weidy
 * @date 2022-01-24
 */
public class CodeKeyAttrRepeatRuleDTO extends BaseModelVO {
public class CodeKeyAttrRepeatRuleDTO extends BaseModel {
    /**
     * ç¦æ­¢ä¿®æ”¹è¿™ä¸ªå€¼
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/CodePhaseAttrDTO.java
@@ -1,7 +1,7 @@
package com.vci.ubcs.code.dto;
import com.vci.ubcs.code.vo.pagemodel.BaseModelVO;
import com.vci.ubcs.starter.revision.model.BaseModel;
/**
 * é˜¶æ®µçš„属性数据传输对象
@@ -9,7 +9,7 @@
 * @author weidy
 * @date 2022-01-24
 */
public class CodePhaseAttrDTO extends BaseModelVO {
public class CodePhaseAttrDTO extends BaseModel {
    /**
     * ç¦æ­¢ä¿®æ”¹è¿™ä¸ªå€¼
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/CodeResembleRuleDTO.java
@@ -1,7 +1,7 @@
package com.vci.ubcs.code.dto;
import com.vci.ubcs.code.vo.pagemodel.BaseModelVO;
import com.vci.ubcs.starter.revision.model.BaseModel;
/**
 * ç›¸ä¼¼æŸ¥è¯¢è§„则数据传输对象
@@ -9,7 +9,7 @@
 * @author weidy
 * @date 2022-04-10
 */
public class CodeResembleRuleDTO extends BaseModelVO {
public class CodeResembleRuleDTO extends BaseModel {
    /**
     * ç¦æ­¢ä¿®æ”¹è¿™ä¸ªå€¼
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/CodeSynonymDTO.java
@@ -1,7 +1,7 @@
package com.vci.ubcs.code.dto;
import com.vci.ubcs.code.vo.pagemodel.BaseModelVO;
import com.vci.ubcs.starter.revision.model.BaseModel;
/**
 * åŒä¹‰è¯é…ç½®æ•°æ®ä¼ è¾“对象
@@ -9,7 +9,7 @@
 * @author weidy
 * @date 2022-02-17
 */
public class CodeSynonymDTO extends BaseModelVO {
public class CodeSynonymDTO extends BaseModel {
    /**
     * ç¦æ­¢ä¿®æ”¹è¿™ä¸ªå€¼
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/CodeTemplatePhaseDTO.java
@@ -1,7 +1,7 @@
package com.vci.ubcs.code.dto;
import com.vci.ubcs.code.vo.pagemodel.BaseModelVO;
import com.vci.ubcs.starter.revision.model.BaseModel;
import lombok.Data;
import java.util.List;
@@ -13,7 +13,7 @@
 * @date 2022-01-24
 */
@Data
public class CodeTemplatePhaseDTO extends BaseModelVO {
public class CodeTemplatePhaseDTO extends BaseModel {
    /**
     * ç¦æ­¢ä¿®æ”¹è¿™ä¸ªå€¼
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/DockingLogeDTO.java
@@ -1,7 +1,7 @@
package com.vci.ubcs.code.dto;
import com.vci.ubcs.code.vo.pagemodel.BaseModelVO;
import com.vci.ubcs.starter.revision.model.BaseModel;
/**
 * èµ„源对接通知、查询接口日志数据传输对象
@@ -9,7 +9,7 @@
 * @author weidy
 * @date 2022-03-28
 */
public class DockingLogeDTO extends BaseModelVO {
public class DockingLogeDTO extends BaseModel {
    /**
     * ç¦æ­¢ä¿®æ”¹è¿™ä¸ªå€¼
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/DockingPreApplyDataDTO.java
@@ -1,7 +1,7 @@
package com.vci.ubcs.code.dto;
import com.vci.ubcs.code.vo.pagemodel.BaseModelVO;
import com.vci.ubcs.starter.revision.model.BaseModel;
/**
 * è®°å½•工艺推送过来的数据信息数据传输对象
@@ -9,7 +9,7 @@
 * @author weidy
 * @date 2022-04-05
 */
public class DockingPreApplyDataDTO extends BaseModelVO {
public class DockingPreApplyDataDTO extends BaseModel {
    /**
     * ç¦æ­¢ä¿®æ”¹è¿™ä¸ªå€¼
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/DockingPreApplyDataInfoDTO.java
@@ -1,7 +1,7 @@
package com.vci.ubcs.code.dto;
import com.vci.ubcs.code.vo.pagemodel.BaseModelVO;
import com.vci.ubcs.starter.revision.model.BaseModel;
/**
 * è®°å½•工艺推送过来的数据信息数据传输对象
@@ -9,7 +9,7 @@
 * @author weidy
 * @date 2022-04-05
 */
public class DockingPreApplyDataInfoDTO extends BaseModelVO {
public class DockingPreApplyDataInfoDTO extends BaseModel {
    /**
     * ç¦æ­¢ä¿®æ”¹è¿™ä¸ªå€¼
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/DockingSystemConfigDTO.java
@@ -1,9 +1,9 @@
package com.vci.ubcs.code.dto;
import com.vci.ubcs.code.vo.pagemodel.BaseModelVO;
import com.vci.ubcs.code.vo.pagemodel.SysIntHeaderVO;
import com.vci.ubcs.code.vo.pagemodel.SysIntParamVO;
import com.vci.ubcs.starter.revision.model.BaseModel;
import java.util.List;
@@ -13,7 +13,7 @@
 * @author lihang
 * @date 2022-03-07
 */
public class DockingSystemConfigDTO extends BaseModelVO {
public class DockingSystemConfigDTO extends BaseModel {
    /**
     * ç¦æ­¢ä¿®æ”¹è¿™ä¸ªå€¼
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/DockingSystemDTO.java
@@ -1,7 +1,7 @@
package com.vci.ubcs.code.dto;
import com.vci.ubcs.code.vo.pagemodel.BaseModelVO;
import com.vci.ubcs.starter.revision.model.BaseModel;
/**
 * ç³»ç»Ÿé›†æˆçš„系统信息数据传输对象
@@ -9,7 +9,7 @@
 * @author lihang
 * @date 2022-03-07
 */
public class DockingSystemDTO extends BaseModelVO {
public class DockingSystemDTO extends BaseModel {
    /**
     * ç¦æ­¢ä¿®æ”¹è¿™ä¸ªå€¼
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/DockingTaskDTO.java
@@ -1,7 +1,7 @@
package com.vci.ubcs.code.dto;
import com.vci.ubcs.code.vo.pagemodel.BaseModelVO;
import com.vci.ubcs.starter.revision.model.BaseModel;
/**
 * èµ„源对接通知、查询接口待推送任务数据传输对象
@@ -9,7 +9,7 @@
 * @author weidy
 * @date 2022-03-28
 */
public class DockingTaskDTO extends BaseModelVO {
public class DockingTaskDTO extends BaseModel {
    /**
     * ç¦æ­¢ä¿®æ”¹è¿™ä¸ªå€¼
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/SysIntAuthorityDTO.java
@@ -1,7 +1,7 @@
package com.vci.ubcs.code.dto;
import com.vci.ubcs.code.vo.pagemodel.BaseModelVO;
import com.vci.ubcs.starter.revision.model.BaseModel;
/**
 * ç³»ç»Ÿé›†æˆæŽ¥å£çš„认证数据传输对象
@@ -9,7 +9,7 @@
 * @author lihang
 * @date 2022-03-07
 */
public class SysIntAuthorityDTO extends BaseModelVO {
public class SysIntAuthorityDTO extends BaseModel {
    /**
     * ç¦æ­¢ä¿®æ”¹è¿™ä¸ªå€¼
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/SysIntHeaderDTO.java
@@ -1,7 +1,7 @@
package com.vci.ubcs.code.dto;
import com.vci.ubcs.code.vo.pagemodel.BaseModelVO;
import com.vci.ubcs.starter.revision.model.BaseModel;
/**
 * ç³»ç»Ÿé›†æˆæŽ¥å£çš„认证数据传输对象
@@ -9,7 +9,7 @@
 * @author weidy
 * @date 2022-04-11
 */
public class SysIntHeaderDTO extends BaseModelVO {
public class SysIntHeaderDTO extends BaseModel {
    /**
     * ç¦æ­¢ä¿®æ”¹è¿™ä¸ªå€¼
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/SysIntInfoBseDTO.java
@@ -1,10 +1,10 @@
package com.vci.ubcs.code.dto;
import com.vci.ubcs.code.vo.pagemodel.BaseModelVO;
import com.vci.ubcs.starter.revision.model.BaseModel;
import java.util.List;
public class SysIntInfoBseDTO extends BaseModelVO {
public class SysIntInfoBseDTO extends BaseModel {
    private DockingSystemConfigDTO sysIntInfoDTO;
    private List<SysIntParamDTO> sysIntParamDTO;
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/dto/SysIntParamDTO.java
@@ -1,7 +1,7 @@
package com.vci.ubcs.code.dto;
import com.vci.ubcs.code.vo.pagemodel.BaseModelVO;
import com.vci.ubcs.starter.revision.model.BaseModel;
/**
 * ç³»ç»Ÿé›†æˆæŽ¥å£çš„认证数据传输对象
@@ -9,7 +9,7 @@
 * @author weidy
 * @date 2022-04-11
 */
public class SysIntParamDTO extends BaseModelVO {
public class SysIntParamDTO extends BaseModel {
    /**
     * ç¦æ­¢ä¿®æ”¹è¿™ä¸ªå€¼
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeAllCode.java
@@ -18,6 +18,7 @@
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.vci.ubcs.starter.constant.CodeTableNameConstant;
import com.vci.ubcs.starter.revision.model.BaseModel;
import io.swagger.annotations.ApiModel;
import lombok.Data;
@@ -31,7 +32,7 @@
 * @since 2023-04-03
 */
@Data
@TableName("PL_CODE_ALLCODE")
@TableName(CodeTableNameConstant.PL_CODE_ALLCODE)
@ApiModel(value = "CodeAllCode对象", description = "全部码值")
@EqualsAndHashCode(callSuper = true)
public class CodeAllCode extends BaseModel {
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeBasicSec.java
@@ -4,10 +4,12 @@
import com.baomidou.mybatisplus.annotation.TableName;
import com.vci.ubcs.starter.annotation.Transient;
import com.vci.ubcs.starter.constant.CodeTableNameConstant;
import com.vci.ubcs.starter.revision.model.BaseModel;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.apache.ibatis.type.Alias;
import java.sql.Clob;
@@ -18,7 +20,7 @@
 * @date 2022-1-18
 */
@Data
@TableName("PL_CODE_BASICSEC")
@TableName(CodeTableNameConstant.PL_CODE_BASICSEC)
@ApiModel(value = "CodeBasicSec对象", description = "码段基础信息")
@EqualsAndHashCode(callSuper = true)
public class CodeBasicSec extends BaseModel {
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeButton.java
@@ -22,6 +22,7 @@
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.vci.ubcs.starter.constant.CodeTableNameConstant;
import com.vci.ubcs.starter.revision.model.BaseModel;
import com.vci.ubcs.starter.web.annotation.VciUseEnum;
import com.vci.ubcs.starter.web.constant.MdmEnumIdConstant;
@@ -40,7 +41,7 @@
 * @since 2023-03-29
 */
@Data
@TableName("PL_CODE_BUTTON")
@TableName(CodeTableNameConstant.PL_CODE_BUTTON)
@ApiModel(value = "codebutton对象", description = "模板扩展池")
@EqualsAndHashCode(callSuper = true)
public class CodeButton extends BaseModel {
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeClassify.java
@@ -3,6 +3,7 @@
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.vci.ubcs.starter.annotation.Transient;
import com.vci.ubcs.starter.constant.CodeTableNameConstant;
import com.vci.ubcs.starter.revision.model.BaseModel;
import io.swagger.annotations.ApiModel;
import lombok.Data;
@@ -15,7 +16,7 @@
 */
//@VciBtmType(name = MdmBtmTypeConstant.CODE_CLASSIFY,text = "主题库分类",lifeCycle = FrameWorkLcStatusConstant.FRAME_WORK_LIFE_CYCLE_NAME)
@Data
@TableName("PL_CODE_CLASSIFY")
@TableName(CodeTableNameConstant.PL_CODE_CLASSIFY)
@ApiModel(value = "CodeClassify对象", description = "主题库的分类")
@EqualsAndHashCode(callSuper = true)
public class CodeClassify extends BaseModel {
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeClassifyProcessTemp.java
@@ -2,7 +2,7 @@
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.vci.ubcs.code.vo.pagemodel.BaseModelVO;
import com.vci.ubcs.starter.constant.CodeTableNameConstant;
import com.vci.ubcs.starter.revision.model.BaseModel;
import com.vci.ubcs.starter.web.annotation.VciUseEnum;
import com.vci.ubcs.starter.web.constant.MdmEnumIdConstant;
@@ -15,7 +15,7 @@
 * @date 2023/5/5
 */
@Data
@TableName("PL_CODE_CLSFLOWTEMP")
@TableName(CodeTableNameConstant.PL_CODE_CLSFLOWTEMP)
@ApiModel(value = "CodeTempphase对象", description = "分类使用的流程模板")
public class CodeClassifyProcessTemp extends BaseModel {
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeClassifyTemplate.java
@@ -19,6 +19,7 @@
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.vci.ubcs.starter.annotation.Transient;
import com.vci.ubcs.starter.constant.CodeTableNameConstant;
import com.vci.ubcs.starter.revision.model.BaseModel;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
@@ -32,7 +33,7 @@
 * @since 2023-04-10
 */
@Data
@TableName("PL_CODE_CLSTEMPLATE")
@TableName(CodeTableNameConstant.PL_CODE_CLSTEMPLATE)
@ApiModel(value = "PlCodeClstemplate对象", description = "编码库定义-模板管理")
@EqualsAndHashCode(callSuper = true)
public class CodeClassifyTemplate extends BaseModel {
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeClassifyTemplateAttr.java
@@ -2,6 +2,7 @@
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.vci.ubcs.starter.constant.CodeTableNameConstant;
import com.vci.ubcs.starter.revision.model.BaseModel;
import com.vci.ubcs.starter.web.annotation.VciFieldType;
import com.vci.ubcs.starter.web.enumpck.VciFieldTypeEnum;
@@ -16,7 +17,7 @@
 */
//@VciBtmType(name = MdmBtmTypeConstant.CODE_CLASSIFY_TEMPLATE_ATTR,text = "主题库分类的模板属性",lifeCycle = FrameWorkLcStatusConstant.EMTYPE_LIFE_CYCLE)
@Data
@TableName("PL_CODE_CLSTEMPATTR")
@TableName(CodeTableNameConstant.PL_CODE_CLSTEMPATTR)
@ApiModel(value = "CodeTempphase对象", description = "编码库定义-模板阶段")
@EqualsAndHashCode(callSuper = true)
public class CodeClassifyTemplateAttr extends BaseModel {
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeClassifyTemplateButton.java
@@ -18,6 +18,7 @@
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.vci.ubcs.starter.constant.CodeTableNameConstant;
import com.vci.ubcs.starter.revision.model.BaseModel;
import lombok.Data;
import io.swagger.annotations.ApiModel;
@@ -31,7 +32,7 @@
 * @since 2023-04-20
 */
@Data
@TableName("PL_CODE_TEMPBUTTON")
@TableName(CodeTableNameConstant.PL_CODE_TEMPBUTTON)
@ApiModel(value = "CodeTempbutton对象", description = "编码库定义-模板按钮扩展")
@EqualsAndHashCode(callSuper = true)
public class CodeClassifyTemplateButton extends BaseModel {
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeClassifyValue.java
@@ -1,6 +1,7 @@
package com.vci.ubcs.code.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.vci.ubcs.starter.constant.CodeTableNameConstant;
import com.vci.ubcs.starter.revision.model.BaseModel;
import io.swagger.annotations.ApiModel;
import lombok.Data;
@@ -13,7 +14,7 @@
 * @date 2023/4/5
 */
@Data
@TableName("PL_CODE_CLASSIFYVALUE")
@TableName(CodeTableNameConstant.PL_CODE_CLASSIFYVALUE)
@ApiModel(value = "CodeClassify对象", description = "分类码段的码值")
@EqualsAndHashCode(callSuper = true)
public class CodeClassifyValue extends BaseModel {
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeFixedValue.java
@@ -1,6 +1,7 @@
package com.vci.ubcs.code.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.vci.ubcs.starter.constant.CodeTableNameConstant;
import com.vci.ubcs.starter.revision.model.BaseModel;
import io.swagger.annotations.ApiModel;
import lombok.Data;
@@ -13,7 +14,7 @@
 * @date 2022-1-18
 */
@Data
@TableName("PL_CODE_FIXEDVALUE")
@TableName(CodeTableNameConstant.PL_CODE_FIXEDVALUE)
@ApiModel(value = "CodeFixedValue对象", description = "固定码段的码值")
@EqualsAndHashCode(callSuper = true)
public class CodeFixedValue extends BaseModel {
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeKeyAttrRepeat.java
@@ -21,6 +21,7 @@
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.vci.ubcs.starter.constant.CodeTableNameConstant;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -35,7 +36,7 @@
 * @since 2023-04-03
 */
@Data
@TableName("PL_CODE_KEYATTRREPEAT")
@TableName(CodeTableNameConstant.PL_CODE_KEYATTRREPEAT)
@ApiModel(value = "PlCodeKeyattrrepeat对象", description = "关键属性查重规则")
//@EqualsAndHashCode(callSuper = true)
public class CodeKeyAttrRepeat implements Serializable {
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodePhaseAttr.java
@@ -17,6 +17,7 @@
package com.vci.ubcs.code.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.vci.ubcs.starter.constant.CodeTableNameConstant;
import com.vci.ubcs.starter.revision.model.BaseModel;
import lombok.Data;
import io.swagger.annotations.ApiModel;
@@ -30,7 +31,7 @@
 * @since 2023-04-20
 */
@Data
@TableName("PL_CODE_PHASEATTR")
@TableName(CodeTableNameConstant.PL_CODE_PHASEATTR)
@ApiModel(value = "CodePhaseattr对象", description = "编码库定义-模板阶段-属性")
@EqualsAndHashCode(callSuper = true)
public class CodePhaseAttr extends BaseModel {
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeReferConfig.java
@@ -8,6 +8,7 @@
import com.github.yulichang.annotation.EntityMapping;
import com.vci.ubcs.code.vo.CodeShowFieldConfigVO;
import com.vci.ubcs.code.vo.CodeSrchCondConfigVO;
import com.vci.ubcs.starter.constant.CodeTableNameConstant;
import com.vci.ubcs.starter.revision.model.BaseModel;
import io.swagger.annotations.ApiModel;
import lombok.Data;
@@ -15,13 +16,13 @@
import java.util.List;
/**
 * ç æ®µåŸºç¡€ä¿¡æ¯æ•°æ®æ“ä½œå±‚
 * ç¼–码规则管理-引用码段-参照配置
 *
 * @author ludc
 * @date 2023/5/19 17:24
 */
@Data
@TableName("PL_CODE_REFERCONFIG")
@TableName(CodeTableNameConstant.PL_CODE_REFERCONFIG)
@ApiModel(value = "CodeReferConfig对象", description = "编码规则管理-引用码段-参照配置")
@JsonInclude(JsonInclude.Include.NON_EMPTY)  //不输出掉空字段
public class CodeReferConfig extends BaseModel {
@@ -31,11 +32,10 @@
     */
    private static final long serialVersionUID = 957685333614390234L;
    /**
     * ç§Ÿæˆ·ID
     */
    @JSONField()
    private String tenantId;
//    /**
//     * ç§Ÿæˆ·ID
//     */
//    private String tenantId;
    /**
     * å‚照的业务类型
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeRule.java
@@ -18,6 +18,7 @@
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.vci.ubcs.starter.constant.CodeTableNameConstant;
import com.vci.ubcs.starter.revision.model.BaseModel;
import io.swagger.annotations.ApiModel;
import lombok.Data;
@@ -30,7 +31,7 @@
 * @since 2023-04-03
 */
@Data
@TableName("PL_CODE_RULE")
@TableName(CodeTableNameConstant.PL_CODE_RULE)
@ApiModel(value = "CodeRule对象", description = "编码规则")
@EqualsAndHashCode(callSuper = true)
public class CodeRule extends BaseModel {
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeSerialValue.java
@@ -2,6 +2,7 @@
import com.baomidou.mybatisplus.annotation.TableName;
import com.vci.ubcs.starter.constant.CodeTableNameConstant;
import com.vci.ubcs.starter.revision.model.BaseModel;
import io.swagger.annotations.ApiModel;
import lombok.Data;
@@ -13,7 +14,7 @@
 * @date 2022-3-1
 */
@Data
@TableName("PL_CODE_SERIALVALUE")
@TableName(CodeTableNameConstant.PL_CODE_SERIALVALUE)
@ApiModel(value = "CodeSerialValue对象", description = "编码规则的流水值")
@EqualsAndHashCode(callSuper = true)
public class CodeSerialValue extends BaseModel {
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeShowFieldConfig.java
@@ -4,6 +4,7 @@
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.github.yulichang.annotation.EntityMapping;
import com.vci.ubcs.starter.constant.CodeTableNameConstant;
import com.vci.ubcs.starter.revision.model.BaseModel;
import io.swagger.annotations.ApiModel;
import lombok.Data;
@@ -17,7 +18,7 @@
 * @date 2023/5/19 17:35
 */
@Data
@TableName("PL_CODE_SHOWFIELDCONFIG")
@TableName(CodeTableNameConstant.PL_CODE_SHOWFIELDCONFIG)
@ApiModel(value = "CodeShowFieldConfig对象", description = "编码规则管理-引用码段-参照配置-显示属性配置")
public class CodeShowFieldConfig implements Serializable {
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeSrchCondConfig.java
@@ -3,6 +3,7 @@
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.vci.ubcs.starter.constant.CodeTableNameConstant;
import com.vci.ubcs.starter.revision.model.BaseModel;
import io.swagger.annotations.ApiModel;
import lombok.Data;
@@ -15,7 +16,7 @@
 */
@Data
@TableName("PL_CODE_SRCHCONDCONFIG")
@TableName(CodeTableNameConstant.PL_CODE_SRCHCONDCONFIG)
@ApiModel(value = "CodeSrchCondConfig对象", description = "编码规则管理-引用码段-参照配置-搜索条件配置")
public class CodeSrchCondConfig {
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeSynonymEntity.java
@@ -21,6 +21,7 @@
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.vci.ubcs.starter.constant.CodeTableNameConstant;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -35,7 +36,7 @@
 * @since 2023-04-04
 */
@Data
@TableName("PL_CODE_SYNONYM")
@TableName(CodeTableNameConstant.PL_CODE_SYNONYM)
@ApiModel(value = "PlCodeSynonym对象", description = "近义词维护")
//@EqualsAndHashCode(callSuper = true)
public class CodeSynonymEntity implements Serializable {
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeTemplatePhase.java
@@ -17,6 +17,7 @@
package com.vci.ubcs.code.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.vci.ubcs.starter.constant.CodeTableNameConstant;
import com.vci.ubcs.starter.revision.model.BaseModel;
import lombok.Data;
import io.swagger.annotations.ApiModel;
@@ -30,7 +31,7 @@
 * @since 2023-04-20
 */
@Data
@TableName("PL_CODE_TEMPPHASE")
@TableName(CodeTableNameConstant.PL_CODE_TEMPPHASE)
@ApiModel(value = "CodeTempphase对象", description = "编码库定义-模板阶段")
@EqualsAndHashCode(callSuper = true)
public class CodeTemplatePhase extends BaseModel {
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeTempphaseEntity.java
@@ -17,6 +17,7 @@
package com.vci.ubcs.code.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.vci.ubcs.starter.constant.CodeTableNameConstant;
import com.vci.ubcs.starter.revision.model.BaseModel;
import lombok.Data;
import io.swagger.annotations.ApiModel;
@@ -30,7 +31,7 @@
 * @since 2023-04-20
 */
@Data
@TableName("PL_CODE_TEMPPHASE")
@TableName(CodeTableNameConstant.PL_CODE_TEMPPHASE)
@ApiModel(value = "CodeTempphase对象", description = "编码库定义-模板阶段")
@EqualsAndHashCode(callSuper = true)
public class CodeTempphaseEntity extends BaseModel {
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/CodeWupin.java
@@ -18,6 +18,7 @@
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.vci.ubcs.starter.constant.CodeTableNameConstant;
import com.vci.ubcs.starter.revision.model.BaseModel;
import lombok.Data;
import io.swagger.annotations.ApiModel;
@@ -32,7 +33,7 @@
 * @since 2023-05-05
 */
@Data
@TableName("PL_CODE_WUPIN")
@TableName(CodeTableNameConstant.PL_CODE_WUPIN)
@ApiModel(value = "CodeWupin对象", description = "编码信息")
@EqualsAndHashCode(callSuper = true)
public class CodeWupin extends BaseModel {
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/DockingLog.java
@@ -1,7 +1,7 @@
package com.vci.ubcs.code.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.vci.ubcs.code.vo.pagemodel.BaseModelVO;
import com.vci.ubcs.starter.constant.CodeTableNameConstant;
import com.vci.ubcs.starter.revision.model.BaseModel;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
@@ -9,7 +9,7 @@
import lombok.EqualsAndHashCode;
@Data
@TableName("PL_DOCKING_LOG")
@TableName(CodeTableNameConstant.PL_DOCKING_LOG)
@ApiModel(value = "DockingLog对象", description = "集成日志对象")
@EqualsAndHashCode(callSuper = true)
public class DockingLog extends BaseModel {
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/DockingSystem.java
@@ -1,6 +1,7 @@
package com.vci.ubcs.code.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.vci.ubcs.starter.constant.CodeTableNameConstant;
import com.vci.ubcs.starter.revision.model.BaseModel;
import io.swagger.annotations.ApiModel;
import lombok.Data;
@@ -12,7 +13,7 @@
 * @date 2023-06-01
 */
@Data
@TableName("PL_CODE_SYSINTBASE")
@TableName(CodeTableNameConstant.PL_CODE_SYSINTBASE)
@ApiModel(value = "DockingSystem", description = "集成管理接口-集成系统维护对象")
@EqualsAndHashCode(callSuper = true)
public class DockingSystem extends BaseModel {
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/entity/DockingSystemConfig.java
@@ -4,6 +4,7 @@
import com.baomidou.mybatisplus.annotation.TableName;
import com.vci.ubcs.code.vo.pagemodel.SysIntHeaderVO;
import com.vci.ubcs.code.vo.pagemodel.SysIntParamVO;
import com.vci.ubcs.starter.constant.CodeTableNameConstant;
import com.vci.ubcs.starter.revision.model.BaseModel;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
@@ -18,7 +19,7 @@
 * @date 2023-06-01
 */
@Data
@TableName("PL_CODE_SYSINTINFO")
@TableName(CodeTableNameConstant.PL_CODE_SYSINTINFO)
@ApiModel(value = "DockingSystemConfig", description = "集成接口-集成接口管理对象")
@EqualsAndHashCode(callSuper = true)
public class DockingSystemConfig extends BaseModel{
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/CodeReferConfigVO.java
@@ -1,13 +1,7 @@
package com.vci.ubcs.code.vo;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.vci.ubcs.code.entity.CodeReferConfig;
import com.vci.ubcs.code.entity.CodeShowFieldConfig;
import com.vci.ubcs.code.entity.CodeSrchCondConfig;
import com.vci.ubcs.code.vo.pagemodel.BaseModelVO;
import com.vci.ubcs.starter.revision.model.BaseModel;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import java.util.List;
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/CodeShowFieldConfigVO.java
@@ -2,8 +2,6 @@
import com.baomidou.mybatisplus.annotation.TableName;
import com.vci.ubcs.code.entity.CodeShowFieldConfig;
import com.vci.ubcs.code.vo.pagemodel.BaseModelVO;
import com.vci.ubcs.starter.revision.model.BaseModel;
import io.swagger.annotations.ApiModel;
import lombok.Data;
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/CodeSrchCondConfigVO.java
@@ -2,7 +2,6 @@
import com.baomidou.mybatisplus.annotation.TableName;
import com.vci.ubcs.code.entity.CodeSrchCondConfig;
import com.vci.ubcs.code.vo.pagemodel.BaseModelVO;
import com.vci.ubcs.starter.revision.model.BaseModel;
import io.swagger.annotations.ApiModel;
import lombok.Data;
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/BaseModelVO.java
ÎļþÒÑɾ³ý
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/CodeAllCodeVO.java
@@ -16,6 +16,7 @@
 */
package com.vci.ubcs.code.vo.pagemodel;
import com.vci.ubcs.starter.revision.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
@@ -27,7 +28,7 @@
 */
@Data
@EqualsAndHashCode(callSuper = true)
public class CodeAllCodeVO extends BaseModelVO {
public class CodeAllCodeVO extends BaseModel {
    private static final long serialVersionUID = 1L;
}
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/CodeBasicSecVO.java
@@ -1,6 +1,6 @@
package com.vci.ubcs.code.vo.pagemodel;
import com.vci.ubcs.code.vo.pagemodel.BaseModelVO;
import com.vci.ubcs.starter.revision.model.BaseModel;
import lombok.Data;
import java.util.List;
@@ -12,7 +12,7 @@
 * @date 2023-04-24
 */
@Data
public class CodeBasicSecVO extends BaseModelVO {
public class CodeBasicSecVO extends BaseModel {
    /**
     * ç¦æ­¢ä¿®æ”¹è¿™ä¸ªå€¼
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/CodeButtonVO.java
@@ -1,6 +1,6 @@
package com.vci.ubcs.code.vo.pagemodel;
import com.vci.ubcs.code.vo.pagemodel.BaseModelVO;
import com.vci.ubcs.starter.revision.model.BaseModel;
/**
 * ä¸»æ•°æ®ä¸­çš„æŒ‰é’®æ‰©å±•显示对象
@@ -8,7 +8,7 @@
 * @author weidy
 * @date 2022-01-24
 */
public class CodeButtonVO extends BaseModelVO {
public class CodeButtonVO extends BaseModel {
    /**
     * ç¦æ­¢ä¿®æ”¹è¿™ä¸ªå€¼
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/CodeClassifyAttributeVO.java
@@ -1,6 +1,7 @@
package com.vci.ubcs.code.vo.pagemodel;
import com.vci.ubcs.code.vo.pagemodel.BaseModelVO;
import com.vci.ubcs.starter.revision.model.BaseModel;
/**
 * ä¸»é¢˜åº“分类所需属性集显示对象
@@ -8,7 +9,7 @@
 * @author weidy
 * @date 2022-01-24
 */
public class CodeClassifyAttributeVO extends BaseModelVO {
public class CodeClassifyAttributeVO extends BaseModel {
    /**
     * ç¦æ­¢ä¿®æ”¹è¿™ä¸ªå€¼
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/CodeClassifyProcessTempVO.java
@@ -1,7 +1,7 @@
package com.vci.ubcs.code.vo.pagemodel;
import com.vci.ubcs.code.entity.CodeClassifyProcessTemp;
import com.vci.ubcs.code.vo.pagemodel.BaseModelVO;
import com.vci.ubcs.starter.revision.model.BaseModel;
import lombok.Data;
import java.util.List;
@@ -13,7 +13,7 @@
 * @date 2023-05-6
 */
@Data
public class CodeClassifyProcessTempVO extends BaseModelVO {
public class CodeClassifyProcessTempVO extends BaseModel {
    /**
     * ç¦æ­¢ä¿®æ”¹è¿™ä¸ªå€¼
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/CodeClassifyTempMapItemVO.java
@@ -1,6 +1,6 @@
package com.vci.ubcs.code.vo.pagemodel;
import com.vci.ubcs.code.vo.pagemodel.BaseModelVO;
import com.vci.ubcs.starter.revision.model.BaseModel;
/**
 * æ˜ å°„规则的明细显示对象
@@ -8,7 +8,7 @@
 * @author weidy
 * @date 2022-03-10
 */
public class CodeClassifyTempMapItemVO extends BaseModelVO {
public class CodeClassifyTempMapItemVO extends BaseModel {
    /**
     * ç¦æ­¢ä¿®æ”¹è¿™ä¸ªå€¼
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/CodeClassifyTemplateAttrVO.java
@@ -1,5 +1,6 @@
package com.vci.ubcs.code.vo.pagemodel;
import com.vci.ubcs.starter.revision.model.BaseModel;
import lombok.Data;
/**
@@ -9,7 +10,7 @@
 * @date 2022-01-24
 */
@Data
public class CodeClassifyTemplateAttrVO extends BaseModelVO {
public class CodeClassifyTemplateAttrVO extends BaseModel {
    /**
     * ç¦æ­¢ä¿®æ”¹è¿™ä¸ªå€¼
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/CodeClassifyTemplateMapVO.java
@@ -1,6 +1,7 @@
package com.vci.ubcs.code.vo.pagemodel;
import com.vci.ubcs.code.vo.pagemodel.BaseModelVO;
import com.vci.ubcs.starter.revision.model.BaseModel;
/**
 * ä¸»é¢˜åº“模板映射规则显示对象
@@ -8,7 +9,7 @@
 * @author weidy
 * @date 2022-01-24
 */
public class CodeClassifyTemplateMapVO extends BaseModelVO {
public class CodeClassifyTemplateMapVO extends BaseModel {
    /**
     * ç¦æ­¢ä¿®æ”¹è¿™ä¸ªå€¼
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/CodeClassifyTemplateVO.java
@@ -1,6 +1,6 @@
package com.vci.ubcs.code.vo.pagemodel;
import com.vci.ubcs.code.vo.pagemodel.BaseModelVO;
import com.vci.ubcs.starter.revision.model.BaseModel;
import java.util.List;
@@ -10,7 +10,7 @@
 * @author weidy
 * @date 2022-01-24
 */
public class CodeClassifyTemplateVO extends BaseModelVO {
public class CodeClassifyTemplateVO extends BaseModel {
    /**
     * ç¦æ­¢ä¿®æ”¹è¿™ä¸ªå€¼
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/CodeClassifyVO.java
@@ -1,12 +1,14 @@
package com.vci.ubcs.code.vo.pagemodel;
import com.vci.ubcs.starter.revision.model.BaseModel;
/**
 * ä¸»é¢˜åº“分类显示对象
 *
 * @author weidy
 * @date 2022-01-20
 */
public class CodeClassifyVO extends BaseModelVO {
public class CodeClassifyVO extends BaseModel {
    /**
     * ç¦æ­¢ä¿®æ”¹è¿™ä¸ªå€¼
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/CodeClassifyValueVO.java
@@ -1,6 +1,6 @@
package com.vci.ubcs.code.vo.pagemodel;
import com.vci.ubcs.code.vo.pagemodel.BaseModelVO;
import com.vci.ubcs.starter.revision.model.BaseModel;
/**
 * åˆ†ç±»ç æ®µçš„码值显示对象
@@ -8,7 +8,7 @@
 * @author weidy
 * @date 2022-01-24
 */
public class CodeClassifyValueVO extends BaseModelVO {
public class CodeClassifyValueVO extends BaseModel {
    /**
     * ç¦æ­¢ä¿®æ”¹è¿™ä¸ªå€¼
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/CodeFixedValueVO.java
@@ -1,6 +1,6 @@
package com.vci.ubcs.code.vo.pagemodel;
import com.vci.ubcs.code.vo.pagemodel.BaseModelVO;
import com.vci.ubcs.starter.revision.model.BaseModel;
/**
 * å›ºå®šç æ®µçš„码值显示对象
@@ -8,7 +8,7 @@
 * @author weidy
 * @date 2022-01-24
 */
public class CodeFixedValueVO extends BaseModelVO {
public class CodeFixedValueVO extends BaseModel {
    /**
     * ç¦æ­¢ä¿®æ”¹è¿™ä¸ªå€¼
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/CodeImportTemplateVO.java
@@ -1,13 +1,22 @@
package com.vci.ubcs.code.vo.pagemodel;
import lombok.Data;
import java.util.ArrayList;
import java.util.List;
/****
 * æ‰¹é‡ç”³è¯·redis缓存对象
 * @author xiejun
 * @date 2023-06-14
 */
@Data
public class CodeImportTemplateVO {
    private List<ColumnVO> cloNamesList=new ArrayList<>();
    private CodeClassifyTemplateVO codeClstemplateVO;
    private CodeClassifyTemplateVO codeClassifyTemplateVO;
    private CodeClassifyVO codeClassifyVO;
}
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/CodeKeyAttrRepeatRuleVO.java
@@ -1,6 +1,6 @@
package com.vci.ubcs.code.vo.pagemodel;
import com.vci.ubcs.code.vo.pagemodel.BaseModelVO;
import com.vci.ubcs.starter.revision.model.BaseModel;
/**
 * å…³é”®æ•°æ®æŸ¥é‡è§„则显示对象
@@ -8,7 +8,7 @@
 * @author weidy
 * @date 2022-01-24
 */
public class CodeKeyAttrRepeatRuleVO extends BaseModelVO {
public class CodeKeyAttrRepeatRuleVO extends BaseModel {
    /**
     * ç¦æ­¢ä¿®æ”¹è¿™ä¸ªå€¼
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/CodePhaseAttrVO.java
@@ -1,6 +1,6 @@
package com.vci.ubcs.code.vo.pagemodel;
import com.vci.ubcs.code.vo.pagemodel.BaseModelVO;
import com.vci.ubcs.starter.revision.model.BaseModel;
/**
 * é˜¶æ®µçš„属性显示对象
@@ -8,7 +8,7 @@
 * @author weidy
 * @date 2022-01-24
 */
public class CodePhaseAttrVO extends BaseModelVO {
public class CodePhaseAttrVO extends BaseModel {
    /**
     * ç¦æ­¢ä¿®æ”¹è¿™ä¸ªå€¼
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/CodeResembleRuleVO.java
@@ -1,6 +1,6 @@
package com.vci.ubcs.code.vo.pagemodel;
import com.vci.ubcs.code.vo.pagemodel.BaseModelVO;
import com.vci.ubcs.starter.revision.model.BaseModel;
/**
 * ç›¸ä¼¼æŸ¥è¯¢è§„则显示对象
@@ -8,7 +8,7 @@
 * @author weidy
 * @date 2022-04-10
 */
public class CodeResembleRuleVO extends BaseModelVO {
public class CodeResembleRuleVO extends BaseModel {
    /**
     * ç¦æ­¢ä¿®æ”¹è¿™ä¸ªå€¼
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/CodeRuleVO.java
@@ -1,6 +1,7 @@
package com.vci.ubcs.code.vo.pagemodel;
import com.vci.ubcs.code.vo.pagemodel.BaseModelVO;
import com.vci.ubcs.code.entity.CodeRule;
import com.vci.ubcs.starter.revision.model.BaseModel;
import java.util.List;
@@ -10,7 +11,7 @@
 * @author weidy
 * @date 2022-01-24
 */
public class CodeRuleVO extends BaseModelVO {
public class CodeRuleVO extends CodeRule {
    /**
     * ç¦æ­¢ä¿®æ”¹è¿™ä¸ªå€¼
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/CodeSynonymVO.java
@@ -1,6 +1,6 @@
package com.vci.ubcs.code.vo.pagemodel;
import com.vci.ubcs.code.vo.pagemodel.BaseModelVO;
import com.vci.ubcs.starter.revision.model.BaseModel;
/**
 * åŒä¹‰è¯é…ç½®æ˜¾ç¤ºå¯¹è±¡
@@ -8,7 +8,7 @@
 * @author weidy
 * @date 2022-02-17
 */
public class CodeSynonymVO extends BaseModelVO {
public class CodeSynonymVO extends BaseModel {
    /**
     * ç¦æ­¢ä¿®æ”¹è¿™ä¸ªå€¼
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/DockingLogeVO.java
@@ -1,6 +1,6 @@
package com.vci.ubcs.code.vo.pagemodel;
import com.vci.ubcs.code.vo.pagemodel.BaseModelVO;
import com.vci.ubcs.starter.revision.model.BaseModel;
/**
 * èµ„源对接通知、查询接口日志显示对象
@@ -8,7 +8,7 @@
 * @author weidy
 * @date 2022-03-28
 */
public class DockingLogeVO extends BaseModelVO {
public class DockingLogeVO extends BaseModel {
    /**
     * ç¦æ­¢ä¿®æ”¹è¿™ä¸ªå€¼
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/DockingPreApplyDataInfoVO.java
@@ -1,6 +1,7 @@
package com.vci.ubcs.code.vo.pagemodel;
import com.vci.ubcs.code.vo.pagemodel.BaseModelVO;
import com.vci.ubcs.code.dto.DockingPreApplyDataInfoDTO;
import com.vci.ubcs.starter.revision.model.BaseModel;
/**
 * è®°å½•工艺推送过来的数据信息显示对象
@@ -8,7 +9,7 @@
 * @author weidy
 * @date 2022-04-05
 */
public class DockingPreApplyDataInfoVO extends BaseModelVO {
public class DockingPreApplyDataInfoVO extends BaseModel {
    /**
     * ç¦æ­¢ä¿®æ”¹è¿™ä¸ªå€¼
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/DockingPreApplyDataVO.java
@@ -1,6 +1,6 @@
package com.vci.ubcs.code.vo.pagemodel;
import com.vci.ubcs.code.vo.pagemodel.BaseModelVO;
import com.vci.ubcs.starter.revision.model.BaseModel;
import java.util.List;
@@ -10,7 +10,7 @@
 * @author weidy
 * @date 2022-04-05
 */
public class DockingPreApplyDataVO extends BaseModelVO {
public class DockingPreApplyDataVO extends BaseModel {
    /**
     * ç¦æ­¢ä¿®æ”¹è¿™ä¸ªå€¼
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/DockingSystemConfigVO.java
@@ -1,6 +1,6 @@
package com.vci.ubcs.code.vo.pagemodel;
import com.vci.ubcs.code.vo.pagemodel.BaseModelVO;
import com.vci.ubcs.starter.revision.model.BaseModel;
import java.util.List;
@@ -10,7 +10,7 @@
 * @author lihang
 * @date 2022-03-07
 */
public class DockingSystemConfigVO extends BaseModelVO {
public class DockingSystemConfigVO extends BaseModel {
    /**
     * ç¦æ­¢ä¿®æ”¹è¿™ä¸ªå€¼
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/DockingSystemVO.java
@@ -1,6 +1,7 @@
package com.vci.ubcs.code.vo.pagemodel;
import com.vci.ubcs.code.vo.pagemodel.BaseModelVO;
import com.vci.ubcs.starter.revision.model.BaseModel;
/**
 * ç³»ç»Ÿé›†æˆçš„系统信息显示对象
@@ -8,7 +9,7 @@
 * @author lihang
 * @date 2022-03-07
 */
public class DockingSystemVO extends BaseModelVO {
public class DockingSystemVO extends BaseModel {
    /**
     * ç¦æ­¢ä¿®æ”¹è¿™ä¸ªå€¼
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/DockingTaskVO.java
@@ -1,6 +1,6 @@
package com.vci.ubcs.code.vo.pagemodel;
import com.vci.ubcs.code.vo.pagemodel.BaseModelVO;
import com.vci.ubcs.starter.revision.model.BaseModel;
/**
 * èµ„源对接通知、查询接口待推送任务显示对象
@@ -8,7 +8,7 @@
 * @author weidy
 * @date 2022-03-28
 */
public class DockingTaskVO extends BaseModelVO {
public class DockingTaskVO extends BaseModel {
    /**
     * ç¦æ­¢ä¿®æ”¹è¿™ä¸ªå€¼
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/SmUserVO.java
@@ -1,6 +1,8 @@
package com.vci.ubcs.code.vo.pagemodel;
import com.vci.ubcs.starter.revision.model.BaseModel;
import java.util.Date;
/**
@@ -8,7 +10,7 @@
 * @author weidy
 * @date 2020/1/29
 */
public class SmUserVO extends BaseModelVO {
public class SmUserVO extends BaseModel {
    /**
     * ç¦æ­¢ä¿®æ”¹è¿™ä¸ªå€¼
     */
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/SysIntAuthorityVO.java
@@ -1,6 +1,6 @@
package com.vci.ubcs.code.vo.pagemodel;
import com.vci.ubcs.code.vo.pagemodel.BaseModelVO;
import com.vci.ubcs.starter.revision.model.BaseModel;
/**
 * ç³»ç»Ÿé›†æˆæŽ¥å£çš„认证显示对象
@@ -8,7 +8,7 @@
 * @author lihang
 * @date 2022-03-07
 */
public class SysIntAuthorityVO extends BaseModelVO {
public class SysIntAuthorityVO extends BaseModel {
    /**
     * ç¦æ­¢ä¿®æ”¹è¿™ä¸ªå€¼
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/SysIntHeaderVO.java
@@ -1,6 +1,6 @@
package com.vci.ubcs.code.vo.pagemodel;
import com.vci.ubcs.code.vo.pagemodel.BaseModelVO;
import com.vci.ubcs.starter.revision.model.BaseModel;
/**
 * ç³»ç»Ÿé›†æˆæŽ¥å£çš„认证显示对象
@@ -8,7 +8,7 @@
 * @author weidy
 * @date 2022-04-11
 */
public class SysIntHeaderVO extends BaseModelVO {
public class SysIntHeaderVO extends BaseModel {
    /**
     * ç¦æ­¢ä¿®æ”¹è¿™ä¸ªå€¼
Source/UBCS/ubcs-service-api/ubcs-code-api/src/main/java/com/vci/ubcs/code/vo/pagemodel/SysIntParamVO.java
@@ -1,6 +1,7 @@
package com.vci.ubcs.code.vo.pagemodel;
import com.vci.ubcs.code.vo.pagemodel.BaseModelVO;
import com.vci.ubcs.starter.revision.model.BaseModel;
/**
 * ç³»ç»Ÿé›†æˆæŽ¥å£çš„认证显示对象
@@ -8,7 +9,7 @@
 * @author weidy
 * @date 2022-04-11
 */
public class SysIntParamVO extends BaseModelVO {
public class SysIntParamVO extends BaseModel {
    /**
     * ç¦æ­¢ä¿®æ”¹è¿™ä¸ªå€¼
Source/UBCS/ubcs-service-api/ubcs-dict-api/src/main/java/com/vci/ubcs/system/feign/IDictBizClient.java
@@ -34,7 +34,7 @@
 * @author Chill
 */
@FeignClient(
    value = AppConstant.APPLICATION_NAME_OMD,
    value = AppConstant.APPLICATION_SYSTEM_NAME,
    fallback = IDictBizClientFallback.class
)
public interface IDictBizClient {
Source/UBCS/ubcs-service-api/ubcs-omd-api/pom.xml
@@ -20,6 +20,12 @@
            <artifactId>ubcs-util-api</artifactId>
            <version>3.0.1.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>com.vci.ubcs</groupId>
            <artifactId>ubcs-user-api</artifactId>
            <version>3.0.1.RELEASE</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>
</project>
Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/enums/EnumEnum.java
@@ -115,7 +115,7 @@
    /**
     * å±žæ€§ç±»åž‹
     */
    VCO_FIELD_TYPE("vciFieldType"),
    VCI_FIELD_TYPE("vciFieldType"),
    /**
     * çª—口类型
     */
Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/feign/IAttributeClient.java
@@ -18,6 +18,7 @@
import com.vci.ubcs.omd.entity.Attribute;
import com.vci.ubcs.omd.vo.AttributeVO;
import org.springblade.core.launch.constant.AppConstant;
import org.springblade.core.tool.api.R;
import org.springframework.cloud.openfeign.FeignClient;
@@ -41,6 +42,8 @@
    String GET_BY_ID = API_PREFIX + "/attribute/get-by-id";
    String GET_LIST = API_PREFIX + "/attribute/get-list";
    String GET_ALL = API_PREFIX + "/attribute/get-all";
    /**
     * èŽ·å–å…ƒæ•°æ®å¯¹è±¡
@@ -57,4 +60,11 @@
     */
    @GetMapping(GET_LIST)
    R<List<Attribute>> getList(@RequestParam("key") String key);
    /**
     * èŽ·å–å…¨éƒ¨å±žæ€§
     * @return æŸ¥è¯¢ç»“æžœ
     */
    @GetMapping(GET_ALL)
    R<List<AttributeVO>> getAll();
}
Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/feign/IAttributeFallback.java
@@ -17,6 +17,7 @@
package com.vci.ubcs.omd.feign;
import com.vci.ubcs.omd.entity.Attribute;
import com.vci.ubcs.omd.vo.AttributeVO;
import org.springblade.core.tool.api.R;
import org.springframework.stereotype.Component;
@@ -39,5 +40,13 @@
        return R.fail("获取数据失败");
    }
    /**
     * æŒ‰é¢†åŸŸèŽ·å–å…¨éƒ¨å±žæ€§
     *
     * @return æŸ¥è¯¢ç»“æžœ
     */
    @Override
    public R<List<AttributeVO>> getAll() {
        return R.fail("获取数据失败");
    }
}
Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/feign/IBtmTypeClient.java
@@ -50,11 +50,11 @@
     */
    String GET_BY_OIDS = API_PREFIX + "/btm-type/get-by-oids";
    String GET_DEFAULT_ATTR_BY_BTM_ID = API_PREFIX + "/btm-attribute/get-default-attr-by-btm-id";
    String GET_DEFAULT_ATTR_BY_BTM_ID = API_PREFIX + "/btm-type/get-default-attr-by-btm-id";
    String GET_ALL_ATTR_BY_BTM_ID = API_PREFIX + "/btm-attribute/get-all-attr-by-btm-id";
    String GET_ALL_ATTR_BY_BTM_ID = API_PREFIX + "/btm-type/get-all-attr-by-btm-id";
    String GET_ALL_ATTR_BY_BTM_OID = API_PREFIX + "/btm-attribute/get-all-attr-by-btm-oid";
    String GET_ALL_ATTR_BY_BTM_OID = API_PREFIX + "/btm-type/get-all-attr-by-btm-oid";
    /**
     * èŽ·å–ä¸šåŠ¡ç±»åž‹è¯¦æƒ…ä¿¡æ¯
Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/feign/ILinkTypeClient.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,136 @@
package com.vci.ubcs.omd.feign;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.vci.ubcs.omd.vo.LinkTypeVO;
import com.vci.ubcs.starter.web.pagemodel.BaseQueryObject;
import org.springblade.core.launch.constant.AppConstant;
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;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.List;
/**
 * Description: é“¾æŽ¥ç±»åž‹Feign接口
 *
 * @author LiHang
 * @date 2023/6/13
 */
@FeignClient(
    value = AppConstant.APPLICATION_NAME_OMD,
    fallback = ILinkTypeFallback.class
)
public interface ILinkTypeClient {
    /**
     * å‰ç¼€
     */
    String API_PREFIX = "/client";
    /**
     * åˆ†é¡µå‚照查询
     */
    String GET_REF_PAGE =API_PREFIX + "/link-type/get-ref-page";
    /**
     * å‚照列表查询无分页
     */
    String GET_REF = API_PREFIX + "/link-type/get-ref";
    /**
     * å‚照明细
     */
    String GET_DETAIL = API_PREFIX + "/link-type/get-detail";
    /**
     * è‹±æ–‡åç§°æ‰¹é‡æŸ¥è¯¢
     */
    String GET_BY_IDS = API_PREFIX + "/link-type/get-by-ids";
    /**
     * ä¸»é”®æ‰¹é‡æŸ¥è¯¢
     */
    String GET_BY_OIDS = API_PREFIX + "/link-type/get-by-oids";
    /**
     * æŒ‰é“¾æŽ¥ç±»åž‹è‹±æ–‡åç§°èŽ·å–é»˜è®¤å­—æ®µ
     */
    String GET_DEFAULT_ATTR_BY_LINK_ID = API_PREFIX + "/link-type/get-default-attr-by-link-id";
    /**
     * æŒ‰é“¾æŽ¥ç±»åž‹è‹±æ–‡åç§°èŽ·å–å…¨éƒ¨å­—æ®µ
     */
    String GET_ALL_ATTR_BY_LINK_ID = API_PREFIX + "/link-type/get-all-attr-by-link-id";
    /**
     * æŒ‰é“¾æŽ¥ç±»åž‹ä¸»é”®èŽ·å–å…¨éƒ¨å­—æ®µ
     */
    String GET_ALL_ATTR_BY_LINK_OID = API_PREFIX + "/link-type/get-all-attr-by-link-oid";
    /**
     * èŽ·å–ä¸šåŠ¡ç±»åž‹è¯¦æƒ…ä¿¡æ¯
     *
     * @param oid ä¸»é”®
     * @return ä¸šåŠ¡ç±»åž‹è¯¦æƒ…ä¿¡æ¯
     */
    @GetMapping(GET_DETAIL)
    R<LinkTypeVO> getDetail(@RequestParam("oid") String oid);
    /**
     * å‚照列表查询
     *
     * @param baseQueryObject æŸ¥è¯¢æ¡ä»¶å¯¹è±¡
     * @return æŸ¥è¯¢ç»“æžœ
     */
    @PostMapping(GET_REF_PAGE)
    R<Page<LinkTypeVO>> getRefPage(@RequestBody BaseQueryObject baseQueryObject);
    /**
     * å‚照列表查询
     * @param baseQueryObject æŸ¥è¯¢æ¡ä»¶å¯¹è±¡
     * @return æŸ¥è¯¢ç»“æžœ
     */
    @PostMapping(GET_REF)
    R<List<LinkTypeVO>> getRef(@RequestBody BaseQueryObject baseQueryObject);
    /**
     * æ ¹æ®è‹±æ–‡åç§°æ‰¹é‡æŸ¥è¯¢å¯¹è±¡
     * @param ids å¯¹è±¡è‹±æ–‡åç§° ä½†æ˜¯ä¸èƒ½è¶…过1000
     * @return ä¸šåŠ¡å¯¹è±¡
     */
    @PostMapping(GET_BY_IDS)
    R<List<LinkTypeVO>> selectByIdCollection(@RequestBody List<String> ids);
    /**
     * æ‰¹é‡æ ¹æ®ä¸»é”®èŽ·å–ä¸šåŠ¡ç±»åž‹
     * @param pkLinkTypeCollection ä¸šåŠ¡ç±»åž‹ä¸»é”®é›†åˆ
     * @return ä¸šåŠ¡ç±»åž‹åˆ—è¡¨ï¼Œå¦‚æžœæœ‰ä¸å­˜åœ¨çš„ä¸ä¼šè¿”å›žï¼Œå…¨éƒ¨ä¸å­˜åœ¨çš„åˆ™è¿”å›žç©ºåˆ—è¡¨
     */
    @PostMapping(GET_BY_OIDS)
    R<List<LinkTypeVO>> listLinkTypeByOidCollection(@RequestBody List<String> pkLinkTypeCollection);
    /**
     * èŽ·å–ä¸šåŠ¡ç±»åž‹ï¼Œåªæœ‰é»˜è®¤å­—æ®µ
     *
     * @param linkTypeId ä¸šåŠ¡ç±»åž‹id
     * @return é»˜è®¤å­—段属性
     */
    @GetMapping(GET_DEFAULT_ATTR_BY_LINK_ID)
    R<LinkTypeVO> getDefaultAttrByLinkId(@RequestParam("linkTypeId") String linkTypeId);
    /**
     * èŽ·å–ä¸šåŠ¡ç±»åž‹ï¼Œæœ‰æ‰€æœ‰çš„å­—æ®µ
     *
     * @param linkTypeId ä¸šåŠ¡ç±»åž‹id
     * @return æ‰€æœ‰å­—段
     */
    @GetMapping(GET_ALL_ATTR_BY_LINK_ID)
    R<LinkTypeVO> getAllAttributeByLinkId(@RequestParam("linkTypeId") String linkTypeId);
    /**
     * èŽ·å–ä¸šåŠ¡ç±»åž‹ï¼Œæœ‰æ‰€æœ‰çš„å­—æ®µ
     *
     * @param linkTypeOid ä¸šåŠ¡ç±»åž‹ä¸»é”®
     * @return æ‰€æœ‰å­—段
     */
    @GetMapping(GET_ALL_ATTR_BY_LINK_OID)
    R<LinkTypeVO> getAllAttributeByLinkOid(@RequestParam("linkTypeOid") String linkTypeOid);
}
Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/feign/ILinkTypeFallback.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,104 @@
package com.vci.ubcs.omd.feign;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.vci.ubcs.omd.vo.LinkTypeVO;
import com.vci.ubcs.starter.web.pagemodel.BaseQueryObject;
import org.springblade.core.tool.api.R;
import java.util.List;
/**
 * Description: é“¾æŽ¥ç±»åž‹feign失败的配置类
 *
 * @author LiHang
 * @date 2023/6/13
 */
public class ILinkTypeFallback implements ILinkTypeClient{
    /**
     * èŽ·å–ä¸šåŠ¡ç±»åž‹è¯¦æƒ…ä¿¡æ¯
     *
     * @param oid ä¸»é”®
     * @return ä¸šåŠ¡ç±»åž‹è¯¦æƒ…ä¿¡æ¯
     */
    @Override
    public R<LinkTypeVO> getDetail(String oid) {
        return R.fail("获取数据失败");
    }
    /**
     * å‚照列表查询
     *
     * @param baseQueryObject æŸ¥è¯¢æ¡ä»¶å¯¹è±¡
     * @return æŸ¥è¯¢ç»“æžœ
     */
    @Override
    public R<Page<LinkTypeVO>> getRefPage(BaseQueryObject baseQueryObject) {
        return R.fail("获取数据失败");
    }
    /**
     * å‚照列表查询
     *
     * @param baseQueryObject æŸ¥è¯¢æ¡ä»¶å¯¹è±¡
     * @return æŸ¥è¯¢ç»“æžœ
     */
    @Override
    public R<List<LinkTypeVO>> getRef(BaseQueryObject baseQueryObject) {
        return R.fail("获取数据失败");
    }
    /**
     * æ ¹æ®è‹±æ–‡åç§°æ‰¹é‡æŸ¥è¯¢å¯¹è±¡
     *
     * @param ids å¯¹è±¡è‹±æ–‡åç§° ä½†æ˜¯ä¸èƒ½è¶…过1000
     * @return ä¸šåŠ¡å¯¹è±¡
     */
    @Override
    public R<List<LinkTypeVO>> selectByIdCollection(List<String> ids) {
        return R.fail("获取数据失败");
    }
    /**
     * æ‰¹é‡æ ¹æ®ä¸»é”®èŽ·å–ä¸šåŠ¡ç±»åž‹
     *
     * @param pkLinkTypeCollection ä¸šåŠ¡ç±»åž‹ä¸»é”®é›†åˆ
     * @return ä¸šåŠ¡ç±»åž‹åˆ—è¡¨ï¼Œå¦‚æžœæœ‰ä¸å­˜åœ¨çš„ä¸ä¼šè¿”å›žï¼Œå…¨éƒ¨ä¸å­˜åœ¨çš„åˆ™è¿”å›žç©ºåˆ—è¡¨
     */
    @Override
    public R<List<LinkTypeVO>> listLinkTypeByOidCollection(List<String> pkLinkTypeCollection) {
        return R.fail("获取数据失败");
    }
    /**
     * èŽ·å–ä¸šåŠ¡ç±»åž‹ï¼Œåªæœ‰é»˜è®¤å­—æ®µ
     *
     * @param linkTypeId ä¸šåŠ¡ç±»åž‹id
     * @return é»˜è®¤å­—段属性
     */
    @Override
    public R<LinkTypeVO> getDefaultAttrByLinkId(String linkTypeId) {
        return R.fail("获取数据失败");
    }
    /**
     * èŽ·å–ä¸šåŠ¡ç±»åž‹ï¼Œæœ‰æ‰€æœ‰çš„å­—æ®µ
     *
     * @param linkTypeId ä¸šåŠ¡ç±»åž‹id
     * @return æ‰€æœ‰å­—段
     */
    @Override
    public R<LinkTypeVO> getAllAttributeByLinkId(String linkTypeId) {
        return R.fail("获取数据失败");
    }
    /**
     * èŽ·å–ä¸šåŠ¡ç±»åž‹ï¼Œæœ‰æ‰€æœ‰çš„å­—æ®µ
     *
     * @param linkTypeOid ä¸šåŠ¡ç±»åž‹ä¸»é”®
     * @return æ‰€æœ‰å­—段
     */
    @Override
    public R<LinkTypeVO> getAllAttributeByLinkOid(String linkTypeOid) {
        return R.fail("获取数据失败");
    }
}
Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/feign/IWebSecretClient.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,184 @@
/*
 *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
 *
 *  Redistribution and use in source and binary forms, with or without
 *  modification, are permitted provided that the following conditions are met:
 *
 *  Redistributions of source code must retain the above copyright notice,
 *  this list of conditions and the following disclaimer.
 *  Redistributions in binary form must reproduce the above copyright
 *  notice, this list of conditions and the following disclaimer in the
 *  documentation and/or other materials provided with the distribution.
 *  Neither the name of the dreamlu.net developer nor the names of its
 *  contributors may be used to endorse or promote products derived from
 *  this software without specific prior written permission.
 *  Author: Chill åº„骞 (smallchill@163.com)
 */
package com.vci.ubcs.omd.feign;
import com.vci.ubcs.omd.entity.Enum;
import com.vci.ubcs.omd.entity.EnumItem;
import com.vci.ubcs.omd.vo.EnumVO;
import com.vci.ubcs.starter.exception.VciBaseException;
import com.vci.ubcs.system.user.vo.UserVO;
import io.swagger.models.auth.In;
import org.springblade.core.launch.constant.AppConstant;
import org.springblade.core.mp.support.BladePage;
import org.springblade.core.tool.api.R;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.List;
/**
 * æžšä¸¾å®šä¹‰ Feign接口类
 *
 * @author yuxc
 * @since 2023-05-08
 */
@FeignClient(
    value = AppConstant.APPLICATION_NAME_OMD,
    fallback = IWebSecretFallback.class
)
public interface IWebSecretClient {
    String API_PREFIX = "/client";
    String MINUSER = API_PREFIX + "/secret/min-user";
    String MINDATA = API_PREFIX + "/secret/min-data";
    String MINIP = API_PREFIX + "/secret/min-ip";
    String USER = API_PREFIX + "/secret/user";
    String USERVO = API_PREFIX + "/secret/uservo";
    String CHECKDATA = API_PREFIX + "/secret/check-data";
    String CHECKUSERDATA = API_PREFIX + "/secret/chec-user-data";
    String CHECKUSERIDDATA = API_PREFIX + "/secret/chec-userid-data";
    String CHECKVO = API_PREFIX + "/secret/checkvo";
    String IP = API_PREFIX + "/secret/ip";
    String IPUSER = API_PREFIX + "/secret/ip-user";
    String IPSECRET = API_PREFIX + "/secret/ip-secret";
    String IPUSERID = API_PREFIX + "/secret/ip-userid";
    String IPUSERVO = API_PREFIX + "/secret/ip-uservo";
    /**
     * èŽ·å–ç”¨æˆ·å¯†çº§çš„æœ€å°å€¼
     * @return å¯†çº§çš„值
     * @throws VciBaseException æŸ¥è¯¢å‡ºé”™ä¼šæŠ›å‡ºå¼‚常
     */
    @GetMapping(MINUSER)
    R<Integer> getMinUserSecret() throws VciBaseException;
    /**
     * èŽ·å–æ•°æ®å¯†çº§çš„é»˜è®¤å€¼
     * @return å¯†çº§çš„值
     * @throws VciBaseException æŸ¥è¯¢å‡ºé”™ä¼šæŠ›å‡ºå¼‚常
     */
    @GetMapping(MINDATA)
    R<Integer> getMinDataSecret() throws VciBaseException;
    /**
     * èŽ·å–IP密级的默认值
     * @return å¯†çº§çš„值
     * @throws VciBaseException æŸ¥è¯¢å‡ºé”™ä¼šæŠ›å‡ºå¼‚常
     */
    @GetMapping(MINIP)
    R<Integer> getMinIpSecret() throws VciBaseException;
    /**
     * èŽ·å–ç”¨æˆ·å¯†çº§
     * @param userId ç”¨æˆ·ä¸»é”®
     * @return ç”¨æˆ·çš„密级
     * @throws VciBaseException å‚数错误,用户不存在会抛出异常
     */
    @GetMapping(USER)
    R<Integer> getUserSecret(@RequestParam("userId") String userId) throws VciBaseException ;
    /**
     * èŽ·å–ç”¨æˆ·å¯†çº§
     * @param userVO ç”¨æˆ·çš„æ˜¾ç¤ºå¯¹è±¡
     * @return ç”¨æˆ·çš„密级
     * @throws VciBaseException å‚数错误,用户不存在会抛出异常
     */
    @GetMapping(USERVO)
    R<Integer> getUserSecret(@RequestBody UserVO userVO) throws VciBaseException;
    /**
     * æ ¡éªŒå½“前用户是否有权限访问数据
     * @param secret æ•°æ®çš„密级
     * @return true表示允许访问
     */
    @GetMapping(CHECKDATA)
    R<Boolean> checkDataSecret(@RequestParam("secret") int secret);
    /**
     * æ ¡éªŒç”¨æˆ·çš„密级是否是否有权限访问数据
     * @param secret æ•°æ®çš„密级
     * @param userSecret ç”¨æˆ·å¯†çº§
     * @return true表示允许访问
     */
    @GetMapping(CHECKUSERDATA)
    R<Boolean> checkDataSecret(@RequestParam("secret") int secret, @RequestParam("userSecret") int userSecret) ;
    /**
     * æ ¹æ®ç”¨æˆ·åæ¥æ ¡éªŒæ•°æ®å¯†çº§
     * @param secret æ•°æ®çš„密级
     * @param userId ç”¨æˆ·å
     * @return true表示允许访问
     * @throws VciBaseException å‚数错误,用户不存在会抛出异常
     */
    @GetMapping(CHECKUSERIDDATA)
    R<Boolean> checkDataSecret(@RequestParam("secret") int secret, @RequestParam("userId") String userId) throws VciBaseException;
    /**
     * æ ¹æ®ç”¨æˆ·å¯¹è±¡æ¥æ ¡éªŒæ•°æ®å¯†çº§
     * @param secret  æ•°æ®çš„密级
     * @param userVO ç”¨æˆ·çš„æ˜¾ç¤ºå¯¹è±¡
     * @return true表示允许访问
     */
    @GetMapping(CHECKVO)
    R<Boolean> checkDataSecret(@RequestParam("secret") int secret,@RequestBody UserVO userVO) ;
    /**
     * èŽ·å–IP地址的密级
     * @param ip ip地址
     * @return å¯†çº§çš„值
     * @throws VciBaseException æŸ¥è¯¢å‡ºé”™çš„æ—¶å€™ä¼šæŠ›å‡ºå¼‚常
     */
    @GetMapping(IP)
    R<Integer> getIpSecret(@RequestParam("ip") String ip) throws VciBaseException;
    /**
     * æ£€æŸ¥æœºå™¨å¯†çº§
     * @param ipSecret æœºå™¨å¯†çº§
     * @param userSecret ç”¨æˆ·çš„密级
     * @return å¯†çº§çš„值
     */
    @GetMapping(IPUSER)
    R<Boolean> checkIpSecret(@RequestParam("ipSecret") int ipSecret, @RequestParam("userSecret") int userSecret);
    /**
     * æ£€æŸ¥å½“前用户是否符合机器密级
     * @param ipSecret æœºå™¨å¯†çº§
     * @return true表示允许访问
     */
    @GetMapping(IPSECRET)
    R<Boolean> checkIpSecret(@RequestParam("ipSecret") int ipSecret) ;
    /**
     * æ ¡éªŒæŒ‡å®šip和用户是否符合机器密级
     * @param ip ip地址
     * @param userId ç”¨æˆ·å
     * @return true表示允许访问
     * @throws VciBaseException å‚数错误,用户不存在会抛出异常
     */
    @GetMapping(IPUSERID)
    R<Boolean> checkIpSecret(@RequestParam("ip") String ip, @RequestParam("userId") String userId) throws VciBaseException;
    /**
     * æ ¡éªŒæŒ‡å®šIP和用户对象符合机器密级
     * @param ip ip地址
     * @param userVO ç”¨æˆ·å¯¹è±¡
     * @return  true表示允许访问
     */
    @GetMapping(IPUSERVO)
    R<Boolean> checkIpSecret(@RequestParam("ip") String ip,@RequestBody UserVO userVO) ;
}
Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/feign/IWebSecretFallback.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,101 @@
/*
 *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
 *
 *  Redistribution and use in source and binary forms, with or without
 *  modification, are permitted provided that the following conditions are met:
 *
 *  Redistributions of source code must retain the above copyright notice,
 *  this list of conditions and the following disclaimer.
 *  Redistributions in binary form must reproduce the above copyright
 *  notice, this list of conditions and the following disclaimer in the
 *  documentation and/or other materials provided with the distribution.
 *  Neither the name of the dreamlu.net developer nor the names of its
 *  contributors may be used to endorse or promote products derived from
 *  this software without specific prior written permission.
 *  Author: Chill åº„骞 (smallchill@163.com)
 */
package com.vci.ubcs.omd.feign;
import com.vci.ubcs.starter.exception.VciBaseException;
import com.vci.ubcs.system.user.vo.UserVO;
import org.springblade.core.tool.api.R;
import org.springframework.stereotype.Component;
/**
 * Feign失败配置
 *
 * @author Chill
 */
@Component
public class IWebSecretFallback implements IWebSecretClient {
    @Override
    public R<Integer> getMinUserSecret() throws VciBaseException {
        return R.fail("获取数据失败");
    }
    @Override
    public R<Integer> getMinDataSecret() throws VciBaseException {
        return R.fail("获取数据失败");
    }
    @Override
    public R<Integer> getMinIpSecret() throws VciBaseException {
        return R.fail("获取数据失败");
    }
    @Override
    public R<Integer> getUserSecret(String userId) throws VciBaseException {
        return R.fail("获取数据失败");
    }
    @Override
    public R<Integer> getUserSecret(UserVO userVO) throws VciBaseException {
        return R.fail("获取数据失败");
    }
    @Override
    public R<Boolean> checkDataSecret(int secret) {
        return R.fail("获取数据失败");
    }
    @Override
    public R<Boolean> checkDataSecret(int secret, int userSecret) {
        return R.fail("获取数据失败");
    }
    @Override
    public R<Boolean> checkDataSecret(int secret, String userId) throws VciBaseException {
        return R.fail("获取数据失败");
    }
    @Override
    public R<Boolean> checkDataSecret(int secret, UserVO userVO) {
        return R.fail("获取数据失败");
    }
    @Override
    public R<Integer> getIpSecret(String ip) throws VciBaseException {
        return R.fail("获取数据失败");
    }
    @Override
    public R<Boolean> checkIpSecret(int ipSecret, int userSecret) {
        return R.fail("获取数据失败");
    }
    @Override
    public R<Boolean> checkIpSecret(int ipSecret) {
        return R.fail("获取数据失败");
    }
    @Override
    public R<Boolean> checkIpSecret(String ip, String userId) throws VciBaseException {
        return R.fail("获取数据失败");
    }
    @Override
    public R<Boolean> checkIpSecret(String ip, UserVO userVO) {
        return R.fail("获取数据失败");
    }
}
Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/util/Tool.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,39 @@
package com.vci.ubcs.omd.util;
import java.util.ArrayList;
public class Tool {
    public static final String ALLOWNULL = "allowNull";
    public static final String BTM = "btm";
    public static final String ISFIXLEN = "isFixLen";
    public static final String LENGTH = "length";
    public static final String ENUMNAME = "enumName";
    public static final String ACCURACY = "accuracy";
    public static final String LINKTYPENAME = "linkTypeName";
    public static final String VERSION = "version";
    public static ArrayList<String> convertArrayToList(String[] array) {
        ArrayList<String> list = new ArrayList();
        for(int i = 0; i < array.length; ++i) {
            list.add(array[i]);
        }
        return list;
    }
    public static String getOtherValueByType(String other, String type) {
        String[] otherArray = other.split(";");
        for(int i = 0; i < otherArray.length; ++i) {
            String otherValue = otherArray[i];
            if (otherValue.contains(type)) {
                return otherValue.substring(otherValue.indexOf("=") + 2, otherValue.length());
            }
        }
        return null;
    }
}
Source/UBCS/ubcs-service-api/ubcs-omd-api/src/main/java/com/vci/ubcs/omd/utils/VciOmdUtil.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,25 @@
package com.vci.ubcs.omd.utils;
import com.vci.ubcs.omd.vo.EnumVO;
import com.vci.ubcs.starter.web.pagemodel.KeyValue;
import java.util.ArrayList;
import java.util.List;
public class VciOmdUtil {
    /**
     * å°†List<EnumVO> è½¬æ¢ä¸ºKeyValue ç±»åž‹
     * @param enums æžšä¸¾é›†åˆ
     * @return KeyValue集合
     */
    public static List<KeyValue> enumsToListKeyVale(List<EnumVO> enums) {
        List<KeyValue> keyValues = new ArrayList<>();
        for (EnumVO anEnum : enums) {
            KeyValue keyValue = new KeyValue();
            keyValue.setKey(anEnum.getItemName());
            keyValue.setValue(anEnum.getItemValue());
            keyValues.add(keyValue);
        }
        return keyValues;
    }
}
Source/UBCS/ubcs-service-api/ubcs-user-api/src/main/java/com/vci/ubcs/system/user/entity/User.java
@@ -104,7 +104,7 @@
    /**
     * ç”¨æˆ·å¯†çº§
     */
    private String secretgrade;
    private String secretGrade;
    /**
     * å¯†ç ç­–略修改状态
     */
Source/UBCS/ubcs-service-api/ubcs-util-api/pom.xml
@@ -45,5 +45,14 @@
            <artifactId>mybatis-plus-join-boot-starter</artifactId>
            <version>${mybatisplus.join.version}</version>
        </dependency>
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.4.1</version>
        </dependency>
        <dependency>
            <groupId>org.springblade</groupId>
            <artifactId>blade-starter-log</artifactId>
        </dependency>
    </dependencies>
</project>
Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/constant/CodeTableNameConstant.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,125 @@
package com.vci.ubcs.starter.constant;
/**
 * code服务中用到的表名常量类
 * @author ludc
 * @date 2023/6/8 11:04
 */
public class CodeTableNameConstant {
    /**
     * åŸºç¡€ç æ®µçš„信息
     */
    public static final String PL_CODE_BASICSEC = "PL_CODE_BASICSEC";
    /**
     * ä¸»é¢˜åº“的分类
     */
    public static final String PL_CODE_CLASSIFY = "PL_CODE_CLASSIFY";
    /**
     * æ¨¡æ¿æ‰©å±•æ± 
     */
    public static final String PL_CODE_BUTTON = "PL_CODE_BUTTON";
    /**
     * å…¨éƒ¨ç å€¼
     */
    public static final String PL_CODE_ALLCODE = "PL_CODE_ALLCODE";
    /**
     * åˆ†ç±»ä½¿ç”¨çš„æµç¨‹æ¨¡æ¿
     */
    public static final String PL_CODE_CLSFLOWTEMP = "PL_CODE_CLSFLOWTEMP";
    /**
     * ç¼–码库定义-模板管理
     */
    public static final String PL_CODE_CLSTEMPLATE = "PL_CODE_CLSTEMPLATE";
    /**
     * ä¸»é¢˜åº“分类的模板属性
     */
    public static final String PL_CODE_CLSTEMPATTR = "PL_CODE_CLSTEMPATTR";
    /**
     * ç¼–码库定义-模板按钮扩展
     */
    public static final String PL_CODE_TEMPBUTTON = "PL_CODE_TEMPBUTTON";
    /**
     * åˆ†ç±»ç æ®µçš„码值
     */
    public static final String PL_CODE_CLASSIFYVALUE = "PL_CODE_CLASSIFYVALUE";
    /**
     * å›ºå®šç æ®µçš„码值
     */
    public static final String PL_CODE_FIXEDVALUE = "PL_CODE_FIXEDVALUE";
    /**
     * å…³é”®å±žæ€§æŸ¥é‡è§„则
     */
    public static final String PL_CODE_KEYATTRREPEAT = "PL_CODE_KEYATTRREPEAT";
    /**
     * ç¼–码库定义
     */
    public static final String PL_CODE_PHASEATTR = "PL_CODE_PHASEATTR";
    /**
     * ç¼–码规则管理-引用码段-参照配置
     */
    public static final String PL_CODE_REFERCONFIG = "PL_CODE_REFERCONFIG";
    /**
     * ç¼–码规则
     */
    public static final String PL_CODE_RULE = "PL_CODE_RULE";
    /**
     * ç¼–码规则的流水值
     */
    public static final String PL_CODE_SERIALVALUE = "PL_CODE_SERIALVALUE";
    /**
     * ç¼–码规则管理-引用码段-参照配置-显示属性配置
     */
    public static final String PL_CODE_SHOWFIELDCONFIG = "PL_CODE_SHOWFIELDCONFIG";
    /**
     * ç¼–码规则管理-引用码段-参照配置-搜索条件配置
     */
    public static final String PL_CODE_SRCHCONDCONFIG = "PL_CODE_SRCHCONDCONFIG";
    /**
     * è¿‘义词维护 å®žä½“ç±»
     */
    public static final String PL_CODE_SYNONYM = "PL_CODE_SYNONYM";
    /**
     * ç¼–码库定义-模板阶段 å®žä½“ç±»
     */
    public static final String PL_CODE_TEMPPHASE = "PL_CODE_TEMPPHASE";
    /**
     * ç¼–码信息 å®žä½“ç±»
     */
    public static final String PL_CODE_WUPIN = "PL_CODE_WUPIN";
    /**
     * é›†æˆæ—¥å¿—对象
     */
    public static final String PL_DOCKING_LOG = "PL_DOCKING_LOG";
    /**
     * é›†æˆç®¡ç†æŽ¥å£-集成系统维护对象
     */
    public static final String PL_CODE_SYSINTBASE = "PL_CODE_SYSINTBASE";
    /**
     * é›†æˆæŽ¥å£-集成接口管理对象
     */
    public static final String PL_CODE_SYSINTINFO = "PL_CODE_SYSINTINFO";
}
Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/enumpack/CodeTableNameEnum.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,161 @@
package com.vci.ubcs.starter.enumpack;
import com.vci.ubcs.starter.constant.CodeTableNameConstant;
import org.springblade.core.launch.constant.AppConstant;
/**
 * code服务中用到的联表查询时表别名
 * @author ludc
 * @date 2023/6/8 11:22
 */
public enum CodeTableNameEnum {
    /**
     * åŸºç¡€ç æ®µçš„信息表别名
     */
    PL_CODE_BASICSEC(CodeTableNameConstant.PL_CODE_BASICSEC,"pl_code_basicsec"),
    /**
     * ä¸»é¢˜åº“的分类表别名
     */
    PL_CODE_CLASSIFY(CodeTableNameConstant.PL_CODE_CLASSIFY,"pl_code_classify"),
    /**
     * æ¨¡æ¿æ‰©å±•æ± 
     */
    PL_CODE_BUTTON(CodeTableNameConstant.PL_CODE_BUTTON,"pl_code_button"),
    /**
     * å…¨éƒ¨ç å€¼
     */
    PL_CODE_ALLCODE(CodeTableNameConstant.PL_CODE_ALLCODE,"pl_code_allcode"),
    /**
     * åˆ†ç±»ä½¿ç”¨çš„æµç¨‹æ¨¡æ¿
     */
    PL_CODE_CLSFLOWTEMP(CodeTableNameConstant.PL_CODE_CLSFLOWTEMP,"pl_code_clsflowtemp"),
    /**
     * ç¼–码库定义-模板管理
     */
    PL_CODE_CLSTEMPLATE(CodeTableNameConstant.PL_CODE_CLSTEMPLATE,"pl_code_clstemplate"),
    /**
     * ä¸»é¢˜åº“分类的模板属性
     */
    PL_CODE_CLSTEMPATTR(CodeTableNameConstant.PL_CODE_CLSTEMPATTR,"pl_code_clstempattr"),
    /**
     * ç¼–码库定义-模板按钮扩展
     */
    PL_CODE_TEMPBUTTON(CodeTableNameConstant.PL_CODE_TEMPBUTTON,"pl_code_tempbutton"),
    /**
     * åˆ†ç±»ç æ®µçš„码值
     */
    PL_CODE_CLASSIFYVALUE(CodeTableNameConstant.PL_CODE_CLASSIFYVALUE,"pl_code_classifyvalue"),
    /**
     * å›ºå®šç æ®µçš„码值
     */
    PL_CODE_FIXEDVALUE(CodeTableNameConstant.PL_CODE_FIXEDVALUE,"pl_code_fixedvalue"),
    /**
     * å…³é”®å±žæ€§æŸ¥é‡è§„则
     */
    PL_CODE_KEYATTRREPEAT(CodeTableNameConstant.PL_CODE_KEYATTRREPEAT,"pl_code_keyattrrepeat"),
    /**
     * ç¼–码库定义
     */
    PL_CODE_PHASEATTR(CodeTableNameConstant.PL_CODE_PHASEATTR,"pl_code_phaseattr"),
    /**
     * ç¼–码规则管理-引用码段-参照配置
     */
    PL_CODE_REFERCONFIG(CodeTableNameConstant.PL_CODE_REFERCONFIG,"pl_code_referconfig"),
    /**
     * ç¼–码规则
     */
    PL_CODE_RULE(CodeTableNameConstant.PL_CODE_RULE,"pl_code_rule"),
    /**
     * ç¼–码规则的流水值
     */
    PL_CODE_SERIALVALUE(CodeTableNameConstant.PL_CODE_SERIALVALUE,"pl_code_serialvalue"),
    /**
     * ç¼–码规则管理-引用码段-参照配置-显示属性配置
     */
    PL_CODE_SHOWFIELDCONFIG(CodeTableNameConstant.PL_CODE_SHOWFIELDCONFIG,"pl_code_showfieldconfig"),
    /**
     * ç¼–码规则管理-引用码段-参照配置-搜索条件配置
     */
    PL_CODE_SRCHCONDCONFIG(CodeTableNameConstant.PL_CODE_SRCHCONDCONFIG,"pl_code_srchcondconfig"),
    /**
     * è¿‘义词维护 å®žä½“ç±»
     */
    PL_CODE_SYNONYM(CodeTableNameConstant.PL_CODE_SYNONYM,"pl_code_synonym"),
    /**
     * ç¼–码库定义-模板阶段 å®žä½“ç±»
     */
    PL_CODE_TEMPPHASE(CodeTableNameConstant.PL_CODE_TEMPPHASE,"pl_code_tempphase"),
    /**
     * ç¼–码信息 å®žä½“ç±»
     */
    PL_CODE_WUPIN(CodeTableNameConstant.PL_CODE_WUPIN,"pl_code_wupin"),
    /**
     * é›†æˆæ—¥å¿—对象
     */
    PL_DOCKING_LOG(CodeTableNameConstant.PL_DOCKING_LOG,"pl_code_log"),
    /**
     * é›†æˆç®¡ç†æŽ¥å£-集成系统维护对象
     */
    PL_CODE_SYSINTBASE(CodeTableNameConstant.PL_CODE_SYSINTBASE,"pl_code_sysintbase"),
    /**
     * é›†æˆæŽ¥å£-集成接口管理对象
     */
    PL_CODE_SYSINTINFO(CodeTableNameConstant.PL_CODE_SYSINTINFO,"pl_code_sysintinfo")
    ;
    /**
     * æžšä¸¾çš„name
     */
    private String name;
    /**
     * æžšä¸¾æ˜¾ç¤ºæ–‡æœ¬
     */
    private String text;
    CodeTableNameEnum(String name, String text) {
        this.name = name;
        this.text = text;
    }
    public String getName() {
        return name;
    }
    public String getText() {
        return text;
    }
    public void setName(String name) {
        this.name = name;
    }
    public void setText(String text) {
        this.text = text;
    }
}
Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/exception/VciBaseException.java
@@ -9,10 +9,14 @@
import com.vci.ubcs.starter.web.util.MessageUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springblade.core.log.exception.ServiceException;
import org.springframework.web.server.ServerErrorException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.text.MessageFormat;
public class VciBaseException extends RuntimeException {
public class VciBaseException extends ServiceException {
    private Logger log = LoggerFactory.getLogger(this.getClass());
    public static final String paramNull = "com.vci.base.paramNull";
    public static final String fieldValueRepeat = "com.vci.base.fieldValueRepeat";
@@ -29,16 +33,18 @@
    private Object[] objs = new Object[0];
    public VciBaseException(String code) {
        super(code);
        this.code = code;
    }
    public VciBaseException(String code, Object[] objs) {
        super(code);
        this.code = code;
        this.objs = objs;
    }
    public VciBaseException(String code, Object[] objs, Throwable e) {
        super(e);
        super(code);
        this.code = code;
        this.objs = objs;
    }
@@ -72,6 +78,36 @@
        }
    }
    /**
     * èŽ·å–å¼‚å¸¸ä¿¡æ¯
     * @param e å¼‚常对象
     * @return å¼‚常对象上的所有内容
     */
    public static String getErrorMsgByE(Throwable e){
        if(e == null){
            return "未知错误";
        }
        if( e.getClass()!= null && e.getClass().getSuperclass()!= null &&
            (e.getClass().getSuperclass().equals(RuntimeException.class)
                || e.getClass().getSuperclass().getName().endsWith(".VciBaseException")
                || e.getClass().getName().endsWith(".VciBaseException"))){
            //说明是我们自定义的异常类
            try {
                Method errorMethod = e.getClass().getMethod("getErrorMsg");
                if(errorMethod != null ){
                    return (String)errorMethod.invoke(e);
                }
            } catch (NoSuchMethodException e1) {
                return e.getMessage();
            } catch (IllegalAccessException e1) {
                return e.getMessage();
            } catch (InvocationTargetException e1) {
                return e.getMessage();
            }
        }
        return e.getMessage();
    }
    @Override
    public String getMessage() {
        return this.getCode() + "," + this.getErrorMsg();
Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/poi/util/ExcelUtil.java
@@ -61,6 +61,10 @@
    private static Logger logger = LoggerFactory.getLogger(ExcelUtil.class);
    public static final String KEY_ATTR_CHAR = "☆";
    public static final String REQUIRED_CHAR = "*";
    /**
     * æ›¿æ¢å­—符
     */
    public static final String SPECIAL_CHAR  = "VCI";
    public ExcelUtil() {
    }
Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/revision/model/BaseModel.java
@@ -1,5 +1,6 @@
package com.vci.ubcs.starter.revision.model;
import com.alibaba.fastjson.annotation.JSONField;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
@@ -26,6 +27,13 @@
    private String id;
    private String name;
    /**
     * ç§Ÿæˆ·ID
     * @TableField(value = "tenant_id")这里必须要写,并且必须是要小写的
     */
    @TableField(value = "tenant_id",exist = false)
    private String tenantId;
    private String description;
@@ -90,18 +98,15 @@
    private String copyFromVersion;
    //    @VciUseEnum(
//        value = "Enumsecretgrade",
//        showTextField = "secretGradeText"
//    )
    /**
     * éœ€è¦ä½¿ç”¨å¯†çº§çš„æ—¶å€™ï¼Œéœ€è¦ç»§æ‰¿è¿™ä¸ªå±žæ€§
     */
    @TableField(exist = false)
    private Integer secretGrade;
    @Transient
    @TableField(exist = false)
    private String secretGradeText;
    @Transient
    @TableField(exist = false)
    private Map<String, String> data;
@@ -340,13 +345,13 @@
        this.lctid = lctid;
    }
/*    public String getGroupcode() {
        return this.groupcode;
    public String getTenantId() {
        return tenantId;
    }
    public void setGroupcode(String groupcode) {
        this.groupcode = groupcode;
    }*/
    public void setTenantId(String tenantId) {
        this.tenantId = tenantId;
    }
    public Map<String, String> getData() {
        return this.data;
@@ -358,7 +363,7 @@
    @Override
    public String toString() {
        return "BaseModel{oid='" + this.oid + '\'' + ", id='" + this.id + '\'' + ", name='" + this.name + '\'' + ", description='" + this.description + '\'' + ", revisionOid='" + this.revisionOid + '\'' + ", nameOid='" + this.nameOid + '\'' + ", btmname='" + this.btmname + '\'' + ", lastR='" + this.lastR + '\'' + ", firstR='" + this.firstR + '\'' + ", lastV='" + this.lastV + '\'' + ", firstV='" + this.firstV + '\'' + ", creator='" + this.creator + '\'' + ", createTime=" + this.createTime + ", lastModifier='" + this.lastModifier + '\'' + ", lastModifyTime=" + this.lastModifyTime + ", revisionRule='" + this.revisionRule + '\'' + ", revisionSeq=" + this.revisionSeq + ", revisionValue='" + this.revisionValue + '\'' + ", versionRule='" + this.versionRule + '\'' + ", versionSeq=" + this.versionSeq + ", versionValue='" + this.versionValue + '\'' + ", lctid='" + this.lctid + '\'' + ", lcStatus='" + this.lcStatus + '\'' + ", lcStatusText='" + this.lcStatusText + '\'' + ", ts=" + this.ts + ", owner='" + this.owner + '\''  + ", copyFromVersion='" + this.copyFromVersion + '\'' + ", secretGrade=" + this.secretGrade + ", secretGradeText='" + this.secretGradeText + '\'' + ", data=" + this.data + '}';
        return "BaseModel{oid='" + this.oid + '\'' + ", id='" + this.id + '\'' + ", name='" + this.name + '\'' + ", description='" + this.description + '\'' + ", revisionOid='" + this.revisionOid + '\'' + ", nameOid='" + this.nameOid + '\'' + ", btmname='" + this.btmname + '\'' + ", lastR='" + this.lastR + '\'' + ", firstR='" + this.firstR + '\'' + ", lastV='" + this.lastV + '\'' + ", firstV='" + this.firstV + '\'' + ", creator='" + this.creator + '\'' + ", createTime=" + this.createTime + ", lastModifier='" + this.lastModifier + '\'' + ", lastModifyTime=" + this.lastModifyTime + ", revisionRule='" + this.revisionRule + '\'' + ", revisionSeq=" + this.revisionSeq + ", revisionValue='" + this.revisionValue + '\'' + ", versionRule='" + this.versionRule + '\'' + ", versionSeq=" + this.versionSeq + ", versionValue='" + this.versionValue + '\'' + ", lctid='" + this.lctid + '\'' + ", lcStatus='" + this.lcStatus + '\'' + ", lcStatusText='" + this.lcStatusText + '\'' + ", ts=" + this.ts + ", owner='" + this.owner + '\''  + ", copyFromVersion='" + this.copyFromVersion + '\'' + ", secretGrade=" + this.secretGrade + ", secretGradeText='" + this.secretGradeText + '\'' + ", data=" + this.data + '}' + '\'' + ", tenantId=" + this.tenantId + '}';
    }
}
Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/revision/model/TreeQueryObject.java
@@ -27,6 +27,26 @@
    public TreeQueryObject() {
    }
    public TreeQueryObject(Map<String, String> conditionMap) {
        this.setConditionMap(conditionMap);
    }
    public TreeQueryObject(Map<String, String> conditionMap, boolean multipleSelect, boolean showCheckBox, boolean queryAllLevel, String parentOid, String parentBtmName, String valueField, String textField, String parentFieldName, Map<String, String> extandParamsMap, boolean queryAllRev, String sort, String order) {
        this.conditionMap = conditionMap;
        this.multipleSelect = multipleSelect;
        this.showCheckBox = showCheckBox;
        this.queryAllLevel = queryAllLevel;
        this.parentOid = parentOid;
        this.parentBtmName = parentBtmName;
        this.valueField = valueField;
        this.textField = textField;
        this.parentFieldName = parentFieldName;
        this.extandParamsMap = extandParamsMap;
        this.queryAllRev = queryAllRev;
        this.sort = sort;
        this.order = order;
    }
    public String getValueField() {
        return this.valueField;
    }
Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/util/DefaultAttrAssimtUtil.java
@@ -1,6 +1,6 @@
package com.vci.ubcs.starter.util;
import com.alibaba.druid.util.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.vci.ubcs.starter.exception.VciBaseException;
import com.vci.ubcs.starter.revision.model.BaseModel;
import com.vci.ubcs.starter.web.util.VciBaseUtil;
@@ -9,8 +9,11 @@
import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.Map;
/**
 * æ–°å¢žæ—¶é»˜è®¤å€¼å±žæ€§èµ‹å€¼
@@ -50,7 +53,7 @@
            baseModel.setVersionSeq(1);
            baseModel.setVersionRule("0");
            baseModel.setVersionValue("1");
            baseModel.setNameOid(VciBaseUtil.getPk());
            baseModel.setRevisionOid(VciBaseUtil.getPk());
            baseModel.setLastModifier(userId);
        }catch (VciBaseException e){
            e.printStackTrace();
@@ -79,4 +82,68 @@
        return (T)baseModel;
    }
    /**
     * æ–°å¢žæ—¶å¡«å……默认值
     * @param object ç»§æ‰¿äº†BaseModel的实体对象
     * @param <T>   è¿”回值的类型
     * @return
     * @throws VciBaseException
     */
    public static <T extends BaseModel> T copplyDefaultAttrAssimt(Map<String,String> dataMap, T object) throws VciBaseException {
        BaseModel baseModel = object;
        try {
            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            baseModel.setOid(dataMap.getOrDefault("OID",""));
            String createTime=dataMap.getOrDefault("CREATETIME","");
            baseModel.setCreateTime(chageStringToDate(createTime));
            baseModel.setNameOid(dataMap.getOrDefault("NAMEOID",""));
            String lastModifyTime=dataMap.getOrDefault("LASTMODIFYTIME","");
            baseModel.setLastModifyTime(chageStringToDate(lastModifyTime));
            String ts=dataMap.getOrDefault("TS","");
            baseModel.setTs(chageStringToDate(ts));
            baseModel.setRevisionOid(dataMap.getOrDefault("REVISIONOID",""));
            //用户id
            String userId = AuthUtil.getUserId().toString();
            baseModel.setBtmname(dataMap.getOrDefault("BTMNAME",""));
            baseModel.setCreator(dataMap.getOrDefault("CREATOR",""));
            baseModel.setFirstR(dataMap.getOrDefault("FIRSTR",""));
            baseModel.setFirstV(dataMap.getOrDefault("FIRSTV",""));
            baseModel.setLastR(dataMap.getOrDefault("LASTR",""));
            baseModel.setLastV(dataMap.getOrDefault("LASTV",""));
            baseModel.setRevisionSeq(chageStringToInt(dataMap.getOrDefault("REVISIONSEQ","")));
            baseModel.setOwner(dataMap.getOrDefault("OWNER",""));
            baseModel.setVersionSeq(chageStringToInt(dataMap.getOrDefault("VERSIONSEQ","")));
            baseModel.setVersionRule(dataMap.getOrDefault("VERSIONRULE",""));
            baseModel.setVersionValue(dataMap.getOrDefault("VERSIONVALUE",""));
            baseModel.setRevisionOid(dataMap.getOrDefault("REVISIONOID",""));
            baseModel.setLastModifier(userId);
        }catch (VciBaseException e){
            e.printStackTrace();
        }
        return (T)baseModel;
    }
    private static int chageStringToInt(String value){
        int newValue=0;
        if(StringUtils.isNotBlank(value)){
            newValue = Integer.parseInt(value);
        }
        return newValue;
    }
    private static Date chageStringToDate(String value){
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date date=new Date();
        if(StringUtils.isNotBlank(value)){
            try {
                date = format.parse(value);
            } catch (ParseException e) {
                e.printStackTrace();
            }
        }
        return date;
    }
}
Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/util/UBCSSqlKeyword.java
@@ -9,7 +9,7 @@
import java.util.Map;
/**
 * UBCSSqlKeyword
 * UBCSSqlKeyword,高级查询不传的时候默认是_equal
 * map转wrapper时用到的比对转换
 * @author ludc
 * @date 2023/06/06 10:01
@@ -43,8 +43,8 @@
        if (!Func.isEmpty(query)) {
            query.forEach((k, v) -> {
                if (!Func.hasEmpty(new Object[]{k, v}) && !k.endsWith("_ignore")) {
                    if (k.endsWith("_equal")) {
                        qw.eq(getColumn(k, "_equal"), v);
                    if (k.endsWith("_like")) {
                        qw.like(getColumn(k, "_like"), v);
                    } else if (k.endsWith("_notequal")) {
                        qw.ne(getColumn(k, "_notequal"), v);
                    } else if (k.endsWith("_likeleft")) {
@@ -76,7 +76,7 @@
                    } else if (k.endsWith("_notnull")) {
                        qw.isNotNull(getColumn(k, "_notnull"));
                    } else {
                        qw.like(getColumn(k, "_like"), v);
                        qw.eq(getColumn(k, "_equal"), v);
                    }
                }
@@ -88,8 +88,8 @@
        if (!Func.isEmpty(query)) {
            query.forEach((k, v) -> {
                if (!Func.hasEmpty(new Object[]{k, v}) && !k.endsWith("_ignore")) {
                    if (k.endsWith("_equal")) {
                        qw.eq(getColumn(k, "_equal"), v);
                    if (k.endsWith("_like")) {
                        qw.like(getColumn(k, "_like"), v);
                    } else if (k.endsWith("_notequal")) {
                        qw.ne(getColumn(k, "_notequal"), v);
                    } else if (k.endsWith("_likeleft")) {
@@ -121,7 +121,7 @@
                    } else if (k.endsWith("_notnull")) {
                        qw.isNotNull(getColumn(k, "_notnull"));
                    } else {
                        qw.like(getColumn(k, "_like"), v);
                        qw.eq(getColumn(k, "_equal"), v);
                    }
                }
@@ -133,8 +133,8 @@
        if (!Func.isEmpty(query)) {
            query.forEach((k, v) -> {
                if (!Func.hasEmpty(new Object[]{k, v}) && !k.endsWith("_ignore")) {
                    if (k.endsWith("_equal")) {
                        qw.eq(getColumn(k, "_equal"), v);
                    if (k.endsWith("_like")) {
                        qw.like(getColumn(k, "_like"), v);
                    } else if (k.endsWith("_notequal")) {
                        qw.ne(getColumn(k, "_notequal"), v);
                    } else if (k.endsWith("_likeleft")) {
@@ -166,7 +166,7 @@
                    } else if (k.endsWith("_notnull")) {
                        qw.isNotNull(getColumn(k, "_notnull"));
                    } else {
                        qw.like(getColumn(k, "_like"), v);
                        qw.eq(getColumn(k, "_equal"), v);
                    }
                }
@@ -178,8 +178,8 @@
        if (!Func.isEmpty(query)) {
            query.forEach((k, v) -> {
                if (!Func.hasEmpty(new Object[]{k, v}) && !k.endsWith("_ignore")) {
                    if (k.endsWith("_equal")) {
                        qw.eq(getColumn(k, "_equal"), v);
                    if (k.endsWith("_like")) {
                        qw.like(getColumn(k, "_like"), v);
                    } else if (k.endsWith("_notequal")) {
                        qw.ne(getColumn(k, "_notequal"), v);
                    } else if (k.endsWith("_likeleft")) {
@@ -211,7 +211,7 @@
                    } else if (k.endsWith("_notnull")) {
                        qw.isNotNull(getColumn(k, "_notnull"));
                    } else {
                        qw.like(getColumn(k, "_like"), v);
                        qw.eq(getColumn(k, "_equal"), v);
                    }
                }
@@ -220,14 +220,12 @@
    }
    /**
     * ç›®å‰è€ƒè™‘一种特殊情况,在做连表查询的时候,因为查询条件是map转wrapper,
     * è¿™æ ·å°±ä¼šå‡ºçŽ°æœªæ˜Žç¡®å®šä¹‰åˆ—çš„é”™è¯¯ï¼Œæ‰€ä»¥éœ€è¦è€ƒè™‘åœ¨ä½•å¤„æ¥åšå¤„ç†ï¼Œ
     * èŽ·å–åˆ—åï¼Œæ²¡æœ‰è½¬ä¸‹åˆ’çº¿æ˜ å°„
     * @param column
     * @param keyword
     * @return
     */
    private static String getColumn(String column, String keyword) {
        //没有转下划线映射
        return StringUtil.removeSuffix(column, keyword).toLowerCase(Locale.ROOT);
    }
Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/web/constant/FrameWorkBusLangCodeConstant.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,519 @@
package com.vci.ubcs.starter.web.constant;
/**
 * åŸºç¡€æ¡†æž¶ä¸­ä¸šåŠ¡éƒ¨åˆ†çš„å¤šè¯­è¨€ä»£ç 
 * @author weidy
 * @date 2020/4/25
 */
public class FrameWorkBusLangCodeConstant {
    //登陆部分的
    /**
     * ç”¨æˆ·å·²ç»ç™»å½•
     */
    public static final String USER_IS_LOGINED = "userIsLogined";
    /**
     * ç”¨æˆ·æ²¡æœ‰æ‰¾åˆ°
     */
    public static final String USER_NOT_FOUND = "userNotFound";
    /**
     * ç”¨æˆ·å·²ç»åœç”¨
     */
    public static final String USER_IS_DISABLED = "userIsDisabled";
    /**
     * ç”¨æˆ·å·²ç»è¢«é”å®š
     */
    public static final String USER_IS_LOCK = "userIsLocked";
    /**
     * ç”¨æˆ·å·²ç»è¶…过失效时间
     */
    public static final String USER_MORE_THAN_DISABLE_DATE = "moreDisableDate";
    /**
     * ç”¨æˆ·å¯†ç é”™è¯¯è¢«é”å®š
     */
    public static final String USER_PWD_LOCK = "userPwdErrorLock";
    /**
     * ç”¨æˆ·å¯†ç ä¸ç›¸ç­‰
     */
    public static final String USER_PWD_NOT_EQUAL = "userPwdNotEqual";
    //密码相关
    /**
     * ç¡®è®¤å¯†ç ä¸ç›¸åŒ
     */
    public static final String CHANGE_PWD_NOT_EQUAL="changePwdNotEqual";
    /**
     * æ²¡æœ‰å¯†ç ç­–ç•¥
     */
    public static final String HAS_NOT_PWD_STRATEGY="hasNotPasswordStrategy";
    /**
     * å¯†ç å®‰å…¨ç­–略未找到
     */
    public static final String PASSWORD_STRATEGY_NOT_FOUND = "passwordStrategyNotFound";
    /**
     * å¯†ç æ‰€éœ€å­—符类型为空
     */
    public static final String REQUIRE_CHAR_TYPE_NULL = "requireCharTypeNull";
    /**
     * å¯†ç çš„字符类型不符合要求
     */
    public static final String REQUIRE_CHAR_TYPE_NOT_EXIST = "requireCharTypeNotExist";
    /**
     * å¯†ç å¤æ‚度不符合要求
     */
    public static final String LESS_CHAR_TYPE = "lessCharType";
    /**
     * å¯†ç ä¸åŒ…含小写字母
     */
    public static final String NOT_HAS_LOW_LETTER= "notHasLowLetter";
    /**
     * å¯†ç ä¸åŒ…含数字
     */
    public static final String NOT_HAS_NUMBER = "notHasNumber";
    /**
     * å¯†ç ä¸åŒ…含特殊字母
     */
    public static final String NOT_HAS_SPECIAL ="notHasSpecial";
    /**
     * å¯†ç ä¸ç¬¦åˆæœ€å°é•¿åº¦è¦æ±‚
     */
    public static final String LESS_MIN_LENGTH = "lessMinLength";
    /**
     * å¯†ç ä¸ç¬¦åˆæœ€å¤§é•¿åº¦è¦æ±‚
     */
    public static final String MORE_MAX_lENGTH ="moreMaxLength";
    /**
     * å¯†ç å³å°†è¿‡æœŸ
     */
    public static final String PASSWORD_REMAIN_DAY = "passwordRemainDay";
    //组织
    //部门
    //职务
    //职级
    //用户
    //角色
    //权限
    //地区分类
    //地点
    //联系人
    //物料基本信息
    //物料
    /**
     * ç‰©æ–™çš„序列号
     */
    public static final String BD_MATERIAL_SERIAL_NUMBER_REPEAT = "materialSerialNumberRepeat";
    //库房类型
    /**
     * åº“房分类的内部标识不全是英文
     */
    public static final String BD_WAREHOUSE_CLASSIFY_ID_NOT_LETTER = "warehouseClassifyIdNotLetter";
    /**
     * å› ä¸ºå·²ç»æœ‰å­˜åœ¨ä½¿ç”¨å½“前分类的库房,所以只是修改名称,描述和上级分类
     */
    public static final String BD_WAREHOUSE_CLASSIFY_LINK_BY_WAREHOUSE ="warehouseClassifyLinkByWarehouse" ;
    /**
     * ä¸Žä¸Šçº§åº“房基本分类的库房类型不相同
     */
    public static final String BD_WAREHOUSE_CLASSIFY_TYPE_NOT_EQUAL_PARENT = "warehouseClassifyParentNotEqualType";
    //库房管理
    /**
     * ä¸Žä¸Šçº§åº“房的库房分类不相同
     */
    public static final String BD_WAREHOUSE_PARENT_WAREHOUSE_NOT_EQUAL_CLASSIFY = "warehouseParentNotEqualClassify";
    /**
     * æœ‰æ•°æ®ä¸èƒ½ä¿®æ”¹åº“房的所属基本分类
     */
    public static final String BD_WAREHOUSE_HAS_DATA_NOT_EDIT_CLASSIFY = "warehouseHasDataNotEditClassify";
    /**
     * æ²¡æœ‰ä¼ é€’用户的主键,不能设置管理员
     */
    public static final String BD_WAREHOUSE_ADMIN_USEROID_NOT_HAS = "warehouseAdminUserOidNotHas";
    /**
     * ä¸ºåº“房设置管理员成功
     */
    public static final String BD_WAREHOUSE_ADMIN_LINK_SUCCESS = "warehouseAdminLinkSuccess";
    /**
     * åº“房分类的主键不存在
     */
    public static final String BD_WAREHOUSE_CLASSIFY_OID_NOT_EXIST = "warehouseClassifyOidNotExsit";
    /**
     * å½“前用户没有库房的权限
     */
    public static final String BD_WAREHOUSE_NOT_RIGHT = "warehouseNotRight";
    //货位
    /**
     * ä¸Šçº§ä¸æ˜¯ä¸€ä¸ªè´§æž¶
     */
    public static final String BD_GOODS_LOCATION_PARENT_NOT_SHELF = "goodsLocationParentNotShelf";
    //Feign
    /**
     * å½“前用户没有对该库房的操作权限
     */
    public static final String BD_FEIGN_WAREHOUSEADMIN_NOT_PERMISSION = "feignCheckWareHouseAdminPermissions";
    //计量单位
    /**
     * è®¡é‡å•位不存在
     */
    public static final String UNIT_NOT_EXIST_BY_IDS = "unitNotExistByIds";
    /**
     * æ·»åŠ æˆåŠŸ
     */
    public static final String ADD_SUCCESS ="addSuccess";
    /**
     * æ·»åŠ å¤±è´¥
     */
    public static final String ADD_FAIL = "addFailInDB";
    /**
     * ä¿®æ”¹æˆåŠŸ
     */
    public static final String EDIT_SUCCESS = "editSuccess";
    /**
     * ä¿®æ”¹å¤±è´¥
     */
    public static final String EDIT_FAIL = "editFail";
    /**
     * åˆ é™¤æˆåŠŸ
     */
    public static final String DELETE_SUCCESS = "deleteSuccess";
    /**
     * çº§è”删除成功
     */
    public static final String DELETE_SUCCESS_CASCADE = "deleteSuccessCascade";
    /**
     * åˆ é™¤å¤±è´¥
     */
    public static final String DELETE_FAIL = "deleteFail";
    /**
     * å¯ç”¨æˆåŠŸ
     */
    public static final String ENABLE_SUCCESS ="enableSuccess";
    /**
     * é”å®šæˆåŠŸ
     */
    public static final String LOCK_SUCCESS = "lockSuccess";
    /**
     * é”å®šå¤±è´¥
     */
    public static final String LOCK_FAIL = "lockFail";
    /**
     * è§£é”æˆåŠŸ
     */
    public static final String UNLOCK_SUCCESS = "unlockSuccess";
    /**
     * è§£é”å¤±è´¥
     */
    public static final String UNLOCK_FAIL = "unlockFail";
    /**
     * çº§è”启用成功
     */
    public static final String ENABLE_SUCCESS_CASCADE = "enableSuccessCascade";
    /**
     * å¯ç”¨å¤±è´¥
     */
    public static final String ENABLE_FAIL = "enableFail";
    /**
     * åœç”¨æˆåŠŸ
     */
    public static final String DISABLE_SUCCESS = "disableSuccess";
    /**
     * çº§è”停用成功
     */
    public static final String DISABLE_SUCCESS_CASCADE = "disableSuccessCascade";
    /**
     * åœç”¨å¤±è´¥
     */
    public static final String DISABLE_FAIL = "disableFail";
    /**
     * å‡ç‰ˆæœ¬å·æˆåŠŸ
     */
    public static final String UP_REVISION_SUCCESS = "dataUpRevisionSuccess";
    /**
     * å‡ç‰ˆæœ¬å·å¤±è´¥
     */
    public static final String UP_REVISION_FAIL = "dataUpRevisionFail";
    /**
     * å‡ç‰ˆæ¬¡æˆåŠŸ
     */
    public static final String UP_VERSION_SUCCESS = "dataUpVersionSuccess";
    /**
     * å‡ç‰ˆæ¬¡å¤±è´¥
     */
    public static final String UP_VERSION_FAIL = "dataUpVersionFail";
    /**
     * æäº¤æˆåŠŸ
     */
    public static final String SUBMIT_SUCCESS= "submitSuccess";
    /**
     * æäº¤å¤±è´¥
     */
    public static final String SUBMIR_FAIL = "submitFail";
    /**
     * å‘布成功
     */
    public static final String RELEASE_SUCCESS = "releaseSuccess";
    /**
     * å‘布失败
     */
    public static final String RELEASE_FAIL = "releaseFail";
    /**
     * ç‰ˆæœ¬å·é‡å¤
     */
    public static final String REVISION_REPEAT = "revisionRepeat";
    /**
     * ç‰ˆæ¬¡å·é‡å¤
     */
    public static final String VERSION_REPEAT= "versionRepeat";
    /**
     * æ ¹æ®ä¸»é”®æŸ¥è¯¢æ•°æ®ä¸å­˜åœ¨
     */
    public static final String DATA_OID_NOT_EXIST = "dataOidNotExist";
    /**
     * æ ¹æ®ä¸»é”®æŸ¥è¯¢çš„æ•°æ®ä¸å­˜åœ¨
     */
    public static final String DATA_ID_NOT_EXIST = "dataIdNotExist";
    /**
     * æ ¹æ®åç§°æŸ¥è¯¢çš„æ•°æ®ä¸å­˜åœ¨
     */
    public static final String DATA_NAME_NOT_EXIST = "dataNameNotExist";
    /**
     * å±žæ€§å€¼é‡å¤
     */
    public static final String DATA_ATTR_REPEAT = "dataRepeat";
    /**
     * è€ç‰ˆæœ¬çš„æ•°æ®ä¸å­˜åœ¨
     */
    public static final String OLD_REVISION_DATA_NOT_EXIST = "oldRevsionDataNotExist";
    /**
     * ä¸Šçº§ä¸»é”®å®žé™…是当前节点的下级节点,会引起死循环
     */
    public static final String PARENT_OID_IS_CHILD ="parentIsChild";
    /**
     * æ•°æ®è¢«å¼•用,不允许删除
     */
    public static final String DATA_LINKED_NOT_DELETE = "dataLinkedNotDelete";
    /**
     * æ•°æ®çš„子节点也被引用,不允许删除
     */
    public static final String DATA_CASCADE_LINKED_NOT_DELETE = "dataCascadeLinkedNotDelete";
    /**
     * æ•°æ®è¢«å¼•用,不允许修改
     */
    public static final String DATA_LINKED_NOT_EDIT ="dataLinkedNotEdit";
    /**
     * æ•°æ®ä¸å¼•用,不允许修改某个属性
     */
    public static final String DATA_LINKED_NOT_EDIT_ATTR="dataLinkedNotEditAttr";
    /**
     * ä¸Šçº§æ¡£æ¡ˆä¸å­˜åœ¨
     */
    public static final String DATA_PARENT_NOT_EXIST = "parentNotExist";
    /**
     * åˆ†ç±»æ•°æ®ä¸å­˜åœ¨
     */
    public static final String DATA_CLASSIFY_NOT_EXIST = "classifyNotExist";
    /**
     * å½“前状态下不允许修改数据
     */
    public static final String LCSTATUS_CAN_NOT_EDIT = "lcStatusCannotEditData";
    /**
     * å½“前状态下不允许删除数据
     */
    public static final String LCSTATUS_CAN_NOT_DELETE = "lcStatusCannotDeleteData";
    /**
     * å¯¼å…¥æˆåŠŸ
     */
    public static final String IMPORT_SUCCESS = "importSuccess";
    /**
     * å¯¼å…¥å¤±è´¥
     */
    public static final String IMPORT_FAIL = "importFail";
    /**
     * å¯¼å…¥çš„æ¨¡æ¿æ–‡ä»¶ä¸å­˜åœ¨
     */
    public static final String IMPORT_TEMPLATE_FILE_NOT_FOUND = "importTemplateFileNotFound";
    /**
     * å¯¼å‡ºæˆåŠŸ
     */
    public static final String EXPORT_SUCCESS = "exportSuccess";
    /**
     * å¯¼å‡ºå¤±è´¥
     */
    public static final String EXPORT_FAIL = "exportFail";
    /**
     * ä¸Šä¼ æˆåŠŸ
     */
    public static final String UPLOAD_SUCCESS = "uploadSuccess";
    /**
     * ä¸Šä¼ å¤±è´¥
     */
    public static final String UPLOAD_FAIL = "uploadFail";
    /**
     * ä¸‹è½½æˆåŠŸ
     */
    public static final String DOWNLOAD_SUCCESS = "downloadSuccess";
    /**
     * ä¸‹è½½å¤±è´¥
     */
    public static final String DOWNLOAD_FAIL = "downloadFail";
    /**
     * æ–‡ä»¶ä¸å­˜åœ¨
     */
    public static final String FILE_NOT_EXIST = "fileNotExist";
    /**
     * å®¡æ‰¹æˆåŠŸ
     */
    public static final String AUDIT_SUCCESS = "auditSuccess";
    /**
     * å®¡æ‰¹å¤±è´¥
     */
    public static final String AUDIT_FAIL = "auditFail";
    /**
     * ä¸‹å‘成功
     */
    public static final String ISSUED_SUCCESS = "issuedSuccess";
    /**
     * ä¸‹å‘失败
     */
    public static final String ISSUED_FAIL = "issuedFail";
    /**
     * æŽ¥æ”¶æˆåŠŸ
     */
    public static final String RECEIVE_SUCCESS = "receiveSuccess";
    /**
     * æŽ¥æ”¶å¤±è´¥
     */
    public static final String RECEIVE_FAIL = "receiveFail";
    /**
     * è®¡åˆ’的制造依据不存在
     */
    public static final String PLAN_SOURCE_NOT_EXIST = "planSourceNotExist";
    /**
     * è®¡åˆ’的制造目标不存在
     */
    public static final String PLAN_TARGET_NOT_EXIST = "planTargetNotExist";
    /**
     * æ´¾å‘成功
     */
    public static final String DISPATCH_SUCCESS = "dispatchSuccess";
    /**
     * æ´¾å‘失败
     */
    public static final String DISPATCH_FAIL = "dispatchFail";
    /**
     * è¯¥è®¡åˆ’下不存在派发过的任务
     */
    public static final String DISPATCH_TASK_NOT_EXIST_BY_PLAN = "dispatchTaskNotExistByPlan";
}
Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/web/enumpck/BaseEnum.java
@@ -1,7 +1,55 @@
package com.vci.ubcs.starter.web.enumpck;
import com.alibaba.druid.util.StringUtils;
public interface BaseEnum {
    String getValue();
    String getText();
    /**
     * ä½¿ç”¨æžšä¸¾çš„值获取枚举对象的通用方法
     * @param clazz æžšä¸¾æ‰€å±žç±»
     * @param value æžšä¸¾çš„值
     * @param <T> ç±»åž‹
     * @return ç»“æžœ
     */
    public static  <T extends BaseEnum> T getEnumByValue(Class<T> clazz,Object value){
        if(value == null){
            return null;
        }
        T[] enums = clazz.getEnumConstants();
        if (enums == null || enums.length == 0) {
            return null;
        }
        for (T e : enums) {
            if (value instanceof String) {
                if (StringUtils.equalsIgnoreCase((String) value, (String) ((BaseEnum) e).getValue())) {
                    return e;
                }
            } else {
                if (value.equals(e.getValue())) {
                    return e;
                }
            }
        }
        return null;
    }
    /**
     * ä½¿ç”¨æžšä¸¾çš„值获取显示文本的方法
     * @param clazz æžšä¸¾æ‰€å±žçš„ç±»
     * @param value æžšä¸¾çš„值
     * @param <T> ç±»åž‹
     * @return ç»“æžœ
     */
    public static <T extends BaseEnum> String getTextByValue(Class<T> clazz,String value){
        T e = getEnumByValue(clazz, value);
        if (e == null) {
            return "";
        }
        return ((BaseEnum) e).getText();
    }
}
Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/web/enumpck/DataSecretEnum.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,76 @@
package com.vci.ubcs.starter.web.enumpck;
public enum DataSecretEnum implements BaseEnumInt {
    NONE(10, "非密"),
    INNER(15, "内部"),
    SECRET(20, "秘密"),
    PRIVACY(30, "机密");
    private int value;
    private String text;
    public int getValue() {
        return this.value;
    }
    public void setValue(int value) {
        this.value = value;
    }
    public String getText() {
        return this.text;
    }
    public void setText(String text) {
        this.text = text;
    }
    private DataSecretEnum(int secret, String secretText) {
        this.value = secret;
        this.text = secretText;
    }
    public static String getSecretText(int secret) {
        DataSecretEnum[] var1 = values();
        int var2 = var1.length;
        for(int var3 = 0; var3 < var2; ++var3) {
            DataSecretEnum eu = var1[var3];
            if (eu.value == secret) {
                return eu.text;
            }
        }
        return NONE.text;
    }
    public static int getSecretValueByText(String text) {
        DataSecretEnum[] var1 = values();
        int var2 = var1.length;
        for(int var3 = 0; var3 < var2; ++var3) {
            DataSecretEnum eu = var1[var3];
            if (eu.text.equalsIgnoreCase(text)) {
                return eu.value;
            }
        }
        return NONE.value;
    }
    public static boolean isValid(int secret) {
        DataSecretEnum[] var1 = values();
        int var2 = var1.length;
        for(int var3 = 0; var3 < var2; ++var3) {
            DataSecretEnum eu = var1[var3];
            if (eu.value == secret) {
                return true;
            }
        }
        return false;
    }
}
Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/web/enumpck/NewAppConstantEnum.java
@@ -8,6 +8,7 @@
     * ç¼–码规则,服务启动名
     */
    APPLICATION_NAME_CODE(AppConstant.APPLICATION_NAME_CODE,"主数据"),
    APPLICATION_FLOW_NAME(AppConstant.APPLICATION_FLOW_NAME,"ubcs-flow"),
    ;
    /**
Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/web/enumpck/ProcessTemplateTypeEnum.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,134 @@
package com.vci.ubcs.starter.web.enumpck;
/**
 * æµç¨‹æ¨¡æ¿åº”用按钮类型
 * @author wang1
 */
public enum ProcessTemplateTypeEnum implements BaseEnum {
    /**
     * å‘布
     */
    PUBLIC("PUBLIC","发布"),
    /**
     * å˜æ›´
     */
    EDIT("EDIT","变更"),
    /**
     * åœç”¨
     */
    ENABLE("ENABLE","停用"),
    /**
     * å¯ç”¨
     */
    DISABLE("DISABLE","启用");
    /**
     * æžšä¸¾çš„值
     */
    private String value;
    /**
     * æžšä¸¾æ˜¾ç¤ºæ–‡æœ¬
     */
    private String text;
    /**
     * èŽ·å–æžšä¸¾å€¼
     *
     * @return æžšä¸¾å€¼
     */
    @Override
    public String getValue() {
        return value;
    }
    /**
     * è®¾ç½®æžšä¸¾å€¼
     *
     * @param value æžšä¸¾å€¼
     */
    public void setValue(String value) {
        this.value = value;
    }
    /**
     * èŽ·å–æžšä¸¾æ˜¾ç¤ºæ–‡æœ¬
     *
     * @return æ˜¾ç¤ºæ–‡æœ¬
     */
    @Override
    public String getText() {
        return text;
    }
    /**
     * è®¾ç½®æ˜¾ç¤ºæ–‡æœ¬
     *
     * @param text æ˜¾ç¤ºæ–‡æœ¬
     */
    public void setText(String text) {
        this.text = text;
    }
    /**
     * æž„造函数
     *
     * @param value å€¼
     * @param text  æ˜¾ç¤ºæ–‡æœ¬
     */
    private ProcessTemplateTypeEnum(String value, String text) {
        this.value = value;
        this.text = text;
    }
    /**
     * æ ¹æ®åç§°èŽ·å–å¯¹åº”çš„æžšä¸¾å€¼
     *
     * @param text åç§°
     * @return æžšä¸¾å€¼
     */
    public static String getValueByText(String text) {
        for (ProcessTemplateTypeEnum wenum : ProcessTemplateTypeEnum.values()) {
            if (wenum.getText().equalsIgnoreCase(text)) {
                return wenum.getValue();
            }
        }
        return "";
    }
    /**
     * æ ¹æ®æžšä¸¾å€¼èŽ·å–åç§°
     *
     * @param value æžšä¸¾å€¼
     * @return åç§°
     */
    public static String getTextByValue(String value) {
        for (ProcessTemplateTypeEnum wenum : ProcessTemplateTypeEnum.values()) {
            if (wenum.getValue().equalsIgnoreCase(value)) {
                return wenum.getText();
            }
        }
        return "";
    }
    /**
     * æ ¹æ®æžšä¸¾å€¼èŽ·å–æžšä¸¾å¯¹è±¡
     *
     * @param value æžšä¸¾å€¼
     * @return æžšä¸¾å¯¹è±¡ï¼Œä¸å­˜åœ¨æ—¶å€™è¿”回null
     */
    public static ProcessTemplateTypeEnum forValue(String value) {
        for (ProcessTemplateTypeEnum wenum : ProcessTemplateTypeEnum.values()) {
            if (wenum.getValue().equalsIgnoreCase(value)) {
                return wenum;
            }
        }
        return null;
    }
}
Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/web/pagemodel/BladeQueryObject.java
@@ -5,13 +5,14 @@
import org.springblade.core.mp.support.Query;
import java.io.Serializable;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.HashMap;
import java.util.Map;
/**
 * å› ä¸ºå½“前框架使用的是query来做分页,
 * æ‰€ä»¥æˆ‘这边参照以前的BladeQueryObject来修改
 * ä¸€ä¸ªå½“前框架使用起来方便一点的对象
 * æ‰€ä»¥æˆ‘这边参照以前的BaseQueryObject来修改的
 * @author ludc
 * @date 2023/5/23 13:00
 */
@@ -25,7 +26,7 @@
    @JSONField
    private Map<String, Object> conditionMap = new HashMap();
    @JSONField
    private int page = 1;
    private Integer page = 1;
    @JSONField
    private String sort;
    @JSONField
Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/web/util/VciBaseUtil.java
@@ -5,6 +5,8 @@
// (powered by FernFlower decompiler)
//
import cn.hutool.core.lang.Snowflake;
import cn.hutool.core.util.IdUtil;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.baomidou.mybatisplus.annotation.TableField;
@@ -52,7 +54,12 @@
    }
    public static String getPk() {
        return UUID.randomUUID().toString();
        return String.valueOf(getPKLong(1,1));
    }
    public static  Long getPKLong(long workerId,long dataCenterId){
        Snowflake snowflake = IdUtil.getSnowflake(workerId,dataCenterId);
        return snowflake.nextId();
    }
    public static int getIntForBoolean(boolean b) {
@@ -1136,7 +1143,38 @@
    public static <T> Collection<Collection<T>> switchCollectionForOracleIn(Collection<T> list) {
        return switchCollectionForOracleIn(list, 500);
    }
    /**
     * oracle in æŸ¥è¯¢ä¸èƒ½è¶…过1000,转换一下集合
     * ç”±äºŽSQL语句1000个可能很长,超过oracle10g,所以牺牲性能分配为500个数组
     * @param list éœ€è¦è½¬æ¢çš„列表内容
     * @return åˆ†ç»„后的list
     */
    public static <T> List<List<T>> switchListForOracleIn(List<T> list) {
        List<List<T>> listHasList = new ArrayList<List<T>>();
        if(list == null){
            return listHasList;
        }
        List<T> newList = new ArrayList<T>();
        for(Object obj : list){
            //为了让list还可以添加内容,因为使用sublist后,list不能再Add了
            newList.add((T)obj);
        }
        int muti = 1;
        if(newList.size() >500){
            int balance = newList.size()%500;
            muti = (newList.size() - balance)/500 + (balance == 0?0:1);
        }
        for(int i = 0 ; i < muti; i ++){
            int start = i*500;
            int end = start + 500;
            if(i == muti-1 || end >newList.size() ){
                end = newList.size();
            }
            List subList = newList.subList(start,end);
            listHasList.add(subList);
        }
        return listHasList;
    }
    public static <T> Collection<Collection<T>> switchCollectionForOracleIn(Collection<T> collection, int preSize) {
        Collection<Collection<T>> listHasList = new ArrayList();
        if (collection == null) {
Source/UBCS/ubcs-service-api/ubcs-util-api/src/main/java/com/vci/ubcs/starter/web/util/WebUtil.java
@@ -724,5 +724,18 @@
        }
        return listHasList;
    }
    /**
     * æ˜¯å¦é»˜è®¤çš„属性
     * @param fieldNames å±žæ€§çš„名字
     * @return true为默认
     */
    public static boolean isDefaultField(String fieldNames){
        if(VciQueryWrapperForDO.BASIC_FIELD_MAP.containsKey(fieldNames) || VciQueryWrapperForDO.LIFECYCLE_MANAGE_FIELD_MAP.containsKey(fieldNames)
            || VciQueryWrapperForDO.REVISION_MANAGE_FIELD_MAP.containsKey(fieldNames) ) {
            return true;
        }
        return false;
    }
}
Source/UBCS/ubcs-service-api/ubcs-workflow-api/src/main/java/com/vci/ubcs/code/constant/FlowConstant.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,32 @@
package com.vci.workflow.constant;
public class FlowConstant {
    public static final String MAPPER_SCAN = "com.dragon.*.dao.*";
    /**
     * æäº¤äººçš„变量名称
     */
    public static final String FLOW_SUBMITTER_VAR = "initiator";
    /**
     * æäº¤äººèŠ‚ç‚¹åç§°
     */
    public static final String FLOW_SUBMITTER = "提交人";
    /**
     * è‡ªåŠ¨è·³è¿‡èŠ‚ç‚¹è®¾ç½®å±žæ€§
     */
    public static final String FLOWABLE_SKIP_EXPRESSION_ENABLED = "_FLOWABLE_SKIP_EXPRESSION_ENABLED";
    /**
     * æŒ‚起状态
     */
    public static final int SUSPENSION_STATE = 2;
    /**
     * æ¿€æ´»çŠ¶æ€
     */
    public static final int ACTIVATE_STATE = 1;
    //后加签
    public static final String AFTER_ADDSIGN = "after";
    //前加签
    public static final String BEFORE_ADDSIGN = "before";
}
Source/UBCS/ubcs-service/ubcs-code/pom.xml
@@ -35,6 +35,12 @@
        <dependency>
            <groupId>org.springblade</groupId>
            <artifactId>blade-core-boot</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springblade</groupId>
                    <artifactId>blade-starter-mybatis</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springblade</groupId>
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/config/UBCSTenantSqlParser.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,11 @@
package com.vci.ubcs.code.config;
/**
 * @author ludc
 * @date 2023/6/13 12:46
 */
public class UBCSTenantSqlParser {
}
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/CodeBasicSecController.java
@@ -49,7 +49,7 @@
    @GetMapping("/gridCodeBasicSec")
    @ApiOperationSupport(order = 2)
    @ApiOperation(value = "分页 ç æ®µåŸºç¡€ä¿¡æ¯åˆ—表", notes = "传入codeRuleVO")
    public R<IPage<CodeBasicSecVO>> gridCodeBasicSec(BladeQueryObject bladeQueryObject){
    public R<IPage<CodeBasicSecVO>> gridCodeBasicSec(BladeQueryObject bladeQueryObject) throws Exception{
        IPage<CodeBasicSecVO> codeRuleVOIPage = codeBasicSecService.gridCodeBasicSec(bladeQueryObject.getQuery().setAscs("ordernum"),bladeQueryObject.getConditionMap());
        return R.data(codeRuleVOIPage);
    }
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/CodeRuleController.java
@@ -17,6 +17,7 @@
package com.vci.ubcs.code.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import com.vci.ubcs.code.dto.CodeRuleDTO;
import com.vci.ubcs.code.entity.CodeRule;
@@ -31,14 +32,20 @@
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import org.apache.http.util.EncodingUtils;
import org.springblade.core.boot.ctrl.BladeController;
import org.springblade.core.mp.support.Condition;
import org.springblade.core.mp.support.Query;
import org.springblade.core.secure.BladeUser;
import org.springblade.core.secure.utils.AuthUtil;
import org.springblade.core.tenant.annotation.NonDS;
import org.springblade.core.tool.api.R;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.Collection;
import java.util.Map;
@@ -71,7 +78,7 @@
     * ç¼–码规则 è‡ªå®šä¹‰åˆ†é¡µ
     * @return baseQueryObject
     */
    @GetMapping("/gridCodeRule")
    @GetMapping(value = "/gridCodeRule")
    @ApiOperationSupport(order = 3)
    @ApiOperation(value = "分页", notes = "传入CodeRule")
    public R<IPage<CodeRuleVO>> gridCodeRule(BladeQueryObject bladeQueryObject) {
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/controller/MdmEngineController.java
@@ -12,10 +12,9 @@
import com.vci.ubcs.code.vo.pagemodel.*;
import com.vci.ubcs.starter.annotation.VciBusinessLog;
import com.vci.ubcs.starter.revision.model.BaseModel;
import com.vci.ubcs.starter.revision.model.TreeQueryObject;
import com.vci.ubcs.starter.util.LocalFileUtil;
import com.vci.ubcs.starter.web.pagemodel.BaseQueryObject;
import com.vci.ubcs.starter.web.pagemodel.DataGrid;
import com.vci.ubcs.starter.web.pagemodel.Tree;
import com.vci.ubcs.starter.web.pagemodel.*;
import com.vci.ubcs.starter.web.util.ControllerUtil;
import com.vci.ubcs.starter.web.util.LangBaseUtil;
import com.vci.ubcs.starter.web.util.VciBaseUtil;
@@ -531,4 +530,25 @@
//        return engineService.updateBatchByBaseModel("wupin", models);
//        return engineService.getUIInfoByClassifyOid(codeClassifyOid,functionId);
    }
    /**
     * é»˜è®¤çš„参照列表
     * @param referConfigVO å‚照的配置信息
     * @return æ‰§è¡Œçš„结果
     */
    @GetMapping("/defaultReferDataGrid")
    public DataGrid defaultReferDataGrid(UIFormReferVO referConfigVO, PageHelper pageHelper){
        return engineService.referDataGrid(referConfigVO,pageHelper);
    }
    /**
     * é»˜è®¤çš„æ ‘形参照列表
     * @param referConfigVO å‚照的配置信息
     * @return æ‰§è¡Œçš„结果
     */
    @GetMapping("/defaultReferTree")
    public List<Tree> defaultReferTree(UIFormReferVO referConfigVO, TreeQueryObject queryObject){
        return engineService.referTree(referConfigVO,queryObject);
    }
}
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/mapper/CommonsMapper.java
@@ -20,6 +20,9 @@
    List<String> selectById(@Param("inSql") String inSql);
    int  queryCountBySql(@Param("inSql") String inSql);
    List<Map> selectBySql(@Param("inSql") String inSql);
    List<Map<String,String>> queryByOnlySqlForMap(@Param("inSql") String inSql);
@@ -31,7 +34,8 @@
     * @param mapList éœ€è¦æ’入的所有记录
     * @return æ’入成功的条数
     */
    Integer insertByBaseModel(String tableName,Map<String,String> columnMap,List<Map<String,String>> mapList);/**
    Integer insertByBaseModel(String tableName,Map<String,String> columnMap,List<Map<String,String>> mapList);
    /**
     * ä¼ å…¥è¡¨åï¼Œmap,list<map>完成批量更新操作
     * @param tableName è¡¨å
     * @param mapList éœ€è¦æ›´æ–°çš„æ‰€æœ‰è®°å½•
@@ -40,4 +44,12 @@
    @InterceptorIgnore(tenantLine = "true")
    Integer updateBatchByBaseModel(String tableName,List<Map<String,String>> mapList);
    /**
     * ä¼ å…¥è¡¨åï¼Œmap,oids完成批量删除操作
     * @param tableName è¡¨å
     * @param oids éœ€è¦åˆ é™¤çš„æ‰€æœ‰è®°å½•
     * @return åˆ é™¤æˆåŠŸçš„æ¡æ•°
     */
    Integer deleteByTaleAndOid(String tableName,String oids);
}
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeClassifyService.java
@@ -32,6 +32,20 @@
     */
    List<CodeClassify> selectByWrapper(Wrapper wrapper);
    /**
     * ä½¿ç”¨æŸ¥è¯¢å°è£…器来查询
     * @param wrapper æŸ¥è¯¢å°è£…器
     * @return æ•°æ®å¯¹è±¡
     */
    List<String> select1(Wrapper wrapper);
    /**
     * è‡ªå®šä¹‰åˆ†é¡µ
     *
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/ICodeRuleService.java
@@ -22,10 +22,9 @@
import com.vci.ubcs.code.entity.CodeRule;
import com.vci.ubcs.code.vo.pagemodel.CodeClassifyVO;
import com.vci.ubcs.code.vo.pagemodel.CodeRuleVO;
import com.vci.ubcs.starter.exception.VciBaseException;
import com.vci.ubcs.starter.web.pagemodel.BladeQueryObject;
import org.apache.commons.codec.net.QCodec;
import org.springblade.core.log.exception.ServiceException;
import org.springblade.core.mp.support.Query;
import org.springblade.core.tool.api.R;
@@ -47,14 +46,14 @@
     * @param condtionMap
     * @return
     */
    IPage<CodeRuleVO> gridCodeRule(Query query, Map<String,Object> condtionMap);
    IPage<CodeRuleVO> gridCodeRule(Query query, Map<String,Object> condtionMap) throws VciBaseException;
    /**
     * æ ¡éªŒç¼–码规则的状态是否可以编辑或删除
     * @param lcStatus ç¼–码规则
     * @return true表示可以编辑或删除,false表示不可以
     */
    boolean checkEditDelStatus(String lcStatus);
    boolean checkEditDelStatus(String lcStatus) throws VciBaseException;
    /**
     * å¢žåŠ ä¸»æ•°æ®ç¼–ç è§„åˆ™
@@ -83,14 +82,14 @@
     * @param oid ç¼–码规则主键
     * @return true表示已经使用,false表示未被使用
     */
    boolean isAlreadyInUse(String oid);
    boolean isAlreadyInUse(String oid) throws VciBaseException;
    /**
     * æŸ¥çœ‹ä¸»æ•°æ®ç¼–码规则的使用范围
     * @param oid ç¼–码规则主键
     * @return ä¸»é¢˜åº“分类使用到该编码规则的所有集合
     */
    Collection<CodeClassifyVO> listUseRangeInCodeClassify(String oid);
    Collection<CodeClassifyVO> listUseRangeInCodeClassify(String oid) throws VciBaseException;
    /**
     * ä¸»é”®èŽ·å–ä¸»æ•°æ®ç¼–ç è§„åˆ™
@@ -122,27 +121,26 @@
     * @param update enable:启用 disable:停用 release:发布
     * @return æ‰§è¡Œç»“æžœ
     */
    R updateStatus(String oid, String update);
    R updateStatus(String oid, String update) throws VciBaseException;
    /**
     * å…‹éš†ç¼–码规则
     * @param codeRuleDTO ä¸»æ•°æ®ç¼–码规则数据传输对象,oid和ts需要传输
     * @return ä¸»æ•°æ®ç¼–码规则显示对象
     */
    R cloneCodeRule(CodeRuleDTO codeRuleDTO);
    R cloneCodeRule(CodeRuleDTO codeRuleDTO) throws VciBaseException;
    /**
     * ç¼–码规则清空所有已生成的编码
     * @param oid ç¼–码规则主键
     * @return æ‰§è¡Œç»“æžœ
     */
    R clearAllCode(String oid);
    R clearAllCode(String oid) throws VciBaseException;
    /**
     * ä½¿ç”¨ä¸»é”®èŽ·å–ç¼–ç è§„åˆ™çš„å†…å®¹
     * @param codeRuleOid ä¸»é”®
     * @return è§„则的显示对象
     */
    CodeRuleVO getObjectHasSecByOid(String codeRuleOid);
    CodeRuleVO getObjectHasSecByOid(String codeRuleOid) throws VciBaseException;
}
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/MdmEngineService.java
@@ -12,6 +12,7 @@
import com.vci.ubcs.code.vo.pagemodel.UITableFieldVO;
import com.vci.ubcs.code.vo.pagemodel.*;
import com.vci.ubcs.starter.revision.model.BaseModel;
import com.vci.ubcs.starter.revision.model.TreeQueryObject;
import com.vci.ubcs.starter.web.pagemodel.*;
import org.springblade.core.tool.api.R;
@@ -377,7 +378,7 @@
     * @param baseModels      å¤„理数据
     * @return å¤„理成功数据条数
     */
    Integer insertBatchByType(String btmType, List<BaseModel> baseModels) throws Exception;
    Integer insertBatchByType(String btmType, List<BaseModel> baseModels);
    /**
     * ä¼ å…¥ä¸šåŠ¡ç±»åž‹ä»¥åŠç›¸oid集合查询数据进行返回
     *
@@ -385,7 +386,7 @@
     * @param oids      éœ€è¦æŸ¥è¯¢çš„oid集合 é€—号分开
     * @return æŸ¥è¯¢å‡ºçš„æ•°æ®
     */
    List<BaseModel> selectByTypeAndOid(String btmType, String oids) throws IllegalAccessException, NoSuchFieldException, InstantiationException, InvocationTargetException, IntrospectionException, SQLException;
    List<BaseModel> selectByTypeAndOid(String btmType, String oids) ;
    /**
     * ä¼ å…¥ä¸šåŠ¡ç±»åž‹ä»¥åŠç›¸å…³æ•°æ®è¿›è¡Œæ‰¹é‡æ›´æ–°æ“ä½œ
     *
@@ -393,6 +394,21 @@
     * @param baseModels      å¤„理数据
     * @return å¤„理状态
     */
    R updateBatchByBaseModel(String btmType, List<BaseModel> baseModels) throws Exception;
    R updateBatchByBaseModel(String btmType, List<BaseModel> baseModels);
    /**
     * é»˜è®¤åˆ—表
     * @param referConfigVO
     * @param pageHelper
     * @return
     */
    DataGrid referDataGrid(UIFormReferVO referConfigVO, PageHelper pageHelper);
    /**
     * èŽ·å–æ ‘å½¢çš„å‚ç…§
     * @param referConfigVO å‚照的配置
     * @return æ ‘形的数据
     */
    List<Tree> referTree(UIFormReferVO referConfigVO, TreeQueryObject queryObject);
}
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeAllCodeServiceImpl.java
@@ -23,6 +23,7 @@
import com.vci.ubcs.code.mapper.CodeAllCodeMapper;
import com.vci.ubcs.code.service.ICodeAllCodeService;
import com.vci.ubcs.code.vo.pagemodel.CodeAllCodeVO;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
@@ -40,6 +41,7 @@
     * æ•°æ®æ“ä½œå¯¹è±¡
     */
    @Resource
    @Lazy
    private CodeAllCodeMapper codeAllcodeMapper;
    @Override
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeBasicSecServiceImpl.java
@@ -26,11 +26,13 @@
import com.vci.ubcs.code.wrapper.CodeBasicSecWrapper;
import com.vci.ubcs.omd.cache.EnumCache;
import com.vci.ubcs.omd.enums.EnumEnum;
import com.vci.ubcs.starter.enumpack.CodeTableNameEnum;
import com.vci.ubcs.starter.exception.VciBaseException;
import com.vci.ubcs.starter.revision.service.RevisionModelUtil;
import com.vci.ubcs.starter.util.DefaultAttrAssimtUtil;
import com.vci.ubcs.starter.util.UBCSCondition;
import com.vci.ubcs.starter.util.UBCSSqlKeyword;
import com.vci.ubcs.starter.web.enumpck.NewAppConstantEnum;
import com.vci.ubcs.starter.web.enumpck.OsCodeFillTypeEnum;
import com.vci.ubcs.starter.web.pagemodel.BladeQueryObject;
import com.vci.ubcs.starter.web.pagemodel.KeyValue;
@@ -40,6 +42,7 @@
import com.vci.ubcs.starter.web.util.WebUtil;
import com.vci.ubcs.system.entity.DictBiz;
import com.vci.ubcs.system.feign.IDictBizClient;
import org.springblade.core.log.exception.ServiceException;
import org.springblade.core.mp.support.Query;
import org.springblade.core.secure.utils.AuthUtil;
import org.springblade.core.tool.api.R;
@@ -120,15 +123,17 @@
     * @throws VciBaseException æŸ¥è¯¢æ¡ä»¶å’Œåˆ†é¡µå‡ºé”™çš„æ—¶å€™ä¼šæŠ›å‡ºå¼‚常
     */
    @Override
    public IPage<CodeBasicSecVO> gridCodeBasicSec(Query query, Map<String,Object> conditionMap) throws VciBaseException {
        if(Func.isEmpty(conditionMap.get("pkCodeRule")) && Func.isEmpty(conditionMap.get("t.pkCodeRule_equal")) ){
    public IPage<CodeBasicSecVO> gridCodeBasicSec(Query query, Map<String,Object> conditionMap) throws ServiceException {
        if(Func.isEmpty(Func.isEmpty(conditionMap.get(CodeTableNameEnum.PL_CODE_BASICSEC.getText()+".pkCodeRule")))){
            return null;
        }
        // è”表查询
        MPJLambdaWrapper<CodeBasicSec> mpjLambdaWrapper = UBCSCondition.getMPJLambdaWrapper(conditionMap, CodeBasicSec.class)
        // è”表查询 ,设置表别名,表别名默认就采用表名小写,配置高级查询的时候就需要根据这个来对where条件进行配置
        MPJLambdaWrapper<CodeBasicSec> mpjLambdaWrapper = new MPJLambdaWrapper<>(CodeBasicSec.class, CodeTableNameEnum.PL_CODE_BASICSEC.getText())
            .selectAll(CodeBasicSec.class)
            .selectAs(CodeClassify::getName, CodeBasicSec::getReferCodeClassifyOidName)
            .leftJoin(CodeClassify.class, CodeClassify::getOid, CodeBasicSec::getReferCodeClassifyOid);
            .leftJoin(CodeClassify.class,CodeTableNameEnum.PL_CODE_CLASSIFY.getText(), CodeClassify::getOid, CodeBasicSec::getReferCodeClassifyOid);
        // æ·»åŠ where条件
        UBCSSqlKeyword.buildCondition(conditionMap,mpjLambdaWrapper);
        IPage<CodeBasicSec> codeBasicSecIPage = codeBasicSecMapper.selectPage(UBCSCondition.getPage(query), mpjLambdaWrapper);
        return CodeBasicSecWrapper.build().pageVO(codeBasicSecIPage);
    }
@@ -140,7 +145,7 @@
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean batchDeleteSecByCodeRuleOid(String codeRuleOid) {
    public boolean batchDeleteSecByCodeRuleOid(String codeRuleOid) throws ServiceException {
        VciBaseUtil.alertNotNull(codeRuleOid,"编码规则主键");
        // 1、通过pkcoderule作为条件,先查询要删除基础码段
        List<CodeBasicSec> deleteList = this.codeBasicSecMapper.selectList(Wrappers.<CodeBasicSec>query().eq("pkcoderule", codeRuleOid));
@@ -183,7 +188,7 @@
     * @return æœ‰ç©ºçš„则传key-属性名 value-字段含义,没有空的则传 key-success value-true
     */
    @Override
    public KeyValue checkAttrNullableBySecType(CodeBasicSecDTO codeBasicSecDTO) {
    public KeyValue checkAttrNullableBySecType(CodeBasicSecDTO codeBasicSecDTO) throws ServiceException {
        VciBaseUtil.alertNotNull(codeBasicSecDTO.getSecType(), "码段分类");
        String secType = codeBasicSecDTO.getSecType();
        HashMap<String, String> attrMap = JSONObject.parseObject(JSONObject.toJSONString(codeBasicSecDTO), HashMap.class);
@@ -346,7 +351,7 @@
     * @param secType ç æ®µç±»åž‹
     * @return ä¸å¯ä¸ºç©ºçš„字段集合
     */
    private Map<String, String> getNotNullableAttr(String secType) {
    private Map<String, String> getNotNullableAttr(String secType) throws ServiceException {
        Map<String, String> attrMap = new HashMap<>();
        if (CodeSecTypeEnum.CODE_ATTR_SEC.getValue().equalsIgnoreCase(secType)) {
            attrMap.put("name", "属性码段名称");
@@ -496,7 +501,7 @@
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public R cloneCodeBasicSec(List<String> oidList, String pkCodeRule) {
    public R cloneCodeBasicSec(List<String> oidList, String pkCodeRule) throws ServiceException {
        boolean isLinked = checkIsLinked(pkCodeRule,null);
        if (isLinked) {
            return R.fail("编码规则已被引用,不允许编辑或删除");
@@ -560,7 +565,7 @@
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean upOrderNum(String oid) {
    public boolean upOrderNum(String oid) throws ServiceException{
        CodeBasicSec secDO = selectByOid(oid);
        if(secDO.getOrderNum() > 1){
            //等于1的时候不能上移了
@@ -591,7 +596,7 @@
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean downOrderNum(String oid) {
    public boolean downOrderNum(String oid) throws ServiceException {
        CodeBasicSec secDO = selectByOid(oid);
        Long total = codeBasicSecMapper.selectCount(Wrappers.<CodeBasicSec>query()
            .lambda().eq(CodeBasicSec::getPkCodeRule,secDO.getPkCodeRule())
@@ -623,7 +628,7 @@
     * @return
     */
    @Override
    public List<String> getOidByCodeclassifysecOid(String codeClassifySecOid) {
    public List<String> getOidByCodeclassifysecOid(String codeClassifySecOid)throws ServiceException {
        return codeBasicSecMapper.getOidByCodeclassifysecOid(codeClassifySecOid.trim());
    }
@@ -703,7 +708,7 @@
     * @return ç æ®µçš„内容
     */
    @Override
    public List<CodeBasicSecVO> listCodeBasicSecByRuleOid(String ruleOid) {
    public List<CodeBasicSecVO> listCodeBasicSecByRuleOid(String ruleOid)throws ServiceException {
        if(StringUtils.isBlank(ruleOid)){
            return new ArrayList<>();
        }
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeClassifyServiceImpl.java
@@ -47,7 +47,7 @@
import org.slf4j.LoggerFactory;
import org.springblade.core.cache.utils.CacheUtil;
import org.springblade.core.launch.constant.AppConstant;
import com.vci.ubcs.core.log.exception.ServiceException;
import org.springblade.core.log.exception.ServiceException;
import org.springblade.core.mp.support.Condition;
import org.springblade.core.secure.utils.AuthUtil;
import org.springblade.core.tool.api.R;
@@ -57,9 +57,11 @@
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import java.awt.event.ItemEvent;
import java.io.File;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import static com.vci.ubcs.code.constant.FrameWorkDefaultValueConstant.*;
@@ -103,6 +105,20 @@
    public List<CodeClassify> selectByWrapper(Wrapper wrapper) {
        return codeClassifyMapper.selectList(wrapper);
    }
    /**
     * æŸ¥è¯¢
     * @param wrapper æŸ¥è¯¢å°è£…器
     * @return
     */
    @Override
    public List<String> select1(Wrapper wrapper) {
        return codeClassifyMapper.selectObjs(wrapper);
    }
    @Override
    public IPage<CodeClassifyVO> selectPlCodeClassifyPage(IPage<CodeClassifyVO> page, CodeClassifyVO plCodeClassify) {
@@ -462,10 +478,19 @@
     */
    @Override
    public List<Tree> treeCodeClassify(TreeQueryObject treeQueryObject) {
        List<CodeClassify> doList =codeClassifyMapper
            .selectCodeClassifyDOByTree(treeQueryObject.getConditionMap().get("id"),treeQueryObject.getConditionMap().get("lcStatus"),treeQueryObject.getParentOid());
//        List<CodeClassify> doList =codeClassifyMapper.selectCodeClassifyVOByTree(treeQueryObject.getParentOid());
        List<CodeClassify> doList = null;
        String id = null;
        String lcStatus = null;
        if(!Objects.isNull(treeQueryObject.getConditionMap())){
            id = treeQueryObject.getConditionMap().getOrDefault("id",null);
            lcStatus = treeQueryObject.getConditionMap().getOrDefault("lcStatus",null);
        }
        if(StringUtils.isNotBlank(id) || StringUtils.isNotBlank(lcStatus) ){
            doList = codeClassifyMapper
                .selectCodeClassifyDOByTree(treeQueryObject.getConditionMap().get("id"),treeQueryObject.getConditionMap().get("lcStatus"),treeQueryObject.getParentOid());
        }else{
            doList =codeClassifyMapper.selectCodeClassifyVOByTree(treeQueryObject.getParentOid());
        }
        List<CodeClassifyVO> voList = codeClassifyDO2VOs(doList);
        TreeWrapperOptions treeWrapperOptions = new TreeWrapperOptions(PARENT_FIELD_NAME.toLowerCase(Locale.ROOT));
        treeWrapperOptions.copyFromTreeQuery(treeQueryObject);
@@ -933,12 +958,12 @@
                attributeVO.setAttributeLength(attr.getAttributeLength());
                attributeVO.setBtmTypeId(btmTypeDetail.getData().getId());
                attributeVO.setBtmname(btmTypeDetail.getData().getName());
                attributeVO.setAttrDataTypeText(EnumCache.getValue(EnumEnum.VCO_FIELD_TYPE,attr.getAttrDataType()));
                attributeVO.setAttrDataTypeText(EnumCache.getValue(EnumEnum.VCI_FIELD_TYPE,attr.getAttrDataType()));
                boolean add = true;
                if(StringUtils.isNotBlank(id) && !attributeVO.getId().contains(id.replace("*",""))){
                    add = false;
                }
                if(StringUtils.isNotBlank(name) && !attributeVO.getId().contains(name.replace("*",""))){
                if(StringUtils.isNotBlank(name) && !attributeVO.getName().contains(name.replace("*",""))){
                    add = false;
                }
                if(add){
@@ -951,20 +976,31 @@
            throw new ServiceException("业务类型feign接口调用出错");
        }
        List<BtmTypeAttributeVO> defaultAttrVOS = btmTypeVOR.getData().getAttributes();
        if(!CollectionUtils.isEmpty(defaultAttrVOS)){
            defaultAttrVOS.stream().forEach(attr->{
        // å–两个集合差集
        List<String> ids = unDefaultAttributes.stream().map(BtmTypeAttributeVO::getId).collect(Collectors.toList());
        defaultAttrVOS.forEach(item->{
            if(!ids.contains(item.getId())){
                BtmTypeAttributeVO attributeVO = new BtmTypeAttributeVO();
                BeanUtils.copyProperties(item,attributeVO);
                attributeVO.setAttrDataType(item.getAttrDataType());
                attributeVO.setAttributeLength(item.getAttributeLength());
                attributeVO.setBtmTypeId(btmTypeDetail.getData().getId());
                attributeVO.setBtmname(btmTypeDetail.getData().getName());
                attributeVO.setAttrDataTypeText(EnumCache.getValue(EnumEnum.VCI_FIELD_TYPE,item.getAttrDataType()));
                boolean add = true;
                if(StringUtils.isNotBlank(id) && !attr.getId().contains(id.replace("*",""))){
                if(StringUtils.isNotBlank(id) && !item.getId().contains(id.replace("*",""))){
                    add = false;
                }
                if(StringUtils.isNotBlank(name) && !attr.getId().contains(name.replace("*",""))){
                if(StringUtils.isNotBlank(name) && !item.getName().contains(name.replace("*",""))){
                    add = false;
                }
                if(add){
                    attributeVOS.add(attr);
                    attributeVOS.add(attributeVO);
                }
            });
        }
            }
        });
        DataGrid<BtmTypeAttributeVO> dataGrid = new DataGrid<>();
        dataGrid.setData(attributeVOS);
        dataGrid.setTotal(attributeVOS.size());
@@ -1056,20 +1092,7 @@
    }
    /**
<<<<<<< Updated upstream
<<<<<<< Updated upstream
<<<<<<< Updated upstream
     * ä¸»é¢˜åº“的树,已联调业务类型查询feign
=======
     * ä¸»é¢˜åº“的树,已经联调业务类型查询
>>>>>>> Stashed changes
=======
     * ä¸»é¢˜åº“的树,已经联调业务类型查询
>>>>>>> Stashed changes
=======
     * ä¸»é¢˜åº“的树,已经联调业务类型查询
>>>>>>> Stashed changes
     *
     * @param treeQueryObject æ ‘形查询对象
     * @return ä¸»é¢˜åº“显示树
     */
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeClassifyTemplateAttrServiceImpl.java
@@ -19,7 +19,9 @@
import com.vci.ubcs.code.vo.pagemodel.CodeClassifyTemplateAttrVO;
import com.vci.ubcs.code.wrapper.CodeClassifyTemplateAttrWrapper;
import com.vci.ubcs.omd.feign.IAttributeClient;
import com.vci.ubcs.omd.feign.IBtmTypeClient;
import com.vci.ubcs.omd.vo.BtmTypeAttributeVO;
import com.vci.ubcs.omd.vo.BtmTypeVO;
import com.vci.ubcs.starter.exception.VciBaseException;
import com.vci.ubcs.starter.revision.service.RevisionModelUtil;
import com.vci.ubcs.starter.util.DefaultAttrAssimtUtil;
@@ -28,14 +30,17 @@
import com.vci.ubcs.starter.web.enumpck.VciFieldTypeEnum;
import com.vci.ubcs.starter.web.pagemodel.*;
import com.vci.ubcs.starter.web.pagemodel.PageHelper;
import com.vci.ubcs.starter.web.util.BeanUtil;
import com.vci.ubcs.starter.web.util.BeanUtilForVCI;
import com.vci.ubcs.starter.web.util.VciBaseUtil;
import com.vci.ubcs.starter.web.util.VciDateUtil;
import com.vci.ubcs.system.entity.DictBiz;
import com.vci.ubcs.system.feign.IDictBizClient;
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.tool.api.R;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cglib.beans.BeanMap;
import org.springframework.context.annotation.Lazy;
@@ -89,7 +94,7 @@
     * å±žæ€§æœåŠ¡å¯¹è±¡
     */
    @Resource
    private IAttributeClient attributeClient;
    private IBtmTypeClient btmTypeClient;
    /**
     * æŸ¥è¯¢æ‰€æœ‰çš„主题库分类的模板属性
@@ -297,34 +302,17 @@
            pageHelper = new PageHelper(-1);
        }
        pageHelper.addDefaultAsc("ordernum");
//        IPage iPage = new IPage();
        Query query = new Query();
        query.setAscs("ordernum");
//        query.setSize(100);
        if(pageHelper.getLimit() != -1){
            query.setSize(pageHelper.getLimit());
            query.setCurrent(pageHelper.getPage());
        }
//        Condition.getPage(query)
        CodeClassifyTemplateAttr codeClstempattrVO = new CodeClassifyTemplateAttr();
//        BeanUtil.toBean(map,codeClstempattrVO);
//        BeanUtil
        BeanMap beanMap = BeanMap.create(codeClstempattrVO);
        beanMap.putAll(conditionMap);
//        Condition.getQueryWrapper(
        IPage<CodeClassifyTemplateAttr> doList = baseMapper.
            selectPage(Condition.getPage(query), Condition.getQueryWrapper(codeClstempattrVO));
            selectPage(Condition.getPage(query), UBCSCondition.getQueryWrapperByMapString(conditionMap,CodeClassifyTemplateAttr.class));
        if (!CollectionUtils.isEmpty(doList.getRecords())) {
//            CodeClstempattrEntity codeClstempattrEntity = new CodeClstempattrEntity();
//            BeanUtils.copyProperties(conditionMap, codeClstempattrEntity);
//            List<CodeClstempattrEntity> codeClstempattrEntities = new ArrayList<>();
//            BeanUtils.copyProperties(doList,codeClstempattrEntities);
//            codeClstempattrEntities.addAll(doList);
            dataGrid.setData(codeClassifyTemplateAttrDO2VOs(doList.getRecords()));
            dataGrid.setTotal(VciBaseUtil.getInt(String.valueOf(baseMapper.selectCount(Condition.getQueryWrapper(codeClstempattrVO)))));
            dataGrid.setTotal(VciBaseUtil.getInt(String.valueOf(baseMapper.selectCount(UBCSCondition.getQueryWrapperByMapString(conditionMap,CodeClassifyTemplateAttr.class)))));
        }
        return dataGrid;
    }
@@ -649,6 +637,7 @@
    public  CodeClassifyTemplateAttrVO getObjectByOid(String oid) throws VciBaseException{
        return codeClassifyTemplateAttrDO2VO(selectByOid(oid));
    }
    /**
     * ä¸»é”®æŸ¥è¯¢æ•°æ®å¯¹è±¡
     * @param oid ä¸»é”®
@@ -697,21 +686,6 @@
    }
    /**
     * å‚照主题库分类的模板属性列表
     * @param conditionMap æŸ¥è¯¢æ¡ä»¶
     * @param pageHelper åˆ†é¡µå’ŒæŽ’序
     * @return ä¸»é¢˜åº“分类的模板属性显示对象列表,生效的内容
     * @throws VciBaseException æŸ¥è¯¢æ¡ä»¶å’Œåˆ†é¡µå‡ºé”™çš„æ—¶å€™ä¼šæŠ›å‡ºå¼‚常
     */
    //    @Override
    //    public DataGrid<CodeClassifyTemplateAttrVO> refDataGridCodeClassifyTemplateAttr(Map<String, String> conditionMap, PageHelper pageHelper) throws VciBaseException{
    //        if(conditionMap == null){
    //            conditionMap = new HashMap<String, String>();
    //        }
    //        return gridCodeClassifyTemplateAttr(conditionMap,pageHelper);
    //    }
    /**
     * æŸ¥è¯¢è¿™ä¸ªæ¨¡æ¿ï¼Œä¸šåŠ¡ç±»åž‹ä¸‹çš„æ‰€æœ‰æœªé€‰æ‹©çš„å±žæ€§
     * @param baseQueryObject
     * @return
@@ -736,35 +710,16 @@
        //查询模板对象
        CodeClassifyTemplate codeClassifyTemplateDO = codeClassifyTemplateMapper.selectById(templateAttrOid);
        //这个业务类型下的所有属性
        // å¾…完善
        List<BtmTypeAttributeVO> boAttrs = null;  //(List<BtmTypeAttributeVO>)attributeClient.selectById(codeClassifyTemplateDO.getBtmTypeId());// this.btmService.listAttributeByBtmId(codeClassifyTemplateDO.getBtmTypeId());
        // codeOsbtmtypeattributeMapper.selectById(codeClassifyTemplateDO.getBtmTypeId());
        // BeanUtils.copyProperties(codeOsbtmtypeattributeMapper.selectById(codeClassifyTemplateDO.getBtmTypeId()),boAttrs);
        //把默认的属性也添加到boAttrs
        if(boAttrs == null){
            boAttrs = new ArrayList<>();
        // æ²¡æœ‰æ¨¡æ¿å¯¹è±¡ä¸æ‰§è¡Œé€»è¾‘
        if(Objects.isNull(codeClassifyTemplateDO)){
            dataGrid.setData(new ArrayList<>());
            dataGrid.setTotal(0);
            return dataGrid;
        }
        if(!false){
//            List<CodeOsbtmtypeattributeVO> finalBoAttrs = boAttrs;
//            attributeService.getDefaultAttributeVOs().stream().forEach(attr-> {
//                CodeOsbtmtypeattributeVO attributeVO = new CodeOsbtmtypeattributeVO();
//                BeanUtil.convert(attr, attributeVO);
//                if ("id".equalsIgnoreCase(attributeVO.getId())) {
//                    attributeVO.setName("企业编码");
//                }
//                if ("name".equalsIgnoreCase(attributeVO.getId())) {
//                    attributeVO.setName("集团码");
//                }
//                attributeVO.setAttrDataType(attr.getAttributeDataType());
//                attributeVO.setAttributeLength(attr.getAttrLength());
//                attributeVO.setReferBtmTypeId(attr.getBtmTypeId());
//                attributeVO.setReferBtmTypeName(attr.getBtmTypeName());
//                finalBoAttrs.add(attributeVO);
//            });
//            boAttrs = finalBoAttrs;
            Object o = null;
        //这个业务类型下的所有属性
        R<BtmTypeVO> btmTypeVOR = btmTypeClient.getAllAttributeByBtmId(codeClassifyTemplateDO.getBtmTypeId());
        if(btmTypeVOR.getCode() != 200){
            throw new ServiceException("业务类型feign调用失败!");
        }
        //这个模板下已经有的属性
@@ -782,7 +737,7 @@
        //过滤掉已经存在的属性
        List<BtmTypeAttributeVO> boAttrss = new ArrayList<BtmTypeAttributeVO>();
        for (BtmTypeAttributeVO osBtmTypeAttributeVO:boAttrs){
        for (BtmTypeAttributeVO osBtmTypeAttributeVO:btmTypeVOR.getData().getAttributes()){
            if(!btmOids.contains(osBtmTypeAttributeVO.getId())){
                //看看是不是有模糊查询
                boolean inSearch = true;
@@ -824,7 +779,7 @@
        CodeClassifyTemplate codeClassifyTemplateDO = codeClassifyTemplateMapper.selectById(templateAttrOid);
        //这个业务类型下的所有属性
        // å¾…完善
        // TODO å¾…完善
        List<BtmTypeAttributeVO> boAttrs =  null; // (List<BtmTypeAttributeVO>) attributeClient.selectById(codeClassifyTemplateDO.getBtmTypeId());//this.btmService.listAttributeByBtmIdHasDefault(codeClassifyTemplateDO.getBtmTypeId());
//        codeOsbtmtypeattributeMapper.selectById(codeClassifyTemplateDO.getBtmTypeId());
//        BeanUtils.copyProperties(codeOsbtmtypeattributeMapper.selectById(codeClassifyTemplateDO.getBtmTypeId()),boAttrs);
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeClstemplateServiceImpl.java
@@ -89,7 +89,7 @@
    private CodeClassifyTemplateButtonServiceImpl codeTempbuttonServiceImpl;
    @Autowired(required = false)
    private ICodeClassifyProcessTempService codeClsflowtempServiceImpl;
//    @Autowired(required = false)
    //    @Autowired(required = false)
//    private CodeClsflowtempMapper codeClsflowtempMapper;
    @Autowired(required = false)
    private CodeTemplatePhaseMapper codeTempphaseMapper;
@@ -493,34 +493,34 @@
//            ClientBusinessObject clientBusinessObject_template_insert = null;
//        try {
//            clientBusinessObject_template_insert = clientBusinessObjectOperation.reviseBusinessObject(clientBusinessObject_template, "");
            codeCls_template_insert.setOid(VciBaseUtil.getPk());
            codeCls_template_insert.setRevisionOid(VciBaseUtil.getPk());
            codeCls_template_insert.setNameOid(codeCls_template.getNameOid());
            codeCls_template_insert.setBtmname(codeCls_template.getBtmname());
            codeCls_template_insert.setLastR(String.valueOf(1));
            codeCls_template_insert.setFirstR(String.valueOf(0));
            codeCls_template_insert.setFirstV(String.valueOf(1));
            codeCls_template_insert.setLastV(String.valueOf(1));
            codeCls_template_insert.setCreator(AuthUtil.getUser().getUserName());
            codeCls_template_insert.setCreateTime(new Date());
            codeCls_template_insert.setLastModifier(AuthUtil.getUser().getUserName());
            codeCls_template_insert.setLastModifyTime(new Date());
            codeCls_template_insert.setRevisionRule(codeCls_template.getRevisionRule());
            codeCls_template_insert.setVersionRule(codeCls_template.getVersionRule());
            Map rvObj = baseMapper.getNextRevision(codeCls_template.getNameOid());
            codeCls_template_insert.setRevisionSeq(Integer.parseInt(rvObj.get("REVISIONSEQ").toString()));
            codeCls_template_insert.setRevisionValue(rvObj.get("REVISIONVAL").toString());
        codeCls_template_insert.setOid(VciBaseUtil.getPk());
        codeCls_template_insert.setRevisionOid(VciBaseUtil.getPk());
        codeCls_template_insert.setNameOid(codeCls_template.getNameOid());
        codeCls_template_insert.setBtmname(codeCls_template.getBtmname());
        codeCls_template_insert.setLastR(String.valueOf(1));
        codeCls_template_insert.setFirstR(String.valueOf(0));
        codeCls_template_insert.setFirstV(String.valueOf(1));
        codeCls_template_insert.setLastV(String.valueOf(1));
        codeCls_template_insert.setCreator(AuthUtil.getUser().getUserName());
        codeCls_template_insert.setCreateTime(new Date());
        codeCls_template_insert.setLastModifier(AuthUtil.getUser().getUserName());
        codeCls_template_insert.setLastModifyTime(new Date());
        codeCls_template_insert.setRevisionRule(codeCls_template.getRevisionRule());
        codeCls_template_insert.setVersionRule(codeCls_template.getVersionRule());
        Map rvObj = baseMapper.getNextRevision(codeCls_template.getNameOid());
        codeCls_template_insert.setRevisionSeq(Integer.parseInt(rvObj.get("REVISIONSEQ").toString()));
        codeCls_template_insert.setRevisionValue(rvObj.get("REVISIONVAL").toString());
//            VersionValueObject versionObj = this.getVersionValue(item.verRuleName);
            codeCls_template_insert.setVersionSeq(Integer.parseInt(rvObj.get("VERSIONSEQ").toString()));
            codeCls_template_insert.setVersionValue(rvObj.get("VERSIONVAL").toString());
            codeCls_template_insert.setLctid(codeCls_template.getLctid());
            codeCls_template_insert.setLcStatus("Editing");
            codeCls_template_insert.setId(codeCls_template.getId());
            codeCls_template_insert.setName(codeCls_template.getName());
            codeCls_template_insert.setDescription(codeCls_template.getDescription());
            codeCls_template_insert.setOwner(AuthUtil.getUser().getUserName());
        codeCls_template_insert.setVersionSeq(Integer.parseInt(rvObj.get("VERSIONSEQ").toString()));
        codeCls_template_insert.setVersionValue(rvObj.get("VERSIONVAL").toString());
        codeCls_template_insert.setLctid(codeCls_template.getLctid());
        codeCls_template_insert.setLcStatus("Editing");
        codeCls_template_insert.setId(codeCls_template.getId());
        codeCls_template_insert.setName(codeCls_template.getName());
        codeCls_template_insert.setDescription(codeCls_template.getDescription());
        codeCls_template_insert.setOwner(AuthUtil.getUser().getUserName());
//            codeCls_template_insert.setCheckinBy(userName);
            codeCls_template_insert.setCopyFromVersion(codeCls_template.getOid());
        codeCls_template_insert.setCopyFromVersion(codeCls_template.getOid());
//        }catch (VCIError e){
//            e.printStackTrace();
//            logger.error("===============>分类模板-升版复制出错oid: "+templateOldOid+",mes"+e.error_message);
@@ -919,6 +919,13 @@
    @Override
    public R<CodeClassifyTemplateVO> addSave(CodeClassifyTemplateDTO codeClassifyTemplateDTO) throws VciBaseException{
        VciBaseUtil.alertNotNull(codeClassifyTemplateDTO,"需要添加的数据对象");
        QueryWrapper<CodeClassifyTemplate> wrapper = new QueryWrapper<>();
        wrapper.eq("CODECLASSIFYOID",codeClassifyTemplateDTO.getCodeclassifyoid());
        Long aLong = baseMapper.selectCount(wrapper);
        if(aLong > 0){
            return R.fail("该分类下已有子模版,无法新增,仅能进行升版操作!");
        }
        //将DTO转换为DO
        CodeClassifyTemplate codeClassifyTemplateDO = new CodeClassifyTemplate();
        BeanUtilForVCI.copyPropertiesIgnoreCase(codeClassifyTemplateDTO,codeClassifyTemplateDO);
@@ -937,7 +944,7 @@
        codeClassifyTemplateDO.setBtmTypeName(codeClassifyDO.getBtmTypeName());
        codeClassifyTemplateDO.setLcStatus(FRAMEWORK_RELEASE_EDITING);
        codeClassifyTemplateDO.setTs(new Date());
        codeClassifyTemplateDO.setOwner(AuthUtil.getUser().getUserName());
        codeClassifyTemplateDO.setOwner(String.valueOf(AuthUtil.getUser().getUserId()));
        codeClassifyTemplateDO.setLctid("codeClsTempLc");
        codeClassifyTemplateDO.setVersionValue("1");
        codeClassifyTemplateDO.setVersionSeq(1);
@@ -946,8 +953,8 @@
        codeClassifyTemplateDO.setVersionRule("0");
        codeClassifyTemplateDO.setRevisionRule("numberversionrule");
        codeClassifyTemplateDO.setLastModifyTime(new Date());
        codeClassifyTemplateDO.setLastModifier(AuthUtil.getUser().getUserName());
        codeClassifyTemplateDO.setCreator(AuthUtil.getUser().getUserName());
        codeClassifyTemplateDO.setLastModifier(String.valueOf(AuthUtil.getUser().getUserId()));
        codeClassifyTemplateDO.setCreator(String.valueOf(AuthUtil.getUser().getUserId()));
        codeClassifyTemplateDO.setCreateTime(new Date());
        codeClassifyTemplateDO.setLastV("1");
        codeClassifyTemplateDO.setLastR("1");
@@ -1043,7 +1050,7 @@
//            condition.put("ts",codeClassifyTemplateDOCopyFromDTO.getTs());
            CodeClassifyTemplate detail = baseMapper
                .selectById(codeClassifyTemplateDOCopyFromDTO.getOid());
    //        boolean tsBoolean = boService.checkTs(codeClassifyTemplateAttrDOListemplateDOCopyFromDTO);
            //        boolean tsBoolean = boService.checkTs(codeClassifyTemplateAttrDOListemplateDOCopyFromDTO);
            if(detail.getTs().compareTo(codeClassifyTemplateDOCopyFromDTO.getTs()) != 0){//不是最新的不让改
                return R.fail("当前数据不是最新,请刷新后再修改!");
            }
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeRuleServiceImpl.java
@@ -49,6 +49,7 @@
import com.vci.ubcs.starter.web.util.BeanUtilForVCI;
import com.vci.ubcs.starter.web.util.VciBaseUtil;
import com.vci.ubcs.starter.web.util.WebUtil;
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.utils.AuthUtil;
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmEngineServiceImpl.java
@@ -1,6 +1,7 @@
package com.vci.ubcs.code.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.baomidou.mybatisplus.extension.toolkit.SqlHelper;
@@ -8,6 +9,7 @@
import com.vci.ubcs.code.bo.CodeClassifyFullInfoBO;
import com.vci.ubcs.code.bo.CodeTemplateAttrSqlBO;
import com.vci.ubcs.code.constant.FrameWorkDefaultValueConstant;
import com.vci.ubcs.code.constant.MdmBtmTypeConstant;
import com.vci.ubcs.code.dto.CodeDeleteBatchDTO;
import com.vci.ubcs.code.dto.CodeOrderDTO;
import com.vci.ubcs.code.dto.datapush.BaseModelDTO;
@@ -20,16 +22,18 @@
import com.vci.ubcs.code.vo.pagemodel.UITableFieldVO;
import com.vci.ubcs.code.vo.pagemodel.UITablePageVO;
import com.vci.ubcs.code.vo.pagemodel.*;
import com.vci.ubcs.omd.feign.IAttributeClient;
import com.vci.ubcs.omd.feign.IBtmTypeClient;
import com.vci.ubcs.omd.feign.IEnumClient;
import com.vci.ubcs.omd.feign.IRevisionRuleClient;
import com.vci.ubcs.omd.constant.BtmTypeLcStatusConstant;
import com.vci.ubcs.omd.entity.BtmTypeAttribute;
import com.vci.ubcs.omd.cache.EnumCache;
import com.vci.ubcs.omd.feign.*;
import com.vci.ubcs.omd.utils.VciOmdUtil;
import com.vci.ubcs.omd.vo.BtmTypeAttributeVO;
import com.vci.ubcs.omd.vo.BtmTypeVO;
import com.vci.ubcs.omd.vo.EnumVO;
import com.vci.ubcs.omd.vo.RevisionRuleVO;
import com.vci.ubcs.starter.exception.VciBaseException;
import com.vci.ubcs.starter.revision.model.BaseModel;
import com.vci.ubcs.starter.revision.model.TreeQueryObject;
import com.vci.ubcs.starter.revision.model.TreeWrapperOptions;
import com.vci.ubcs.starter.revision.service.RevisionModelUtil;
import com.vci.ubcs.starter.web.constant.QueryOptionConstant;
@@ -48,34 +52,32 @@
import com.vci.ubcs.system.user.feign.IUserClient;
import net.logstash.logback.encoder.org.apache.commons.lang3.StringUtils;
import oracle.sql.TIMESTAMP;
import org.apache.commons.collections4.MapUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springblade.core.cache.utils.CacheUtil;
import org.springblade.core.launch.constant.AppConstant;
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.StringPool;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.Cache;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Supplier;
import java.util.stream.Collectors;
import static com.vci.ubcs.code.constant.FrameWorkLangCodeConstant.DATA_OID_NOT_EXIST;
@@ -98,8 +100,6 @@
    @Resource
    private CodeClstemplateServiceImpl templateService;
    @Resource
    private IAttributeClient attributeClient;
    /**
     * ç”Ÿæˆç¼–码的服务
@@ -117,6 +117,11 @@
     */
    @Resource
    ISysClient iSysClient;
    /**
     * ç³»ç»Ÿçš„æœåŠ¡
     */
    @Resource
    private IWebSecretClient secretService;
    /**
     * ç”¨æˆ·æœåŠ¡
     */
@@ -264,7 +269,7 @@
    /**
     * æ›¿æ¢å­—符
     */
    public static final String SPECIAL_CHAR  = "VCI";
    public static final String SPECIAL_CHAR = "VCI";
//    @Autowired
//    private CodeOsbtmtypeMapper codeOsbtmtypeMapper;----
@@ -310,7 +315,7 @@
//             Dict dict = new Dict();
//            dict.setParentId(Long.valueOf(attrVO.getEnumid()));
            R<List<EnumVO>> list = enumClient.getList(attrVO.getEnumId());
            if(list.isSuccess()){
            if (list.isSuccess()) {
                for (EnumVO datum : list.getData()) {
                    KeyValue keyValue = new KeyValue();
                    keyValue.setKey(datum.getItemValue());
@@ -326,15 +331,24 @@
     *
     * @param baseModelDTO æ•°æ®ä¼ è¾“对象
     */
    @Transactional
    @Override
    public void changeStatus(BaseModelDTO baseModelDTO) {
        VciBaseUtil.alertNotNull(baseModelDTO, "数据信息", baseModelDTO.getOid(), "主键", baseModelDTO.getBtmname(), "业务类型", baseModelDTO.getLcStatus(), "目标状态");
        List<String> oids = VciBaseUtil.str2List(baseModelDTO.getOid());
//        List<ClientBusinessObject> cboList = boService.selectCBOByOidCollection(oids, baseModelDTO.getBtmname());
        //插个点 ä¸šåŠ¡ç±»åž‹å®ŒæˆåŽéœ€è¦ä¿®æ”¹
        // TODO æ’个点 ä¸šåŠ¡ç±»åž‹å®ŒæˆåŽéœ€è¦ä¿®æ”¹
        QueryWrapper<BtmTypeVO> wrapper = new QueryWrapper<>();
        wrapper.eq("BTMNAME",baseModelDTO.getBtmname());
        wrapper.in("OID",oids);
        // TODO å¾…完善
        //插个点 ä¸šåŠ¡ç±»åž‹å®ŒæˆåŽéœ€è¦ä¿®æ”¹
//        QueryWrapper<BtmTypeVO> wrapper = new QueryWrapper<>();
        List<BaseModel> baseModels = new ArrayList<>();
        baseModels = selectByTypeAndOid(baseModelDTO.getBtmname(), baseModelDTO.getOid());
        if(baseModels.size() == 0){
            throw new VciBaseException("未查询到相关数据。");
        }
        // å¾…完善
        List<BtmTypeVO> cboList =  null;  // btmTypeClient.selectList(wrapper);
        //还需要修改allCode的生命周期
@@ -348,16 +362,27 @@
//        List<ClientBusinessObject> codeCbos = boService.queryCBO(MdmBtmTypeConstant.CODE_ALL_CODE, conditionMap);
        // å›žæ”¶éœ€è¦ä¸šåŠ¡æ•°æ®åˆ é™¤
        if (CodeDefaultLC.TASK_BACK.getValue().equals(baseModelDTO.getLcStatus())) {
            R<List<BtmTypeVO>> listR = btmTypeClient.selectByIdCollection(Collections.singletonList(baseModelDTO.getBtmname()));
//            String referTable = listR.getData().get(0).getTableName();
            commonsMapper.deleteByTaleAndOid(listR.getData().get(0).getTableName(),VciBaseUtil.toInSql(baseModelDTO.getOid()));
            // BatchCBO batchCBO = new BatchCBO();
            // batchCBO.getDeleteCbos().addAll(cboList);
            // å¾…完善
            // TODO å¾…完善
            //btmTypeClient.deleteBatchIds(cboList);
            //boService.persistenceBatch(batchCBO);
        } else {
            for (BaseModel baseModel : baseModels) {
                baseModel.setLcStatus(baseModelDTO.getLcStatus());
            }
            updateBatchByBaseModel(baseModelDTO.getBtmname(),baseModels);
            // lifeCycleService.transCboStatus(cboList, baseModelDTO.getLcStatus());
        }
        for (CodeAllCode codeCbo : codeCbos) {
            codeCbo.setLcStatus(baseModelDTO.getLcStatus());
        }
        codeAllCodeService.updateBatchById(codeCbos);
        // lifeCycleService.transCboStatus(codeCbos, baseModelDTO.getLcStatus());
    }
@@ -624,9 +649,10 @@
        //没有限制分类,但是一个模板只可能在一个业务类型里面,所以直接查询这个业务类型即可
        if (!CollectionUtils.isEmpty(conditionMap)) {
            //表需要改
//            final String[] sql = {"select count(*) from " + VciBaseUtil.getTableName(classifyFullInfo.getTopClassifyVO().getBtmtypeid()) + " t where 1 = 1 "};
            final String[] sql = {"select count(*) from pl_code_wupin t where 1 = 1 "};
            R<List<BtmTypeVO>> listR = btmTypeClient.selectByIdCollection(Collections.singletonList(classifyFullInfo.getTopClassifyVO().getBtmtypeid()));
//                String referTable = VciBaseUtil.getTableName(referVO.getReferType());
            final String[] sql = {"select count(*) from "+ listR.getData().get(0).getTableName() +" t where 1 = 1 "};
            conditionMap.forEach((key, value) -> {
                sql[0] += " and " + key + " = " + value;
            });
@@ -822,9 +848,7 @@
            }
            int secret = VciBaseUtil.getInt(String.valueOf(cbo.getSecretGrade()));
            //后续看密级服务是否可用
//            if (secret == 0 || !secretService.checkDataSecret(secret)) {
            if (secret == 0 ) {
            if (secret == 0 || !secretService.checkDataSecret(secret).getData()) {
                Integer userSecret = VciBaseUtil.getCurrentUserSecret();
//                cbo.setAttributeValue(SECRET_FIELD, String.valueOf((userSecret == null || userSecret == 0) ? UserSecretEnum.NONE.getValue() : userSecret));
                cbo.setSecretGrade(userSecret == null || userSecret == 0 ? UserSecretEnum.NONE.getValue() : userSecret);
@@ -1160,7 +1184,7 @@
            //处理所有的列,这个模板没有合并的表头的情况
            List<UITableFieldVO> fieldVOList = new ArrayList<>();
            resembleAttrList.forEach(attrVO -> {
                UITableFieldVO tableFieldVO = templateAttr2TableField(attrVO,false);
                UITableFieldVO tableFieldVO = templateAttr2TableField(attrVO, false);
                tableFieldVO.setHidden(false);
                fieldVOList.add(tableFieldVO);
            });
@@ -1175,12 +1199,12 @@
    /**
     * æ¨¡æ¿å±žæ€§è½¬æ¢ä¸ºè¡¨æ ¼æ˜¾ç¤ºçš„配置
     *
     * @param attrVO æ¨¡æ¿å±žæ€§
     * @param attrVO  æ¨¡æ¿å±žæ€§
     * @param forEdit æ˜¯å¦æ˜¯ç¼–辑所需
     * @return è¡¨æ ¼çš„字段
     */
    @Override
    public UITableFieldVO templateAttr2TableField(CodeClassifyTemplateAttrVO attrVO,boolean forEdit) {
    public UITableFieldVO templateAttr2TableField(CodeClassifyTemplateAttrVO attrVO, boolean forEdit) {
        UITableFieldVO fieldVO = new UITableFieldVO();
        if (SECRET_FILED.equalsIgnoreCase(attrVO.getId())) {
            attrVO.setEnumId(MY_DATA_SECRET);
@@ -1191,9 +1215,9 @@
        fieldVO.setSort(true);
        fieldVO.setSortField(fieldVO.getField());
        fieldVO.setQueryField(fieldVO.getField());
        if (forEdit){
        if (forEdit) {
            fieldVO.setHidden(!VciBaseUtil.getBoolean(attrVO.getFormDisplayFlag()));
        }else {
        } else {
            fieldVO.setHidden(!VciBaseUtil.getBoolean(attrVO.getTableDisplayFlag()));
        }
        if (attrVO.getAttrTableWidth() != null && attrVO.getAttrTableWidth() > 0) {
@@ -1213,9 +1237,9 @@
                if (StringUtils.isBlank(attrVO.getEnumId())) {
                    fieldVO.setComboxKey(fieldVO.getField() + "_data");
                }
            }else {
//                List<KeyValue> osEnumItemVOList= enumService.getEnum(attrVO.getEnumId());
//                fieldVO.setData(osEnumItemVOList);
            } else {
                List<KeyValue> osEnumItemVOList= VciOmdUtil.enumsToListKeyVale(EnumCache.getList(attrVO.getEnumId()));
                fieldVO.setData(osEnumItemVOList);
            }
        }
        //看是否有参照
@@ -1383,8 +1407,8 @@
                }
            }
            queryValue = String.format(temp, (trim ? value.trim() : value));
            temp = temp.replace("to_single_byte('%s')","to_single_byte(%s)");
            queryKey = String.format(temp, "t."+attrId);
            temp = temp.replace("to_single_byte('%s')", "to_single_byte(%s)");
            queryKey = String.format(temp, "t." + attrId);
            conditionMap.put(queryKey, QueryOptionConstant.OR + queryValue);
        }
    }
@@ -1403,35 +1427,49 @@
    public DataGrid<Map<String, String>> queryGrid(String btmType, CodeClassifyTemplateVO templateVO, Map<String, String> conditionMap, PageHelper pageHelper) {
        CodeTemplateAttrSqlBO sqlBO = getSqlByTemplateVO(btmType, templateVO, conditionMap, pageHelper);
//        List<Map> maps = boService.queryByOnlySqlForMap(sqlBO.getSqlHasPage());
        List<Map<String,String>> maps = commonsMapper.queryByOnlySqlForMap(sqlBO.getSqlHasPage());
        List<Map<String, String>> maps = commonsMapper.queryByOnlySqlForMap(sqlBO.getSqlHasPage());
        DataGrid<Map<String, String>> dataGrid = new DataGrid<>();
        List<Map<String, String>> dataList = new ArrayList<>();
//        if (!CollectionUtils.isEmpty(maps)) {
//            maps.stream().forEach(map -> {
//                Map<String, String> data = new HashMap<>();
//                map.forEach((key, value) -> {
//                    data.put(((String) key).toLowerCase(Locale.ROOT), String.valueOf(value));
//                });
//                dataList.add(data);
//            });
//        }
//        dataGrid.setData(dataList);
        if (!CollectionUtils.isEmpty(maps)) {
            wrapperData(maps, templateVO, sqlBO.getSelectFieldList(), false);
            maps.stream().forEach(map -> {
                Map<String, String> data = new HashMap<>();
                for (String s : map.keySet()) {
                    data.put(s.toLowerCase(Locale.ROOT), String.valueOf(map.get(s)));
                }
//                map.forEach((key, value) -> {
//                    data.put(((String) key).toLowerCase(Locale.ROOT), String.valueOf(value));
//                });
                for (String s : map.keySet()) {
                    data.put(((String) s).toLowerCase(Locale.ROOT), String.valueOf(map.get(s)));
                }
                dataList.add(data);
            });
            dataGrid.setData(dataList);
            dataGrid.setTotal(Long.parseLong(commonsMapper.selectBySql(sqlBO.getSqlCount()).get(0).values().toArray()[0].toString()));
            wrapperData(dataList, templateVO, sqlBO.getSelectFieldList(), false);
//            maps.stream().forEach(map -> {
//                Map<String, String> data = new HashMap<>();
////                map.forEach((key, value) -> {
////                    data.put(((String) key).toLowerCase(Locale.ROOT), String.valueOf(value));
////                });
//                for (String s : map.keySet()) {
//                    data.put(((String) s).toLowerCase(Locale.ROOT), String.valueOf(map.get(s)));
//                }
//                dataList.add(data);
//            });
        }
//        dataGrid.setData(dataList);
//        if (!CollectionUtils.isEmpty(maps)) {
//            wrapperData(maps, templateVO, sqlBO.getSelectFieldList(), false);
//            maps.stream().forEach(map -> {
//                Map<String, String> data = new HashMap<>();
////                map.forEach((key, value) -> {
////                    data.put(((String) key).toLowerCase(Locale.ROOT), String.valueOf(value));
////                });
//                for (String s : map.keySet()) {
//                    data.put(((String) s).toLowerCase(Locale.ROOT), String.valueOf(map.get(s)));
//                }
//                dataList.add(data);
//            });
        dataGrid.setData(dataList);
        dataGrid.setTotal(Long.parseLong(commonsMapper.selectBySql(sqlBO.getSqlCount()).get(0).values().toArray()[0].toString()));
//        }
        return dataGrid;
    }
@@ -1442,7 +1480,7 @@
     * @param dataMap              æ•°æ®çš„æ˜ å°„
     * @param templateVO           æ¨¡æ¿çš„属性
     * @param onlySelectAttrIdList ä»…仅查询的属性字段
     * @param form è¡¨å•里使用
     * @param form                 è¡¨å•里使用
     */
    @Override
    public void wrapperData(List<Map<String, String>> dataMap, CodeClassifyTemplateVO templateVO,
@@ -1473,15 +1511,15 @@
            //处理枚举
            wrapperEnum(enumAttrVOs, data);
            String lcstatus = data.get(VciQueryWrapperForDO.LC_STATUS_FIELD);
            String copyFromVersion = data.getOrDefault(COPY_FROM_VERSION,"");
            String copyFromVersion = data.getOrDefault(COPY_FROM_VERSION, "");
            if ((CodeDefaultLC.EDITING.getValue().equalsIgnoreCase(lcstatus) || CodeDefaultLC.AUDITING.getValue().equalsIgnoreCase(lcstatus))
                && StringUtils.isBlank(copyFromVersion)
            ) {
                data.put(VciQueryWrapperForDO.ID_FIELD, "******");
            }
            data.put(VciQueryWrapperForDO.LC_STATUS_FIELD_TEXT.toLowerCase(Locale.ROOT), CodeDefaultLC.getTextByValue(lcstatus));
            if(CodeDefaultLC.EDITING.getValue().equalsIgnoreCase(lcstatus)
                && StringUtils.isNotBlank(copyFromVersion)){
            if (CodeDefaultLC.EDITING.getValue().equalsIgnoreCase(lcstatus)
                && StringUtils.isNotBlank(copyFromVersion)) {
                data.put(VciQueryWrapperForDO.LC_STATUS_FIELD_TEXT.toLowerCase(Locale.ROOT), "修改中");
            }
            if (data.containsKey("creator")) {
@@ -1494,12 +1532,12 @@
        if (!CollectionUtils.isEmpty(userIds)) {
            Map<String, User> userVOMap = new HashMap<>();
            for (String userId : userIds) {
                if(!StringUtils.isNumeric(userId)){
                if (!StringUtils.isNumeric(userId)) {
                    continue;
                }
                User data = iUserClient.userInfoById(Long.valueOf(userId)).getData();
                if(data != null){
                    userVOMap.put(String.valueOf(data.getId()),data);
                if (data != null) {
                    userVOMap.put(String.valueOf(data.getId()), data);
                }
            }
//            Map<String, SmUserVO> userVOMap = Optional.ofNullable(userQueryService.listUserByUserIds(userIds)).orElseGet(() -> new ArrayList<>()).stream().collect(Collectors.toMap(s -> s.getId().toLowerCase(Locale.ROOT), t -> t));
@@ -1632,7 +1670,7 @@
//                selectFieldList.add(attrId.getOid());
//            }
//        });
        if(allAttributeByBtmId.getData() != null ){
        if (allAttributeByBtmId.getData() != null) {
            for (BtmTypeAttributeVO attribute : allAttributeByBtmId.getData().getAttributes()) {
                if (!selectFieldList.contains(attribute.getId()) && !"secretgrade".equalsIgnoreCase(attribute.getId())) {
                    selectFieldList.add(attribute.getId());
@@ -1703,13 +1741,11 @@
        if (attrVOMap.keySet().contains("secretgrade")) {
            Integer userSecret = VciBaseUtil.getCurrentUserSecret();
            if (userSecret == null || userSecret == 0) {
//                userSecret = secretService.getMinUserSecret();
                userSecret = secretService.getMinUserSecret().getData();
            }
            whereSql += " and ( t.secretGrade <= " + userSecret + ") ";
        }
        //要改,表明获取有问题
//        String tableName = VciBaseUtil.getTableName(btmType);
//        String tableName = "pl_code_wupin";
        R<List<BtmTypeVO>> listR = btmTypeClient.selectByIdCollection(Collections.singletonList(btmType));
//                String referTable = VciBaseUtil.getTableName(referVO.getReferType());
        String tableName = listR.getData().get(0).getTableName();
@@ -1845,10 +1881,10 @@
     */
    private String getSqlByValue(String selectKey, String value, Map<String, CodeClassifyTemplateAttrVO> attrVOMap) {
        StringBuilder sql = new StringBuilder();
        //待完善
//        if (!selectKey.contains(".") && (attrVOMap.containsKey(selectKey.toLowerCase(Locale.ROOT)) || attributeService.isDefaultAttr(selectKey) || selectKey.matches(RegExpConstant.LETTER))) {
//            sql.append("t.");
//        }
        // TODO å¾…完善
        //    if (!selectKey.contains(".") && (attrVOMap.containsKey(selectKey.toLowerCase(Locale.ROOT)) || attributeService.isDefaultAttr(selectKey) || selectKey.matches(RegExpConstant.LETTER))) {
        //        sql.append("t.");
        //    }
        if (value.startsWith(QueryOptionConstant.IN)) {
            sql.append(selectKey)
                .append(SPACE)
@@ -2024,8 +2060,6 @@
//        return codeList.size() > 0 ? codeList.get(0) : "";
        //修改的时候,编码是不变的
//        BatchCBO batchCBO = new BatchCBO();
//        batchCBO.getUpdateCbos().add(cbo);
@@ -2070,10 +2104,10 @@
        //只能删除自己创建的数据
        String userId = AuthUtil.getUser().getUserName();
        for (CodeWupin clientBusinessObject:cboList){
        for (CodeWupin clientBusinessObject : cboList) {
            String creator = clientBusinessObject.getCreator();
            if(!userId.equalsIgnoreCase(creator)){
                throw new VciBaseException("编码为"+clientBusinessObject.getId()+"的数据不是当前用户创建,不能删除!");
            if (!userId.equalsIgnoreCase(creator)) {
                throw new VciBaseException("编码为" + clientBusinessObject.getId() + "的数据不是当前用户创建,不能删除!");
            }
        }
@@ -2157,15 +2191,18 @@
        //pageHelper.addDefaultDesc("createTime");
        pageHelper.addDefaultDesc("id");
        if (!classifyService.checkHasChild(codeClassifyOid)) {
            conditionMap.put(CODE_CLASSIFY_OID_FIELD, codeClassifyOid);
            conditionMap.put("t."+CODE_CLASSIFY_OID_FIELD, codeClassifyOid);
        } else {
            //表需要改
//            conditionMap.put(CODE_CLASSIFY_OID_FIELD, QueryOptionConstant.IN + "(select oid from " + VciBaseUtil.getTableName(MdmBtmTypeConstant.CODE_CLASSIFY)
            conditionMap.put(CODE_CLASSIFY_OID_FIELD, QueryOptionConstant.IN + "(select oid from pl_code_classify where lcstatus='" + FrameWorkDefaultValueConstant.FRAMEWORK_DATA_ENABLED +
                "' start with parentCodeClassifyOid = '" + codeClassifyOid + "' CONNECT BY PRIOR OID = parentCodeClassifyOid )");
            conditionMap.put("t."+CODE_CLASSIFY_OID_FIELD, QueryOptionConstant.IN + "(select oid from "+
                btmTypeClient.selectByIdCollection(Collections.singletonList(MdmBtmTypeConstant.CODE_CLASSIFY))
                    .getData().get(0).getTableName() +" where lcstatus='" + FrameWorkDefaultValueConstant
                .FRAMEWORK_DATA_ENABLED + "' start with parentCodeClassifyOid = '" + codeClassifyOid +
                "' CONNECT BY PRIOR OID = parentCodeClassifyOid )");
        }
        conditionMap.put("lastr", "1");
        conditionMap.put("lastv", "1");
        conditionMap.put("t.lastr", "1");
        conditionMap.put("t.lastv", "1");
        return queryGrid(btmTypeId, templateVO, conditionMap, pageHelper);
//        List<String> selectFieldList = templateVO.getAttributes().stream().map(CodeClassifyTemplateAttrVO::getId).collect(Collectors.toList());
//        //参照让平台直接查询就行
@@ -2480,11 +2517,11 @@
        String btmId = topClassifyVO.getBtmtypeid();
        //查询数据
        Map<String, String> conditionMap = new HashMap<>();
        conditionMap.put("t.oid",oid);
        conditionMap.put("t.oid", oid);
        CodeTemplateAttrSqlBO sqlBO = getSqlByTemplateVO(btmId, templateVO, conditionMap, new PageHelper(-1));
        //我们使用和业务类型的来查询
        List<Map> cbosB = commonsMapper.selectBySql(sqlBO.getSqlUnPage());
        List<Map<String,String>> cbos = new ArrayList<>();
        List<Map<String, String>> cbos = new ArrayList<>();
        cbosB.stream().forEach(map -> {
            Map<String, String> data = new HashMap<>();
            for (Object o : map.keySet()) {
@@ -2498,7 +2535,7 @@
            throw new VciBaseException("数据在系统中不存在,是否因为修改过业务类型?");
        }
//        Map<String, String> data = new HashMap<>();
        Map<String,String> cbo = cbos.get(0);
        Map<String, String> cbo = cbos.get(0);
//        WebUtil.copyValueToMapFromCbos(cbo, data);
        List<Map<String, String>> dataList = new ArrayList<>();
        dataList.add(cbo);
@@ -2594,10 +2631,10 @@
        QueryWrapper<CodeWupin> wrapper = new QueryWrapper();
        if (conditionMap.get("oid").contains(",")) {
//            oidMap.put("oid", QueryOptionConstant.IN +"("+ VciBaseUtil.toInSql(oidList.toArray(new String[0])) + ")");
            wrapper.in("oid",oidList);
            wrapper.in("oid", oidList);
        } else {
//            oidMap.put("oid", conditionMap.get("oid"));
            wrapper.in("oid",conditionMap.get("oid"));
            wrapper.in("oid", conditionMap.get("oid"));
        }
        if (CollectionUtils.isEmpty(oidMap)) {
            throw new VciBaseException("业务数据主键不能为空");
@@ -2630,18 +2667,18 @@
        CodeClassifyTemplateVO templateVO = templateService.codeClassifyTemplateDO2VO(templateDOList.get(0));
        templateVO.setAttributes(codeClassifyTemplateAttrService.codeClassifyTemplateAttrDO2VOs(attrDOList));
        try {
            if (oidList.size() > 1){
                DataGrid<Map<String,String>> allDataGrid = new DataGrid<>();
                List<Map<String,String>> allData = new ArrayList<>();
            if (oidList.size() > 1) {
                DataGrid<Map<String, String>> allDataGrid = new DataGrid<>();
                List<Map<String, String>> allData = new ArrayList<>();
                oidList.forEach(oid -> {
                    Map<String,String> condition = new HashMap<>();
                    condition.put("oid",oid);
                    Map<String, String> condition = new HashMap<>();
                    condition.put("oid", oid);
                    DataGrid<Map<String, String>> dataGrid = queryGrid(btmType, templateVO, condition, pageHelper);
                    allData.addAll(dataGrid.getData());
                });
                allDataGrid.setData(allData);
                return allDataGrid;
            }else {
            } else {
                return queryGrid(btmType, templateVO, conditionMap, pageHelper);
            }
        } catch (Exception e) {
@@ -2661,20 +2698,20 @@
        MdmUIInfoVO uiInfoVO = new MdmUIInfoVO();
        CodeClassifyTemplateVO templateVO = getUsedTemplateByClassifyOid(codeClassifyOid);
        uiInfoVO.setTemplateVO(templateVO);
        UITableDefineVO uiTableDefineVO = wrapperTableDefineByTemplate(templateVO,true);
        UITableDefineVO uiTableDefineVO = wrapperTableDefineByTemplate(templateVO, true);
        List<String> phaseAttrIdList = listPhaseAttrByClassifyOid(codeClassifyOid, phase);
        uiTableDefineVO.getCols().stream().forEach(list -> {
            List<UITableFieldVO> visiableTableField=new ArrayList<>();
            if(StringUtils.isNotBlank(phase)) {
            List<UITableFieldVO> visiableTableField = new ArrayList<>();
            if (StringUtils.isNotBlank(phase)) {
                visiableTableField = list.stream().filter(col ->
                    phaseAttrIdList.stream().anyMatch(s -> StringUtils.equalsIgnoreCase(col.getField(), s) ||
                        (StringUtils.equalsIgnoreCase(col.getFieldType(), "combox") && StringUtils.equalsIgnoreCase(col.getSortField(), s))
                        || (StringUtils.equalsIgnoreCase(col.getFieldType(), "refer") && StringUtils.equalsIgnoreCase(col.getQueryField(), s))
                    )).collect(Collectors.toList());
            }else{
                visiableTableField=  list.stream().filter(col ->
            } else {
                visiableTableField = list.stream().filter(col ->
                    templateVO.getAttributes().stream().anyMatch(s ->
                        (!s.getReadOnlyFlag().equalsIgnoreCase("true")&& StringUtils.equalsIgnoreCase(col.getField(), s.getId())) ||
                        (!s.getReadOnlyFlag().equalsIgnoreCase("true") && StringUtils.equalsIgnoreCase(col.getField(), s.getId())) ||
                            (StringUtils.equalsIgnoreCase(col.getFieldType(), "combox") && StringUtils.equalsIgnoreCase(col.getSortField(), s.getId()))
                            || (StringUtils.equalsIgnoreCase(col.getFieldType(), "refer") && StringUtils.equalsIgnoreCase(col.getQueryField(), s.getId()))
                    )).collect(Collectors.toList());
@@ -2686,9 +2723,9 @@
                    setReferConfig2EditConfig(vo);
                } else if ("combox".equalsIgnoreCase(vo.getFieldType())) {
                    setComboxConfig2EditConfig(vo);
                } else if (StringUtils.isNotBlank(vo.getDateFormate())){
                } else if (StringUtils.isNotBlank(vo.getDateFormate())) {
                    vo.setEdit("date");
                }else {
                } else {
                    vo.setEdit(vo.getFieldType());
                }
            });
@@ -2768,14 +2805,14 @@
     * @param vo è¡¨æ ¼å­—段显示对象
     */
    private void setReferConfig2EditConfig(UITableFieldVO vo) {
        if (!CollectionUtils.isEmpty(vo.getReferConfig().getWhere())){
        if (!CollectionUtils.isEmpty(vo.getReferConfig().getWhere())) {
            vo.getReferConfig().getWhere().keySet().forEach(key -> {
                vo.getReferConfig().getWhere().put(key, "'" + vo.getReferConfig().getWhere().get(key) + "'");
            });
        }
        if (StringUtils.isNotBlank(vo.getReferConfig().getParentValue())){
        if (StringUtils.isNotBlank(vo.getReferConfig().getParentValue())) {
            String parentValue = vo.getReferConfig().getParentValue();
            parentValue ="\\" +  parentValue.replaceAll("'","{vci-quote}").replaceAll("=","{vci-equals}");
            parentValue = "\\" + parentValue.replaceAll("'", "{vci-quote}").replaceAll("=", "{vci-equals}");
            vo.getReferConfig().setParentValue(parentValue);
        }
        String referConfig = vo.getReferConfig().toString()
@@ -2799,16 +2836,16 @@
     */
    private void setComboxConfig2EditConfig(UITableFieldVO vo) {
        vo.setEditConfig("{editable:true,comboxKey:'" + vo.getComboxKey() + "'");
        if (!CollectionUtils.isEmpty(vo.getData())){
            vo.setEditConfig(vo.getEditConfig()+", comboxConfig:");
        if (!CollectionUtils.isEmpty(vo.getData())) {
            vo.setEditConfig(vo.getEditConfig() + ", comboxConfig:");
            for (int i = 0; i < vo.getData().size(); i++) {
                KeyValue data = vo.getData().get(i);
                if (i == vo.getData().size() -1){
                    vo.setEditConfig(vo.getEditConfig() + "{attributes:"+data.getAttributes()+",key:'"+data.getKey()+"',value:'"+data.getValue()+"'}]}");
                }else if (i == 0){
                    vo.setEditConfig(vo.getEditConfig() + "{data:[{attributes:"+data.getAttributes()+",key:'"+data.getKey()+"',value:'"+data.getValue()+"'},");
                }else{
                    vo.setEditConfig(vo.getEditConfig() + "{attributes:"+data.getAttributes()+",key:'"+data.getKey()+"',value:'"+data.getValue()+"'},");
                if (i == vo.getData().size() - 1) {
                    vo.setEditConfig(vo.getEditConfig() + "{attributes:" + data.getAttributes() + ",key:'" + data.getKey() + "',value:'" + data.getValue() + "'}]}");
                } else if (i == 0) {
                    vo.setEditConfig(vo.getEditConfig() + "{data:[{attributes:" + data.getAttributes() + ",key:'" + data.getKey() + "',value:'" + data.getValue() + "'},");
                } else {
                    vo.setEditConfig(vo.getEditConfig() + "{attributes:" + data.getAttributes() + ",key:'" + data.getKey() + "',value:'" + data.getValue() + "'},");
                }
            }
            vo.setEditConfig(vo.getEditConfig() + ",valueField:'" + vo.getQueryField() + "'");
@@ -2826,7 +2863,7 @@
    @Override
    public MdmUIInfoVO getFormDefineByClassifyIdPath(String idPath) {
        CodeClassifyVO classifyVO = classifyService.getObjectByIdPath(idPath);
        if(classifyVO !=null){
        if (classifyVO != null) {
            return getFormDefineByClassifyOid(classifyVO.getOid());
        }
        return null;
@@ -2871,7 +2908,7 @@
        MdmUIInfoVO uiInfoVO = new MdmUIInfoVO();
        uiInfoVO.setTemplateVO(templateVO);
        //我们需要将模板转换为表格相关的显示信息
        uiInfoVO.setTableDefineVO(wrapperTableDefineByTemplate(uiInfoVO.getTemplateVO(),false));
        uiInfoVO.setTableDefineVO(wrapperTableDefineByTemplate(uiInfoVO.getTemplateVO(), false));
        //需要去看扩展的按钮,只有列表里面本身才添加进去,工具栏上的单独获取
        List<CodeClassifyTemplateButtonVO> buttonVOS = templateButtonService.listButtonByTemplateOid(templateVO.getOid(), true);
        if (!CollectionUtils.isEmpty(buttonVOS)) {
@@ -2910,8 +2947,8 @@
    @Override
    public MdmUIInfoVO getUIInfoByClassifyIdPath(String codeClassifyIdPath, String functionId) {
        CodeClassifyVO classifyVO = classifyService.getObjectByIdPath(codeClassifyIdPath);
        if(classifyVO !=null){
            return getUIInfoByClassifyOid(classifyVO.getOid(),functionId);
        if (classifyVO != null) {
            return getUIInfoByClassifyOid(classifyVO.getOid(), functionId);
        }
        return null;
    }
@@ -2926,12 +2963,11 @@
    @Override
    public MdmUIInfoVO getUIInfoByClassifyOid(String codeClassifyOid, String functionId) {
        VciBaseUtil.alertNotNull(codeClassifyOid, "主题库分类主键");
        MdmUIInfoVO uiInfoVO = getTableDefineByTemplateVO(getUsedTemplateByClassifyOid(codeClassifyOid));
        uiInfoVO.setLeaf(classifyService.countChildrenByClassifyOid(codeClassifyOid) == 0);
        if (StringUtils.isNotBlank(functionId) && !"~".equalsIgnoreCase(functionId)) {
            List<Menu> buttonVOS = iSysClient.getMenuButtonByType(uiInfoVO.getTemplateVO().getBtmTypeId()).getData();
            //功能按钮服务还未实现,等实现了,在进行调用
//            List<SmOperationVO> operationVOS = operationService.listButtonByFunctionId(functionId);
//            if (operationVOS == null) {
//                operationVOS = new ArrayList<>();
@@ -3001,7 +3037,7 @@
     * @return å¤„理成功数据条数
     */
    @Override
    public Integer insertBatchByType(String btmType, List<BaseModel> baseModels) throws Exception {
    public Integer insertBatchByType(String btmType, List<BaseModel> baseModels) {
        //使用传入的业务类型查询表
        R<List<BtmTypeVO>> listR = btmTypeClient.selectByIdCollection(Collections.singletonList(btmType));
        if(listR.getData().size() == 0){
@@ -3023,15 +3059,15 @@
     * ä¼ å…¥ä¸šåŠ¡ç±»åž‹ä»¥åŠç›¸oid集合查询数据进行返回
     *
     * @param btmType ä¸šåŠ¡ç±»åž‹
     * @param oids      éœ€è¦æŸ¥è¯¢çš„oid集合 é€—号分开
     * @param oids    éœ€è¦æŸ¥è¯¢çš„oid集合 é€—号分开
     * @return æŸ¥è¯¢å‡ºçš„æ•°æ®
     */
    @Override
    public List<BaseModel> selectByTypeAndOid(String btmType, String oids) throws IllegalAccessException, NoSuchFieldException, InstantiationException, InvocationTargetException, IntrospectionException, SQLException {
    public List<BaseModel> selectByTypeAndOid(String btmType, String oids)  {
        //使用传入的业务类型查询表
        R<List<BtmTypeVO>> listR = btmTypeClient.selectByIdCollection(Collections.singletonList(btmType));
        if(listR.getData().size() == 0){
        if (listR.getData().size() == 0) {
            throw new VciBaseException("传入业务类型未查询到相应表单,请检查!");
        }
        //查询数据
@@ -3040,38 +3076,42 @@
        List<BaseModel> baseModels = new ArrayList<>();
        //将查询到的数据转换为basemodel,使用的反射方式来进行创建的
        for (Map map : maps) {
            Object obj = BaseModel.class.newInstance();
            BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass());
            PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
            for (PropertyDescriptor property : propertyDescriptors) {
                Method setter = property.getWriteMethod();
                if (setter != null) {
                    //oracle的时间为TIMESTAMP的,需要进行转换成data,否则将报错
                    if(map.get(property.getName().toUpperCase()) instanceof TIMESTAMP){
                        LocalDateTime localDateTime = ((TIMESTAMP) map.get(property.getName().toUpperCase())).toLocalDateTime();
                        ZoneId zoneId = ZoneId.systemDefault();
                        ZonedDateTime zdt = localDateTime.atZone(zoneId);
                        Date date = Date.from(zdt.toInstant());
                        setter.invoke(obj,date);
                        map.remove(property.getName().toUpperCase());
                    } //oracle的数字为BigDecimal的,需要进行转换成Integer,否则将报错
                    else if (map.get(property.getName().toUpperCase()) instanceof BigDecimal
                        && ("Integer").equals(setter.getParameterTypes()[0].getSimpleName())){
                        setter.invoke(obj, ((BigDecimal)map.get(property.getName().toUpperCase())).intValue());
                        map.remove(property.getName().toUpperCase());
                    }else if(map.get(property.getName().toUpperCase()) != null){
                        setter.invoke(obj, map.get(property.getName().toUpperCase()));
                        map.remove(property.getName().toUpperCase());
        try{
            for (Map map : maps) {
                Object obj = BaseModel.class.newInstance();
                BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass());
                PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
                for (PropertyDescriptor property : propertyDescriptors) {
                    Method setter = property.getWriteMethod();
                    if (setter != null) {
                        //oracle的时间为TIMESTAMP的,需要进行转换成data,否则将报错
                        if(map.get(property.getName().toUpperCase()) instanceof TIMESTAMP){
                            LocalDateTime localDateTime = ((TIMESTAMP) map.get(property.getName().toUpperCase())).toLocalDateTime();
                            ZoneId zoneId = ZoneId.systemDefault();
                            ZonedDateTime zdt = localDateTime.atZone(zoneId);
                            Date date = Date.from(zdt.toInstant());
                            setter.invoke(obj,date);
                            map.remove(property.getName().toUpperCase());
                        } //oracle的数字为BigDecimal的,需要进行转换成Integer,否则将报错
                        else if (map.get(property.getName().toUpperCase()) instanceof BigDecimal
                            && ("Integer").equals(setter.getParameterTypes()[0].getSimpleName())){
                            setter.invoke(obj, ((BigDecimal)map.get(property.getName().toUpperCase())).intValue());
                            map.remove(property.getName().toUpperCase());
                        }else if(map.get(property.getName().toUpperCase()) != null){
                            setter.invoke(obj, map.get(property.getName().toUpperCase()));
                            map.remove(property.getName().toUpperCase());
                        }
                    }
                }
            }
            for (Object key : map.keySet()) {
                map.put(key,String.valueOf(map.get(key)));
            }
                for (Object key : map.keySet()) {
                    map.put(key,String.valueOf(map.get(key)));
                }
            ((BaseModel) obj).setData(map);
            baseModels.add((BaseModel) obj);
                ((BaseModel) obj).setData(map);
                baseModels.add((BaseModel) obj);
            }
        }catch (Exception e){
            throw new VciBaseException("查询失败:" + e.getMessage());
        }
        return baseModels;
    }
@@ -3147,7 +3187,7 @@
     * @return å¤„理状态
     */
    @Override
    public R updateBatchByBaseModel(String btmType, List<BaseModel> baseModels) throws Exception {
    public R updateBatchByBaseModel(String btmType, List<BaseModel> baseModels) {
        //使用传入的业务类型查询表
        R<List<BtmTypeVO>> listR = btmTypeClient.selectByIdCollection(Collections.singletonList(btmType));
        if(listR.getData().size() == 0){
@@ -3172,4 +3212,149 @@
        return R.success("更新成功!");
    }
    /**
     * èŽ·å–å‚ç…§çš„ä¿¡æ¯
     *
     * @param referConfigVO å‚照的配置
     * @param pageHelper    åˆ†é¡µçš„工具
     * @return åˆ—表数据
     */
    @Override
    public DataGrid referDataGrid(UIFormReferVO referConfigVO, PageHelper pageHelper) {
//        checkReferConfig(referConfigVO);
        //使用业务类型查询
        R<BtmTypeVO> allAttributeByBtmId = btmTypeClient.getAllAttributeByBtmId(referConfigVO.getReferType());
        BtmTypeVO btmTypeVO = allAttributeByBtmId.getData();
        if (referConfigVO.getWhere() == null) {
            referConfigVO.setWhere(new HashMap<>());
        }
        /**
         * åŠ ä¸ŠæŸ¥è¯¢æœ€æ–°ç‰ˆæ¬¡
         */
        Map<String, String> conditionMap = new HashMap<>();
        conditionMap.put("lastr", "1");
        conditionMap.put("lastv", "1");
        referConfigVO.getWhere().putAll(conditionMap);
        if (VciBaseUtil.containsKeyUnCaseForMap(referConfigVO.getWhere(), VciQueryWrapperForDO.LC_STATUS_FIELD) &&
            BtmTypeLcStatusConstant.FRAME_WORK_LIFE_CYCLE_NAME.equalsIgnoreCase(btmTypeVO.getLifeCycleId())) {
            referConfigVO.getWhere().put(VciQueryWrapperForDO.LC_STATUS_FIELD, FrameworkDataLCStatus.ENABLED.getValue());
        }
        if (VciBaseUtil.containsKeyUnCaseForMap(referConfigVO.getWhere(), VciQueryWrapperForDO.LC_STATUS_FIELD) &&
            BtmTypeLcStatusConstant.RELEASE_LIFE_CYCLE.equalsIgnoreCase(btmTypeVO.getLifeCycleId())) {
            referConfigVO.getWhere().put(VciQueryWrapperForDO.LC_STATUS_FIELD, CodeDefaultLC.RELEASED.getValue());
        }
        BaseQueryObject baseQueryObject = new BaseQueryObject();
        Map<String, String> where = referConfigVO.getWhere();
        where.put("domain", AppConstant.APPLICATION_NAME_CODE);
        baseQueryObject.setConditionMap(where);
        baseQueryObject.setPage(pageHelper.getPage());
        baseQueryObject.setSort(pageHelper.getSort());
        baseQueryObject.setLimit(pageHelper.getLimit());
        baseQueryObject.setOrder(pageHelper.getOrder());
        R<List<BtmTypeVO>> ref = btmTypeClient.getRef(baseQueryObject);
        DataGrid<BtmTypeVO> btmTypeVODataGrid = new DataGrid<>();
        List<BtmTypeVO> data = ref.getData();
        btmTypeVODataGrid.setData(data);
        btmTypeVODataGrid.setCode(ref.getCode());
        btmTypeVODataGrid.setLimit(pageHelper.getLimit());
        btmTypeVODataGrid.setMsg(ref.getMsg());
        btmTypeVODataGrid.setSort(pageHelper.getSort());
        btmTypeVODataGrid.setOrder(pageHelper.getOrder());
        btmTypeVODataGrid.setPage(pageHelper.getPage());
        return btmTypeVODataGrid;
    }
    /**
     * èŽ·å–æ ‘å½¢çš„å‚ç…§
     *
     * @param referConfigVO å‚照的配置
     * @return æ ‘形的数据
     */
    @Override
    public List<Tree> referTree(UIFormReferVO referConfigVO, TreeQueryObject queryObject) {
        if (queryObject.getConditionMap() == null) {
            queryObject.setConditionMap(new HashMap<>());
        }
        if (queryObject.getParentOid()==null){
            LambdaQueryWrapper<CodeClassify> lqw = new LambdaQueryWrapper<>();
            String parentValue = referConfigVO.getParentValue().substring(3);
            lqw.inSql(CodeClassify::getOid,parentValue);
            List<String> codeClassifies = classifyService.select1(lqw);
            String oid = codeClassifies.get(0);
            queryObject.setParentOid(oid);
        }
        String oidFieldName = StringUtils.isNotBlank(referConfigVO.getParentUsedField()) ? referConfigVO.getParentUsedField() : referConfigVO.getValueField();
        if (queryObject.isQueryAllLevel()) {
            String parentOidSql = "";
            if (StringUtils.isNotBlank(referConfigVO.getParentValue())) {
                String temp = referConfigVO.getParentValue();
                if (temp.startsWith(QueryOptionConstant.IN)) {
                    temp = temp.substring((QueryOptionConstant.IN).length()).trim();
                    parentOidSql = " in " + ((temp.startsWith("(") && temp.endsWith(")")) ? temp : "(" + temp + ")");
                } else if (temp.startsWith(QueryOptionConstant.NOTIN)) {
                    parentOidSql = " not in " + ((temp.startsWith("(") && temp.endsWith(")")) ? temp : "(" + temp + ")");
                } else if (temp.startsWith(QueryOptionConstant.NOTEQUAL)) {
                    temp = temp.substring((QueryOptionConstant.NOTEQUAL).length()).trim();
                    parentOidSql = QueryOptionConstant.NOTEQUAL + " " + ((temp.startsWith("'") && temp.endsWith("'")) ? temp : "'" + temp + "'");
                } else if (temp.startsWith(QueryOptionConstant.MORETHAN)) {
                    temp = temp.substring((QueryOptionConstant.MORETHAN).length()).trim();
                    parentOidSql = QueryOptionConstant.MORETHAN + " " + ((temp.startsWith("'") && temp.endsWith("'")) ? temp : "'" + temp + "'");
                } else if (temp.startsWith(QueryOptionConstant.MORE)) {
                    temp = temp.substring((QueryOptionConstant.MORE).length()).trim();
                    parentOidSql = QueryOptionConstant.MORE + " " + ((temp.startsWith("'") && temp.endsWith("'")) ? temp : "'" + temp + "'");
                } else if (temp.startsWith(QueryOptionConstant.LESSTHAN)) {
                    temp = temp.substring((QueryOptionConstant.LESSTHAN).length()).trim();
                    parentOidSql = QueryOptionConstant.LESSTHAN + " " + ((temp.startsWith("'") && temp.endsWith("'")) ? temp : "'" + temp + "'");
                } else if (temp.startsWith(QueryOptionConstant.LESS)) {
                    temp = temp.substring((QueryOptionConstant.LESS).length()).trim();
                    parentOidSql = QueryOptionConstant.LESS + " " + ((temp.startsWith("'") && temp.endsWith("'")) ? temp : "'" + temp + "'");
                } else if (temp.startsWith(QueryOptionConstant.ISNOTNULL)) {
                    parentOidSql = " is not null";
                } else if (temp.startsWith(QueryOptionConstant.ISNULL)) {
                    parentOidSql = " is  null";
                } else if (temp.contains("*")) {
                    parentOidSql = " like " + ((temp.startsWith("'") && temp.endsWith("'")) ? temp : "'" + temp + "'").replace("*", "%");
                } else {
                    parentOidSql = " = " + ((temp.startsWith("'") && temp.endsWith("'")) ? temp : "'" + temp + "'");
                }
            }
            //查询全部的信息
            queryObject.getConditionMap().put("oid", QueryOptionConstant.IN + "(select oid from " +
                    getTableName(referConfigVO.getReferType())+
                " START WITH " + referConfigVO.getParentFieldName() + " " +
                parentOidSql +
                " CONNECT BY PRIOR " + oidFieldName + " = " + referConfigVO.getParentFieldName() + ")");
        } else {
            if (StringUtils.isNotBlank(referConfigVO.getParentFieldName()) && StringUtils.isNotBlank(queryObject.getParentOid())) {
                queryObject.getConditionMap().put(referConfigVO.getParentFieldName(), queryObject.getParentOid());
            }
        }
        LambdaQueryWrapper<CodeClassify> lqw = new LambdaQueryWrapper<>();
        String sql = queryObject.getConditionMap().get("oid").substring(3);
        lqw.inSql(CodeClassify::getOid,sql);
        List<CodeClassify> codeClassifies = classifyService.selectByWrapper(lqw);
        TreeWrapperOptions treeWrapperOptions = new TreeWrapperOptions(referConfigVO.getParentFieldName());
        treeWrapperOptions.setOidFieldName(oidFieldName);
        treeWrapperOptions.setTextFieldName(referConfigVO.getTextField());
        treeWrapperOptions.setMultipleSelect(referConfigVO.isMuti());
        treeWrapperOptions.setParentOid(queryObject.getParentOid());
        return revisionModelUtil.doList2Trees(codeClassifies, treeWrapperOptions, null);
    }
    private String getTableName(String refertype){
        if ("codeclassify".equals(refertype)){
            return "pl_code_classify";
        }
        if ("table".equals(refertype)){
            return "pl_code_test_table";
        }
        if ("testBtmType".equals(refertype)){
            return "PLBT_code_testBtmType";
        }
        return "pl_code_"+refertype.trim().toLowerCase();
    }
}
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmIOServiceImpl.java
@@ -1,11 +1,17 @@
package com.vci.ubcs.code.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.nacos.common.utils.StringUtils;
import com.vci.ubcs.code.bo.AttributeValue;
import com.vci.ubcs.code.bo.CodeClassifyFullInfoBO;
import com.vci.ubcs.code.bo.CodeTemplateAttrSqlBO;
import com.vci.ubcs.code.dto.CodeOrderDTO;
import com.vci.ubcs.code.service.ICodeClassifyService;
import com.vci.ubcs.code.service.MdmEngineService;
import com.vci.ubcs.code.service.MdmIOService;
import com.vci.ubcs.code.enumpack.CodeDefaultLC;
import com.vci.ubcs.code.enumpack.CodeLevelTypeEnum;
import com.vci.ubcs.code.mapper.CommonsMapper;
import com.vci.ubcs.code.service.*;
import com.vci.ubcs.code.util.ClientBusinessObject;
import com.vci.ubcs.code.vo.CodeKeyAttrRepeatVO;
import com.vci.ubcs.code.vo.pagemodel.*;
import com.vci.ubcs.code.vo.webserviceModel.attrmap.DataObjectVO;
import com.vci.ubcs.code.vo.webserviceModel.attrmap.RowDatas;
@@ -17,14 +23,20 @@
import com.vci.ubcs.starter.poi.bo.SheetRowData;
import com.vci.ubcs.starter.poi.bo.WriteExcelOption;
import com.vci.ubcs.starter.poi.util.ExcelUtil;
import com.vci.ubcs.starter.revision.model.BaseModel;
import com.vci.ubcs.starter.util.DefaultAttrAssimtUtil;
import com.vci.ubcs.starter.util.LocalFileUtil;
import com.vci.ubcs.starter.web.enumpck.BooleanEnum;
import com.vci.ubcs.starter.web.enumpck.VciFieldTypeEnum;
import com.vci.ubcs.starter.web.pagemodel.DataGrid;
import com.vci.ubcs.starter.web.pagemodel.KeyValue;
import com.vci.ubcs.starter.web.util.LangBaseUtil;
import com.vci.ubcs.starter.web.util.VciBaseUtil;
import com.vci.ubcs.starter.web.util.VciDateUtil;
import com.vci.ubcs.starter.web.pagemodel.PageHelper;
import com.vci.ubcs.starter.web.pagemodel.UIFormReferVO;
import com.vci.ubcs.starter.web.toolmodel.DateConverter;
import com.vci.ubcs.starter.web.util.*;
import lombok.AllArgsConstructor;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;
@@ -33,6 +45,8 @@
import org.apache.poi.ss.usermodel.Workbook;
import org.springblade.core.redis.cache.BladeRedis;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
@@ -40,23 +54,31 @@
import java.io.File;
import java.io.IOException;
import java.util.*;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.CopyOnWriteArraySet;
import java.util.stream.Collectors;
import static com.alibaba.druid.util.FnvHash.Constants.LIMIT;
import static com.vci.ubcs.code.constant.MdmEngineConstant.*;
import static com.vci.ubcs.starter.poi.util.ExcelUtil.KEY_ATTR_CHAR;
import static com.vci.ubcs.starter.poi.util.ExcelUtil.REQUIRED_CHAR;
import static com.vci.ubcs.starter.poi.util.ExcelUtil.*;
@AllArgsConstructor
@RequiredArgsConstructor
@Service
@Slf4j
public class MdmIOServiceImpl implements MdmIOService {
    @Value("${batchadd.redis.time:6000000}")
    public int BATCHADD_REDIS_TIME;
    /**
     * ä¸»é¢˜åº“分类的服务
     */
    @Resource
    private ICodeClassifyService classifyService;
    /**
     * é€šç”¨æŸ¥è¯¢
     */
    @Resource
    CommonsMapper commonsMapper;
    /**
     * æ¨¡æ¿çš„æœåŠ¡
@@ -69,9 +91,26 @@
     */
    @Resource
    private MdmEngineService engineService;
    /***
     * resdis缓存服务
     */
    private final BladeRedis bladeRedis;
    /**
     * ç”Ÿæˆç¼–码的服务
     */
    @Resource
    private MdmProductCodeService productCodeService;
    /**
     * å…³é”®å±žæ€§çš„配置
     */
    @Autowired
    private ICodeKeyAttrRepeatService keyRuleService;
    /**
     * å…¬å¼çš„æœåŠ¡
     */
    @Autowired
    private FormulaServiceImpl formulaService;
    /**
     * ç”Ÿæˆå¯¼å…¥çš„æ–‡ä»¶
     *
@@ -350,125 +389,140 @@
     */
    private String batchImportCodes(CodeOrderDTO orderDTO,CodeClassifyTemplateVO templateVO,SheetDataSet dataSet,Map<String,String> errorMap,boolean isEnumType){
        List<String> codeList=new ArrayList<>();
//        CodeClassifyFullInfoBO classifyFullInfo = classifyService.getClassifyFullInfo(orderDTO.getCodeClassifyOid());
        CodeClassifyFullInfoBO classifyFullInfo = classifyService.getClassifyFullInfo(orderDTO.getCodeClassifyOid());
        //规则的主键需要去获取
//        CodeRuleVO ruleVO = engineService.getCodeRuleByClassifyFullInfo(classifyFullInfo);
//        //1.判断规则中除了流水码段,是否有其他码段
//        engineService.checkSecValueOnOrder(ruleVO,orderDTO);
//        List<SheetRowData> rowDataList = dataSet.getRowData();
//
//        //除去默认的属性.还有只有表单显示的字段才导入
//        List<CodeClassifyTemplateAttrVO> attrVOS = templateVO.getAttributes().stream().filter(s ->
//            !DEFAULT_ATTR_LIST.contains(s.getId()) && VciBaseUtil.getBoolean(s.getFormdisplayflag())
//        ).collect(Collectors.toList());
//        Map<Integer/**列号**/,String/**字段的名称**/> fieldIndexMap = new HashMap<>();
//        List<String> titleRowData = dataSet.getColName();
//        Map<String/**中文名称**/, String/**英文名称**/> attrNameIdMap = attrVOS.stream().collect(Collectors.toMap(s -> s.getName(), t -> t.getId().toLowerCase(Locale.ROOT),(o1, o2)->o2));
//        getFieldIndexMap(titleRowData,attrNameIdMap,fieldIndexMap);
//
//        //需要判断是否所有的属性都在模板上了
//        List<CodeClassifyTemplateAttrVO> unExistAttrVOs = attrVOS.stream().filter(s -> !fieldIndexMap.containsValue(s.getId().toLowerCase(Locale.ROOT))
//            && StringUtils.isBlank(s.getComponentrule()) && StringUtils.isBlank(s.getClassifyinvokeattr())//组合规则和分类注入确实没给用户导出去
//        ).collect(Collectors.toList());
//        if(!CollectionUtils.isEmpty(unExistAttrVOs)){
//            throw new VciBaseException("【" + unExistAttrVOs.stream().map(CodeClassifyTemplateAttrVO::getName) + "】这些属性在列表中没有找到");
//        }
//        List<ClientBusinessObject> cboList = new ArrayList<>();
//        String fullPath = getFullPath(classifyFullInfo);
//        excelToCbo(classifyFullInfo,fieldIndexMap,rowDataList,templateVO,cboList,fullPath,true);
//
//        //都转换完了。需要批量检查
//        //如果出错了,我们依然执行有效的数据,无效的数据写回到excel中
//        //2.判断必输项。。需要全部的属性,如果是必输,但是表单里面不显示的,只能是分类注入或者组合规则
//        batchCheckRequiredAttrOnOrder(templateVO,cboList,errorMap);
//        //3.判断关键属性
//        CodeImportResultVO keyResultVO = batchCheckKeyAttrOnOrder(classifyFullInfo, templateVO, cboList);
//        Set<String> selfRepeatRowIndexList = keyResultVO.getSelfRepeatRowIndexList();
//        Set<String> keyAttrRepeatRowIndexList = keyResultVO.getKeyAttrRepeatRowIndexList();
//        if(!CollectionUtils.isEmpty(selfRepeatRowIndexList)){
//            selfRepeatRowIndexList.stream().forEach(rowIndex->{
//                errorMap.put(rowIndex,errorMap.getOrDefault(rowIndex,"") + ";在当前处理的数据文件中关键属性重复" );
//            });
//        }
//        if(!CollectionUtils.isEmpty(keyAttrRepeatRowIndexList)){
//            keyAttrRepeatRowIndexList.stream().forEach(rowIndex->{
//                errorMap.put(rowIndex,errorMap.getOrDefault(rowIndex,"") + ";关键属性与系统中的重复" );
//            });
//        }
//        //分类注入
//        batchSwitchClassifyAttrOnOrder(attrVOS,cboList,classifyFullInfo,false);
//        //boolean
//        reSwitchBooleanAttrOnOrder(attrVOS,cboList);
//        //4.校验规则
//        batchCheckVerifyOnOrder(attrVOS, cboList,errorMap);
//        if(isEnumType) {//是否需要校验枚举/参照
//            //5.校验枚举是否正确
//            batchSwitchEnumAttrOnOrder(attrVOS, cboList, errorMap);
//            //7.处理参照的情况
//            batchSwitchReferAttrOnOrder(attrVOS,cboList,errorMap);
//        }
//        //6.时间格式的验证
//        //6.时间的,必须统一为yyyy-MM-dd HH:mm:ss
//        batchSwitchDateAttrOnOrder(attrVOS,cboList,errorMap);
//        //最后弄组合规则
//        batchSwitchComponentAttrOnOrder(attrVOS,cboList);
//        String uuid=redisService.getUUIDEveryDay();
//        Map<String, ClientBusinessObject> rowIndexCboMap = cboList.stream().filter(cbo -> cbo != null).collect(Collectors.toList()).stream().collect(Collectors.toMap(s -> s.getAttributeValue((IMPORT_ROW_INDEX)), t -> t));
//
//        if(errorMap.size()>0) {
//            createRedisDatas(uuid + "-error",templateVO, rowIndexCboMap, dataSet, fieldIndexMap, errorMap,false);
//        }
//        boolean isCreateUUid=false;
//        List<ClientBusinessObject> needSaveCboList = cboList.stream().filter(cbo -> {
//            String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
//            return !errorMap.containsKey(rowIndex);
//        }).collect(Collectors.toList());
//        //相似校验
//        Map<String,String>resembleMap=new HashMap<>();
//        List<DataResembleVO> dataResembleVOS=new ArrayList<>();
//        String btmtypeid= classifyFullInfo.getTopClassifyVO().getBtmtypeid();
//        bathcResembleQuery(orderDTO.getCodeClassifyOid(),templateVO,needSaveCboList,resembleMap,btmtypeid,dataResembleVOS);
//        if(resembleMap.size()>0) {
//            isCreateUUid=true;
//            if(!CollectionUtils.isEmpty(dataResembleVOS)) {
//                redisService.setCacheList(uuid + "-resemble-data", dataResembleVOS);
//                createRedisDatas(uuid + "-resemble",templateVO, rowIndexCboMap, dataSet, fieldIndexMap, resembleMap, false);
//            }
//        }
//        //排除错误的,剩下正确的
//        Map<String,String> newErrorMap=new HashMap<>();
//        newErrorMap.putAll(resembleMap);
//        newErrorMap.putAll(errorMap);
//        needSaveCboList = cboList.stream().filter(cbo -> {
//            String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
//            return !newErrorMap.containsKey(rowIndex);
//        }).collect(Collectors.toList());
//        if((errorMap.size()>0&&needSaveCboList.size()>0)||resembleMap.size()>0){
//            isCreateUUid=true;
//        }
//        createRedisByCodeClassify(uuid + "-class",templateVO,dataSet,fieldIndexMap,false);
//        if(newErrorMap.size()>0) {
//            createRedisDatas(uuid + "-ok",templateVO, rowIndexCboMap, dataSet, fieldIndexMap, newErrorMap,true);
//        }else {
//            uuid="";
//            //要把以上的错误的都抛出后,再继续处理时间和组合规则
//            needSaveCboList = cboList.stream().filter(cbo -> {
//                String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
//                return !newErrorMap.containsKey(rowIndex);
//            }).collect(Collectors.toList());
//            if (!CollectionUtils.isEmpty(needSaveCboList)) {
//                //9.我们处理业务数据
//                //生成编码的内容
//                codeList = productCodeService.productCodeAndSaveData(classifyFullInfo, templateVO, ruleVO, orderDTO.getSecDTOList(), needSaveCboList);
//                //如果是编码生成失败,则直接就失败了,其他的判断出来有错误的我们都统一返回到excel里面
//                engineService.batchSaveSelectChar(templateVO, needSaveCboList);
//            }
//        }
//        if(!isCreateUUid){
//            return uuid="";
//        }
//        return uuid;
        return null;
        CodeRuleVO ruleVO = engineService.getCodeRuleByClassifyFullInfo(classifyFullInfo);
        //1.判断规则中除了流水码段,是否有其他码段
        engineService.checkSecValueOnOrder(ruleVO,orderDTO);
        List<SheetRowData> rowDataList = dataSet.getRowData();
        //除去默认的属性.还有只有表单显示的字段才导入
        List<CodeClassifyTemplateAttrVO> attrVOS = templateVO.getAttributes().stream().filter(s ->
            !DEFAULT_ATTR_LIST.contains(s.getId()) && VciBaseUtil.getBoolean(s.getFormDisplayFlag())
        ).collect(Collectors.toList());
        Map<Integer/**列号**/,String/**字段的名称**/> fieldIndexMap = new HashMap<>();
        List<String> titleRowData = dataSet.getColName();
        Map<String/**中文名称**/, String/**英文名称**/> attrNameIdMap = attrVOS.stream().collect(Collectors.toMap(s -> s.getName(), t -> t.getId().toLowerCase(Locale.ROOT),(o1, o2)->o2));
        getFieldIndexMap(titleRowData,attrNameIdMap,fieldIndexMap);
        //需要判断是否所有的属性都在模板上了
        List<CodeClassifyTemplateAttrVO> unExistAttrVOs = attrVOS.stream().filter(s -> !fieldIndexMap.containsValue(s.getId().toLowerCase(Locale.ROOT))
            && StringUtils.isBlank(s.getComponentRule()) && StringUtils.isBlank(s.getClassifyInvokeAttr())//组合规则和分类注入确实没给用户导出去
        ).collect(Collectors.toList());
        if(!CollectionUtils.isEmpty(unExistAttrVOs)){
            throw new VciBaseException("【" + unExistAttrVOs.stream().map(CodeClassifyTemplateAttrVO::getName) + "】这些属性在列表中没有找到");
        }
        List<ClientBusinessObject> cboList = new ArrayList<>();
        String fullPath = getFullPath(classifyFullInfo);
        excelToCbo(classifyFullInfo,fieldIndexMap,rowDataList,templateVO,cboList,fullPath,true);
        //都转换完了。需要批量检查
        //如果出错了,我们依然执行有效的数据,无效的数据写回到excel中
        //2.判断必输项。。需要全部的属性,如果是必输,但是表单里面不显示的,只能是分类注入或者组合规则
        batchCheckRequiredAttrOnOrder(templateVO,cboList,errorMap);
        //3.判断关键属性
        CodeImportResultVO keyResultVO = batchCheckKeyAttrOnOrder(classifyFullInfo, templateVO, cboList);
        Set<String> selfRepeatRowIndexList = keyResultVO.getSelfRepeatRowIndexList();
        Set<String> keyAttrRepeatRowIndexList = keyResultVO.getKeyAttrRepeatRowIndexList();
        if(!CollectionUtils.isEmpty(selfRepeatRowIndexList)){
            selfRepeatRowIndexList.stream().forEach(rowIndex->{
                errorMap.put(rowIndex,errorMap.getOrDefault(rowIndex,"") + ";在当前处理的数据文件中关键属性重复" );
            });
        }
        if(!CollectionUtils.isEmpty(keyAttrRepeatRowIndexList)){
            keyAttrRepeatRowIndexList.stream().forEach(rowIndex->{
                errorMap.put(rowIndex,errorMap.getOrDefault(rowIndex,"") + ";关键属性与系统中的重复" );
            });
        }
        //分类注入
        batchSwitchClassifyAttrOnOrder(attrVOS,cboList,classifyFullInfo,false);
        //boolean
        reSwitchBooleanAttrOnOrder(attrVOS,cboList);
        //4.校验规则
        batchCheckVerifyOnOrder(attrVOS, cboList,errorMap);
        if(isEnumType) {//是否需要校验枚举/参照
            //5.校验枚举是否正确
            batchSwitchEnumAttrOnOrder(attrVOS, cboList, errorMap);
            //7.处理参照的情况
            batchSwitchReferAttrOnOrder(attrVOS,cboList,errorMap);
        }
        //6.时间格式的验证
        //6.时间的,必须统一为yyyy-MM-dd HH:mm:ss
        batchSwitchDateAttrOnOrder(attrVOS,cboList,errorMap);
        //最后弄组合规则
        batchSwitchComponentAttrOnOrder(attrVOS,cboList);
        String uuid=VciBaseUtil.getPk();
        Map<String, ClientBusinessObject> rowIndexCboMap = cboList.stream().filter(cbo -> cbo != null).collect(Collectors.toList()).stream().collect(Collectors.toMap(s -> s.getAttributeValue((IMPORT_ROW_INDEX)), t -> t));
        if(errorMap.size()>0) {
            createRedisDatas(uuid + "-error",templateVO, rowIndexCboMap, dataSet, fieldIndexMap, errorMap,false);
        }
        boolean isCreateUUid=false;
        List<ClientBusinessObject> needSaveCboList = cboList.stream().filter(cbo -> {
            String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
            return !errorMap.containsKey(rowIndex);
        }).collect(Collectors.toList());
        //相似校验
        Map<String,String>resembleMap=new HashMap<>();
        List<DataResembleVO> dataResembleVOS=new ArrayList<>();
        String btmtypeid= classifyFullInfo.getTopClassifyVO().getBtmtypeid();
        bathcResembleQuery(orderDTO.getCodeClassifyOid(),templateVO,needSaveCboList,resembleMap,btmtypeid,dataResembleVOS);
        if(resembleMap.size()>0) {
            isCreateUUid=true;
            if(!CollectionUtils.isEmpty(dataResembleVOS)) {
                bladeRedis.set(uuid + "-resemble-data", dataResembleVOS);
                createRedisDatas(uuid + "-resemble",templateVO, rowIndexCboMap, dataSet, fieldIndexMap, resembleMap, false);
            }
        }
        //排除错误的,剩下正确的
        Map<String,String> newErrorMap=new HashMap<>();
        newErrorMap.putAll(resembleMap);
        newErrorMap.putAll(errorMap);
        needSaveCboList = cboList.stream().filter(cbo -> {
            String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
            return !newErrorMap.containsKey(rowIndex);
        }).collect(Collectors.toList());
        if((errorMap.size()>0&&needSaveCboList.size()>0)||resembleMap.size()>0){
            isCreateUUid=true;
        }
        createRedisByCodeClassify(uuid + "-class",templateVO,dataSet,fieldIndexMap,false);
        if(newErrorMap.size()>0) {
            createRedisDatas(uuid + "-ok",templateVO, rowIndexCboMap, dataSet, fieldIndexMap, newErrorMap,true);
        }else {
            uuid="";
            //要把以上的错误的都抛出后,再继续处理时间和组合规则
            /*dataCBOList = cboList.stream().filter(cbo -> {
                String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
                return !newErrorMap.containsKey(rowIndex);
            }).collect(Collectors.toList());
*/            List<String> dataCBOIdList=new ArrayList<>();
            List<BaseModel> dataCBOList=new ArrayList<>();
            cboList.stream().forEach(clientBusinessObject -> {
                BaseModel baseModel=new BaseModel();
                BeanUtil.convert(clientBusinessObject,baseModel);
                baseModel.setData(VciBaseUtil.objectToMapString(clientBusinessObject));
                dataCBOList.add(baseModel);
                dataCBOIdList.add(baseModel.getOid());
            });
            if (!CollectionUtils.isEmpty(needSaveCboList)) {
                //9.我们处理业务数据
                //生成编码的内容
                try {
                    codeList = productCodeService.productCodeAndSaveData(classifyFullInfo,templateVO,ruleVO, orderDTO.getSecDTOList(),dataCBOList);
                    //如果是编码生成失败,则直接就失败了,其他的判断出来有错误的我们都统一返回到excel里面
                    engineService.batchSaveSelectChar(templateVO, dataCBOIdList);
                } catch (Exception e) {
                    e.printStackTrace();
                    log.error("批了申请时失败");
                }
            }
        }
        if(!isCreateUUid){
            return uuid="";
        }
        return uuid;
    }
    @Override
@@ -629,6 +683,587 @@
    }
    /**
     * excel转换为cbo的对象
     * @param classifyFullInfo åˆ†ç±»çš„全部信息
     * @param fieldIndexMap å­—段的位置
     * @param rowDataList excel里的行数据
     * @param templateVO æ¨¡æ¿çš„æ˜¾ç¤ºå¯¹è±¡
     * @param cboList æ•°æ®çš„列表
     * @param fullPath å…¨è·¯å¾„
     * @param newCode æ˜¯å¦ä¸ºæ‰¹é‡ç”³è¯·
     */
    private void excelToCbo(CodeClassifyFullInfoBO classifyFullInfo,Map<Integer,String> fieldIndexMap,List<SheetRowData> rowDataList,
                            CodeClassifyTemplateVO templateVO,List<ClientBusinessObject> cboList,
                            String fullPath,boolean newCode){
        rowDataList.stream().forEach(rowData -> {
            ClientBusinessObject cbo=new ClientBusinessObject();
             DefaultAttrAssimtUtil.addDefaultAttrAssimt(cbo, classifyFullInfo.getTopClassifyVO().getBtmtypeid());
            rowData.getData().forEach((index,value)->{
                String field = fieldIndexMap.get(index);
                if (StringUtils.isBlank(field)) {
                    throw new VciBaseException("第" + (index + 1) + "列的标题在系统中不存在");
                }
                try {
                    cbo.setAttributeValueWithNoCheck(field, value);
                    if (WebUtil.isDefaultField(field)) {
                        WebUtil.setValueToField(field, cbo, value);
                    }
                } catch (VciBaseException e) {
                    log.error("设置属性的值错误", e);
                }
            });
            try {
                cbo.setAttributeValue(CODE_TEMPLATE_OID_FIELD,templateVO.getOid());
                cbo.setAttributeValue(IMPORT_ROW_INDEX,rowData.getRowIndex());
                if(newCode){
                    cbo.setAttributeValue(CODE_CLASSIFY_OID_FIELD,classifyFullInfo.getCurrentClassifyVO().getOid());
                    cbo.setAttributeValue(CODE_FULL_PATH_FILED,fullPath);
                    //cbo.setLcStatus(CodeDefaultLC.EDITING.getValue());
                    int secret = VciBaseUtil.getInt(cbo.getAttributeValue(SECRET_FIELD));
                    /*if(secret == 0 || !secretService.checkDataSecret(secret) ){
                        Integer userSecret = VciBaseUtil.getCurrentUserSecret();
                        cbo.setAttributeValue(SECRET_FIELD,String.valueOf((userSecret==null || userSecret ==0)? UserSecretEnum.NONE.getValue():userSecret));
                    }*/
                }else{
                    //此时还没有转换路径
                    //cbo.setAttributeValue(CODE_FULL_PATH_FILED, childOidPathMap.getOrDefault(rowData.getData().getOrDefault(CODE_CLASSIFY_OID_FIELD,""),fullPath));
                    cbo.setLcStatus(CodeDefaultLC.RELEASED.getValue());
                }
            }catch (Throwable e){
                log.error("设置默认的属性的值错误",e);
            }
            cboList.add(cbo);
        });
    }
    /**
     * æ£€æŸ¥æ ¡éªŒè§„则没有通过的内容
     * @param attrVOS éœ€è¦æ ¡éªŒçš„属性
     * @param dataList æ•°æ®çš„列表
     * @param errorMap é”™è¯¯çš„信息映射
     * @return æ ¡éªŒä¸é€šè¿‡çš„行数
     */
    private void batchCheckVerifyOnOrder(Collection<CodeClassifyTemplateAttrVO> attrVOS, List<ClientBusinessObject> dataList,Map<String,String> errorMap) {
        Map<String, CodeClassifyTemplateAttrVO> verifyAttrVOMap = attrVOS.stream().filter(s -> StringUtils.isNotBlank(s.getVerifyRule()) && StringUtils.isBlank(s.getComponentRule())
            &&StringUtils.isBlank(s.getClassifyInvokeAttr())
        ).collect(Collectors.toMap(s -> s.getId().toLowerCase(Locale.ROOT), t -> t));
        if(!CollectionUtils.isEmpty(verifyAttrVOMap)){
            Map<String/**行号**/,List<String>/**校验不通过的属性**/> unPassCheckMap = new HashMap<>();
            verifyAttrVOMap.forEach((attrId,attrVO)->{
                dataList.stream().forEach(cbo -> {
                    String value = cbo.getAttributeValue(attrId);
                    if(StringUtils.isNotBlank(value) && !value.matches(attrVO.getVerifyRule())){
                        String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
                        List<String> unPassAttrs = unPassCheckMap.getOrDefault(rowIndex, new ArrayList<>());
                        unPassAttrs.add(attrVO.getName());
                        unPassCheckMap.put(rowIndex,unPassAttrs);
                    }
                });
            });
            if(!CollectionUtils.isEmpty(unPassCheckMap)){
                unPassCheckMap.forEach((rowIndex,unPassAttrs)->{
                    errorMap.put(rowIndex,";属性[" + unPassAttrs.stream().collect(Collectors.joining(",")) + "]内容不符合校验规则的要求");
                });
            }
        }
    }
    /**
     * æ‰¹é‡è½¬æ¢æ—¶é—´éƒ½ä¸ºæŒ‡å®šçš„æ ¼å¼
     * @param attrVOS æ¨¡æ¿å±žæ€§
     * @param cboList æ•°æ®çš„列表
     * @param errorMap é”™è¯¯çš„信息
     */
    private void batchSwitchDateAttrOnOrder(Collection<CodeClassifyTemplateAttrVO> attrVOS,List<ClientBusinessObject> cboList,Map<String,String> errorMap){
        Map<String, CodeClassifyTemplateAttrVO> dateAttrVOMap =attrVOS.stream().filter(s ->
            StringUtils.isNotBlank(s.getCodeDateFormat()) && VciBaseUtil.getBoolean(s.getCodeDateFormat()) && StringUtils.isBlank(s.getComponentRule())
                && StringUtils.isBlank(s.getClassifyInvokeAttr())
        ).collect(Collectors.toMap(s -> s.getId().toLowerCase(Locale.ROOT), t -> t));
        if(!CollectionUtils.isEmpty(dateAttrVOMap)) {
            dateAttrVOMap.forEach((attrId, attrVO) -> {
                cboList.stream().forEach(cbo -> {
                    String value = cbo.getAttributeValue(attrId);
                    if (value == null) {
                        value = "";
                    }
                    if (StringUtils.isNotBlank(value)) {
                        boolean formated = false;
                        if(StringUtils.isNotBlank(attrVO.getCodeDateFormat())){
                            try {
                                Date date = VciDateUtil.str2Date(value, attrVO.getCodeDateFormat());
                                if(date!=null){
                                    cbo.setAttributeValue(attrId,value);
                                    formated = true;
                                }
                            } catch (Exception e) {
                                //说明不是这个格式
                            }
                        }
                        if(!formated) {
                            try {
                                DateConverter dateConverter = new DateConverter();
                                dateConverter.setAsText(value);
                                value = VciDateUtil.date2Str(dateConverter.getValue(), VciDateUtil.DateTimeMillFormat);
                                cbo.setAttributeValue(attrId,value);
                            }catch (Throwable e){
                                //转换不了
                                String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
                                errorMap.put(rowIndex,errorMap.getOrDefault(rowIndex,"") + ";属性[" + attrVO.getName() + "]时间格式不正确" );
                            }
                        }
                    }
                });
            });
        }
    }
    /**
     * è½¬ç§»boolean型的属性
     * @param attrVOS å±žæ€§çš„对象
     * @param dataList æ•°æ®
     */
    private void reSwitchBooleanAttrOnOrder(Collection<CodeClassifyTemplateAttrVO> attrVOS,List<ClientBusinessObject> dataList){
        Map<String, CodeClassifyTemplateAttrVO> booleanAttrMap = attrVOS.stream().filter(
            s -> VciFieldTypeEnum.VTBoolean.name().equalsIgnoreCase(s.getAttributeDataType())
        ).collect(Collectors.toMap(s -> s.getId().toLowerCase(Locale.ROOT), t -> t));
        if (!CollectionUtils.isEmpty(booleanAttrMap)) {
            booleanAttrMap.forEach((attrId, attrVO) -> {
                dataList.stream().forEach(cbo -> {
                    String text = cbo.getAttributeValue(attrId);
                    try {
                        if (BooleanEnum.TRUE.getValue().equalsIgnoreCase(text) || "是".equalsIgnoreCase(text)) {
                            cbo.setAttributeValue(attrId, BooleanEnum.TRUE.getValue());
                        } else {
                            cbo.setAttributeValue(attrId, BooleanEnum.FASLE.getValue());
                        }
                    }catch (Throwable e){
                    }
                });
            });
        }
    }
    /**
     * å¤„理组合规则
     * @param attrVOS æ¨¡æ¿å±žæ€§
     * @param dataList excel的数据内容
     */
    private void batchSwitchComponentAttrOnOrder(Collection<CodeClassifyTemplateAttrVO> attrVOS,List<ClientBusinessObject> dataList) {
        Map<String, CodeClassifyTemplateAttrVO> dateAttrVOMap = attrVOS.stream().filter(s -> StringUtils.isNotBlank(s.getComponentRule())).collect(Collectors.toMap(s -> s.getId().toLowerCase(Locale.ROOT), t -> t));
        if(!CollectionUtils.isEmpty(dateAttrVOMap)) {
            dateAttrVOMap.forEach((attrId, attrVO) -> {
                dataList.stream().forEach(cbo -> {
                    //从excel上把属性转换为map
                    Map<String,String> thisRowDataMap = new HashMap<>();
                    copyValueToMapFromCbos(cbo,thisRowDataMap);
                    //组合内容
                    String value = formulaService.getValueByFormula(thisRowDataMap,attrVO.getComponentRule());
                    if(value == null){
                        value = "";
                    }
                    try {
                        cbo.setAttributeValue(attrId, value);
                    }catch (Throwable e){
                        log.error("设置属性的错误",e);
                    }
                });
            });
        }
    }
    /**
     * è½¬æ¢å‚照的值
     * @param attrVOS å±žæ€§çš„æ˜¾ç¤ºå¯¹è±¡
     * @param dataList æ•°æ®åˆ—表
     * @param errorMap é”™è¯¯çš„信息
     */
    private void batchSwitchReferAttrOnOrder(Collection<CodeClassifyTemplateAttrVO> attrVOS,List<ClientBusinessObject> dataList,Map<String,String> errorMap){
        Map<String, CodeClassifyTemplateAttrVO> referAttrVOMap = attrVOS.stream().filter(
            s -> (StringUtils.isNotBlank(s.getReferBtmId()) || StringUtils.isNotBlank(s.getReferConfig()))
        ).collect(Collectors.toMap(s -> s.getId().toLowerCase(Locale.ROOT), t -> t));
        if(!CollectionUtils.isEmpty(referAttrVOMap)){
            Map<String/**表格和值的属性**/,Map<String/**显示属性的值**/,List<String>/**表格里的值**/>> linkValueMap = new HashMap<>();
            referAttrVOMap.forEach((attrId,attrVO)->{
                dataList.stream().forEach(cbo -> {
                    String text = cbo.getAttributeValue(attrId);
                    if(StringUtils.isNotBlank(text)){
                        UIFormReferVO referVO = getReferVO(attrVO);
                        String valueField = getValueField(referVO);
                        String showText = getTextField(referVO);
                        String tableAndAttr = VciBaseUtil.getTableName(referVO.getReferType()) + "#" + valueField;
                        Map<String, List<String>> showTextMap = linkValueMap.getOrDefault(tableAndAttr, new HashMap<>());
                        List<String> textList = showTextMap.getOrDefault(showText, new ArrayList<>());
                        if(!textList.contains(text)) {
                            textList.add(text);
                        }
                        showTextMap.put(showText,textList);
                        linkValueMap.put(tableAndAttr,showTextMap);
                    }
                });
            });
            if(!CollectionUtils.isEmpty(linkValueMap)){
                //需要逐个表的值字段,逐个查询
                Map<String/**表格和值属性**/,Map<String/**显示属性**/, Map<String/**值**/,String/**显示的值**/>>> linkCboMap = new HashMap<>();
                linkValueMap.forEach((tableAndAttr,showValueMap)->{
                    String[] split = tableAndAttr.split("#");
                    String table = split[0];
                    String valueField = split[1].toLowerCase(Locale.ROOT);
                    Map<String,Map<String,String>> dataMap = new HashMap<>();
                    showValueMap.forEach((showText,valueList)->{
                        Map<String,String> valueOidTextMap = new HashMap<>();
                        List<List<String>> valueCollections = VciBaseUtil.switchListForOracleIn(valueList);
                        String sql = "select " + valueField + "," + showText.toLowerCase(Locale.ROOT) +" from " + table + "  where " + showText + " in (%s)";
                        valueCollections.stream().forEach(values->{
                            List<Map<String,String>> dataMapList = commonsMapper.queryByOnlySqlForMap(String.format(sql, VciBaseUtil.toInSql(values.toArray(new String[0]))));
                            List<ClientBusinessObject> cbos=    ChangeMapTOClientBusinessObjects(dataMapList);
                            if(!CollectionUtils.isEmpty(cbos)){
                                valueOidTextMap.putAll(cbos.stream().collect(Collectors.toMap(s->s.getAttributeValue(valueField),t->t.getAttributeValue(showText))));
                            }
                        });
                        dataMap.put(showText,valueOidTextMap);
                    });
                    linkCboMap.put(tableAndAttr,dataMap);
                });
                referAttrVOMap.forEach((attrId,attrVO)->{
                    dataList.stream().forEach(cbo -> {
                        String text = cbo.getAttributeValue(attrId);
                        if (StringUtils.isNotBlank(text)) {
                            UIFormReferVO referVO = getReferVO(attrVO);
                            String valueField = getValueField(referVO);
                            String showText = getTextField(referVO);
                            String tableAndAttr = VciBaseUtil.getTableName(referVO.getReferType()) + "#" + valueField;
                            if(!linkCboMap.containsKey(tableAndAttr)){
                                String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
                                errorMap.put(rowIndex,errorMap.getOrDefault(rowIndex,"") + ";参数属性[" + attrVO.getName() + "]的值在系统中不存在" );
                            }else{
                                Map<String, Map<String, String>> dataMap = linkCboMap.get(tableAndAttr);
                                if(!dataMap.containsKey(showText)){
                                    String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
                                    errorMap.put(rowIndex,errorMap.getOrDefault(rowIndex,"") + ";参数属性[" + attrVO.getName() + "]的值在系统中不存在" );
                                }else{
                                    Map<String, String> data = dataMap.get(showText);
                                    final boolean[] fined = {false};
                                    data.forEach((key,value)->{
                                        if(value.equalsIgnoreCase(text)){
                                            fined[0] = true;
                                            try {
                                                cbo.setAttributeValue(attrId, key);
                                            }catch (Throwable e){
                                            }
                                        }
                                    });
                                    if(!fined[0]){
                                        String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
                                        errorMap.put(rowIndex,errorMap.getOrDefault(rowIndex,"") + ";参数属性[" + attrVO.getName() + "]的值在系统中不存在" );
                                    }
                                }
                            }
                        }
                    });
                });
            }
        }
    }
    /**
     * ä»Žå±žæ€§ä¸ŠèŽ·å–å‚ç…§çš„å†…å®¹
     * @param attrVO å±žæ€§çš„信息
     * @return å‚照的内容
     */
    private UIFormReferVO getReferVO(CodeClassifyTemplateAttrVO attrVO){
        UIFormReferVO referVO = null;
        if(StringUtils.isNotBlank(attrVO.getReferConfig())){
            referVO = JSONObject.parseObject(attrVO.getReferConfig(),UIFormReferVO.class);
        }else{
            referVO = new UIFormReferVO();
            referVO.setReferType(attrVO.getReferBtmId());
            referVO.setValueField(VciQueryWrapperForDO.OID_FIELD);
            referVO.setTextField("name");
        }
        return referVO;
    }
    /**
     * èŽ·å–å‚ç…§ä¸­çš„å€¼çš„å­—æ®µ
     * @param referVO å‚照的对象
     * @return é»˜è®¤ä¸ºOid,有多个的时候,获取第一个
     */
    private String getValueField(UIFormReferVO referVO){
        String showText = referVO.getValueField();
        if(StringUtils.isBlank(showText)){
            return "oid";
        }
        if(showText.contains(",")){
            //防止万一有多个,看看有没有oid
            List<String> strings = VciBaseUtil.str2List(showText);
            if(strings.contains("oid")){
                showText = "oid";
            }else{
                showText = strings.get(0);
            }
        }
        return showText;
    }
    /**
     * èŽ·å–å‚ç…§ä¸­çš„æ˜¾ç¤ºå†…å®¹çš„å­—æ®µ
     * @param referVO å‚照的对象
     * @return é»˜è®¤ä¸ºname,有多个的时候,获取第一个
     */
    private String getTextField(UIFormReferVO referVO){
        String showText = referVO.getTextField();
        if(StringUtils.isBlank(showText)){
            return "name";
        }
        if(showText.contains(",")){
            //防止万一有多个,看看有没有name
            List<String> strings = VciBaseUtil.str2List(showText);
            if(strings.contains("name")){
                showText = "name";
            }else{
                showText = strings.get(0);
            }
        }
        return showText;
    }
    /**
     * å¤„理枚举的显示对象
     * @param attrVOS æ¨¡æ¿å±žæ€§
     * @param dataList excel的数据内容
     * @param errorMap é”™è¯¯ä¿¡æ¯çš„æ˜ å°„
     */
    private void batchSwitchEnumAttrOnOrder(Collection<CodeClassifyTemplateAttrVO> attrVOS,List<ClientBusinessObject> dataList,
                                            Map<String,String> errorMap ) {
        Map<String, CodeClassifyTemplateAttrVO> dateAttrVOMap = attrVOS.stream().filter(
            s -> (StringUtils.isNotBlank(s.getEnumString()) || StringUtils.isNotBlank(s.getEnumId()))
        ).collect(Collectors.toMap(s -> s.getId().toLowerCase(Locale.ROOT), t -> t));
        if (!CollectionUtils.isEmpty(dateAttrVOMap)) {
            dateAttrVOMap.forEach((attrId, attrVO) -> {
                dataList.stream().forEach(cbo -> {
                    String text = cbo.getAttributeValue(attrId);
                    if(StringUtils.isNotBlank(text)){
                        List<KeyValue> valueList = engineService.listComboboxItems(attrVO);
                        boolean fined = false;
                        for (int i = 0; i < valueList.size(); i++) {
                            KeyValue keyValue = valueList.get(i);
                            //if(keyValue.getValue().equalsIgnoreCase(text)){
                            if(keyValue.getValue().equalsIgnoreCase(text)||keyValue.getKey().equalsIgnoreCase(text)){
                                try {
                                    cbo.setAttributeValue(attrId, keyValue.getKey());
                                }catch (Throwable e){
                                    log.error("设置属性出错");
                                }
                                fined = true;
                                break;
                            }
                        }
                        if(!fined){
                            String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
                            errorMap.put(rowIndex,errorMap.getOrDefault(rowIndex,"") + ";属性[" + attrVO.getName() + "]的值不符合下拉的要求");
                        }
                    }
                });
            });
        }
    }
    /**
     * æ‰¹é‡æ ¡éªŒæ•°æ®çš„信息
     * @param templateVO æ¨¡æ¿çš„æ˜¾ç¤ºå¯¹è±¡
     * @param cboList æ•°æ®çš„内容
     */
    private void batchCheckRequiredAttrOnOrder(CodeClassifyTemplateVO templateVO,List<ClientBusinessObject> cboList,Map<String,String> errorMap){
        Map<String, CodeClassifyTemplateAttrVO> requiredAttrMap = templateVO.getAttributes().stream().filter(s ->
            VciBaseUtil.getBoolean(s.getRequireFlag()) && StringUtils.isBlank(s.getComponentRule()) && StringUtils.isBlank(s.getClassifyInvokeLevel())//不能是组合的和分类注入的
        ).collect(Collectors.toMap(s -> s.getId().toLowerCase(Locale.ROOT), t -> t));
        //与MdmEngineServiceImpl里面的checkRequiredAttrOnOrder é€»è¾‘应该相似
        if(!CollectionUtils.isEmpty(requiredAttrMap)) {
            Set<String> nullRowIndex = cboList.stream().filter(cbo -> requiredAttrMap.keySet().stream().anyMatch(attrId -> StringUtils.isBlank(cbo.getAttributeValue(attrId)))).map(cbo -> cbo.getAttributeValue(IMPORT_ROW_INDEX)).collect(Collectors.toSet());
            if(!CollectionUtils.isEmpty(nullRowIndex)){
                String checkAttr = requiredAttrMap.values().stream().map(CodeClassifyTemplateAttrVO::getName).collect(Collectors.joining(","));
                nullRowIndex.stream().forEach(rowIndex->{
                    errorMap.put(rowIndex,errorMap.getOrDefault(rowIndex,"") + ";校验规则不通过,有校验的属性为" + checkAttr);
                });
            }
        }
    }
    /**
     * å¤„理分类注入
     * @param attrVOS æ¨¡æ¿å±žæ€§
     * @param dataList excel的数据内容
     * @param classifyFullInfo åˆ†ç±»çš„全路径
     */
    private void batchSwitchClassifyAttrOnOrder(Collection<CodeClassifyTemplateAttrVO> attrVOS,List<ClientBusinessObject> dataList,
                                                CodeClassifyFullInfoBO classifyFullInfo,boolean isImPort) {
        Map<String, CodeClassifyTemplateAttrVO> dateAttrVOMap = attrVOS.stream().filter(
            s -> StringUtils.isNotBlank(s.getClassifyInvokeAttr()) && StringUtils.isNotBlank(s.getClassifyInvokeAttr())
        ).collect(Collectors.toMap(s -> s.getId().toLowerCase(Locale.ROOT), t -> t));
        Map<String,CodeClassifyFullInfoBO> classifyFullInfoMap=new HashMap<>();
        classifyFullInfoMap.put(classifyFullInfo.getCurrentClassifyVO().getOid(),classifyFullInfo);
        if (!CollectionUtils.isEmpty(dateAttrVOMap)) {
            dataList.stream().forEach(cbo -> {
                dateAttrVOMap.forEach((attrId, attrVO) -> {
                    //分类注入的编号或者名称,
                    //层级包含指定层和最小层
                    CodeClassifyVO classifyVO = null;
                    if(!CodeLevelTypeEnum.MIN.getValue().equalsIgnoreCase(attrVO.getClassifyInvokeLevel()) && !"min".equalsIgnoreCase(attrVO.getClassifyInvokeLevel())) {
                        //指定了层级的
                        //注意,因为查询上级分类出来的层级是倒序的,即顶层节点是最大的值
                        if(isImPort){
                            if(!classifyFullInfoMap.containsKey(cbo.getAttributeValue(CODE_CLASSIFY_OID_FIELD))) {
                                CodeClassifyFullInfoBO currentClassifyFullInfo = classifyService.getClassifyFullInfo(cbo.getAttributeValue(CODE_CLASSIFY_OID_FIELD));
                                classifyFullInfoMap.put(currentClassifyFullInfo.getCurrentClassifyVO().getOid(), currentClassifyFullInfo);
                            }
                        }
                        CodeClassifyFullInfoBO newClassifyFullInfo= classifyFullInfoMap.get(cbo.getAttributeValue(CODE_CLASSIFY_OID_FIELD));
                        List<CodeClassifyVO> classifyVOS = newClassifyFullInfo.getParentClassifyVOs().stream().sorted(((o1, o2) -> o2.getDataLevel().compareTo(o1.getDataLevel()))).collect(Collectors.toList());
                        int level = VciBaseUtil.getInt(attrVO.getClassifyInvokeLevel());
                        if (classifyVOS.size()>=level && level > 0 ) {
                            classifyVO = classifyVOS.get(level-1);
                        }
                    }else{
                        //当前的分类
                        classifyVO = classifyFullInfo.getCurrentClassifyVO();
                    }
                    try {
                        if (classifyVO == null) {
                            //说明层级有误
                            cbo.setAttributeValue(attrId, "分类树上没有层级[" + attrVO.getClassifyInvokeLevel() + "]");
                        } else {
                            Map<String, String> classifyDataMap = VciBaseUtil.objectToMapString(classifyVO);
                            String value = classifyDataMap.getOrDefault(attrVO.getClassifyInvokeAttr(), "");
                            cbo.setAttributeValue(attrId, value);
                        }
                    } catch (Throwable e) {
                        log.error("设置属性错误", e);
                    }
                });
            });
        }
    }
    /**
     * æ ¡éªŒå…³é”®å±žæ€§
     * @param classifyFullInfo åˆ†ç±»çš„全部信息
     * @param templateVO æ¨¡æ¿çš„内容,必须包含模板属性
     * @param cboList æ‰¹é‡çš„æ•°æ®
     */
    private CodeImportResultVO batchCheckKeyAttrOnOrder(CodeClassifyFullInfoBO classifyFullInfo, CodeClassifyTemplateVO templateVO,
                                                        List<ClientBusinessObject> cboList) {
        //与MdmEngineServiceImpl里的checkKeyAttrOnOrder相似
        //先获取关键属性的规则,也利用继承的方式
        CodeKeyAttrRepeatVO keyRuleVO = keyRuleService.getRuleByClassifyFullInfo(classifyFullInfo);
        //注意的是keyRuleVO可能为空,表示不使用规则控制
        //获取所有的关键属性
        Map<String/**属性的编号**/, CodeClassifyTemplateAttrVO> ketAttrMap = templateVO.getAttributes().stream().filter(s -> VciBaseUtil.getBoolean(s.getKeyAttrFlag())).collect(Collectors.toMap(s -> s.getId().toLowerCase(Locale.ROOT), t -> t));
        boolean trimAll =keyRuleVO ==null?false: VciBaseUtil.getBoolean(keyRuleVO.getIgnoreallspaceflag());
        //全部去空的优先级大于去空
        boolean trim =keyRuleVO ==null?false:  VciBaseUtil.getBoolean(keyRuleVO.getIgnorespaceflag());
        boolean ignoreCase = keyRuleVO ==null?false: VciBaseUtil.getBoolean(keyRuleVO.getIgnorecaseflag());
        boolean ignoreWidth = keyRuleVO ==null?false: VciBaseUtil.getBoolean(keyRuleVO.getIgnorewidthflag());
        //1. æˆ‘们需要先判断excel导入的内容是否正确
        CodeImportResultVO resultVO = new CodeImportResultVO();
        resultVO.setKeyAttrRuleInfo(String.format(keyRuleVO ==null?"":"查询规则:去除空格--{0},忽略大小写--{1},忽略全半角--{2},忽略全部空格--{3}",
            new String[]{trim?"是":"否",ignoreCase?"是":"否",ignoreWidth?"是":"否",trimAll?"是":"否"}));
        resultVO.setSelfRepeatRowIndexList(getSelfRepeatRowIndex(ketAttrMap,cboList,keyRuleVO));
        if(!CollectionUtils.isEmpty(resultVO.getSelfRepeatRowIndexList())){
            //我们移除本身重复的数据
            cboList = cboList.stream().filter(s->!resultVO.getSelfRepeatRowIndexList().contains(s.getAttributeValue(IMPORT_ROW_INDEX))).collect(Collectors.toList());
        }
        //2.判断关键属性在系统里是否重复
        //因为数据量很大,所以得想办法并行
        //SessionInfo sessionInfo = VciBaseUtil.getCurrentUserSessionInfo();
        Map<String,List<ClientBusinessObject>> indexTODataMap=new HashMap<>();
        List<ClientBusinessObject> repeatDataMap = cboList.parallelStream().filter(cbo -> {
            //每行都得查询.如果其中出现了错误,我们就直接抛出异常,其余的显示
            //VciBaseUtil.setCurrentUserSessionInfo(sessionInfo);
            Map<String, String> conditionMap = new HashMap<>();
            ketAttrMap.forEach((attrId, attrVO) -> {
                String value =cbo.getAttributeValue(attrId.toLowerCase(Locale.ROOT));
                if (value == null) {
                    value = "";
                }
                value= value.replace(REQUIRED_CHAR,SPECIAL_CHAR);
                engineService.wrapperKeyAttrConditionMap(value, keyRuleVO, attrId, trim, ignoreCase, ignoreWidth, trimAll, conditionMap);
            });
            if (!CollectionUtils.isEmpty(ketAttrMap)) {
                CodeTemplateAttrSqlBO sqlBO = engineService.getSqlByTemplateVO(classifyFullInfo.getTopClassifyVO().getBtmtypeid(), templateVO, conditionMap, null);
                boolean isKeyCheck= commonsMapper.queryCountBySql(sqlBO.getSqlCount()) > 0;
                if(isKeyCheck){
                    List<Map<String,String>> newDataList=  commonsMapper.queryByOnlySqlForMap(sqlBO.getSqlUnPage());
                    List<ClientBusinessObject> newCboList=    ChangeMapTOClientBusinessObjects(newDataList);
                    indexTODataMap.put(cbo.getAttributeValue(IMPORT_ROW_INDEX),newCboList);
                }
                return isKeyCheck;
            }else{
                return false;
            }
        }).collect(Collectors.toList());
        if(!CollectionUtils.isEmpty(repeatDataMap)){
            resultVO.setKeyAttrRepeatRowIndexList(repeatDataMap.stream().map(s->s.getAttributeValue(IMPORT_ROW_INDEX)).collect(Collectors.toSet()));
        }
        //resultVO.setIndexTODataMap(indexTODataMap);
        //resultVO.setSuccess(true);
        return resultVO;
    }
    /**
     * èŽ·å–å¯¼å…¥çš„å†…å®¹ä¸­å…³é”®å±žæ€§é‡å¤çš„è¡Œå·
     * @param ketAttrMap å…³é”®å±žæ€§çš„æ˜ å°„
     * @param dataList å¯¼å…¥çš„æ•°æ®
     * @param keyRuleVO å…³é”®å±žæ€§æŽ§åˆ¶è§„则
     * @return é‡å¤çš„行号
     */
    private Set<String> getSelfRepeatRowIndex(Map<String/**属性的编号**/, CodeClassifyTemplateAttrVO> ketAttrMap,
                                              List<ClientBusinessObject> dataList,CodeKeyAttrRepeatVO keyRuleVO){
        Set<String> selfRepeatRowIndexList = new CopyOnWriteArraySet<>();
        boolean trimAll =keyRuleVO ==null?false: VciBaseUtil.getBoolean(keyRuleVO.getIgnoreallspaceflag());
        //全部去空的优先级大于去空
        boolean trim =keyRuleVO ==null?false:  VciBaseUtil.getBoolean(keyRuleVO.getIgnorespaceflag());
        boolean ignoreCase = keyRuleVO ==null?false: VciBaseUtil.getBoolean(keyRuleVO.getIgnorecaseflag());
        boolean ignoreWidth = keyRuleVO ==null?false: VciBaseUtil.getBoolean(keyRuleVO.getIgnorewidthflag());
        //必须将属性按照顺序排序好
        List<CodeClassifyTemplateAttrVO> attrVOList = ketAttrMap.values().stream().sorted(((o1, o2) -> o1.getOrderNum().compareTo(o2.getOrderNum()))).collect(Collectors.toList());
        Map<String/**行号**/,String/**关键属性的组合内容**/> rowIndexKeyStringMap = new HashMap<>();
        dataList.parallelStream().forEach(cbo-> {
            String rowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < attrVOList.size(); i++) {
                CodeClassifyTemplateAttrVO attrVO = attrVOList.get(i);
                String attrId = attrVO.getId().toLowerCase(Locale.ROOT);
                String value = cbo.getAttributeValue( attrId);
                if (value == null) {
                    value = "";
                }
                if(trim){
                    value = value.trim();
                }
                if(trimAll){
                    value = value.replace(" ","");
                }
                if(ignoreCase){
                    value = value.toLowerCase(Locale.ROOT);
                }
                if(ignoreWidth){
                    value = VciBaseUtil.toDBC(value);
                }
                sb.append(value).append("${ks}");
            }
            String keyString = sb.toString();
            if(rowIndexKeyStringMap.containsValue(keyString) && StringUtils.isNotBlank(keyString)){
                selfRepeatRowIndexList.add(rowIndex);
            }else {
                rowIndexKeyStringMap.put(rowIndex, sb.toString());
            }
        });
        //因为只是关键属性重复,所以我们不能重复的多条选一条来报错
        return selfRepeatRowIndexList;
    }
    /**
     * excel的标题上获取字段所在的位置
     * @param titleRowData æ ‡é¢˜çš„内容
     * @param attrNameIdMap æ¨¡æ¿ä¸­å±žæ€§åç§°å’Œè‹±æ–‡çš„æ˜ å°„
@@ -653,6 +1288,272 @@
            }
        }
    }
    private List<ClientBusinessObject> ChangeMapTOClientBusinessObjects(List<Map<String,String>> oldDataMap){
        List<ClientBusinessObject> clientBusinessObjectList=new CopyOnWriteArrayList<>();
        oldDataMap.parallelStream().forEach(dataMap->{
            ClientBusinessObject clientBusinessObject=new ClientBusinessObject();
            DefaultAttrAssimtUtil.copplyDefaultAttrAssimt(dataMap,clientBusinessObject);
            dataMap.forEach((key,value)->{
                clientBusinessObject.setAttributeValue(key,value);
            });
        });
        return clientBusinessObjectList;
    }
    /***
     * æ­£ç¡®é”™è¯¯æ•°æ®redis缓存
     * @param uuid
     * @param templateVO
     * @param rowIndexCbo
     * @param dataSet
     * @param fieldIndexMap
     * @param errorMap
     * @param isok
     */
    private void createRedisDatas(String uuid,CodeClassifyTemplateVO templateVO,Map<String,ClientBusinessObject> rowIndexCbo, SheetDataSet dataSet, Map<Integer/**列号**/,String/**字段的名称**/> fieldIndexMap,Map<String,String> errorMap,boolean isok){
        List<SheetRowData>  needsheetRowDataList =new ArrayList<>();
        if(errorMap.size()>0) {
            //要把以上的错误的都抛出后,再继续处理时间和组合规则
            needsheetRowDataList = dataSet.getRowData().stream().filter(cbo -> {
                String rowIndex=cbo.getRowIndex();
                return  isok? !errorMap.containsKey(rowIndex):errorMap.containsKey(rowIndex);
            }).collect(Collectors.toList());
        }else{
            needsheetRowDataList= dataSet.getRowData();
        }
        Map<String/**中文名称**/, SheetRowData/**英文名称**/> rowIdexDataMap = needsheetRowDataList.stream().collect(Collectors.toMap(s -> s.getRowIndex(), t -> t,(o1, o2)->o2));
        Map<String,CodeImprotDataVO> clsfDataMap=new HashMap<>();
        rowIndexCbo .forEach((rowIndex, cbo) -> {
            CodeImprotDataVO codeImprotDataVO = new CodeImprotDataVO();
            codeImprotDataVO.setTemplateOid(templateVO.getOid());
            List<Map<String, String>> dataList = new ArrayList<>();
            if(rowIdexDataMap.containsKey(rowIndex)){
                SheetRowData sheetRowData=rowIdexDataMap.get(rowIndex);
                Map<String, String> dataMap = new HashMap<>();
                Map<Integer, String> data = sheetRowData.getData();
                fieldIndexMap.forEach((integer, s) -> {
                    String field = fieldIndexMap.get(integer);
                    if (data.containsKey(integer)) {
                        String vlues = data.get(integer);
                        dataMap.put(field, vlues);
                    }
                });
                dataMap.put("oid",cbo.getOid());
                dataList.add(dataMap);
            }
            if(clsfDataMap.containsKey(templateVO.getOid())){
                codeImprotDataVO=clsfDataMap.get(templateVO.getOid());
                dataList.addAll(codeImprotDataVO.getDatas());
            }
            codeImprotDataVO.setColNames(dataSet.getColName());
            codeImprotDataVO.setDatas(dataList);
            clsfDataMap.put(templateVO.getOid(),codeImprotDataVO);
        });
        if(!CollectionUtils.isEmpty(clsfDataMap)) {
            Collection codeImprotDataVOS=clsfDataMap.values();
            List<CodeImprotDataVO> codeImprotDataVOList=new ArrayList<>();
            codeImprotDataVOList.addAll(codeImprotDataVOS);
            bladeRedis.set(uuid+"-"+templateVO.getOid(), codeImprotDataVOList);
            bladeRedis.expire(uuid+"-"+templateVO.getOid(),BATCHADD_REDIS_TIME);//redis过期时间
        }
    }
    /****
     * æ•°æ®ç›¸ä¼¼é¡¹æ•°æ®æ ¡éªŒredis缓存
     * @param codeClassifyOid
     * @param templateVO
     * @param cboList
     * @param resembleMap
     * @param btmtypeid
     * @param dataResembleVOS
     */
    private void bathcResembleQuery(String codeClassifyOid, CodeClassifyTemplateVO templateVO, List<ClientBusinessObject> cboList,Map<String,String>resembleMap,String btmtypeid,List<DataResembleVO> dataResembleVOS){
        CodeClassifyFullInfoBO fullInfoBO = classifyService.getClassifyFullInfo(codeClassifyOid);
        Map<String, String> conditionMap = new HashMap<>();
        CodeResembleRuleVO resembleRuleVO = Optional.ofNullable(engineService.getUseResembleRule(fullInfoBO, fullInfoBO.getCurrentClassifyVO())).orElseGet(() -> new CodeResembleRuleVO());
        //需要获取是否有相似查询属性
        Map<String, CodeClassifyTemplateAttrVO> attrVOs = templateVO.getAttributes().stream().filter(s -> VciBaseUtil.getBoolean(s.getSameRepeatAttrFlag())).collect(Collectors.toMap(s -> s.getId(), t -> t));
        if (CollectionUtils.isEmpty(attrVOs)) {
            return;
        }
        Map<String,CodeImprotResembleVO> codeImprotResembleVOMap=new HashMap<>();
        List<CodeImprotResembleVO> codeImprotResembleVOList=new ArrayList<>();
        Map<String,String> rowIndePathMap=new HashMap<>();
        cboList.stream().forEach(clientBusinessObject -> {
            CodeImprotResembleVO codeImprotResembleVO=new CodeImprotResembleVO();
            final String[] path = {""};
            List<String> fieldList=new ArrayList<>();
            List<String> rowIndeList=new ArrayList<>();
            String rowIndex = clientBusinessObject.getAttributeValue(IMPORT_ROW_INDEX);
            attrVOs.forEach((attrId, attrVO) -> {
                String value="";
                /*if (VciQueryWrapperForDO.BASIC_FIELD_MAP.containsKey(attrId)) {
                    value = WebUtil.getStringValueFromObject(WebUtil.getValueFromField(WebUtil.getFieldForObject(attrId, orderDTO.getClass()).getName(), orderDTO));
                }else {*/
                value= clientBusinessObject.getAttributeValue(attrId);
                // }
                fieldList.add(attrId);
                value=StringUtils.isBlank(value)?"":value;
                path[0] +=value+"#";
                engineService.wrapperResembleConditionMap(value, resembleRuleVO, attrId, conditionMap);
            });
            List<Map<String,String>> dataMap=new ArrayList<>();
            if(codeImprotResembleVOMap.containsKey(path[0])) {
                codeImprotResembleVO=codeImprotResembleVOMap.get(path[0]);
                rowIndeList=codeImprotResembleVO.getRownIndex();
                dataMap=  codeImprotResembleVO.getDataList();
                resembleMap.put(rowIndex, "存在相似数据");
            }else{
                if (!CollectionUtils.isEmpty(conditionMap)) {
                    Map<String, String> andConditionMap = new HashMap<>();
                    andConditionMap.put("islastr", "1");
                    andConditionMap.put("islastv", "1");
                    conditionMap.putAll(andConditionMap);
                    PageHelper pageHelper = new PageHelper(-1);
                    pageHelper.addDefaultDesc("id");
                    CodeTemplateAttrSqlBO sqlBO = engineService.getSqlByTemplateVO(btmtypeid, templateVO, conditionMap, pageHelper);
                    List<Map<String,String>> dataMapList=commonsMapper.queryByOnlySqlForMap(sqlBO.getSqlUnPage());
                    List<ClientBusinessObject> resembleCboList=    ChangeMapTOClientBusinessObjects(dataMapList);
                    if(!CollectionUtils.isEmpty(resembleCboList)) {
                        List<Map<String, String>> finalDataMap = dataMap;
                        resembleCboList.stream().forEach(cbo->{
                            Map<String,String> resembDataMap=new HashMap<>();
                            fieldList.stream().forEach(field->{
                                String value=cbo.getAttributeValue(field);
                                value=StringUtils.isBlank(value)?"":value;
                                resembDataMap.put(field,value);
                            });
                            resembDataMap.put("codetemplateoid",templateVO.getOid());
                            resembDataMap.put("id",StringUtils.isBlank(cbo.getAttributeValue("id"))?"":cbo.getAttributeValue("id"));
                            resembDataMap.put("rowIndex","");
                            resembDataMap.put("oid",cbo.getOid());
                            finalDataMap.add(resembDataMap);
                        });
                        resembleMap.put(rowIndex, "存在相似数据");
                    }
                }
            }
            rowIndePathMap.put(rowIndex,path[0]);
            rowIndeList.add(rowIndex);
            codeImprotResembleVO.setPath(path[0]);
            codeImprotResembleVO.setRownIndex(rowIndeList);
            codeImprotResembleVO.setConditionMap(conditionMap);
            codeImprotResembleVO.setFields(fieldList);
            codeImprotResembleVO.setDataList(dataMap);
            codeImprotResembleVOMap.put(path[0],codeImprotResembleVO);
        });
        Map<String, ClientBusinessObject> cboMap = cboList.stream().filter(cbo -> cbo != null).collect(Collectors.toList()).stream().collect(Collectors.toMap(s -> s.getAttributeValue((IMPORT_ROW_INDEX)), t -> t));
        if(!CollectionUtils.isEmpty(rowIndePathMap)){
            rowIndePathMap.forEach((rowIndex, path) -> {
                if(codeImprotResembleVOMap.containsKey(path)){
                    CodeImprotResembleVO codeImprotResembleVO=  codeImprotResembleVOMap.get(path);
                    List<String> fieldList=codeImprotResembleVO.getFields();
                    List<String> rownIndexList= codeImprotResembleVO.getRownIndex();
                    List<String> newRownIndexList = rownIndexList.stream().filter(cbo -> {
                        return rowIndex!=cbo;
                    }).collect(Collectors.toList());
                    newRownIndexList.stream().forEach(s -> {
                        resembleMap.put(s, "存在相似数据");
                    });
                    List<Map<String, String>>newDataList=new ArrayList<>();
                    DataResembleVO dataResembleVO=new DataResembleVO();
                    dataResembleVO.setOid(cboMap.get(rowIndex).getOid());
                    List<ClientBusinessObject> needSaveCboList = cboList.stream().filter(cbo -> {
                        String newRowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
                        return rownIndexList.contains(newRowIndex)&&(!newRowIndex.equalsIgnoreCase(rowIndex));
                    }).collect(Collectors.toList());
                    if(!CollectionUtils.isEmpty(needSaveCboList)) {
                        needSaveCboList.stream().forEach(cbo -> {
                            String newRowIndex = cbo.getAttributeValue(IMPORT_ROW_INDEX);
                            Map<String, String> resembDataMap = new HashMap<>();
                            fieldList.stream().forEach(field -> {
                                String value = cbo.getAttributeValue(field);
                                value = StringUtils.isBlank(value) ? "" : value;
                                resembDataMap.put(field, value);
                            });
                            resembDataMap.put("codetemplateoid",templateVO.getOid());
                            resembDataMap.put("id",StringUtils.isBlank(cbo.getAttributeValue("id"))?"":cbo.getAttributeValue("id"));
                            resembDataMap.put("rowIndex", newRowIndex);
                            resembDataMap.put("oid",cbo.getOid());
                            newDataList.add(resembDataMap);
                        });
                    }
                    List<Map<String, String>>dataList=codeImprotResembleVO.getDataList();
                    newDataList.addAll(dataList);
                    dataResembleVO.setDataList(newDataList);
                    dataResembleVOS.add(dataResembleVO);
                }
            });
        }
    }
    /***
     * å­˜å‚¨åˆ†ç±»å¯¹è±¡åŠå…¶åˆ—名
     * @param uuid
     * @param templateVOList
     * @param dataSet
     * @param fieldIndexMap
     * @param iscContain
     */
    private  void createRedisByCodeClassify(String uuid,CodeClassifyTemplateVO templateVOList,SheetDataSet dataSet, Map<Integer/**列号**/,String/**字段的名称**/> fieldIndexMap,boolean iscContain){
        List<ColumnVO> columnVOList = new ArrayList<>();
        List<String> outNameList = dataSet.getColName();
        fieldIndexMap.forEach((integer, s) -> {
            ColumnVO columnVOS = new ColumnVO();
            String field = fieldIndexMap.get(integer);
            String outName = outNameList.get(integer);
            columnVOS.setField(field);
            columnVOS.setTitle(outName);
            columnVOList.add(columnVOS);
        });
        CodeImportTemplateVO codeImportTemplateVO=new CodeImportTemplateVO();
        codeImportTemplateVO.setCodeClassifyTemplateVO(templateVOList);
        codeImportTemplateVO.setCloNamesList(columnVOList);
        List<CodeImportTemplateVO> codeImportTemplateVOs= new ArrayList<>();
        codeImportTemplateVOs.add(codeImportTemplateVO);
        if(codeImportTemplateVOs.size()>0) {
            bladeRedis.set(uuid, codeImportTemplateVOs);
            bladeRedis.expire(uuid, BATCHADD_REDIS_TIME);//redis过期时间
        }
    }
    /**
     * æ‹·è´ä¸šåŠ¡ç±»åž‹åˆ°map
     * @param cbo ä¸šåŠ¡æ•°æ®
     * @param map map
     */
    public static void copyValueToMapFromCbos(ClientBusinessObject cbo,Map<String,String> map){
        if(cbo!=null){
            copyValueToMapFromBos(cbo,map);
        }
    }
    /**
     * æ‹·è´ä¸šåŠ¡ç±»åž‹åˆ°map
     * @param bo ä¸šåŠ¡æ•°æ®
     * @param map map
     */
    public static void copyValueToMapFromBos(ClientBusinessObject bo,Map<String,String> map){
        if(bo!=null ){
            //先把所有的字段映射找到
            AttributeValue[] newAList = bo.newAttrValList;
            AttributeValue[] hisAList = bo.hisAttrValList;
            if(hisAList!=null&&hisAList.length>0){//
                for(int i = 0 ; i < hisAList.length;i++){
                    AttributeValue av = hisAList[i];
                    String attrName = av.attrName.toLowerCase();
                    map.put(attrName, av.attrVal);
                }
            }
            if(newAList!=null&&newAList.length>0){//NEW的优先级高些
                for(int i = 0 ; i < newAList.length;i++){
                    AttributeValue av = newAList[i];
                    String attrName = av.attrName.toLowerCase();
                    map.put(attrName, av.attrVal);
                }
            }
        }
    }
}
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/util/AttributeChecker.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,115 @@
package com.vci.ubcs.code.util;
import com.vci.ubcs.omd.feign.IAttributeClient;
import com.vci.ubcs.omd.util.Tool;
import com.vci.ubcs.omd.vo.AttributeVO;
import org.springblade.core.tool.api.R;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
public class AttributeChecker {
    @Autowired(required = false)
    private  IAttributeClient attributeClient;
    public static HashMap<String, AttributeVO> attrItemMap = new HashMap();
    public static List<AttributeVO> attrItems = new ArrayList<AttributeVO>();
    public void getAllAttribute() {
        if (attrItems == null) {
            R<List<AttributeVO>> R = attributeClient.getAll();
            attrItems=R.getData();
            List<AttributeVO> var4;
            int var3 = (var4 = attrItems).size();
            for(int var2 = 0; var2 < var3; ++var2) {
                AttributeVO attrItem = var4.get(var2);
                attrItemMap.put(attrItem.getName(), attrItem);
            }
        }
    }
    public int isAttrValValid(String attrName, String attrVal) {
//        if (!BusinessConstants.BO_CONSTANTS.containsKey(attrName.toUpperCase())) {
            if (attrVal != null && !attrVal.trim().equals("")) {
                this.getAllAttribute();
                AttributeVO attributeVO = (AttributeVO)attrItemMap.get(attrName);
                if (attributeVO == null) {
                    return 0;
                } else {
                    String attrType = attributeVO.getTypeKey();
                    int rs;
                    if (attrType.equals("VTString")) {
                    //    rs = this.checkVTStringValValid(attributeVO, attrName, attrVal);
                        rs = 0;
                    } else if (attrType.equals("VTInteger")) {
                    //    rs = this.checkVTIntegerValValid(attributeVO, attrName, attrVal);
                        rs = 0;
                    } else if (attrType.equals("VTLong")) {
                    //    rs = this.checkVTLongValValid(attributeVO, attrName, attrVal);
                        rs = 0;
                    } else if (attrType.equals("VTDouble")) {
                    //    rs = this.checkVTDoubleValValid(attributeVO, attrName, attrVal);
                        rs = 0;
                    } else if (attrType.equals("VTBoolean")) {
                        rs = 0;
                    } else if (attrType.equals("VTImage")) {
                        rs = 0;
                    } else if (attrType.equals("VTDate")) {
                        rs = 0;
                    } else if (attrType.equals("VTTime")) {
                        rs = 0;
                    } else if (attrType.equals("VTDateTime")) {
                        rs = 0;
                    } else if (attrType.equals("VTNote")) {
                        rs = 0;
                    } else if (attrType.equals("VTFilePath")) {
                        rs = 0;
                    } else {
                        rs = 0;
                    }
                    return rs;
                }
            } else {
                return 0;
            }
//        } else {
//            return 0;
//        }
    }
    /*private int checkVTStringValValid(AttributeVO attributeVO, String attrName, String attrVal) {
        String other ="";
        int maxLength = Integer.valueOf(Tool.getOtherValueByType(other, "length"));
        int length = attrVal.length();
        return length > maxLength ? 1 : 0;
    }
    private int checkVTIntegerValValid(AttributeVO attributeVO, String attrName, String attrVal) {
        VTInteger obj = new VTInteger(Integer.valueOf(attrVal));
        return !obj.checkRageValueByRage(attributeVO.rage) ? 2 : 0;
    }
    private int checkVTLongValValid(AttributeVO attributeVO, String attrName, String attrVal) {
        VTLong obj = new VTLong(Long.valueOf(attrVal));
        return !obj.checkRageValueByRage(attributeVO.rage) ? 2 : 0;
    }
    private int checkVTDoubleValValid(AttributeVO attributeVO, String attrName, String attrVal) {
        VTDouble obj = new VTDouble(Double.valueOf(attrVal));
        String other = attributeVO.other;
        int maxLength = Integer.valueOf(Tool.getOtherValueByType(other, "length"));
        int length = String.valueOf(attrVal).length() - 1;
        if (length >= maxLength && !obj.checkRageValueByRage(attributeVO.rage)) {
            return 3;
        } else if (!obj.checkRageValueByRage(attributeVO.rage)) {
            return 2;
        } else {
            return length >= maxLength ? 1 : 0;
        }
    }*/
}
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/util/ClientBusinessObject.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,110 @@
package com.vci.ubcs.code.util;
import com.vci.ubcs.code.bo.AttributeValue;
import com.vci.ubcs.starter.exception.VciBaseException;
import com.vci.ubcs.starter.revision.model.BaseModel;
import lombok.Data;
import java.util.ArrayList;
@Data
public class ClientBusinessObject extends BaseModel {
    public AttributeValue[] newAttrValList;
    public AttributeValue[] hisAttrValList;
    public void setAttributeValue(String attributeName, String attributeValue) throws VciBaseException {
        this.setAttributeValue(attributeName, attributeValue, false);
    }
    public void setAttributeValue(String attributeName, String attributeValue, boolean isCreate) throws VciBaseException {
        int isValid = (new AttributeChecker()).isAttrValValid(attributeName, attributeValue);
        if (isValid == 1) {
            throw getLocalError("P0010SOF-00017", new String[]{attributeName, attributeValue});
        } else if (isValid == 2) {
            throw this.getLocalError("P0010SOF-00018", new String[]{attributeName, attributeValue});
        } else if (isValid == 3) {
            throw this.getLocalError("P0010SOF-00019", new String[]{attributeName, attributeValue});
        } else {
            this.setAttributeValueWithNoCheck(attributeName, attributeValue, isCreate);
        }
    }
    public void setAttributeValueWithNoCheck(String attributeName, String attributeValue) throws VciBaseException {
        this.setAttributeValueWithNoCheck(attributeName, attributeValue, false);
    }
    public void setAttributeValueWithNoCheck(String attributeName, String attributeValue, boolean isCreate) throws VciBaseException {
        /*if (isCreate) {//&& BusinessConstants.BO_CONSTANTS.containsKey(attributeName.toUpperCase())
            this.setConstantsAttrVal(attributeName, attributeValue);
        } else {*/
            AttributeValue[] attrValues = this.newAttrValList;
            ArrayList<AttributeValue> attrValList = new ArrayList();
            AttributeValue attrVal;
            int i;
            if (attrValues != null && attrValues.length > 0) {
                AttributeValue[] var9 = attrValues;
                i = attrValues.length;
                for(int var7 = 0; var7 < i; ++var7) {
                    attrVal = var9[var7];
                    attrValList.add(attrVal);
                }
            }
            attrVal = null;
            boolean isExist = false;
            for(i = 0; i < attrValList.size(); ++i) {
                attrVal = (AttributeValue)attrValList.get(i);
                if (attrVal.attrName.toUpperCase().equals(attributeName.toUpperCase())) {
                    attrVal.attrVal = attributeValue;
                    isExist = true;
                    break;
                }
            }
            if (!isExist) {
                attrVal = new AttributeValue();
                attrVal.attrName = attributeName.toUpperCase();
                attrVal.attrVal = attributeValue;
                attrValList.add(attrVal);
            }
            this.newAttrValList = (AttributeValue[])attrValList.toArray(new AttributeValue[attrValList.size()]);
    //    }
    }
    public String getAttributeValue(String attrName) {
        String res = "";
        boolean existInNewAttr = false;
        int i;
        if (this.newAttrValList != null) {
            for(i = 0; i < this.newAttrValList.length; ++i) {
                if (this.newAttrValList[i].attrName.toUpperCase().equals(attrName.toUpperCase())) {
                    existInNewAttr = true;
                    res = this.newAttrValList[i].attrVal;
                }
            }
        }
        if (existInNewAttr) {
            return res;
        } else if (this.hisAttrValList == null) {
            return "";
        } else {
            for(i = 0; i < this.hisAttrValList.length; ++i) {
                if (this.hisAttrValList[i].attrName.toUpperCase().equals(attrName.toUpperCase())) {
                    res = this.hisAttrValList[i].attrVal;
                }
            }
            return res;
        }
    }
    public VciBaseException getLocalError(String error_code ,String[] error_messages) {
        return new VciBaseException(error_code, error_messages);
    }
}
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/wrapper/CodeClassifyTemplateAttrWrapper.java
@@ -42,7 +42,7 @@
    public CodeClassifyTemplateAttrVO entityVO(CodeClassifyTemplateAttr CodeClstempattr) {
        CodeClassifyTemplateAttrVO codeClassifyTemplateAttrVO = Objects.requireNonNull(BeanUtil.copy(CodeClstempattr, CodeClassifyTemplateAttrVO.class));
        if(StringUtils.isNotBlank(CodeClstempattr.getAttributeDataType())){
            codeClassifyTemplateAttrVO.setAttributeDataTypeText( EnumCache.getValue(EnumEnum.VCO_FIELD_TYPE,CodeClstempattr.getAttributeDataType()));
            codeClassifyTemplateAttrVO.setAttributeDataTypeText( EnumCache.getValue(EnumEnum.VCI_FIELD_TYPE,CodeClstempattr.getAttributeDataType()));
        }
        return codeClassifyTemplateAttrVO;
    }
Source/UBCS/ubcs-service/ubcs-code/src/main/resources/application-dev.yml
@@ -1,19 +1,30 @@
#服务器端口
server:
  port: 36014
  tomcat:
    uri-encoding: UTF-8
  servlet:
    encoding:
      enabled: true
      charset: UTF-8
      force: true
#数据源配置
spring:
  datasource:
    url: ${ubcs.datasource.mdm.dev.url}
    username: ${ubcs.datasource.mdm.dev.username}
    password: ${ubcs.datasource.mdm.dev.password}
  messages:
    encoding: utf-8
    basename: i18n/messages
#关闭驼峰命名映射
mybatis-plus:
  configuration:
    map-underscore-to-camel-case: false
#mybatis-plus-join:
#  table-alias:
#  table-alias: t
######应用基本配置
#app:
Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CodeRuleMapper.xml
@@ -30,6 +30,7 @@
        <result property="description" column="DESCRIPTION"/>
        <result property="owner" column="OWNER"/>
        <result property="copyFromVersion" column="COPYFROMVERSION"/>
        <result property="tenantId" column="TENANTID"/>
    </resultMap>
    <select id="selectCodeRulePage" resultMap="codeRuleResultMap">
@@ -58,7 +59,8 @@
               PCR.NAME,
               PCR.DESCRIPTION,
               PCR.OWNER,
               PCR.COPYFROMVERSION
               PCR.COPYFROMVERSION,
               PCR.TENANTID
        FROM PL_CODE_RULE PCR
        <where>
            <if test="codeRule.id != null and codeRule.id != ''">
Source/UBCS/ubcs-service/ubcs-code/src/main/resources/mapper/CommonsMapper.xml
@@ -41,6 +41,10 @@
        </foreach>
    </insert>
    <insert id="deleteByTaleAndOid" >
        delete from ${tableName} where oid in (${oids})
    </insert>
    <update  id="updateBatchByBaseModel"  parameterType="java.util.List" >
        BEGIN
        <foreach collection="mapList" item="columnMap" index="index" separator=";">
Source/UBCS/ubcs-service/ubcs-omd/pom.xml
@@ -75,6 +75,12 @@
            <version>3.0.1.RELEASE</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>com.vci.ubcs</groupId>
            <artifactId>ubcs-user-api</artifactId>
            <version>3.0.1.RELEASE</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>
    <build>
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/controller/AttributeController.java
@@ -134,15 +134,15 @@
    /**
     * åˆ é™¤
     * @param ids ä¸»é”®é›†åˆ
     * @param oid ä¸»é”®é›†åˆ
     * @return æ‰§è¡Œç»“æžœ
     */
    @PostMapping("/remove")
    @ApiOperationSupport(order = 4)
    @ApiOperation(value = "删除", notes = "主键集合")
    public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
    public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String oid) {
        CacheUtil.clear(OmdCacheConstant.ATTR_CACHE);
        return R.status(attributeService.removeAttrs(ids));
        return attributeService.remove(oid);
    }
    /**
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/controller/RevisionRuleController.java
@@ -1,5 +1,6 @@
package com.vci.ubcs.omd.controller;
import com.alibaba.cloud.commons.lang.StringUtils;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import com.vci.ubcs.omd.dto.RevisionRuleDTO;
@@ -12,11 +13,14 @@
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import org.springblade.core.mp.support.Condition;
import org.springblade.core.mp.support.Query;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.BeanUtil;
import org.springframework.web.bind.annotation.*;
import springfox.documentation.annotations.ApiIgnore;
import java.util.List;
import java.util.Map;
/**
 * Description: ç‰ˆæœ¬è§„则控制器
@@ -49,8 +53,8 @@
    @GetMapping("page")
    @ApiOperationSupport(order = 2)
    @ApiOperation(value = "分页查询版本规则",notes = "分页查询版本规则")
    public R<IPage<RevisionRuleVO>> page(BaseQueryObject baseQueryObject){
        return R.data(revisionRuleService.pageQueryVO(baseQueryObject));
    public R<IPage<RevisionRuleVO>> page(@ApiIgnore @RequestParam Map<String, Object> condition, Query query){
        return R.data(revisionRuleService.pageQueryVO(condition,query));
    }
    /**
@@ -60,7 +64,11 @@
    @ApiOperationSupport(order = 3)
    @ApiOperation(value = "新增或修改",notes = "传入版本规则页面对象")
    public R<RevisionRuleVO> submit(@RequestBody RevisionRuleDTO ruleDTO){
        return R.data(revisionRuleService.addSave(ruleDTO));
        if (StringUtils.isBlank(ruleDTO.getOid())) {
            return R.data(revisionRuleService.addSave(ruleDTO));
        }else {
            return R.data(revisionRuleService.editSave(ruleDTO));
        }
    }
    /**
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/controller/StatusController.java
@@ -1,5 +1,6 @@
package com.vci.ubcs.omd.controller;
import com.alibaba.cloud.commons.lang.StringUtils;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import com.vci.ubcs.omd.entity.Status;
@@ -11,9 +12,11 @@
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import org.springblade.core.mp.support.Condition;
import org.springblade.core.mp.support.Query;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.BeanUtil;
import org.springframework.web.bind.annotation.*;
import springfox.documentation.annotations.ApiIgnore;
import java.util.HashMap;
import java.util.List;
@@ -50,12 +53,8 @@
    @GetMapping("page")
    @ApiOperationSupport(order = 2)
    @ApiOperation(value = "分页查询状态池",notes = "分页查询状态池")
    public R<IPage<StatusVO>> page(BaseQueryObject baseQueryObject){
        Map<String, String> conditionMap = baseQueryObject.getConditionMap();
        if (conditionMap == null){
            conditionMap = new HashMap<>();
        }
        return R.data(statusService.listStatus(conditionMap,baseQueryObject.getPageHelper()));
    public R<IPage<StatusVO>> page(@ApiIgnore @RequestParam Map<String, Object> condition, Query query){
        return R.data(statusService.listStatus(condition,query));
    }
    /**
@@ -65,7 +64,11 @@
    @ApiOperationSupport(order = 3)
    @ApiOperation(value = "新增或修改",notes = "传入状态池页面对象")
    public R<StatusVO> submit(@RequestBody StatusVO statusVO){
        return R.data(statusService.addSave(statusVO));
        if (StringUtils.isBlank(statusVO.getOid())){
            return R.data(statusService.addSave(statusVO));
        }else {
            return R.data(statusService.editSave(statusVO));
        }
    }
    /**
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/feign/AttributeClient.java
@@ -1,7 +1,11 @@
package com.vci.ubcs.omd.feign;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.vci.ubcs.omd.entity.Attribute;
import com.vci.ubcs.omd.service.IAttributeService;
import com.vci.ubcs.omd.vo.AttributeVO;
import com.vci.ubcs.omd.wrapper.AttributeWrapper;
import com.vci.ubcs.starter.web.util.VciBaseUtil;
import lombok.AllArgsConstructor;
import org.springblade.core.mp.support.Condition;
import org.springblade.core.tenant.annotation.NonDS;
@@ -40,4 +44,16 @@
        condition.put("key",key);
        return R.data(service.list(Condition.getQueryWrapper(condition, Attribute.class).lambda().orderByAsc(Attribute::getId)));
    }
    /**
     * æŒ‰é¢†åŸŸèŽ·å–å…¨éƒ¨å±žæ€§
     *
     * @return æŸ¥è¯¢ç»“æžœ
     */
    @Override
    @GetMapping(GET_ALL)
    public R<List<AttributeVO>> getAll() {
        List<AttributeVO> voList = AttributeWrapper.build().listEntityVO(service.list());
        return R.data(voList);
    }
}
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/feign/BtmTypeClient.java
@@ -51,7 +51,7 @@
    @Override
    @GetMapping(GET_DETAIL)
    public R<BtmTypeVO> getDetail(String oid) {
        return R.data(btmTypeService.getAllAttributeByBtmOid(oid));
        return R.data(btmTypeService.getBtmTypeByOid(oid));
    }
    /**
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/feign/LinkTypeClient.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,183 @@
package com.vci.ubcs.omd.feign;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.vci.ubcs.omd.entity.LinkType;
import com.vci.ubcs.omd.service.ILinkTypeService;
import com.vci.ubcs.omd.vo.LinkTypeVO;
import com.vci.ubcs.omd.wrapper.LinkTypeWrapper;
import com.vci.ubcs.starter.web.pagemodel.BaseQueryObject;
import com.vci.ubcs.starter.web.pagemodel.PageHelper;
import com.vci.ubcs.starter.web.util.VciBaseUtil;
import lombok.AllArgsConstructor;
import org.springblade.core.mp.support.Condition;
import org.springblade.core.mp.support.Query;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.BeanUtil;
import org.springblade.core.tool.utils.Func;
import org.springframework.cglib.beans.BeanMap;
import org.springframework.web.bind.annotation.RestController;
import springfox.documentation.annotations.ApiIgnore;
import java.util.*;
/**
 * Description: é“¾æŽ¥ç±»åž‹Feign实现类
 *
 * @author LiHang
 * @date 2023/6/13
 */
@ApiIgnore()
@RestController
@AllArgsConstructor
public class LinkTypeClient implements ILinkTypeClient{
    private final ILinkTypeService linkTypeService;
    private final String DOMAIN = "domain";
    /**
     * èŽ·å–é“¾æŽ¥ç±»åž‹è¯¦æƒ…ä¿¡æ¯
     *
     * @param oid ä¸»é”®
     * @return é“¾æŽ¥ç±»åž‹è¯¦æƒ…信息
     */
    @Override
    public R<LinkTypeVO> getDetail(String oid) {
        LinkTypeVO vo = linkTypeService.getLinkTypeByOid(oid);
        return R.data(vo);
    }
    /**
     * å‚照列表查询
     *
     * @param baseQueryObject æŸ¥è¯¢æ¡ä»¶å¯¹è±¡
     * @return æŸ¥è¯¢ç»“æžœ
     */
    @Override
    public R<Page<LinkTypeVO>> getRefPage(BaseQueryObject baseQueryObject) {
        Map<String, String> conditionMap = baseQueryObject.getConditionMap();
        if (conditionMap == null){
            conditionMap = new HashMap<>(16);
        }
        if (!conditionMap.containsKey(DOMAIN)){
            return R.fail("领域值不能为空");
        }
        PageHelper pageHelper = baseQueryObject.getPageHelper();
        if (pageHelper == null){
            pageHelper = new PageHelper(-1);
        }
        String domainValue = conditionMap.get(DOMAIN);
        VciBaseUtil.alertNotNull(domainValue,"领域值");
        conditionMap.remove(DOMAIN);
        LinkType queryObj = new LinkType();
        BeanMap.create(queryObj).putAll(conditionMap);
        Query query = new Query();
        query.setSize(pageHelper.getLimit());
        query.setCurrent(pageHelper.getPage());
        IPage<LinkType> page = linkTypeService.page(Condition.getPage(query), Condition.getQueryWrapper(queryObj).lambda().eq(LinkType::getDomain, domainValue).orderByAsc(LinkType::getId));
        Page<LinkTypeVO> pageVO = new Page<>();
        BeanUtil.copy(page,pageVO);
        pageVO.setRecords(LinkTypeWrapper.build().listEntityVO(page.getRecords(),null));
        R<Page<LinkTypeVO>> r = R.data(pageVO);
        r.setSuccess(true);
        return r;
    }
    /**
     * å‚照列表查询
     *
     * @param baseQueryObject æŸ¥è¯¢æ¡ä»¶å¯¹è±¡
     * @return æŸ¥è¯¢ç»“æžœ
     */
    @Override
    public R<List<LinkTypeVO>> getRef(BaseQueryObject baseQueryObject) {
        Map<String, String> conditionMap = baseQueryObject.getConditionMap();
        if (conditionMap == null){
            conditionMap = new HashMap<>(16);
        }
        if (!conditionMap.containsKey(DOMAIN)){
            return R.fail("领域值不能为空");
        }
        PageHelper pageHelper = baseQueryObject.getPageHelper();
        if (pageHelper == null){
            pageHelper = new PageHelper(-1);
        }
        String domainValue = conditionMap.get(DOMAIN);
        VciBaseUtil.alertNotNull(domainValue,"领域值");
        conditionMap.remove(DOMAIN);
        LinkType queryObj = new LinkType();
        BeanMap.create(queryObj).putAll(conditionMap);
        List<LinkType> doList = linkTypeService.list(Condition.getQueryWrapper(queryObj).lambda().eq(LinkType::getDomain, domainValue).orderByAsc(LinkType::getId));
        return R.data(LinkTypeWrapper.build().listEntityVO(doList,null));
    }
    /**
     * æ ¹æ®è‹±æ–‡åç§°æ‰¹é‡æŸ¥è¯¢å¯¹è±¡
     *
     * @param ids å¯¹è±¡è‹±æ–‡åç§° ä½†æ˜¯ä¸èƒ½è¶…过1000
     * @return ä¸šåŠ¡å¯¹è±¡
     */
    @Override
    public R<List<LinkTypeVO>> selectByIdCollection(List<String> ids) {
        Func.requireNotNull(ids,"链接类型英文名称");
        List<LinkTypeVO> voList = LinkTypeWrapper.build().listEntityVO(
            Optional.ofNullable(linkTypeService.list(
                    Wrappers.<LinkType>query().lambda().in(LinkType::getId, ids)
                )
            ).orElseGet(ArrayList::new),null
        );
        return R.data(voList);
    }
    /**
     * æ‰¹é‡æ ¹æ®ä¸»é”®èŽ·å–é“¾æŽ¥ç±»åž‹
     *
     * @param pkLinkTypeCollection é“¾æŽ¥ç±»åž‹ä¸»é”®é›†åˆ
     * @return é“¾æŽ¥ç±»åž‹åˆ—表,如果有不存在的不会返回,全部不存在的则返回空列表
     */
    @Override
    public R<List<LinkTypeVO>> listLinkTypeByOidCollection(List<String> pkLinkTypeCollection) {
        Func.requireNotNull(pkLinkTypeCollection,"链接类型主键");
        List<LinkTypeVO> voList = LinkTypeWrapper.build().listEntityVO(
            Optional.ofNullable(linkTypeService.list(
                    Wrappers.<LinkType>query().lambda().in(LinkType::getOid, pkLinkTypeCollection)
                )
            ).orElseGet(ArrayList::new),null
        );
        return R.data(voList);
    }
    /**
     * èŽ·å–é“¾æŽ¥ç±»åž‹ï¼Œåªæœ‰é»˜è®¤å­—æ®µ
     *
     * @param linkTypeId é“¾æŽ¥ç±»åž‹ID
     * @return é»˜è®¤å­—段属性
     */
    @Override
    public R<LinkTypeVO> getDefaultAttrByLinkId(String linkTypeId) {
        return R.data(linkTypeService.getLinkTypeDefaultAttrById(linkTypeId));
    }
    /**
     * èŽ·å–é“¾æŽ¥ç±»åž‹ï¼Œæœ‰æ‰€æœ‰çš„å­—æ®µ
     *
     * @param linkTypeId é“¾æŽ¥ç±»åž‹id
     * @return æ‰€æœ‰å­—段
     */
    @Override
    public R<LinkTypeVO> getAllAttributeByLinkId(String linkTypeId) {
        return R.data(linkTypeService.getLinkTypeAllAttrById(linkTypeId));
    }
    /**
     * èŽ·å–é“¾æŽ¥ç±»åž‹ï¼Œæœ‰æ‰€æœ‰çš„å­—æ®µ
     *
     * @param linkTypeOid é“¾æŽ¥ç±»åž‹ä¸»é”®
     * @return æ‰€æœ‰å­—段
     */
    @Override
    public R<LinkTypeVO> getAllAttributeByLinkOid(String linkTypeOid) {
        return R.data(linkTypeService.getLinkTypeAllAttrByOid(linkTypeOid));
    }
}
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/feign/RevisionRuleClient.java
@@ -13,6 +13,7 @@
import org.springblade.core.mp.support.Query;
import org.springblade.core.tenant.annotation.NonDS;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.BeanUtil;
import org.springframework.cglib.beans.BeanMap;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@@ -54,7 +55,16 @@
    @GetMapping(GET_REF_PAGE)
    @Override
    public R<IPage<RevisionRuleVO>> getRefPage(BaseQueryObject baseQueryObject) {
        return R.data(service.pageQueryVO(baseQueryObject));
        Map<String, String> conditionMap = baseQueryObject.getConditionMap();
        if (conditionMap == null){
            conditionMap = new HashMap<>();
        }
        Query query = new Query();
        query.setSize(baseQueryObject.getLimit());
        query.setCurrent(baseQueryObject.getPage());
        Map<String,Object> condition = new HashMap<>();
        BeanUtil.copy(conditionMap,condition);
        return R.data(service.pageQueryVO(condition,query));
    }
    /**
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/feign/StatusClient.java
@@ -8,8 +8,10 @@
import com.vci.ubcs.starter.web.pagemodel.BaseQueryObject;
import com.vci.ubcs.starter.web.util.VciBaseUtil;
import lombok.AllArgsConstructor;
import org.springblade.core.mp.support.Query;
import org.springblade.core.tenant.annotation.NonDS;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.BeanUtil;
import org.springblade.core.tool.utils.Func;
import org.springblade.core.tool.utils.StringUtil;
import org.springframework.web.bind.annotation.RestController;
@@ -44,7 +46,12 @@
        if (conditionMap == null) {
            conditionMap = new HashMap<>(16);
        }
        return R.data(service.listStatus(conditionMap,baseQueryObject.getPageHelper()));
        Map<String,Object> condition = new HashMap<>();
        BeanUtil.copy(conditionMap,condition);
        Query query = new Query();
        query.setCurrent(baseQueryObject.getPage());
        query.setSize(baseQueryObject.getLimit());
        return R.data(service.listStatus(condition,query));
    }
    /**
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/feign/WebSecretClient.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,111 @@
/*
 *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
 *
 *  Redistribution and use in source and binary forms, with or without
 *  modification, are permitted provided that the following conditions are met:
 *
 *  Redistributions of source code must retain the above copyright notice,
 *  this list of conditions and the following disclaimer.
 *  Redistributions in binary form must reproduce the above copyright
 *  notice, this list of conditions and the following disclaimer in the
 *  documentation and/or other materials provided with the distribution.
 *  Neither the name of the dreamlu.net developer nor the names of its
 *  contributors may be used to endorse or promote products derived from
 *  this software without specific prior written permission.
 *  Author: Chill åº„骞 (smallchill@163.com)
 */
package com.vci.ubcs.omd.feign;
import com.vci.ubcs.omd.service.IWebSecretService;
import com.vci.ubcs.starter.exception.VciBaseException;
import com.vci.ubcs.system.user.vo.UserVO;
import lombok.AllArgsConstructor;
import org.springblade.core.tool.api.R;
import org.springframework.web.bind.annotation.RestController;
import springfox.documentation.annotations.ApiIgnore;
/**
 * æžšä¸¾å®šä¹‰ Feign实现类
 *
 * @author yuxc
 * @since 2023-05-08
 */
@ApiIgnore()
@RestController
@AllArgsConstructor
public class WebSecretClient implements IWebSecretClient {
    IWebSecretService webSecretService;
    @Override
    public R<Integer> getMinUserSecret() throws VciBaseException {
        return R.data(webSecretService.getMinUserSecret());
    }
    @Override
    public R<Integer> getMinDataSecret() throws VciBaseException {
        return R.data(webSecretService.getMinDataSecret());
    }
    @Override
    public R<Integer> getMinIpSecret() throws VciBaseException {
        return R.data(webSecretService.getMinIpSecret());
    }
    @Override
    public R<Integer> getUserSecret(String userId) throws VciBaseException {
        return R.data(webSecretService.getUserSecret(userId));
    }
    @Override
    public R<Integer> getUserSecret(UserVO userVO) throws VciBaseException {
        return R.data(webSecretService.getUserSecret(userVO));
    }
    @Override
    public R<Boolean> checkDataSecret(int secret) {
        return R.data(webSecretService.checkDataSecret(secret));
    }
    @Override
    public R<Boolean> checkDataSecret(int secret, int userSecret) {
        return R.data(webSecretService.checkDataSecret(secret,userSecret));
    }
    @Override
    public R<Boolean> checkDataSecret(int secret, String userId) throws VciBaseException {
        return R.data(webSecretService.checkDataSecret(secret,userId));
    }
    @Override
    public R<Boolean> checkDataSecret(int secret, UserVO userVO) {
        return R.data(webSecretService.checkDataSecret(secret,userVO));
    }
    @Override
    public R<Integer> getIpSecret(String ip) throws VciBaseException {
        return R.data(webSecretService.getIpSecret(ip));
    }
    @Override
    public R<Boolean> checkIpSecret(int ipSecret, int userSecret) {
        return R.data(webSecretService.checkIpSecret(ipSecret,userSecret));
    }
    @Override
    public R<Boolean> checkIpSecret(int ipSecret) {
        return R.data(webSecretService.checkIpSecret(ipSecret));
    }
    @Override
    public R<Boolean> checkIpSecret(String ip, String userId) throws VciBaseException {
        return R.data(webSecretService.checkIpSecret(ip,userId));
    }
    @Override
    public R<Boolean> checkIpSecret(String ip, UserVO userVO) {
        return R.data(webSecretService.checkIpSecret(ip,userVO));
    }
}
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/mapper/RevisionRuleMapper.java
@@ -3,6 +3,9 @@
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.vci.ubcs.omd.entity.RevisionRule;
import java.util.Collection;
import java.util.List;
/**
 * Description: ç‰ˆæœ¬è§„则数据层
 *
@@ -11,4 +14,10 @@
 */
public interface RevisionRuleMapper extends BaseMapper<RevisionRule> {
    /**
     * æŒ‰ç¼–号忽略大小写查询
     * @param records è®°å½•
     * @return
     */
    List<RevisionRule> selectByIdIgnoreCase(Collection<String> records);
}
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/mapper/StatusMapper.java
@@ -3,6 +3,9 @@
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.vci.ubcs.omd.entity.Status;
import java.util.Collection;
import java.util.List;
/**
 * Description: çŠ¶æ€æ± æ•°æ®å±‚
 *
@@ -10,4 +13,10 @@
 * @date 2023/5/23
 */
public interface StatusMapper extends BaseMapper<Status> {
    /**
     * å¿½ç•¥å¤§å°å†™çš„æŸ¥è¯¢
     * @param records
     * @return
     */
    List<Status> selectByIdIgnoreCase(Collection<String> records);
}
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/IAttributeService.java
@@ -7,6 +7,7 @@
import com.vci.ubcs.omd.vo.BtmTypeVO;
import com.vci.ubcs.starter.exception.VciBaseException;
import org.springblade.core.mp.base.BaseService;
import org.springblade.core.tool.api.R;
import java.util.Collection;
import java.util.List;
@@ -84,4 +85,12 @@
     * @throws VciBaseException ä¸ç¬¦åˆæ—¶æŠ›å‡ºå¼‚常
     */
    boolean checkAttribute(BtmTypeLinkAttributesDTO attributesDTO) throws VciBaseException;
    /**
     * å•个删除
     *
     * @param oid ä¸»é”®
     * @return æ‰§è¡Œç»“æžœ
     */
    R remove(String oid);
}
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/ILinkTypeService.java
@@ -8,6 +8,7 @@
import com.vci.ubcs.omd.vo.LinkTypeVO;
import com.vci.ubcs.starter.exception.VciBaseException;
import com.vci.ubcs.starter.web.pagemodel.PageHelper;
import org.springblade.core.mp.base.BaseService;
import java.util.Collection;
import java.util.List;
@@ -20,7 +21,7 @@
 * @author LiHang
 * @date 2023/5/24
 */
public interface ILinkTypeService extends IService<LinkType> {
public interface ILinkTypeService extends BaseService<LinkType> {
    /**
     * èŽ·å–é“¾æŽ¥ç±»åž‹åˆ—è¡¨
@@ -209,4 +210,28 @@
     * @return æŸ¥è¯¢ç»“æžœ
     */
    List<BtmTreeVO> treeDomain();
    /**
     * èŽ·å–é“¾æŽ¥ç±»åž‹ï¼Œåªæœ‰é»˜è®¤å­—æ®µ
     *
     * @param linkTypeId é“¾æŽ¥ç±»åž‹id
     * @return é»˜è®¤å­—段属性
     */
    LinkTypeVO getLinkTypeDefaultAttrById(String linkTypeId);
    /**
     * èŽ·å–é“¾æŽ¥ç±»åž‹ï¼Œæœ‰æ‰€æœ‰çš„å­—æ®µ
     *
     * @param linkTypeId é“¾æŽ¥ç±»åž‹id
     * @return æ‰€æœ‰å­—段
     */
    LinkTypeVO getLinkTypeAllAttrById(String linkTypeId);
    /**
     * èŽ·å–é“¾æŽ¥ç±»åž‹ï¼Œæœ‰æ‰€æœ‰çš„å­—æ®µ
     *
     * @param linkTypeOid é“¾æŽ¥ç±»åž‹ä¸»é”®
     * @return æ‰€æœ‰å­—段
     */
    LinkTypeVO getLinkTypeAllAttrByOid(String linkTypeOid);
}
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/IRevisionRuleService.java
@@ -182,11 +182,12 @@
    /**
     * åˆ†é¡µæŸ¥è¯¢
     * @param baseQueryObject æŸ¥è¯¢å¯¹è±¡
     * @param query åˆ†é¡µ
     * @param condition æŸ¥è¯¢æ¡ä»¶
     * @return æŸ¥è¯¢ç»“æžœ
     * @throws VciBaseException æŸ¥è¯¢å‡ºé”™æ—¶æŠ›å‡ºå¼‚常
     */
    IPage<RevisionRuleVO> pageQueryVO(BaseQueryObject baseQueryObject) throws VciBaseException;
    IPage<RevisionRuleVO> pageQueryVO(Map<String, Object> condition, Query query) throws VciBaseException;
    /**
     * æŸ¥çœ‹åº”用范围
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/IStatusService.java
@@ -5,7 +5,7 @@
import com.vci.ubcs.omd.entity.Status;
import com.vci.ubcs.omd.vo.StatusVO;
import com.vci.ubcs.starter.exception.VciBaseException;
import com.vci.ubcs.starter.web.pagemodel.PageHelper;
import org.springblade.core.mp.support.Query;
import java.util.Collection;
import java.util.List;
@@ -26,7 +26,7 @@
     * @return çŠ¶æ€å¯¹è±¡åˆ—è¡¨
     * @throws VciBaseException æŸ¥è¯¢å‡ºé”™æ—¶ä¼šæŠ›å‡ºå¼‚常
     */
    IPage<StatusVO> listStatus(Map<String,String> conditionMap, PageHelper pageHelper) throws VciBaseException;
    IPage<StatusVO> listStatus(Map<String, Object> conditionMap, Query pageHelper) throws VciBaseException;
    /**
     * èŽ·å–çŠ¶æ€åˆ—è¡¨
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/IWebSecretService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,120 @@
package com.vci.ubcs.omd.service;
import com.vci.ubcs.code.vo.pagemodel.SmUserVO;
import com.vci.ubcs.starter.exception.VciBaseException;
import com.vci.ubcs.system.user.vo.UserVO;
/**
 * web端的密级服务
 */
public interface IWebSecretService {
    /**
     * èŽ·å–ç”¨æˆ·å¯†çº§çš„æœ€å°å€¼
     * @return å¯†çº§çš„值
     * @throws VciBaseException æŸ¥è¯¢å‡ºé”™ä¼šæŠ›å‡ºå¼‚常
     */
    int getMinUserSecret() throws VciBaseException;
    /**
     * èŽ·å–æ•°æ®å¯†çº§çš„é»˜è®¤å€¼
     * @return å¯†çº§çš„值
     * @throws VciBaseException æŸ¥è¯¢å‡ºé”™ä¼šæŠ›å‡ºå¼‚常
     */
    int getMinDataSecret() throws VciBaseException;
    /**
     * èŽ·å–IP密级的默认值
     * @return å¯†çº§çš„值
     * @throws VciBaseException æŸ¥è¯¢å‡ºé”™ä¼šæŠ›å‡ºå¼‚常
     */
    int getMinIpSecret() throws VciBaseException;
    /**
     * èŽ·å–ç”¨æˆ·å¯†çº§
     * @param userId ç”¨æˆ·ä¸»é”®
     * @return ç”¨æˆ·çš„密级
     * @throws VciBaseException å‚数错误,用户不存在会抛出异常
     */
    int getUserSecret(String userId) throws VciBaseException ;
    /**
     * èŽ·å–ç”¨æˆ·å¯†çº§
     * @param userVO ç”¨æˆ·çš„æ˜¾ç¤ºå¯¹è±¡
     * @return ç”¨æˆ·çš„密级
     * @throws VciBaseException å‚数错误,用户不存在会抛出异常
     */
    int getUserSecret(UserVO userVO) throws VciBaseException;
    /**
     * æ ¡éªŒå½“前用户是否有权限访问数据
     * @param secret æ•°æ®çš„密级
     * @return true表示允许访问
     */
    boolean checkDataSecret(int secret);
    /**
     * æ ¡éªŒç”¨æˆ·çš„密级是否是否有权限访问数据
     * @param secret æ•°æ®çš„密级
     * @param userSecret ç”¨æˆ·å¯†çº§
     * @return true表示允许访问
     */
    boolean checkDataSecret(int secret, int userSecret) ;
    /**
     * æ ¹æ®ç”¨æˆ·åæ¥æ ¡éªŒæ•°æ®å¯†çº§
     * @param secret æ•°æ®çš„密级
     * @param userId ç”¨æˆ·å
     * @return true表示允许访问
     * @throws VciBaseException å‚数错误,用户不存在会抛出异常
     */
    boolean checkDataSecret(int secret, String userId) throws VciBaseException;
    /**
     * æ ¹æ®ç”¨æˆ·å¯¹è±¡æ¥æ ¡éªŒæ•°æ®å¯†çº§
     * @param secret  æ•°æ®çš„密级
     * @param userVO ç”¨æˆ·çš„æ˜¾ç¤ºå¯¹è±¡
     * @return true表示允许访问
     */
    boolean checkDataSecret(int secret, UserVO userVO) ;
    /**
     * èŽ·å–IP地址的密级
     * @param ip ip地址
     * @return å¯†çº§çš„值
     * @throws VciBaseException æŸ¥è¯¢å‡ºé”™çš„æ—¶å€™ä¼šæŠ›å‡ºå¼‚常
     */
    int getIpSecret(String ip) throws VciBaseException;
    /**
     * æ£€æŸ¥æœºå™¨å¯†çº§
     * @param ipSecret æœºå™¨å¯†çº§
     * @param userSecret ç”¨æˆ·çš„密级
     * @return å¯†çº§çš„值
     */
    boolean checkIpSecret(int ipSecret, int userSecret);
    /**
     * æ£€æŸ¥å½“前用户是否符合机器密级
     * @param ipSecret æœºå™¨å¯†çº§
     * @return true表示允许访问
     */
    boolean checkIpSecret(int ipSecret) ;
    /**
     * æ ¡éªŒæŒ‡å®šip和用户是否符合机器密级
     * @param ip ip地址
     * @param userId ç”¨æˆ·å
     * @return true表示允许访问
     * @throws VciBaseException å‚数错误,用户不存在会抛出异常
     */
    boolean checkIpSecret(String ip, String userId) throws VciBaseException;
    /**
     * æ ¡éªŒæŒ‡å®šIP和用户对象符合机器密级
     * @param ip ip地址
     * @param userVO ç”¨æˆ·å¯¹è±¡
     * @return  true表示允许访问
     */
    boolean checkIpSecret(String ip, UserVO userVO) ;
}
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/AttributeServiceImpl.java
@@ -4,15 +4,12 @@
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import com.vci.ubcs.omd.constant.OmdCacheConstant;
import com.vci.ubcs.omd.dto.AttributeDTO;
import com.vci.ubcs.omd.dto.BtmTypeLinkAttributesDTO;
import com.vci.ubcs.omd.entity.Attribute;
import com.vci.ubcs.omd.entity.BtmType;
import com.vci.ubcs.omd.entity.BtmTypeAttribute;
import com.vci.ubcs.omd.mapper.AttributeMapper;
import com.vci.ubcs.omd.mapper.BtmTypeMapper;
import com.vci.ubcs.omd.service.IAttributeService;
import com.vci.ubcs.omd.vo.AttributeVO;
import com.vci.ubcs.omd.vo.BtmTypeVO;
@@ -24,14 +21,11 @@
import com.vci.ubcs.starter.web.util.VciBaseUtil;
import org.springblade.core.cache.utils.CacheUtil;
import org.springblade.core.log.exception.ServiceException;
import org.springblade.core.tool.constant.BladeConstant;
import org.springblade.core.tool.utils.BeanUtil;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.Func;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import javax.validation.constraints.NotEmpty;
import java.util.ArrayList;
import java.util.Collection;
@@ -82,13 +76,14 @@
     */
    @Override
    public boolean submit(AttributeDTO dto) {
        VciBaseUtil.alertNotNull(dto.getId(),"属性编号",dto.getName(),"属性名称",dto.getTypeKey(),"属性类型",dto.getMaxLength(),"属性长度");
        if (!Pattern.compile(REGEXP).matcher(dto.getId()).matches()){
            throw new VciBaseException("属性名称{0}只能是英文",new Object[]{dto.getId()});
            throw new VciBaseException("属性编号{0}只能是英文",new Object[]{dto.getId()});
        }
        LambdaQueryWrapper<Attribute> wrapper = Wrappers.<Attribute>query().lambda().eq(Attribute::getId, dto.getId());
        Long count = baseMapper.selectCount((Func.isEmpty(dto.getOid())) ? wrapper : wrapper.notIn(Attribute::getOid, dto.getOid()));
        if (count > 0L) {
            throw new ServiceException("属性名已存在!");
            throw new ServiceException("属性编号已存在!");
        }
        Attribute attribute = AttributeWrapper.build().copyBeforeSave(dto);
        CacheUtil.clear(OmdCacheConstant.ATTR_CACHE);
@@ -98,13 +93,17 @@
    /**
     * åˆ é™¤
     *
     * @param ids ä¸»é”®é›†åˆ
     * @param oids ä¸»é”®é›†åˆ
     * @return æ‰§è¡Œç»“æžœ
     */
    @Override
    public boolean removeAttrs(String ids) {
        List<Long> idList = Func.toLongList(ids);
        return !deleteLogic(idList) && removeByIds(idList);
    public boolean removeAttrs(String oids) {
        List<String> oidList = Func.toStrList(",", oids);
        List<Attribute> list = list(Wrappers.<Attribute>query().lambda().in(Attribute::getOid, oidList));
        if (!CollectionUtils.isEmpty(list)){
            baseMapper.delete(Wrappers.<Attribute>query().lambda().in(Attribute::getOid,list.stream().map(Attribute::getOid).collect(Collectors.toList())));
        }
        return true;
    }
    /**
@@ -243,4 +242,20 @@
        }
        return pass;
    }
    /**
     * å•个删除
     *
     * @param oid ä¸»é”®
     * @return æ‰§è¡Œç»“æžœ
     */
    @Override
    public R remove(String oid) {
        List<BtmTypeVO> vos = applyRange(oid);
        if (CollectionUtils.isEmpty(vos)){
             return R.status(removeAttrs(oid));
        }else {
            return R.fail("该属性已被使用,不允许删除");
        }
    }
}
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/LinkTypeServiceImpl.java
@@ -45,6 +45,7 @@
import org.springframework.transaction.support.DefaultTransactionDefinition;
import org.springframework.util.CollectionUtils;
import javax.validation.constraints.NotEmpty;
import java.util.*;
import java.util.stream.Collectors;
@@ -901,4 +902,56 @@
            throw new RuntimeException(e);
        }
    }
    @Override
    public boolean deleteLogic(@NotEmpty List<Long> ids) {
        return false;
    }
    @Override
    public boolean changeStatus(@NotEmpty List<Long> ids, Integer status) {
        return false;
    }
    /**
     * èŽ·å–é“¾æŽ¥ç±»åž‹ï¼Œåªæœ‰é»˜è®¤å­—æ®µ
     *
     * @param linkTypeId é“¾æŽ¥ç±»åž‹id
     * @return é»˜è®¤å­—段属性
     */
    @Override
    public LinkTypeVO getLinkTypeDefaultAttrById(String linkTypeId) {
        LinkTypeVO vo = getLinkTypeById(linkTypeId);
        List<LinkTypeAttributeVO> attributes = linkTypeAttributeService.getDefaultAttributes(vo);
        vo.setAttributes(attributes);
        return vo;
    }
    /**
     * èŽ·å–é“¾æŽ¥ç±»åž‹ï¼Œæœ‰æ‰€æœ‰çš„å­—æ®µ
     *
     * @param linkTypeId é“¾æŽ¥ç±»åž‹id
     * @return æ‰€æœ‰å­—段
     */
    @Override
    public LinkTypeVO getLinkTypeAllAttrById(String linkTypeId) {
        LinkTypeVO vo = getLinkTypeById(linkTypeId);
        List<LinkTypeAttributeVO> attributes = linkTypeAttributeService.getAllAttributes(vo);
        vo.setAttributes(attributes);
        return vo;
    }
    /**
     * èŽ·å–é“¾æŽ¥ç±»åž‹ï¼Œæœ‰æ‰€æœ‰çš„å­—æ®µ
     *
     * @param linkTypeOid é“¾æŽ¥ç±»åž‹ä¸»é”®
     * @return æ‰€æœ‰å­—段
     */
    @Override
    public LinkTypeVO getLinkTypeAllAttrByOid(String linkTypeOid) {
        LinkTypeVO vo = getLinkTypeByOid(linkTypeOid);
        List<LinkTypeAttributeVO> attributes = linkTypeAttributeService.getAllAttributes(vo);
        vo.setAttributes(attributes);
        return vo;
    }
}
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/RevisionRuleServiceImpl.java
@@ -148,8 +148,7 @@
    @Override
    public List<RevisionRuleVO> listRevisionRuleByIdCollection(Collection<String> revisionRuleIdCollection) throws VciBaseException {
        VciBaseUtil.alertNotNull(revisionRuleIdCollection,"英文名称集合");
//        return RevisionRuleWrapper.build().listVO(list(MybatisParameterUtil.cutInParameter(Wrappers.<RevisionRule>query().lambda(),RevisionRule::getId, Collections.singletonList(revisionRuleIdCollection))));
        List<RevisionRule> list = baseMapper.selectList(Wrappers.<RevisionRule>query().lambda().in(RevisionRule::getId, revisionRuleIdCollection));
        List<RevisionRule> list = baseMapper.selectByIdIgnoreCase(revisionRuleIdCollection);
        return RevisionRuleWrapper.build().listVO(list);
    }
@@ -545,20 +544,8 @@
     * @throws VciBaseException æŸ¥è¯¢å‡ºé”™æ—¶æŠ›å‡ºå¼‚常
     */
    @Override
    public IPage<RevisionRuleVO> pageQueryVO(BaseQueryObject baseQueryObject) throws VciBaseException {
        Map<String, String> conditionMap = baseQueryObject.getConditionMap();
        if (conditionMap == null){
            conditionMap = new HashMap<>();
        }
        PageHelper pageHelper = baseQueryObject.getPageHelper();
        Query query = new Query();
        query.setCurrent(pageHelper.getPage());
        query.setSize(pageHelper.getLimit());
        query.setAscs(pageHelper.getSort());
        RevisionRule queryConditionObj = new RevisionRule();
        BeanMap beanMap = BeanMap.create(queryConditionObj);
        beanMap.putAll(conditionMap);
        return RevisionRuleWrapper.build().pageVO(baseMapper.selectPage(Condition.getPage(query),Condition.getQueryWrapper(queryConditionObj).lambda().orderByAsc(RevisionRule::getId)));
    public IPage<RevisionRuleVO> pageQueryVO(Map<String, Object> condition, Query query) throws VciBaseException {
        return RevisionRuleWrapper.build().pageVO(baseMapper.selectPage(Condition.getPage(query),Condition.getQueryWrapper(condition,RevisionRule.class).lambda().orderByAsc(RevisionRule::getId)));
    }
    /**
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/StatusServiceImpl.java
@@ -11,7 +11,6 @@
import com.vci.ubcs.omd.vo.StatusVO;
import com.vci.ubcs.omd.wrapper.StatusWrapper;
import com.vci.ubcs.starter.exception.VciBaseException;
import com.vci.ubcs.starter.web.pagemodel.PageHelper;
import com.vci.ubcs.starter.web.util.BeanUtil;
import com.vci.ubcs.starter.web.util.VciBaseUtil;
import org.springblade.core.mp.support.Condition;
@@ -46,14 +45,8 @@
     * @throws VciBaseException æŸ¥è¯¢å‡ºé”™æ—¶ä¼šæŠ›å‡ºå¼‚常
     */
    @Override
    public IPage<StatusVO> listStatus(Map<String, String> conditionMap, PageHelper pageHelper) throws VciBaseException {
        Query query = new Query();
        query.setCurrent(pageHelper.getPage());
        query.setSize(pageHelper.getLimit());
        query.setAscs("id");
        Status queryVO = new Status();
        BeanMap.create(queryVO).putAll(conditionMap);
        return StatusWrapper.build().pageVO(baseMapper.selectPage(Condition.getPage(query), Condition.getQueryWrapper(queryVO).lambda().orderByAsc(Status::getId)));
    public IPage<StatusVO> listStatus(Map<String, Object> conditionMap, Query pageHelper) throws VciBaseException {
        return StatusWrapper.build().pageVO(baseMapper.selectPage(Condition.getPage(pageHelper), Condition.getQueryWrapper(conditionMap,Status.class).lambda().orderByAsc(Status::getId)));
    }
    /**
@@ -203,7 +196,7 @@
        Collection<Collection<String>> idCollections = VciBaseUtil.switchCollectionForOracleIn(idCollection);
        if(!CollectionUtils.isEmpty(idCollections)) {
            idCollections.forEach(s -> {
                List<Status> queryResult = baseMapper.selectList(Wrappers.<Status>query().lambda().in(Status::getId,s));
                List<Status> queryResult = baseMapper.selectByIdIgnoreCase(s);
                if(!CollectionUtils.isEmpty(queryResult)){
                    statusDOList.addAll(queryResult);
                }
Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/WebSecretServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,376 @@
package com.vci.ubcs.omd.service.impl;
import com.vci.ubcs.common.utils.CommonUtil;
import com.vci.ubcs.omd.cache.EnumCache;
import com.vci.ubcs.omd.service.IWebSecretService;
import com.vci.ubcs.omd.utils.VciOmdUtil;
import com.vci.ubcs.starter.exception.VciBaseException;
import com.vci.ubcs.starter.web.constant.EnumIdConstant;
import com.vci.ubcs.starter.web.enumpck.DataSecretEnum;
import com.vci.ubcs.starter.web.enumpck.UserSecretEnum;
import com.vci.ubcs.starter.web.pagemodel.KeyValue;
import com.vci.ubcs.starter.web.util.VciBaseUtil;
import com.vci.ubcs.starter.web.util.WebUtil;
import com.vci.ubcs.system.user.entity.User;
import com.vci.ubcs.system.user.feign.IUserClient;
import com.vci.ubcs.system.user.vo.UserVO;
import net.logstash.logback.encoder.org.apache.commons.lang3.StringUtils;
import org.springblade.core.tool.api.R;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import static com.vci.ubcs.starter.web.constant.FrameWorkBusLangCodeConstant.DATA_ID_NOT_EXIST;
/**
 * å¯†çº§çš„æœåŠ¡
 * @author weidy
 * @date 2021-2-16
 */
@Service
public class WebSecretServiceImpl implements IWebSecretService {
    /**
     * ç”¨æˆ·æŸ¥è¯¢æœåŠ¡
     */
    @Autowired
    private IUserClient userClient;
    /**
     * ä¸šåŠ¡ç±»åž‹æœåŠ¡
     */
//    @Autowired
//    private WebBoServiceI boService;
    /**
     * å±žæ€§çš„对象
     */
//    @Autowired
//    private WebProperties properties;
    /**
     * èŽ·å–ç”¨æˆ·å¯†çº§çš„æœ€å°å€¼
     *
     * @return å¯†çº§çš„值
     * @throws VciBaseException æŸ¥è¯¢å‡ºé”™ä¼šæŠ›å‡ºå¼‚常
     */
    @Override
    public int getMinUserSecret() throws VciBaseException {
        List<KeyValue> enumKeyValueList = VciOmdUtil.enumsToListKeyVale(EnumCache.getList(EnumIdConstant.USERSECRET_ENUMNAME));
//            enumService.getEnum(EnumIdConstant.USERSECRET_ENUMNAME);
        //重新设置枚举的值
        if(!CollectionUtils.isEmpty(enumKeyValueList)){
            List<KeyValue> keyValues = enumKeyValueList.stream().sorted((a, b) -> ((Integer) VciBaseUtil.getInt(a.getKey())).compareTo((Integer) VciBaseUtil.getInt(b.getKey()))).collect(Collectors.toList());
            for(int i = 0 ; i < keyValues.size() ; i++){
                KeyValue keyValue = keyValues.get(i);
                if(i ==0){
                    UserSecretEnum.NONE.setValue(VciBaseUtil.getInt(keyValue.getKey()));
                    UserSecretEnum.NONE.setText(keyValue.getValue());
                }else if(i ==1){
                    UserSecretEnum.SECRET.setValue(VciBaseUtil.getInt(keyValue.getKey()));
                    UserSecretEnum.SECRET.setText(keyValue.getValue());
                }else{
                    UserSecretEnum.PRIVACY.setValue(VciBaseUtil.getInt(keyValue.getKey()));
                    UserSecretEnum.PRIVACY.setText(keyValue.getValue());
                }
            }
        }
        return getMinValueInKeyValueList(enumKeyValueList,UserSecretEnum.NONE.getValue());
    }
    /**
     * èŽ·å–æžšä¸¾ä¸­çš„æœ€å°å€¼
     * @param enumKeyValueList æžšä¸¾K-V列表
     * @param minValue æœ€å°å€¼
     * @return æœ€å°å€¼
     */
    private int getMinValueInKeyValueList(  List<KeyValue> enumKeyValueList,int minValue){
        for(KeyValue ec : enumKeyValueList){
            int value = VciBaseUtil.getInt(ec.getKey());
            if(minValue> value){
                minValue = value;
            }
        }
        return minValue;
    }
    /**
     * èŽ·å–æ•°æ®å¯†çº§çš„é»˜è®¤å€¼
     *
     * @return æœ€å°å¯†çº§çš„值
     * @throws VciBaseException  æŸ¥è¯¢å‡ºé”™ä¼šæŠ›å‡ºå¼‚常
     */
    @Override
    public int getMinDataSecret() throws VciBaseException {
        List<KeyValue> enumKeyValueList = VciOmdUtil.enumsToListKeyVale(EnumCache.getList(EnumIdConstant.DATASECRET_ENUMNAME));
        //重新设置枚举的值
        if(!CollectionUtils.isEmpty(enumKeyValueList)){
            List<KeyValue> keyValues = enumKeyValueList.stream().sorted((a, b) -> ((Integer) VciBaseUtil.getInt(a.getKey())).compareTo((Integer) VciBaseUtil.getInt(b.getKey()))).collect(Collectors.toList());
            for(int i = 0 ; i < keyValues.size() ; i++){
                KeyValue keyValue = keyValues.get(i);
                if(i ==0){
                    DataSecretEnum.NONE.setValue(VciBaseUtil.getInt(keyValue.getKey()));
                    DataSecretEnum.NONE.setText(keyValue.getValue());
                }else if(i ==1){
                    DataSecretEnum.INNER.setValue(VciBaseUtil.getInt(keyValue.getKey()));
                    DataSecretEnum.INNER.setText(keyValue.getValue());
                }else if(i ==2){
                    DataSecretEnum.SECRET.setValue(VciBaseUtil.getInt(keyValue.getKey()));
                    DataSecretEnum.SECRET.setText(keyValue.getValue());
                }else{
                    DataSecretEnum.PRIVACY.setValue(VciBaseUtil.getInt(keyValue.getKey()));
                    DataSecretEnum.PRIVACY.setText(keyValue.getValue());
                }
            }
        }
        return getMinValueInKeyValueList(enumKeyValueList,DataSecretEnum.NONE.getValue());
    }
    /**
     * èŽ·å–IP密级的默认值
     *
     * @return æœ€å°å¯†çº§çš„值
     * @throws VciBaseException æŸ¥è¯¢å‡ºé”™ä¼šæŠ›å‡ºå¼‚常
     */
    @Override
    public int getMinIpSecret() throws VciBaseException {
        List<KeyValue> enumKeyValueList = VciOmdUtil.enumsToListKeyVale(EnumCache.getList(EnumIdConstant.IPSECRET_ENUMNAME));
        return getMinValueInKeyValueList(enumKeyValueList,10);
    }
    /**
     * èŽ·å–ç”¨æˆ·å¯†çº§
     *
     * @param userId ç”¨æˆ·å
     * @return ç”¨æˆ·å¯†çº§çš„值,如果没有密级,默认为最小密级
     * @throws VciBaseException æŸ¥è¯¢å‡ºé”™ä¼šæŠ›å‡ºå¼‚常
     */
    @Override
    public int getUserSecret(String userId) throws VciBaseException {
        WebUtil.alertNotNull(userId,"用户名");
        R<User> userR = userClient.userInfoById(Long.valueOf(userId));
        if(userR.getData() == null){
            throw new VciBaseException(DATA_ID_NOT_EXIST,new String[]{userId});
        }
        return userR.getData().getSecretGrade()==null?getMinUserSecret():Integer.parseInt(userR.getData().getSecretGrade());
    }
    /**
     * èŽ·å–ç”¨æˆ·å¯†çº§
     *
     * @param userVO ç”¨æˆ·çš„对象
     * @return å¯†çº§ï¼Œä¸å­˜åœ¨çš„æ—¶å€™ä¸ºæœ€ä½Žå¯†çº§
     * @throws VciBaseException æŸ¥è¯¢å‡ºé”™ä¼šæŠ›å‡ºå¼‚常
     */
    @Override
    public int getUserSecret(UserVO userVO) throws VciBaseException {
        if(userVO == null){
            throw new VciBaseException(DATA_ID_NOT_EXIST,new String[0]);
        }
        return userVO.getSecretGrade()==null?getMinUserSecret(): Integer.valueOf(userVO.getSecretGrade());
    }
    /**
     * æ ¡éªŒå½“前用户是否有权限访问数据
     *
     * @param secret æ•°æ®çš„密级
     * @return true表示可以访问
     */
    @Override
    public boolean checkDataSecret(int secret) {
        return checkDataSecret(secret,WebUtil.getCurrentUserSecret()==null?getMinUserSecret():WebUtil.getCurrentUserSecret());
    }
    /**
     * èŽ·å–æ•°æ®æƒé™
     * @param secret æ•°æ®çš„密级的值
     * @return æ•°æ®å¯†çº§
     */
    private DataSecretEnum dataSecretForValue(int secret){
        for(DataSecretEnum de : DataSecretEnum.values()){
            if(de.getValue() == secret){
                return de;
            }
        }
        return null;
    }
    /**
     * ç”¨æˆ·çš„密级
     * @param userSecret ç”¨æˆ·çš„密级
     * @return å¯†çº§çš„对象
     */
    private UserSecretEnum userSecretForValue(int userSecret){
        for(UserSecretEnum ue : UserSecretEnum.values()){
            if(ue.getValue() == userSecret){
                return  ue;
            }
        }
        return null;
    }
    /**
     * æ ¡éªŒç”¨æˆ·çš„密级是否是否有权限访问数据
     *
     * @param secret     æ•°æ®çš„密级
     * @param userSecret ç”¨æˆ·å¯†çº§
     * @return true表示可以访问
     */
    @Override
    public boolean checkDataSecret(int secret, int userSecret){
        //可能被转换了下
        DataSecretEnum de = dataSecretForValue(secret);
        if(de == null){
            de = DataSecretEnum.NONE;
        }
        UserSecretEnum ue = userSecretForValue(userSecret);
        if(ue == null){
            ue = UserSecretEnum.NONE;
        }
        int reaySecret = 0;
        switch (de){
            case NONE:
                reaySecret=1;
                break;
            case INNER:
                reaySecret = 2;
                break;
            case SECRET:
                reaySecret = 3;
                break;
            default:
                reaySecret = 4;
                break;
        }
        int userReaySecret = 0;
        switch (ue){
            case NONE:
                userReaySecret = 1;
                break;
            case SECRET:
                userReaySecret = 3;
                break;
            default:
                userReaySecret = 4;
                break;
        }
        if(reaySecret> userReaySecret){
            return false;
        }else{
            return true;
        }
    }
    /**
     * æ ¹æ®ç”¨æˆ·åæ¥æ ¡éªŒæ•°æ®å¯†çº§
     *
     * @param secret æ•°æ®çš„密级
     * @param userId ç”¨æˆ·å
     * @return true表示可以访问
     * @throws VciBaseException æŸ¥è¯¢å‡ºé”™ä¼šæŠ›å‡ºå¼‚常
     */
    @Override
    public boolean checkDataSecret(int secret, String userId) throws VciBaseException {
        return checkDataSecret(secret,getUserSecret(userId));
    }
    /**
     * æ ¹æ®ç”¨æˆ·å¯¹è±¡æ¥æ ¡éªŒæ•°æ®å¯†çº§
     *
     * @param secret æ•°æ®å¯†çº§
     * @param userVO ç”¨æˆ·çš„对象
     * @return true表示可以访问
     */
    @Override
    public boolean checkDataSecret(int secret, UserVO userVO)  {
        return checkDataSecret(secret,getUserSecret(userVO));
    }
    /**
     * èŽ·å–IP地址的密级 æš‚时还未使用,数据库表也还未移植。
     *
     * @param ip ip地址
     * @return å¯†çº§çš„值
     * @throws VciBaseException æŸ¥è¯¢å‡ºé”™çš„æ—¶å€™ä¼šæŠ›å‡ºå¼‚常
     */
    @Override
    public int getIpSecret(String ip) throws VciBaseException {
        if(StringUtils.isBlank(ip)){
            return getMinIpSecret();
        }
        Map<String,String> conditionMap = new HashMap<String, String>();
        conditionMap.put("startip",ip.trim());
//        List<ClientBusinessObject> ipCbos = boService.queryCBO(EnumIdConstant.IPSECRET_BTMNAME,conditionMap,null, Arrays.asList(new String[]{"ipsecret"}));
        int ipSecret = 0;
//        if(ipCbos!=null&& ipCbos.size()>0){
//            ipSecret = WebUtil.getInt(ipCbos.get(0).getAttributeValue("ipsecret"));
//        }
        if(ipSecret == 0){
            ipSecret = getMinIpSecret();
        }
        return ipSecret;
    }
    /**
     * æ£€æŸ¥æœºå™¨å¯†çº§
     *
     * @param ipSecret   æœºå™¨å¯†çº§
     * @param userSecret ç”¨æˆ·çš„密级
     * @return true表示许可
     */
    @Override
    public boolean checkIpSecret(int ipSecret, int userSecret)  {
        if(ipSecret> userSecret){
            return false;
        }else{
            return true;
        }
    }
    /**
     * æ£€æŸ¥å½“前用户是否符合机器密级
     *
     * @param ipSecret æœºå™¨å¯†çº§
     * @return true表示许可
     */
    @Override
    public boolean checkIpSecret(int ipSecret) {
        return checkIpSecret(ipSecret,WebUtil.getCurrentUserSecret()==null?getMinUserSecret():WebUtil.getCurrentUserSecret());
    }
    /**
     * æ ¡éªŒæŒ‡å®šip和用户是否符合机器密级
     *
     * @param ip     ip地址
     * @param userId ç”¨æˆ·å
     * @return true表示许可
     * @throws VciBaseException æŸ¥è¯¢å‡ºé”™ä¼šæŠ›å‡ºå¼‚常
     */
    @Override
    public boolean checkIpSecret(String ip, String userId) throws VciBaseException {
        return checkIpSecret(getIpSecret(ip),getUserSecret(userId));
    }
    /**
     * æ ¡éªŒæŒ‡å®šIP和用户对象符合机器密级
     *
     * @param ip         ip地址
     * @param userVO ç”¨æˆ·å¯¹è±¡
     * @return true表示许可
     */
    @Override
    public boolean checkIpSecret(String ip, UserVO userVO) {
        return checkIpSecret(getIpSecret(ip),getUserSecret(userVO));
    }
}
Source/UBCS/ubcs-service/ubcs-omd/src/main/resources/mapper/RevisionRuleMapper.xml
@@ -29,4 +29,15 @@
        pl_omd_revision_rule
    </sql>
    <select id="selectByIdIgnoreCase" resultMap="BaseResultMap">
        select <include refid="base_query_column"/> from <include refid="tableName"/>
        where lower(id) in
        <foreach collection="records" item="item" index="arrayindex" open=" ( " close=")" >
            #{item,jdbcType=VARCHAR}
            <if test="(arrayindex != records.size() -1)">
                ,
            </if>
        </foreach>
    </select>
</mapper>
Source/UBCS/ubcs-service/ubcs-omd/src/main/resources/mapper/StatusMapper.xml
@@ -6,7 +6,7 @@
        <result column="id" jdbcType="VARCHAR" property="id" />
        <result column="name" jdbcType="VARCHAR" property="name" />
        <result column="description" jdbcType="VARCHAR" property="description" />
        <result column="btm_name" property="btmname" jdbcType="VARCHAR" />
        <result column="btm_name" property="btmName" jdbcType="VARCHAR" />
        <result column="owner" property="owner" jdbcType="VARCHAR" />
        <result column="creator" jdbcType="VARCHAR" property="creator" />
        <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
@@ -23,4 +23,15 @@
        pl_omd_status
    </sql>
    <select id="selectByIdIgnoreCase" resultMap="BaseResultMap">
        select <include refid="base_query_column"/> from <include refid="tableName"/>
                    where lower(id) in
        <foreach collection="records" item="item" index="arrayindex" open=" ( " close=")" >
            #{item,jdbcType=VARCHAR}
            <if test="(arrayindex != records.size() -1)">
                ,
            </if>
        </foreach>
    </select>
</mapper>
Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/controller/UserPwdstrategyController.java
@@ -13,6 +13,7 @@
import javax.annotation.Resource;
import javax.validation.Valid;
import java.util.List;
/**
 * ç”¨æˆ·å¯†ç ç­–略关联(UserPwdstrategy)表控制层
Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/service/impl/MenuServiceImpl.java
@@ -30,7 +30,7 @@
import com.vci.ubcs.system.service.ITopMenuSettingService;
import com.vci.ubcs.system.wrapper.MenuWrapper;
import lombok.AllArgsConstructor;
import com.vci.ubcs.core.log.exception.ServiceException;
import org.springblade.core.log.exception.ServiceException;
import org.springblade.core.secure.BladeUser;
import org.springblade.core.secure.utils.AuthUtil;
import org.springblade.core.tool.api.R;
Source/UBCS/ubcs-service/ubcs-system/src/main/resources/mapper/CombinationMapper.xml
@@ -88,7 +88,7 @@
    </select>
    <select id="queryRegex" resultType="java.lang.String">
        SELECT listagg(psc.REGEX,'],') within group ( order by psc.REGEX) || ']' FROM PL_SYS_COMBINATION psc
        SELECT REPLACE(listagg(psc.REGEX,'],') within group ( order by psc.REGEX) || ']','],[','') FROM PL_SYS_COMBINATION psc
        WHERE psc.ID IN (
        <foreach collection="combinationIds" item="id" separator=",">
            #{id}
Source/UBCS/ubcs-service/ubcs-user/src/main/java/com/vci/ubcs/system/user/controller/UserController.java
@@ -31,6 +31,7 @@
import io.swagger.annotations.ApiParam;
import lombok.AllArgsConstructor;
import com.vci.ubcs.common.cache.CacheNames;
import org.hibernate.validator.internal.util.logging.Log;
import org.springblade.core.cache.utils.CacheUtil;
import org.springblade.core.excel.util.ExcelUtil;
import org.springblade.core.mp.support.Condition;
@@ -68,6 +69,7 @@
@RestController
@RequestMapping
@AllArgsConstructor
@lombok.extern.java.Log
public class UserController {
    private final IUserService userService;
@@ -348,7 +350,7 @@
    @ApiOperationSupport(order = 20)
    @ApiOperation(value = "查询用户密码策略是否需要提醒", notes = "传入id")
    public R<Long> checkRenAndExpr(BladeUser user) {
        System.out.println("==============================="+user.getUserId());
        log.info("==============================="+user.getUserId());
        Long res = userService.checkRenAndExpr(user.getUserId());
        return R.data(res);
    }
Source/UBCS/ubcs-service/ubcs-user/src/main/java/com/vci/ubcs/system/user/service/impl/UserServiceImpl.java
@@ -19,6 +19,7 @@
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.vci.ubcs.system.cache.DictCache;
@@ -308,6 +309,9 @@
        }
        //获取用户采用的密码策略
        Strategy strategy = sysClient.getByUserId(userId).getData();
        if(ObjectUtil.isEmpty(strategy)) {
            throw new ServiceException("当前用户未应用密码策略!");
        }
        //密码长度校验
        if(newPassword1.length() < strategy.getMinPwdLen() || newPassword1.length() > strategy.getMaxPwdLen()){
            throw new ServiceException("密码中必须含有【"+strategy.getCombinationNames()+"】中的【"+strategy.getRequiredType()+"】种密码组合方式,且密码长度必须在【"+strategy.getMinPwdLen()+"-"+strategy.getMaxPwdLen()+"】范围内");
@@ -332,7 +336,7 @@
        regex = "^"+regex+"{"+strategy.getRequiredType()+",}$";
        boolean result = RegexUtil.find(regex, newPassword1);
        if(!result){
            throw new ServiceException(resException);
            //throw new ServiceException(resException);
        }
        //修改密码同时,改变用户信息中的密码修改状态字段,密码修改时间
        return this.update(Wrappers.<User>update().lambda()
@@ -482,8 +486,9 @@
        if(adminUserId.equals(userId)){
            return 0L;
        }
        QueryWrapper<User> wrapper = Wrappers.<User>query().eq("ID", userId);
        //获取到密码修改时间
        Date pwdUpdateTime = this.getOne(Wrappers.<User>query().eq("ID", userId)).getPwdUpdateTime();
        Date pwdUpdateTime = this.getOne(wrapper).getPwdUpdateTime();
        Long pwdupdateday = 0L;
        if(!Func.isEmpty(pwdUpdateTime)){
            pwdupdateday = dateToDay(pwdUpdateTime);
Source/UBCS/ubcs-service/ubcs-user/src/main/java/com/vci/ubcs/system/user/wrapper/UserWrapper.java
@@ -47,7 +47,7 @@
        List<String> roleName = SysCache.getRoleNames(user.getRoleId());
        List<String> deptName = SysCache.getDeptNames(user.getDeptId());
        List<String> postName = SysCache.getPostNames(user.getPostId());
        userVO.setTenantName(tenant.getTenantName());
        userVO.setTenantName(tenant==null?"":tenant.getTenantName());
        userVO.setRoleName(Func.join(roleName));
        userVO.setDeptName(Func.join(deptName));
        userVO.setPostName(Func.join(postName));
Source/UBCS/ubcs-service/ubcs-user/src/main/resources/mapper/UserMapper.xml
@@ -27,7 +27,7 @@
        <result column="post_id" property="postId"/>
        <result column="strategy_name" property="pwdStrategy"/>
        <result column="pwd_update_time" property="pwdUpdateTime"/>
        <result column="secretgrade" property="secretgrade"/>
        <result column="secretgrade" property="secretGrade"/>
        <result column="strategy_update_status" property="strategyUpdateStatus"/>
    </resultMap>
Source/UBCS/ubcs-service/ubcs-webservice/src/main/java/com/vci/ubcs/code/webservice/controller/DockingPreApplyCodeController.java
@@ -216,7 +216,7 @@
    @GetMapping( "/queryApplyState")
    @ApiOperationSupport(order = 2)
    @ApiOperation(value = "查看申请单状态", notes = "查看申请单状态")
    public R  queryApplyState(String oids){
    public R queryApplyState(String oids){
        try {
            return groupMdmInterService.queryApplyState(oids);
        }catch (VciBaseException e){
Source/data/applogs/xxl-job/xxl-job-admin.log
ÎļþÌ«´ó
Source/data/applogs/xxl-job/xxl-job-admin.log.2023-06-07.zip
Binary files differ
Source/data/applogs/xxl-job/xxl-job-admin.log.2023-06-08.zip
Binary files differ
Source/data/applogs/xxl-job/xxl-job-admin.log.2023-06-09.zip
Binary files differ
Source/data/applogs/xxl-job/xxl-job-executor-sample-springboot.log
@@ -1,1078 +1,98 @@
2023-06-07 19:14:59,835 INFO [background-preinit] o.h.validator.internal.util.Version [Version.java : 21] HV000001: Hibernate Validator 6.2.3.Final
2023-06-07 19:15:01,502 INFO [main] c.a.n.p.a.s.c.ClientAuthPluginManager [ClientAuthPluginManager.java : 56] [ClientAuthPluginManager] Load ClientAuthService com.alibaba.nacos.client.auth.impl.NacosClientAuthServiceImpl success.
2023-06-07 19:15:01,503 INFO [main] c.a.n.p.a.s.c.ClientAuthPluginManager [ClientAuthPluginManager.java : 56] [ClientAuthPluginManager] Load ClientAuthService com.alibaba.nacos.client.auth.ram.RamClientAuthServiceImpl success.
2023-06-07 19:15:07,441 WARN [main] c.a.c.n.c.NacosPropertySourceBuilder [NacosPropertySourceBuilder.java : 87] Ignore the empty nacos configuration and get it based on dataId[ubcs-xxljob] & group[DEFAULT_GROUP]
2023-06-07 19:15:07,449 WARN [main] c.a.c.n.c.NacosPropertySourceBuilder [NacosPropertySourceBuilder.java : 87] Ignore the empty nacos configuration and get it based on dataId[ubcs-xxljob.yaml] & group[DEFAULT_GROUP]
2023-06-07 19:15:07,457 WARN [main] c.a.c.n.c.NacosPropertySourceBuilder [NacosPropertySourceBuilder.java : 87] Ignore the empty nacos configuration and get it based on dataId[ubcs-xxljob-dev.yaml] & group[DEFAULT_GROUP]
2023-06-07 19:15:07,458 INFO [main] o.s.c.b.c.PropertySourceBootstrapConfiguration [PropertySourceBootstrapConfiguration.java : 109] Located property source: [BootstrapPropertySource {name='bootstrapProperties-ubcs-xxljob-dev.yaml,DEFAULT_GROUP'}, BootstrapPropertySource {name='bootstrapProperties-ubcs-xxljob.yaml,DEFAULT_GROUP'}, BootstrapPropertySource {name='bootstrapProperties-ubcs-xxljob,DEFAULT_GROUP'}, BootstrapPropertySource {name='bootstrapProperties-ubcs-dev.yaml,DEFAULT_GROUP'}, BootstrapPropertySource {name='bootstrapProperties-ubcs.yaml,DEFAULT_GROUP'}]
2023-06-07 19:15:07,493 INFO [main] c.v.ubcs.job.executor.JobApplication [SpringApplication.java : 640] The following 1 profile is active: "dev"
2023-06-07 19:15:10,427 INFO [main] o.s.d.r.c.RepositoryConfigurationDelegate [RepositoryConfigurationDelegate.java : 262] Multiple Spring Data modules found, entering strict repository configuration mode
2023-06-07 19:15:10,434 INFO [main] o.s.d.r.c.RepositoryConfigurationDelegate [RepositoryConfigurationDelegate.java : 132] Bootstrapping Spring Data Redis repositories in DEFAULT mode.
2023-06-07 19:15:10,508 INFO [main] o.s.d.r.c.RepositoryConfigurationDelegate [RepositoryConfigurationDelegate.java : 201] Finished Spring Data repository scanning in 21 ms. Found 0 Redis repository interfaces.
2023-06-07 19:15:11,281 INFO [main] o.s.cloud.context.scope.GenericScope [GenericScope.java : 283] BeanFactory id=8a87525c-4e09-336f-9e65-667cebc7cd92
2023-06-07 19:15:11,287 INFO [main] o.s.c.l.p.BladePropertySourcePostProcessor [BladePropertySourcePostProcessor.java : 150] BladePropertySourcePostProcessor init.
2023-06-07 19:15:11,309 INFO [main] o.s.c.l.p.BladePropertySourcePostProcessor [BladePropertySourcePostProcessor.java : 62] BladePropertySourcePostProcessor process @BladePropertySource bean.
2023-06-07 19:15:11,378 WARN [main] o.s.c.l.p.BladePropertySourcePostProcessor [BladePropertySourcePostProcessor.java : 67] Not found @BladePropertySource on spring bean class.
2023-06-07 19:15:12,036 INFO [main] o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker [PostProcessorRegistrationDelegate.java : 376] Bean 'org.springframework.cloud.commons.config.CommonsConfigAutoConfiguration' of type [org.springframework.cloud.commons.config.CommonsConfigAutoConfiguration] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2023-06-07 19:15:12,045 INFO [main] o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker [PostProcessorRegistrationDelegate.java : 376] Bean 'org.springframework.cloud.client.loadbalancer.LoadBalancerDefaultMappingsProviderAutoConfiguration' of type [org.springframework.cloud.client.loadbalancer.LoadBalancerDefaultMappingsProviderAutoConfiguration] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2023-06-07 19:15:12,047 INFO [main] o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker [PostProcessorRegistrationDelegate.java : 376] Bean 'loadBalancerClientsDefaultsMappingsProvider' of type [org.springframework.cloud.client.loadbalancer.LoadBalancerDefaultMappingsProviderAutoConfiguration$$Lambda$490/1746759758] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2023-06-07 19:15:12,055 INFO [main] o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker [PostProcessorRegistrationDelegate.java : 376] Bean 'defaultsBindHandlerAdvisor' of type [org.springframework.cloud.commons.config.DefaultsBindHandlerAdvisor] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2023-06-07 19:15:12,169 INFO [main] o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker [PostProcessorRegistrationDelegate.java : 376] Bean 'spring.cloud.sentinel-com.alibaba.cloud.sentinel.SentinelProperties' of type [com.alibaba.cloud.sentinel.SentinelProperties] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2023-06-07 19:15:12,180 INFO [main] o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker [PostProcessorRegistrationDelegate.java : 376] Bean 'com.alibaba.cloud.sentinel.custom.SentinelAutoConfiguration' of type [com.alibaba.cloud.sentinel.custom.SentinelAutoConfiguration] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2023-06-07 19:15:12,945 WARN [main] io.undertow.websockets.jsr [Bootstrap.java : 68] UT026010: Buffer pool was not set on WebSocketDeploymentInfo, the default pool will be used
2023-06-07 19:15:13,042 INFO [main] io.undertow.servlet [ServletContextImpl.java : 382] Initializing Spring embedded WebApplicationContext
2023-06-07 19:15:13,043 INFO [main] o.s.b.w.s.c.ServletWebServerApplicationContext [ServletWebServerApplicationContext.java : 292] Root WebApplicationContext: initialization completed in 5507 ms
2023-06-07 19:15:13,811 INFO [main] c.v.u.j.executor.config.XxlJobConfig [XxlJobConfig.java : 43] >>>>>>>>>>> xxl-job config init.
2023-06-07 19:15:13,847 INFO [main] c.x.job.core.executor.XxlJobExecutor [XxlJobExecutor.java : 211] >>>>>>>>>>> xxl-job register jobhandler success, name:shardingJobHandler, jobHandler:com.xxl.job.core.handler.impl.MethodJobHandler@11dbcb3b[class com.vci.ubcs.job.executor.jobhandler.SampleXxlJob#shardingJobHandler]
2023-06-07 19:15:13,847 INFO [main] c.x.job.core.executor.XxlJobExecutor [XxlJobExecutor.java : 211] >>>>>>>>>>> xxl-job register jobhandler success, name:commandJobHandler, jobHandler:com.xxl.job.core.handler.impl.MethodJobHandler@4aa517c3[class com.vci.ubcs.job.executor.jobhandler.SampleXxlJob#commandJobHandler]
2023-06-07 19:15:13,848 INFO [main] c.x.job.core.executor.XxlJobExecutor [XxlJobExecutor.java : 211] >>>>>>>>>>> xxl-job register jobhandler success, name:httpJobHandler, jobHandler:com.xxl.job.core.handler.impl.MethodJobHandler@5f369fc6[class com.vci.ubcs.job.executor.jobhandler.SampleXxlJob#httpJobHandler]
2023-06-07 19:15:13,848 INFO [main] c.x.job.core.executor.XxlJobExecutor [XxlJobExecutor.java : 211] >>>>>>>>>>> xxl-job register jobhandler success, name:demoJobHandler2, jobHandler:com.xxl.job.core.handler.impl.MethodJobHandler@3a13f663[class com.vci.ubcs.job.executor.jobhandler.SampleXxlJob#demoJobHandler2]
2023-06-07 19:15:13,849 INFO [main] c.x.job.core.executor.XxlJobExecutor [XxlJobExecutor.java : 211] >>>>>>>>>>> xxl-job register jobhandler success, name:demoJobHandler, jobHandler:com.xxl.job.core.handler.impl.MethodJobHandler@75de7009[class com.vci.ubcs.job.executor.jobhandler.SampleXxlJob#demoJobHandler]
2023-06-07 19:15:14,729 INFO [main] c.a.c.s.SentinelWebMvcConfigurer [SentinelWebMvcConfigurer.java : 52] [Sentinel Starter] register SentinelWebInterceptor with urlPatterns: [/**].
2023-06-07 19:15:14,882 INFO [main] o.s.c.c.v.BladeRequestMappingHandlerMapping [BladeRequestMappingHandlerMapping.java : 99] Mapped "{ [/error], produces [text/html]}" onto org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController#errorHtml(HttpServletRequest, HttpServletResponse)
2023-06-07 19:15:14,883 INFO [main] o.s.c.c.v.BladeRequestMappingHandlerMapping [BladeRequestMappingHandlerMapping.java : 99] Mapped "{ [/error]}" onto org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController#error(HttpServletRequest)
2023-06-07 19:15:14,884 INFO [main] o.s.c.c.v.BladeRequestMappingHandlerMapping [BladeRequestMappingHandlerMapping.java : 99] Mapped "{GET [/test/testRequest]}" onto com.vci.ubcs.job.executor.controller.TestController#testRequest(String)
2023-06-07 19:15:18,122 INFO [main] com.alibaba.nacos.client.naming [InitUtils.java : 62] initializer namespace from System Property : null
2023-06-07 19:15:18,124 INFO [main] com.alibaba.nacos.client.naming [InitUtils.java : 66] initializer namespace from System Environment :null
2023-06-07 19:15:18,125 INFO [main] com.alibaba.nacos.client.naming [InitUtils.java : 73] initializer namespace from System Property :null
2023-06-07 19:15:18,155 INFO [main] c.a.n.p.a.s.c.ClientAuthPluginManager [ClientAuthPluginManager.java : 56] [ClientAuthPluginManager] Load ClientAuthService com.alibaba.nacos.client.auth.impl.NacosClientAuthServiceImpl success.
2023-06-07 19:15:18,156 INFO [main] c.a.n.p.a.s.c.ClientAuthPluginManager [ClientAuthPluginManager.java : 56] [ClientAuthPluginManager] Load ClientAuthService com.alibaba.nacos.client.auth.ram.RamClientAuthServiceImpl success.
2023-06-07 19:15:18,181 INFO [main] c.alibaba.nacos.common.remote.client [RpcClientFactory.java : 95] [RpcClientFactory] create a new rpc client of c53356d2-b650-44ab-a874-71e9604bcd4a
2023-06-07 19:15:18,182 INFO [main] c.alibaba.nacos.common.remote.client [LoggerUtils.java : 60] [c53356d2-b650-44ab-a874-71e9604bcd4a] RpcClient init label, labels = {module=naming, source=sdk}
2023-06-07 19:15:18,188 INFO [main] c.alibaba.nacos.common.remote.client [LoggerUtils.java : 60] [c53356d2-b650-44ab-a874-71e9604bcd4a] RpcClient init, ServerListFactory = com.alibaba.nacos.client.naming.core.ServerListManager
2023-06-07 19:15:18,190 INFO [main] c.alibaba.nacos.common.remote.client [LoggerUtils.java : 60] [c53356d2-b650-44ab-a874-71e9604bcd4a] Registry connection listener to current client:com.alibaba.nacos.client.naming.remote.gprc.redo.NamingGrpcRedoService
2023-06-07 19:15:18,192 INFO [main] c.alibaba.nacos.common.remote.client [LoggerUtils.java : 60] [c53356d2-b650-44ab-a874-71e9604bcd4a] Register server push request handler:com.alibaba.nacos.client.naming.remote.gprc.NamingPushRequestHandler
2023-06-07 19:15:18,193 INFO [main] c.alibaba.nacos.common.remote.client [LoggerUtils.java : 60] [c53356d2-b650-44ab-a874-71e9604bcd4a] Try to connect to server on start up, server: {serverIp = '127.0.0.1', server main port = 8848}
2023-06-07 19:15:18,323 INFO [main] c.alibaba.nacos.common.remote.client [LoggerUtils.java : 60] [c53356d2-b650-44ab-a874-71e9604bcd4a] Success to connect to server [127.0.0.1:8848] on start up, connectionId = 1686136518202_127.0.0.1_61382
2023-06-07 19:15:18,324 INFO [com.alibaba.nacos.client.remote.worker] c.alibaba.nacos.common.remote.client [LoggerUtils.java : 60] [c53356d2-b650-44ab-a874-71e9604bcd4a] Notify connected event to listeners.
2023-06-07 19:15:18,326 INFO [main] c.alibaba.nacos.common.remote.client [LoggerUtils.java : 60] [c53356d2-b650-44ab-a874-71e9604bcd4a] Register server push request handler:com.alibaba.nacos.common.remote.client.RpcClient$ConnectResetRequestHandler
2023-06-07 19:15:18,328 INFO [com.alibaba.nacos.client.remote.worker] com.alibaba.nacos.client.naming [NamingGrpcRedoService.java : 76] Grpc connection connect
2023-06-07 19:15:18,328 INFO [main] c.alibaba.nacos.common.remote.client [LoggerUtils.java : 60] [c53356d2-b650-44ab-a874-71e9604bcd4a] Register server push request handler:com.alibaba.nacos.common.remote.client.RpcClient$$Lambda$376/1561005241
2023-06-07 19:15:18,962 INFO [main] o.s.b.a.e.web.EndpointLinksResolver [EndpointLinksResolver.java : 58] Exposing 20 endpoint(s) beneath base path '/actuator'
2023-06-07 19:15:21,153 INFO [main] o.s.b.f.a.AutowiredAnnotationBeanPostProcessor [AutowiredAnnotationBeanPostProcessor.java : 367] Inconsistent constructor declaration on bean with name 'org.springblade.core.launch.server.ServerInfo': single autowire-marked constructor flagged as optional - this constructor is effectively required since there is no default constructor to fall back to: public org.springblade.core.launch.server.ServerInfo(org.springframework.boot.autoconfigure.web.ServerProperties)
2023-06-07 19:15:22,965 WARN [main] o.s.c.l.c.LoadBalancerCacheAutoConfiguration$LoadBalancerCaffeineWarnLogger [LoadBalancerCacheAutoConfiguration.java : 82] Spring Cloud LoadBalancer is currently working with the default cache. While this cache implementation is useful for development and tests, it's recommended to use Caffeine cache in production.You can switch to using Caffeine cache, by adding it and org.springframework.cache.caffeine.CaffeineCacheManager to the classpath.
2023-06-07 19:15:23,067 INFO [main] c.x.r.r.p.XxlRpcProviderFactory [XxlRpcProviderFactory.java : 197] >>>>>>>>>>> xxl-rpc, provider factory add service success. serviceKey = com.xxl.job.core.biz.ExecutorBiz, serviceBean = class com.xxl.job.core.biz.impl.ExecutorBizImpl
2023-06-07 19:15:23,990 INFO [main] com.alibaba.nacos.client.naming [NamingClientProxyDelegate.java : 141] [SUBSCRIBE-SERVICE] service:ubcs-xxljob, group:DEFAULT_GROUP, clusters:DEFAULT
2023-06-07 19:15:24,019 INFO [main] com.alibaba.nacos.client.naming [ServiceInfoHolder.java : 181] init new ips(0) service: DEFAULT_GROUP@@ubcs-xxljob@@DEFAULT -> []
2023-06-07 19:15:24,039 INFO [main] com.alibaba.nacos.client.naming [ServiceInfoHolder.java : 166] current ips:(0) service: DEFAULT_GROUP@@ubcs-xxljob@@DEFAULT -> []
2023-06-07 19:15:24,085 INFO [main] io.undertow [Undertow.java : 120] starting server: Undertow - 2.2.18.Final
2023-06-07 19:15:24,102 INFO [Thread-66] com.xxl.rpc.remoting.net.Server [NettyHttpServer.java : 66] >>>>>>>>>>> xxl-rpc remoting server start success, nettype = com.xxl.rpc.remoting.net.impl.netty_http.server.NettyHttpServer, port = 7018
2023-06-07 19:15:24,113 INFO [main] org.xnio [Xnio.java : 95] XNIO version 3.8.7.Final
2023-06-07 19:15:24,147 INFO [main] org.xnio.nio [NioXnio.java : 58] XNIO NIO Implementation Version 3.8.7.Final
2023-06-07 19:15:24,265 INFO [main] org.jboss.threads [Version.java : 52] JBoss Threads version 3.1.0.Final
2023-06-07 19:15:24,407 INFO [main] o.s.b.w.e.undertow.UndertowWebServer [UndertowWebServer.java : 119] Undertow started on port(s) 36009 (http)
2023-06-07 19:15:24,419 INFO [main] com.alibaba.nacos.client.naming [NamingGrpcClientProxy.java : 111] [REGISTER-SERVICE] public registering service ubcs-xxljob with instance Instance{instanceId='null', ip='192.168.237.1', port=36009, weight=1.0, healthy=true, enabled=true, ephemeral=true, clusterName='DEFAULT', serviceName='null', metadata={preserved.register.source=SPRING_CLOUD}}
2023-06-07 19:15:24,434 INFO [main] c.a.c.n.r.NacosServiceRegistry [NacosServiceRegistry.java : 75] nacos registry, DEFAULT_GROUP ubcs-xxljob 192.168.237.1:36009 register finished
2023-06-07 19:15:24,594 INFO [nacos-grpc-client-executor-127.0.0.1-8] c.alibaba.nacos.common.remote.client [LoggerUtils.java : 60] [c53356d2-b650-44ab-a874-71e9604bcd4a] Receive server push request, request = NotifySubscriberRequest, requestId = 517
2023-06-07 19:15:24,600 INFO [nacos-grpc-client-executor-127.0.0.1-8] com.alibaba.nacos.client.naming [ServiceInfoHolder.java : 181] init new ips(1) service: DEFAULT_GROUP@@ubcs-xxljob -> [{"ip":"192.168.237.1","port":36009,"weight":1.0,"healthy":true,"enabled":true,"ephemeral":true,"clusterName":"DEFAULT","serviceName":"DEFAULT_GROUP@@ubcs-xxljob","metadata":{"preserved.register.source":"SPRING_CLOUD"},"instanceHeartBeatTimeOut":15000,"ipDeleteTimeout":30000,"instanceHeartBeatInterval":5000}]
2023-06-07 19:15:24,601 INFO [nacos-grpc-client-executor-127.0.0.1-8] com.alibaba.nacos.client.naming [ServiceInfoHolder.java : 166] current ips:(1) service: DEFAULT_GROUP@@ubcs-xxljob -> [{"ip":"192.168.237.1","port":36009,"weight":1.0,"healthy":true,"enabled":true,"ephemeral":true,"clusterName":"DEFAULT","serviceName":"DEFAULT_GROUP@@ubcs-xxljob","metadata":{"preserved.register.source":"SPRING_CLOUD"},"instanceHeartBeatTimeOut":15000,"ipDeleteTimeout":30000,"instanceHeartBeatInterval":5000}]
2023-06-07 19:15:24,611 INFO [nacos-grpc-client-executor-127.0.0.1-8] c.alibaba.nacos.common.remote.client [LoggerUtils.java : 60] [c53356d2-b650-44ab-a874-71e9604bcd4a] Ack server push request, request = NotifySubscriberRequest, requestId = 517
2023-06-07 19:15:25,009 INFO [com.alibaba.nacos.client.naming.updater.0] com.alibaba.nacos.client.naming [ServiceInfoHolder.java : 234] new ips(1) service: DEFAULT_GROUP@@ubcs-xxljob@@DEFAULT -> [{"ip":"192.168.237.1","port":36009,"weight":1.0,"healthy":true,"enabled":true,"ephemeral":true,"clusterName":"DEFAULT","serviceName":"DEFAULT_GROUP@@ubcs-xxljob","metadata":{"preserved.register.source":"SPRING_CLOUD"},"instanceHeartBeatTimeOut":15000,"ipDeleteTimeout":30000,"instanceHeartBeatInterval":5000}]
2023-06-07 19:15:25,010 INFO [com.alibaba.nacos.client.naming.updater.0] com.alibaba.nacos.client.naming [ServiceInfoHolder.java : 166] current ips:(1) service: DEFAULT_GROUP@@ubcs-xxljob@@DEFAULT -> [{"ip":"192.168.237.1","port":36009,"weight":1.0,"healthy":true,"enabled":true,"ephemeral":true,"clusterName":"DEFAULT","serviceName":"DEFAULT_GROUP@@ubcs-xxljob","metadata":{"preserved.register.source":"SPRING_CLOUD"},"instanceHeartBeatTimeOut":15000,"ipDeleteTimeout":30000,"instanceHeartBeatInterval":5000}]
2023-06-07 19:15:25,264 INFO [main] o.s.core.launch.StartEventListener [StartEventListener.java : 45] ---[UBCS-XXLJOB]---启动完成,当前使用的端口:[36009],环境变量:[dev]---
2023-06-07 19:15:25,292 INFO [main] c.v.ubcs.job.executor.JobApplication [StartupInfoLogger.java : 61] Started JobApplication in 27.567 seconds (JVM running for 30.289)
2023-06-07 19:15:25,301 INFO [main] c.a.n.client.config.impl.CacheData [CacheData.java : 65] nacos.cache.data.init.snapshot = true
2023-06-07 19:15:25,303 INFO [main] c.a.n.c.config.impl.ClientWorker [ClientWorker.java : 373] [fixed-127.0.0.1_8848] [subscribe] ubcs-dev.yaml+DEFAULT_GROUP
2023-06-07 19:15:25,306 INFO [main] c.a.n.client.config.impl.CacheData [CacheData.java : 180] [fixed-127.0.0.1_8848] [add-listener] ok, tenant=, dataId=ubcs-dev.yaml, group=DEFAULT_GROUP, cnt=1
2023-06-07 19:15:25,307 INFO [main] c.a.c.n.r.NacosContextRefresher [NacosContextRefresher.java : 105] listening config: dataId=ubcs-dev.yaml, group=DEFAULT_GROUP
2023-06-07 19:15:25,308 INFO [main] c.a.n.c.config.impl.ClientWorker [ClientWorker.java : 373] [fixed-127.0.0.1_8848] [subscribe] ubcs-xxljob+DEFAULT_GROUP
2023-06-07 19:15:25,309 INFO [main] c.a.n.client.config.impl.CacheData [CacheData.java : 180] [fixed-127.0.0.1_8848] [add-listener] ok, tenant=, dataId=ubcs-xxljob, group=DEFAULT_GROUP, cnt=1
2023-06-07 19:15:25,309 INFO [main] c.a.c.n.r.NacosContextRefresher [NacosContextRefresher.java : 105] listening config: dataId=ubcs-xxljob, group=DEFAULT_GROUP
2023-06-07 19:15:25,312 INFO [main] c.a.n.c.config.impl.ClientWorker [ClientWorker.java : 373] [fixed-127.0.0.1_8848] [subscribe] ubcs.yaml+DEFAULT_GROUP
2023-06-07 19:15:25,312 INFO [main] c.a.n.client.config.impl.CacheData [CacheData.java : 180] [fixed-127.0.0.1_8848] [add-listener] ok, tenant=, dataId=ubcs.yaml, group=DEFAULT_GROUP, cnt=1
2023-06-07 19:15:25,313 INFO [main] c.a.c.n.r.NacosContextRefresher [NacosContextRefresher.java : 105] listening config: dataId=ubcs.yaml, group=DEFAULT_GROUP
2023-06-07 19:15:25,313 INFO [main] c.a.n.c.config.impl.ClientWorker [ClientWorker.java : 373] [fixed-127.0.0.1_8848] [subscribe] ubcs-xxljob.yaml+DEFAULT_GROUP
2023-06-07 19:15:25,314 INFO [main] c.a.n.client.config.impl.CacheData [CacheData.java : 180] [fixed-127.0.0.1_8848] [add-listener] ok, tenant=, dataId=ubcs-xxljob.yaml, group=DEFAULT_GROUP, cnt=1
2023-06-07 19:15:25,314 INFO [main] c.a.c.n.r.NacosContextRefresher [NacosContextRefresher.java : 105] listening config: dataId=ubcs-xxljob.yaml, group=DEFAULT_GROUP
2023-06-07 19:15:25,315 INFO [main] c.a.n.c.config.impl.ClientWorker [ClientWorker.java : 373] [fixed-127.0.0.1_8848] [subscribe] ubcs-xxljob-dev.yaml+DEFAULT_GROUP
2023-06-07 19:15:25,316 INFO [main] c.a.n.client.config.impl.CacheData [CacheData.java : 180] [fixed-127.0.0.1_8848] [add-listener] ok, tenant=, dataId=ubcs-xxljob-dev.yaml, group=DEFAULT_GROUP, cnt=1
2023-06-07 19:15:25,316 INFO [main] c.a.c.n.r.NacosContextRefresher [NacosContextRefresher.java : 105] listening config: dataId=ubcs-xxljob-dev.yaml, group=DEFAULT_GROUP
2023-06-07 19:15:26,155 ERROR [xxl-job, executor ExecutorRegistryThread] c.x.job.core.util.XxlJobRemotingUtil [XxlJobRemotingUtil.java : 146] Connection refused: connect
java.net.ConnectException: Connection refused: connect
    at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:81)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:476)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:218)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:200)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:162)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:394)
    at java.net.Socket.connect(Socket.java:606)
    at sun.net.NetworkClient.doConnect(NetworkClient.java:175)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:463)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:558)
    at sun.net.www.http.HttpClient.<init>(HttpClient.java:242)
    at sun.net.www.http.HttpClient.New(HttpClient.java:339)
    at sun.net.www.http.HttpClient.New(HttpClient.java:357)
    at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:1226)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1162)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1056)
    at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:990)
    at com.xxl.job.core.util.XxlJobRemotingUtil.postBody(XxlJobRemotingUtil.java:94)
    at com.xxl.job.core.biz.client.AdminBizClient.registry(AdminBizClient.java:41)
    at com.xxl.job.core.thread.ExecutorRegistryThread$1.run(ExecutorRegistryThread.java:48)
    at java.lang.Thread.run(Thread.java:748)
2023-06-07 19:15:26,156 INFO [xxl-job, executor ExecutorRegistryThread] c.x.j.c.t.ExecutorRegistryThread [ExecutorRegistryThread.java : 54] >>>>>>>>>>> xxl-job registry fail, registryParam:RegistryParam{registryGroup='EXECUTOR', registryKey='blade-xxljob', registryValue='127.0.0.1:7018'}, registryResult:ReturnT [code=500, msg=xxl-rpc remoting error(Connection refused: connect), for url : http://127.0.0.1:37012/xxl-job-admin/api/registry, content=null]
2023-06-07 19:15:27,039 INFO [RMI TCP Connection(8)-192.168.1.46] io.undertow.servlet [ServletContextImpl.java : 382] Initializing Spring DispatcherServlet 'dispatcherServlet'
2023-06-07 19:15:27,039 INFO [RMI TCP Connection(8)-192.168.1.46] o.s.web.servlet.DispatcherServlet [FrameworkServlet.java : 525] Initializing Servlet 'dispatcherServlet'
2023-06-07 19:15:27,046 INFO [RMI TCP Connection(8)-192.168.1.46] o.s.web.servlet.DispatcherServlet [FrameworkServlet.java : 547] Completed initialization in 6 ms
2023-06-07 19:15:38,450 WARN [RMI TCP Connection(9)-192.168.1.46] o.s.b.a.health.HealthEndpointSupport [HealthEndpointSupport.java : 181] Health contributor org.springframework.boot.actuate.autoconfigure.health.HealthEndpointConfiguration$AdaptedReactiveHealthContributors$1 (redis) took 11281ms to respond
2023-06-07 19:15:58,184 ERROR [xxl-job, executor ExecutorRegistryThread] c.x.job.core.util.XxlJobRemotingUtil [XxlJobRemotingUtil.java : 146] Connection refused: connect
java.net.ConnectException: Connection refused: connect
    at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:81)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:476)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:218)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:200)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:162)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:394)
    at java.net.Socket.connect(Socket.java:606)
    at sun.net.NetworkClient.doConnect(NetworkClient.java:175)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:463)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:558)
    at sun.net.www.http.HttpClient.<init>(HttpClient.java:242)
    at sun.net.www.http.HttpClient.New(HttpClient.java:339)
    at sun.net.www.http.HttpClient.New(HttpClient.java:357)
    at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:1226)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1162)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1056)
    at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:990)
    at com.xxl.job.core.util.XxlJobRemotingUtil.postBody(XxlJobRemotingUtil.java:94)
    at com.xxl.job.core.biz.client.AdminBizClient.registry(AdminBizClient.java:41)
    at com.xxl.job.core.thread.ExecutorRegistryThread$1.run(ExecutorRegistryThread.java:48)
    at java.lang.Thread.run(Thread.java:748)
2023-06-07 19:15:58,185 INFO [xxl-job, executor ExecutorRegistryThread] c.x.j.c.t.ExecutorRegistryThread [ExecutorRegistryThread.java : 54] >>>>>>>>>>> xxl-job registry fail, registryParam:RegistryParam{registryGroup='EXECUTOR', registryKey='blade-xxljob', registryValue='127.0.0.1:7018'}, registryResult:ReturnT [code=500, msg=xxl-rpc remoting error(Connection refused: connect), for url : http://127.0.0.1:37012/xxl-job-admin/api/registry, content=null]
2023-06-07 19:16:30,224 ERROR [xxl-job, executor ExecutorRegistryThread] c.x.job.core.util.XxlJobRemotingUtil [XxlJobRemotingUtil.java : 146] Connection refused: connect
java.net.ConnectException: Connection refused: connect
    at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:81)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:476)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:218)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:200)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:162)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:394)
    at java.net.Socket.connect(Socket.java:606)
    at sun.net.NetworkClient.doConnect(NetworkClient.java:175)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:463)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:558)
    at sun.net.www.http.HttpClient.<init>(HttpClient.java:242)
    at sun.net.www.http.HttpClient.New(HttpClient.java:339)
    at sun.net.www.http.HttpClient.New(HttpClient.java:357)
    at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:1226)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1162)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1056)
    at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:990)
    at com.xxl.job.core.util.XxlJobRemotingUtil.postBody(XxlJobRemotingUtil.java:94)
    at com.xxl.job.core.biz.client.AdminBizClient.registry(AdminBizClient.java:41)
    at com.xxl.job.core.thread.ExecutorRegistryThread$1.run(ExecutorRegistryThread.java:48)
    at java.lang.Thread.run(Thread.java:748)
2023-06-07 19:16:30,225 INFO [xxl-job, executor ExecutorRegistryThread] c.x.j.c.t.ExecutorRegistryThread [ExecutorRegistryThread.java : 54] >>>>>>>>>>> xxl-job registry fail, registryParam:RegistryParam{registryGroup='EXECUTOR', registryKey='blade-xxljob', registryValue='127.0.0.1:7018'}, registryResult:ReturnT [code=500, msg=xxl-rpc remoting error(Connection refused: connect), for url : http://127.0.0.1:37012/xxl-job-admin/api/registry, content=null]
2023-06-07 19:17:02,259 ERROR [xxl-job, executor ExecutorRegistryThread] c.x.job.core.util.XxlJobRemotingUtil [XxlJobRemotingUtil.java : 146] Connection refused: connect
java.net.ConnectException: Connection refused: connect
    at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:81)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:476)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:218)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:200)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:162)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:394)
    at java.net.Socket.connect(Socket.java:606)
    at sun.net.NetworkClient.doConnect(NetworkClient.java:175)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:463)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:558)
    at sun.net.www.http.HttpClient.<init>(HttpClient.java:242)
    at sun.net.www.http.HttpClient.New(HttpClient.java:339)
    at sun.net.www.http.HttpClient.New(HttpClient.java:357)
    at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:1226)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1162)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1056)
    at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:990)
    at com.xxl.job.core.util.XxlJobRemotingUtil.postBody(XxlJobRemotingUtil.java:94)
    at com.xxl.job.core.biz.client.AdminBizClient.registry(AdminBizClient.java:41)
    at com.xxl.job.core.thread.ExecutorRegistryThread$1.run(ExecutorRegistryThread.java:48)
    at java.lang.Thread.run(Thread.java:748)
2023-06-07 19:17:02,260 INFO [xxl-job, executor ExecutorRegistryThread] c.x.j.c.t.ExecutorRegistryThread [ExecutorRegistryThread.java : 54] >>>>>>>>>>> xxl-job registry fail, registryParam:RegistryParam{registryGroup='EXECUTOR', registryKey='blade-xxljob', registryValue='127.0.0.1:7018'}, registryResult:ReturnT [code=500, msg=xxl-rpc remoting error(Connection refused: connect), for url : http://127.0.0.1:37012/xxl-job-admin/api/registry, content=null]
2023-06-07 19:17:34,295 ERROR [xxl-job, executor ExecutorRegistryThread] c.x.job.core.util.XxlJobRemotingUtil [XxlJobRemotingUtil.java : 146] Connection refused: connect
java.net.ConnectException: Connection refused: connect
    at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:81)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:476)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:218)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:200)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:162)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:394)
    at java.net.Socket.connect(Socket.java:606)
    at sun.net.NetworkClient.doConnect(NetworkClient.java:175)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:463)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:558)
    at sun.net.www.http.HttpClient.<init>(HttpClient.java:242)
    at sun.net.www.http.HttpClient.New(HttpClient.java:339)
    at sun.net.www.http.HttpClient.New(HttpClient.java:357)
    at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:1226)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1162)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1056)
    at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:990)
    at com.xxl.job.core.util.XxlJobRemotingUtil.postBody(XxlJobRemotingUtil.java:94)
    at com.xxl.job.core.biz.client.AdminBizClient.registry(AdminBizClient.java:41)
    at com.xxl.job.core.thread.ExecutorRegistryThread$1.run(ExecutorRegistryThread.java:48)
    at java.lang.Thread.run(Thread.java:748)
2023-06-07 19:17:34,296 INFO [xxl-job, executor ExecutorRegistryThread] c.x.j.c.t.ExecutorRegistryThread [ExecutorRegistryThread.java : 54] >>>>>>>>>>> xxl-job registry fail, registryParam:RegistryParam{registryGroup='EXECUTOR', registryKey='blade-xxljob', registryValue='127.0.0.1:7018'}, registryResult:ReturnT [code=500, msg=xxl-rpc remoting error(Connection refused: connect), for url : http://127.0.0.1:37012/xxl-job-admin/api/registry, content=null]
2023-06-07 19:18:06,330 ERROR [xxl-job, executor ExecutorRegistryThread] c.x.job.core.util.XxlJobRemotingUtil [XxlJobRemotingUtil.java : 146] Connection refused: connect
java.net.ConnectException: Connection refused: connect
    at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:81)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:476)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:218)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:200)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:162)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:394)
    at java.net.Socket.connect(Socket.java:606)
    at sun.net.NetworkClient.doConnect(NetworkClient.java:175)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:463)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:558)
    at sun.net.www.http.HttpClient.<init>(HttpClient.java:242)
    at sun.net.www.http.HttpClient.New(HttpClient.java:339)
    at sun.net.www.http.HttpClient.New(HttpClient.java:357)
    at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:1226)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1162)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1056)
    at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:990)
    at com.xxl.job.core.util.XxlJobRemotingUtil.postBody(XxlJobRemotingUtil.java:94)
    at com.xxl.job.core.biz.client.AdminBizClient.registry(AdminBizClient.java:41)
    at com.xxl.job.core.thread.ExecutorRegistryThread$1.run(ExecutorRegistryThread.java:48)
    at java.lang.Thread.run(Thread.java:748)
2023-06-07 19:18:06,331 INFO [xxl-job, executor ExecutorRegistryThread] c.x.j.c.t.ExecutorRegistryThread [ExecutorRegistryThread.java : 54] >>>>>>>>>>> xxl-job registry fail, registryParam:RegistryParam{registryGroup='EXECUTOR', registryKey='blade-xxljob', registryValue='127.0.0.1:7018'}, registryResult:ReturnT [code=500, msg=xxl-rpc remoting error(Connection refused: connect), for url : http://127.0.0.1:37012/xxl-job-admin/api/registry, content=null]
2023-06-07 19:18:38,361 ERROR [xxl-job, executor ExecutorRegistryThread] c.x.job.core.util.XxlJobRemotingUtil [XxlJobRemotingUtil.java : 146] Connection refused: connect
java.net.ConnectException: Connection refused: connect
    at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:81)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:476)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:218)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:200)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:162)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:394)
    at java.net.Socket.connect(Socket.java:606)
    at sun.net.NetworkClient.doConnect(NetworkClient.java:175)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:463)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:558)
    at sun.net.www.http.HttpClient.<init>(HttpClient.java:242)
    at sun.net.www.http.HttpClient.New(HttpClient.java:339)
    at sun.net.www.http.HttpClient.New(HttpClient.java:357)
    at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:1226)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1162)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1056)
    at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:990)
    at com.xxl.job.core.util.XxlJobRemotingUtil.postBody(XxlJobRemotingUtil.java:94)
    at com.xxl.job.core.biz.client.AdminBizClient.registry(AdminBizClient.java:41)
    at com.xxl.job.core.thread.ExecutorRegistryThread$1.run(ExecutorRegistryThread.java:48)
    at java.lang.Thread.run(Thread.java:748)
2023-06-07 19:18:38,362 INFO [xxl-job, executor ExecutorRegistryThread] c.x.j.c.t.ExecutorRegistryThread [ExecutorRegistryThread.java : 54] >>>>>>>>>>> xxl-job registry fail, registryParam:RegistryParam{registryGroup='EXECUTOR', registryKey='blade-xxljob', registryValue='127.0.0.1:7018'}, registryResult:ReturnT [code=500, msg=xxl-rpc remoting error(Connection refused: connect), for url : http://127.0.0.1:37012/xxl-job-admin/api/registry, content=null]
2023-06-07 19:19:10,390 ERROR [xxl-job, executor ExecutorRegistryThread] c.x.job.core.util.XxlJobRemotingUtil [XxlJobRemotingUtil.java : 146] Connection refused: connect
java.net.ConnectException: Connection refused: connect
    at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:81)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:476)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:218)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:200)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:162)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:394)
    at java.net.Socket.connect(Socket.java:606)
    at sun.net.NetworkClient.doConnect(NetworkClient.java:175)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:463)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:558)
    at sun.net.www.http.HttpClient.<init>(HttpClient.java:242)
    at sun.net.www.http.HttpClient.New(HttpClient.java:339)
    at sun.net.www.http.HttpClient.New(HttpClient.java:357)
    at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:1226)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1162)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1056)
    at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:990)
    at com.xxl.job.core.util.XxlJobRemotingUtil.postBody(XxlJobRemotingUtil.java:94)
    at com.xxl.job.core.biz.client.AdminBizClient.registry(AdminBizClient.java:41)
    at com.xxl.job.core.thread.ExecutorRegistryThread$1.run(ExecutorRegistryThread.java:48)
    at java.lang.Thread.run(Thread.java:748)
2023-06-07 19:19:10,391 INFO [xxl-job, executor ExecutorRegistryThread] c.x.j.c.t.ExecutorRegistryThread [ExecutorRegistryThread.java : 54] >>>>>>>>>>> xxl-job registry fail, registryParam:RegistryParam{registryGroup='EXECUTOR', registryKey='blade-xxljob', registryValue='127.0.0.1:7018'}, registryResult:ReturnT [code=500, msg=xxl-rpc remoting error(Connection refused: connect), for url : http://127.0.0.1:37012/xxl-job-admin/api/registry, content=null]
2023-06-07 19:19:42,430 ERROR [xxl-job, executor ExecutorRegistryThread] c.x.job.core.util.XxlJobRemotingUtil [XxlJobRemotingUtil.java : 146] Connection refused: connect
java.net.ConnectException: Connection refused: connect
    at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:81)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:476)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:218)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:200)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:162)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:394)
    at java.net.Socket.connect(Socket.java:606)
    at sun.net.NetworkClient.doConnect(NetworkClient.java:175)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:463)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:558)
    at sun.net.www.http.HttpClient.<init>(HttpClient.java:242)
    at sun.net.www.http.HttpClient.New(HttpClient.java:339)
    at sun.net.www.http.HttpClient.New(HttpClient.java:357)
    at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:1226)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1162)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1056)
    at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:990)
    at com.xxl.job.core.util.XxlJobRemotingUtil.postBody(XxlJobRemotingUtil.java:94)
    at com.xxl.job.core.biz.client.AdminBizClient.registry(AdminBizClient.java:41)
    at com.xxl.job.core.thread.ExecutorRegistryThread$1.run(ExecutorRegistryThread.java:48)
    at java.lang.Thread.run(Thread.java:748)
2023-06-07 19:19:42,430 INFO [xxl-job, executor ExecutorRegistryThread] c.x.j.c.t.ExecutorRegistryThread [ExecutorRegistryThread.java : 54] >>>>>>>>>>> xxl-job registry fail, registryParam:RegistryParam{registryGroup='EXECUTOR', registryKey='blade-xxljob', registryValue='127.0.0.1:7018'}, registryResult:ReturnT [code=500, msg=xxl-rpc remoting error(Connection refused: connect), for url : http://127.0.0.1:37012/xxl-job-admin/api/registry, content=null]
2023-06-07 19:20:14,469 ERROR [xxl-job, executor ExecutorRegistryThread] c.x.job.core.util.XxlJobRemotingUtil [XxlJobRemotingUtil.java : 146] Connection refused: connect
java.net.ConnectException: Connection refused: connect
    at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:81)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:476)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:218)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:200)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:162)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:394)
    at java.net.Socket.connect(Socket.java:606)
    at sun.net.NetworkClient.doConnect(NetworkClient.java:175)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:463)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:558)
    at sun.net.www.http.HttpClient.<init>(HttpClient.java:242)
    at sun.net.www.http.HttpClient.New(HttpClient.java:339)
    at sun.net.www.http.HttpClient.New(HttpClient.java:357)
    at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:1226)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1162)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1056)
    at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:990)
    at com.xxl.job.core.util.XxlJobRemotingUtil.postBody(XxlJobRemotingUtil.java:94)
    at com.xxl.job.core.biz.client.AdminBizClient.registry(AdminBizClient.java:41)
    at com.xxl.job.core.thread.ExecutorRegistryThread$1.run(ExecutorRegistryThread.java:48)
    at java.lang.Thread.run(Thread.java:748)
2023-06-07 19:20:14,470 INFO [xxl-job, executor ExecutorRegistryThread] c.x.j.c.t.ExecutorRegistryThread [ExecutorRegistryThread.java : 54] >>>>>>>>>>> xxl-job registry fail, registryParam:RegistryParam{registryGroup='EXECUTOR', registryKey='blade-xxljob', registryValue='127.0.0.1:7018'}, registryResult:ReturnT [code=500, msg=xxl-rpc remoting error(Connection refused: connect), for url : http://127.0.0.1:37012/xxl-job-admin/api/registry, content=null]
2023-06-07 19:20:46,489 ERROR [xxl-job, executor ExecutorRegistryThread] c.x.job.core.util.XxlJobRemotingUtil [XxlJobRemotingUtil.java : 146] Connection refused: connect
java.net.ConnectException: Connection refused: connect
    at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:81)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:476)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:218)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:200)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:162)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:394)
    at java.net.Socket.connect(Socket.java:606)
    at sun.net.NetworkClient.doConnect(NetworkClient.java:175)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:463)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:558)
    at sun.net.www.http.HttpClient.<init>(HttpClient.java:242)
    at sun.net.www.http.HttpClient.New(HttpClient.java:339)
    at sun.net.www.http.HttpClient.New(HttpClient.java:357)
    at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:1226)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1162)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1056)
    at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:990)
    at com.xxl.job.core.util.XxlJobRemotingUtil.postBody(XxlJobRemotingUtil.java:94)
    at com.xxl.job.core.biz.client.AdminBizClient.registry(AdminBizClient.java:41)
    at com.xxl.job.core.thread.ExecutorRegistryThread$1.run(ExecutorRegistryThread.java:48)
    at java.lang.Thread.run(Thread.java:748)
2023-06-07 19:20:46,490 INFO [xxl-job, executor ExecutorRegistryThread] c.x.j.c.t.ExecutorRegistryThread [ExecutorRegistryThread.java : 54] >>>>>>>>>>> xxl-job registry fail, registryParam:RegistryParam{registryGroup='EXECUTOR', registryKey='blade-xxljob', registryValue='127.0.0.1:7018'}, registryResult:ReturnT [code=500, msg=xxl-rpc remoting error(Connection refused: connect), for url : http://127.0.0.1:37012/xxl-job-admin/api/registry, content=null]
2023-06-07 19:21:18,520 ERROR [xxl-job, executor ExecutorRegistryThread] c.x.job.core.util.XxlJobRemotingUtil [XxlJobRemotingUtil.java : 146] Connection refused: connect
java.net.ConnectException: Connection refused: connect
    at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:81)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:476)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:218)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:200)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:162)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:394)
    at java.net.Socket.connect(Socket.java:606)
    at sun.net.NetworkClient.doConnect(NetworkClient.java:175)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:463)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:558)
    at sun.net.www.http.HttpClient.<init>(HttpClient.java:242)
    at sun.net.www.http.HttpClient.New(HttpClient.java:339)
    at sun.net.www.http.HttpClient.New(HttpClient.java:357)
    at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:1226)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1162)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1056)
    at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:990)
    at com.xxl.job.core.util.XxlJobRemotingUtil.postBody(XxlJobRemotingUtil.java:94)
    at com.xxl.job.core.biz.client.AdminBizClient.registry(AdminBizClient.java:41)
    at com.xxl.job.core.thread.ExecutorRegistryThread$1.run(ExecutorRegistryThread.java:48)
    at java.lang.Thread.run(Thread.java:748)
2023-06-07 19:21:18,521 INFO [xxl-job, executor ExecutorRegistryThread] c.x.j.c.t.ExecutorRegistryThread [ExecutorRegistryThread.java : 54] >>>>>>>>>>> xxl-job registry fail, registryParam:RegistryParam{registryGroup='EXECUTOR', registryKey='blade-xxljob', registryValue='127.0.0.1:7018'}, registryResult:ReturnT [code=500, msg=xxl-rpc remoting error(Connection refused: connect), for url : http://127.0.0.1:37012/xxl-job-admin/api/registry, content=null]
2023-06-07 19:21:50,553 ERROR [xxl-job, executor ExecutorRegistryThread] c.x.job.core.util.XxlJobRemotingUtil [XxlJobRemotingUtil.java : 146] Connection refused: connect
java.net.ConnectException: Connection refused: connect
    at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:81)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:476)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:218)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:200)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:162)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:394)
    at java.net.Socket.connect(Socket.java:606)
    at sun.net.NetworkClient.doConnect(NetworkClient.java:175)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:463)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:558)
    at sun.net.www.http.HttpClient.<init>(HttpClient.java:242)
    at sun.net.www.http.HttpClient.New(HttpClient.java:339)
    at sun.net.www.http.HttpClient.New(HttpClient.java:357)
    at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:1226)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1162)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1056)
    at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:990)
    at com.xxl.job.core.util.XxlJobRemotingUtil.postBody(XxlJobRemotingUtil.java:94)
    at com.xxl.job.core.biz.client.AdminBizClient.registry(AdminBizClient.java:41)
    at com.xxl.job.core.thread.ExecutorRegistryThread$1.run(ExecutorRegistryThread.java:48)
    at java.lang.Thread.run(Thread.java:748)
2023-06-07 19:21:50,557 INFO [xxl-job, executor ExecutorRegistryThread] c.x.j.c.t.ExecutorRegistryThread [ExecutorRegistryThread.java : 54] >>>>>>>>>>> xxl-job registry fail, registryParam:RegistryParam{registryGroup='EXECUTOR', registryKey='blade-xxljob', registryValue='127.0.0.1:7018'}, registryResult:ReturnT [code=500, msg=xxl-rpc remoting error(Connection refused: connect), for url : http://127.0.0.1:37012/xxl-job-admin/api/registry, content=null]
2023-06-07 19:22:22,610 ERROR [xxl-job, executor ExecutorRegistryThread] c.x.job.core.util.XxlJobRemotingUtil [XxlJobRemotingUtil.java : 146] Connection refused: connect
java.net.ConnectException: Connection refused: connect
    at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:81)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:476)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:218)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:200)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:162)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:394)
    at java.net.Socket.connect(Socket.java:606)
    at sun.net.NetworkClient.doConnect(NetworkClient.java:175)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:463)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:558)
    at sun.net.www.http.HttpClient.<init>(HttpClient.java:242)
    at sun.net.www.http.HttpClient.New(HttpClient.java:339)
    at sun.net.www.http.HttpClient.New(HttpClient.java:357)
    at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:1226)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1162)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1056)
    at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:990)
    at com.xxl.job.core.util.XxlJobRemotingUtil.postBody(XxlJobRemotingUtil.java:94)
    at com.xxl.job.core.biz.client.AdminBizClient.registry(AdminBizClient.java:41)
    at com.xxl.job.core.thread.ExecutorRegistryThread$1.run(ExecutorRegistryThread.java:48)
    at java.lang.Thread.run(Thread.java:748)
2023-06-07 19:22:22,611 INFO [xxl-job, executor ExecutorRegistryThread] c.x.j.c.t.ExecutorRegistryThread [ExecutorRegistryThread.java : 54] >>>>>>>>>>> xxl-job registry fail, registryParam:RegistryParam{registryGroup='EXECUTOR', registryKey='blade-xxljob', registryValue='127.0.0.1:7018'}, registryResult:ReturnT [code=500, msg=xxl-rpc remoting error(Connection refused: connect), for url : http://127.0.0.1:37012/xxl-job-admin/api/registry, content=null]
2023-06-07 19:22:54,671 ERROR [xxl-job, executor ExecutorRegistryThread] c.x.job.core.util.XxlJobRemotingUtil [XxlJobRemotingUtil.java : 146] Connection refused: connect
java.net.ConnectException: Connection refused: connect
    at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:81)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:476)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:218)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:200)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:162)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:394)
    at java.net.Socket.connect(Socket.java:606)
    at sun.net.NetworkClient.doConnect(NetworkClient.java:175)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:463)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:558)
    at sun.net.www.http.HttpClient.<init>(HttpClient.java:242)
    at sun.net.www.http.HttpClient.New(HttpClient.java:339)
    at sun.net.www.http.HttpClient.New(HttpClient.java:357)
    at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:1226)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1162)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1056)
    at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:990)
    at com.xxl.job.core.util.XxlJobRemotingUtil.postBody(XxlJobRemotingUtil.java:94)
    at com.xxl.job.core.biz.client.AdminBizClient.registry(AdminBizClient.java:41)
    at com.xxl.job.core.thread.ExecutorRegistryThread$1.run(ExecutorRegistryThread.java:48)
    at java.lang.Thread.run(Thread.java:748)
2023-06-07 19:22:54,672 INFO [xxl-job, executor ExecutorRegistryThread] c.x.j.c.t.ExecutorRegistryThread [ExecutorRegistryThread.java : 54] >>>>>>>>>>> xxl-job registry fail, registryParam:RegistryParam{registryGroup='EXECUTOR', registryKey='blade-xxljob', registryValue='127.0.0.1:7018'}, registryResult:ReturnT [code=500, msg=xxl-rpc remoting error(Connection refused: connect), for url : http://127.0.0.1:37012/xxl-job-admin/api/registry, content=null]
2023-06-07 19:23:26,703 ERROR [xxl-job, executor ExecutorRegistryThread] c.x.job.core.util.XxlJobRemotingUtil [XxlJobRemotingUtil.java : 146] Connection refused: connect
java.net.ConnectException: Connection refused: connect
    at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:81)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:476)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:218)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:200)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:162)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:394)
    at java.net.Socket.connect(Socket.java:606)
    at sun.net.NetworkClient.doConnect(NetworkClient.java:175)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:463)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:558)
    at sun.net.www.http.HttpClient.<init>(HttpClient.java:242)
    at sun.net.www.http.HttpClient.New(HttpClient.java:339)
    at sun.net.www.http.HttpClient.New(HttpClient.java:357)
    at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:1226)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1162)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1056)
    at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:990)
    at com.xxl.job.core.util.XxlJobRemotingUtil.postBody(XxlJobRemotingUtil.java:94)
    at com.xxl.job.core.biz.client.AdminBizClient.registry(AdminBizClient.java:41)
    at com.xxl.job.core.thread.ExecutorRegistryThread$1.run(ExecutorRegistryThread.java:48)
    at java.lang.Thread.run(Thread.java:748)
2023-06-07 19:23:26,703 INFO [xxl-job, executor ExecutorRegistryThread] c.x.j.c.t.ExecutorRegistryThread [ExecutorRegistryThread.java : 54] >>>>>>>>>>> xxl-job registry fail, registryParam:RegistryParam{registryGroup='EXECUTOR', registryKey='blade-xxljob', registryValue='127.0.0.1:7018'}, registryResult:ReturnT [code=500, msg=xxl-rpc remoting error(Connection refused: connect), for url : http://127.0.0.1:37012/xxl-job-admin/api/registry, content=null]
2023-06-07 19:23:58,739 ERROR [xxl-job, executor ExecutorRegistryThread] c.x.job.core.util.XxlJobRemotingUtil [XxlJobRemotingUtil.java : 146] Connection refused: connect
java.net.ConnectException: Connection refused: connect
    at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:81)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:476)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:218)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:200)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:162)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:394)
    at java.net.Socket.connect(Socket.java:606)
    at sun.net.NetworkClient.doConnect(NetworkClient.java:175)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:463)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:558)
    at sun.net.www.http.HttpClient.<init>(HttpClient.java:242)
    at sun.net.www.http.HttpClient.New(HttpClient.java:339)
    at sun.net.www.http.HttpClient.New(HttpClient.java:357)
    at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:1226)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1162)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1056)
    at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:990)
    at com.xxl.job.core.util.XxlJobRemotingUtil.postBody(XxlJobRemotingUtil.java:94)
    at com.xxl.job.core.biz.client.AdminBizClient.registry(AdminBizClient.java:41)
    at com.xxl.job.core.thread.ExecutorRegistryThread$1.run(ExecutorRegistryThread.java:48)
    at java.lang.Thread.run(Thread.java:748)
2023-06-07 19:23:58,740 INFO [xxl-job, executor ExecutorRegistryThread] c.x.j.c.t.ExecutorRegistryThread [ExecutorRegistryThread.java : 54] >>>>>>>>>>> xxl-job registry fail, registryParam:RegistryParam{registryGroup='EXECUTOR', registryKey='blade-xxljob', registryValue='127.0.0.1:7018'}, registryResult:ReturnT [code=500, msg=xxl-rpc remoting error(Connection refused: connect), for url : http://127.0.0.1:37012/xxl-job-admin/api/registry, content=null]
2023-06-07 19:24:30,792 ERROR [xxl-job, executor ExecutorRegistryThread] c.x.job.core.util.XxlJobRemotingUtil [XxlJobRemotingUtil.java : 146] Connection refused: connect
java.net.ConnectException: Connection refused: connect
    at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:81)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:476)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:218)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:200)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:162)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:394)
    at java.net.Socket.connect(Socket.java:606)
    at sun.net.NetworkClient.doConnect(NetworkClient.java:175)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:463)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:558)
    at sun.net.www.http.HttpClient.<init>(HttpClient.java:242)
    at sun.net.www.http.HttpClient.New(HttpClient.java:339)
    at sun.net.www.http.HttpClient.New(HttpClient.java:357)
    at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:1226)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1162)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1056)
    at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:990)
    at com.xxl.job.core.util.XxlJobRemotingUtil.postBody(XxlJobRemotingUtil.java:94)
    at com.xxl.job.core.biz.client.AdminBizClient.registry(AdminBizClient.java:41)
    at com.xxl.job.core.thread.ExecutorRegistryThread$1.run(ExecutorRegistryThread.java:48)
    at java.lang.Thread.run(Thread.java:748)
2023-06-07 19:24:30,792 INFO [xxl-job, executor ExecutorRegistryThread] c.x.j.c.t.ExecutorRegistryThread [ExecutorRegistryThread.java : 54] >>>>>>>>>>> xxl-job registry fail, registryParam:RegistryParam{registryGroup='EXECUTOR', registryKey='blade-xxljob', registryValue='127.0.0.1:7018'}, registryResult:ReturnT [code=500, msg=xxl-rpc remoting error(Connection refused: connect), for url : http://127.0.0.1:37012/xxl-job-admin/api/registry, content=null]
2023-06-07 19:25:02,811 ERROR [xxl-job, executor ExecutorRegistryThread] c.x.job.core.util.XxlJobRemotingUtil [XxlJobRemotingUtil.java : 146] Connection refused: connect
java.net.ConnectException: Connection refused: connect
    at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:81)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:476)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:218)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:200)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:162)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:394)
    at java.net.Socket.connect(Socket.java:606)
    at sun.net.NetworkClient.doConnect(NetworkClient.java:175)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:463)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:558)
    at sun.net.www.http.HttpClient.<init>(HttpClient.java:242)
    at sun.net.www.http.HttpClient.New(HttpClient.java:339)
    at sun.net.www.http.HttpClient.New(HttpClient.java:357)
    at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:1226)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1162)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1056)
    at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:990)
    at com.xxl.job.core.util.XxlJobRemotingUtil.postBody(XxlJobRemotingUtil.java:94)
    at com.xxl.job.core.biz.client.AdminBizClient.registry(AdminBizClient.java:41)
    at com.xxl.job.core.thread.ExecutorRegistryThread$1.run(ExecutorRegistryThread.java:48)
    at java.lang.Thread.run(Thread.java:748)
2023-06-07 19:25:02,812 INFO [xxl-job, executor ExecutorRegistryThread] c.x.j.c.t.ExecutorRegistryThread [ExecutorRegistryThread.java : 54] >>>>>>>>>>> xxl-job registry fail, registryParam:RegistryParam{registryGroup='EXECUTOR', registryKey='blade-xxljob', registryValue='127.0.0.1:7018'}, registryResult:ReturnT [code=500, msg=xxl-rpc remoting error(Connection refused: connect), for url : http://127.0.0.1:37012/xxl-job-admin/api/registry, content=null]
2023-06-07 19:25:34,850 ERROR [xxl-job, executor ExecutorRegistryThread] c.x.job.core.util.XxlJobRemotingUtil [XxlJobRemotingUtil.java : 146] Connection refused: connect
java.net.ConnectException: Connection refused: connect
    at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:81)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:476)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:218)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:200)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:162)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:394)
    at java.net.Socket.connect(Socket.java:606)
    at sun.net.NetworkClient.doConnect(NetworkClient.java:175)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:463)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:558)
    at sun.net.www.http.HttpClient.<init>(HttpClient.java:242)
    at sun.net.www.http.HttpClient.New(HttpClient.java:339)
    at sun.net.www.http.HttpClient.New(HttpClient.java:357)
    at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:1226)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1162)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1056)
    at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:990)
    at com.xxl.job.core.util.XxlJobRemotingUtil.postBody(XxlJobRemotingUtil.java:94)
    at com.xxl.job.core.biz.client.AdminBizClient.registry(AdminBizClient.java:41)
    at com.xxl.job.core.thread.ExecutorRegistryThread$1.run(ExecutorRegistryThread.java:48)
    at java.lang.Thread.run(Thread.java:748)
2023-06-07 19:25:34,856 INFO [xxl-job, executor ExecutorRegistryThread] c.x.j.c.t.ExecutorRegistryThread [ExecutorRegistryThread.java : 54] >>>>>>>>>>> xxl-job registry fail, registryParam:RegistryParam{registryGroup='EXECUTOR', registryKey='blade-xxljob', registryValue='127.0.0.1:7018'}, registryResult:ReturnT [code=500, msg=xxl-rpc remoting error(Connection refused: connect), for url : http://127.0.0.1:37012/xxl-job-admin/api/registry, content=null]
2023-06-07 19:26:06,891 ERROR [xxl-job, executor ExecutorRegistryThread] c.x.job.core.util.XxlJobRemotingUtil [XxlJobRemotingUtil.java : 146] Connection refused: connect
java.net.ConnectException: Connection refused: connect
    at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:81)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:476)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:218)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:200)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:162)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:394)
    at java.net.Socket.connect(Socket.java:606)
    at sun.net.NetworkClient.doConnect(NetworkClient.java:175)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:463)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:558)
    at sun.net.www.http.HttpClient.<init>(HttpClient.java:242)
    at sun.net.www.http.HttpClient.New(HttpClient.java:339)
    at sun.net.www.http.HttpClient.New(HttpClient.java:357)
    at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:1226)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1162)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1056)
    at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:990)
    at com.xxl.job.core.util.XxlJobRemotingUtil.postBody(XxlJobRemotingUtil.java:94)
    at com.xxl.job.core.biz.client.AdminBizClient.registry(AdminBizClient.java:41)
    at com.xxl.job.core.thread.ExecutorRegistryThread$1.run(ExecutorRegistryThread.java:48)
    at java.lang.Thread.run(Thread.java:748)
2023-06-07 19:26:06,892 INFO [xxl-job, executor ExecutorRegistryThread] c.x.j.c.t.ExecutorRegistryThread [ExecutorRegistryThread.java : 54] >>>>>>>>>>> xxl-job registry fail, registryParam:RegistryParam{registryGroup='EXECUTOR', registryKey='blade-xxljob', registryValue='127.0.0.1:7018'}, registryResult:ReturnT [code=500, msg=xxl-rpc remoting error(Connection refused: connect), for url : http://127.0.0.1:37012/xxl-job-admin/api/registry, content=null]
2023-06-07 19:26:38,928 ERROR [xxl-job, executor ExecutorRegistryThread] c.x.job.core.util.XxlJobRemotingUtil [XxlJobRemotingUtil.java : 146] Connection refused: connect
java.net.ConnectException: Connection refused: connect
    at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:81)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:476)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:218)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:200)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:162)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:394)
    at java.net.Socket.connect(Socket.java:606)
    at sun.net.NetworkClient.doConnect(NetworkClient.java:175)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:463)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:558)
    at sun.net.www.http.HttpClient.<init>(HttpClient.java:242)
    at sun.net.www.http.HttpClient.New(HttpClient.java:339)
    at sun.net.www.http.HttpClient.New(HttpClient.java:357)
    at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:1226)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1162)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1056)
    at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:990)
    at com.xxl.job.core.util.XxlJobRemotingUtil.postBody(XxlJobRemotingUtil.java:94)
    at com.xxl.job.core.biz.client.AdminBizClient.registry(AdminBizClient.java:41)
    at com.xxl.job.core.thread.ExecutorRegistryThread$1.run(ExecutorRegistryThread.java:48)
    at java.lang.Thread.run(Thread.java:748)
2023-06-07 19:26:38,929 INFO [xxl-job, executor ExecutorRegistryThread] c.x.j.c.t.ExecutorRegistryThread [ExecutorRegistryThread.java : 54] >>>>>>>>>>> xxl-job registry fail, registryParam:RegistryParam{registryGroup='EXECUTOR', registryKey='blade-xxljob', registryValue='127.0.0.1:7018'}, registryResult:ReturnT [code=500, msg=xxl-rpc remoting error(Connection refused: connect), for url : http://127.0.0.1:37012/xxl-job-admin/api/registry, content=null]
2023-06-07 19:27:10,991 ERROR [xxl-job, executor ExecutorRegistryThread] c.x.job.core.util.XxlJobRemotingUtil [XxlJobRemotingUtil.java : 146] Connection refused: connect
java.net.ConnectException: Connection refused: connect
    at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:81)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:476)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:218)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:200)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:162)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:394)
    at java.net.Socket.connect(Socket.java:606)
    at sun.net.NetworkClient.doConnect(NetworkClient.java:175)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:463)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:558)
    at sun.net.www.http.HttpClient.<init>(HttpClient.java:242)
    at sun.net.www.http.HttpClient.New(HttpClient.java:339)
    at sun.net.www.http.HttpClient.New(HttpClient.java:357)
    at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:1226)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1162)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1056)
    at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:990)
    at com.xxl.job.core.util.XxlJobRemotingUtil.postBody(XxlJobRemotingUtil.java:94)
    at com.xxl.job.core.biz.client.AdminBizClient.registry(AdminBizClient.java:41)
    at com.xxl.job.core.thread.ExecutorRegistryThread$1.run(ExecutorRegistryThread.java:48)
    at java.lang.Thread.run(Thread.java:748)
2023-06-07 19:27:10,992 INFO [xxl-job, executor ExecutorRegistryThread] c.x.j.c.t.ExecutorRegistryThread [ExecutorRegistryThread.java : 54] >>>>>>>>>>> xxl-job registry fail, registryParam:RegistryParam{registryGroup='EXECUTOR', registryKey='blade-xxljob', registryValue='127.0.0.1:7018'}, registryResult:ReturnT [code=500, msg=xxl-rpc remoting error(Connection refused: connect), for url : http://127.0.0.1:37012/xxl-job-admin/api/registry, content=null]
2023-06-07 19:27:43,027 ERROR [xxl-job, executor ExecutorRegistryThread] c.x.job.core.util.XxlJobRemotingUtil [XxlJobRemotingUtil.java : 146] Connection refused: connect
java.net.ConnectException: Connection refused: connect
    at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:81)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:476)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:218)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:200)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:162)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:394)
    at java.net.Socket.connect(Socket.java:606)
    at sun.net.NetworkClient.doConnect(NetworkClient.java:175)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:463)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:558)
    at sun.net.www.http.HttpClient.<init>(HttpClient.java:242)
    at sun.net.www.http.HttpClient.New(HttpClient.java:339)
    at sun.net.www.http.HttpClient.New(HttpClient.java:357)
    at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:1226)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1162)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1056)
    at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:990)
    at com.xxl.job.core.util.XxlJobRemotingUtil.postBody(XxlJobRemotingUtil.java:94)
    at com.xxl.job.core.biz.client.AdminBizClient.registry(AdminBizClient.java:41)
    at com.xxl.job.core.thread.ExecutorRegistryThread$1.run(ExecutorRegistryThread.java:48)
    at java.lang.Thread.run(Thread.java:748)
2023-06-07 19:27:43,027 INFO [xxl-job, executor ExecutorRegistryThread] c.x.j.c.t.ExecutorRegistryThread [ExecutorRegistryThread.java : 54] >>>>>>>>>>> xxl-job registry fail, registryParam:RegistryParam{registryGroup='EXECUTOR', registryKey='blade-xxljob', registryValue='127.0.0.1:7018'}, registryResult:ReturnT [code=500, msg=xxl-rpc remoting error(Connection refused: connect), for url : http://127.0.0.1:37012/xxl-job-admin/api/registry, content=null]
2023-06-07 19:28:15,068 ERROR [xxl-job, executor ExecutorRegistryThread] c.x.job.core.util.XxlJobRemotingUtil [XxlJobRemotingUtil.java : 146] Connection refused: connect
java.net.ConnectException: Connection refused: connect
    at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:81)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:476)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:218)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:200)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:162)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:394)
    at java.net.Socket.connect(Socket.java:606)
    at sun.net.NetworkClient.doConnect(NetworkClient.java:175)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:463)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:558)
    at sun.net.www.http.HttpClient.<init>(HttpClient.java:242)
    at sun.net.www.http.HttpClient.New(HttpClient.java:339)
    at sun.net.www.http.HttpClient.New(HttpClient.java:357)
    at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:1226)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1162)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1056)
    at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:990)
    at com.xxl.job.core.util.XxlJobRemotingUtil.postBody(XxlJobRemotingUtil.java:94)
    at com.xxl.job.core.biz.client.AdminBizClient.registry(AdminBizClient.java:41)
    at com.xxl.job.core.thread.ExecutorRegistryThread$1.run(ExecutorRegistryThread.java:48)
    at java.lang.Thread.run(Thread.java:748)
2023-06-07 19:28:15,069 INFO [xxl-job, executor ExecutorRegistryThread] c.x.j.c.t.ExecutorRegistryThread [ExecutorRegistryThread.java : 54] >>>>>>>>>>> xxl-job registry fail, registryParam:RegistryParam{registryGroup='EXECUTOR', registryKey='blade-xxljob', registryValue='127.0.0.1:7018'}, registryResult:ReturnT [code=500, msg=xxl-rpc remoting error(Connection refused: connect), for url : http://127.0.0.1:37012/xxl-job-admin/api/registry, content=null]
2023-06-07 19:28:47,094 ERROR [xxl-job, executor ExecutorRegistryThread] c.x.job.core.util.XxlJobRemotingUtil [XxlJobRemotingUtil.java : 146] Connection refused: connect
java.net.ConnectException: Connection refused: connect
    at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:81)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:476)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:218)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:200)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:162)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:394)
    at java.net.Socket.connect(Socket.java:606)
    at sun.net.NetworkClient.doConnect(NetworkClient.java:175)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:463)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:558)
    at sun.net.www.http.HttpClient.<init>(HttpClient.java:242)
    at sun.net.www.http.HttpClient.New(HttpClient.java:339)
    at sun.net.www.http.HttpClient.New(HttpClient.java:357)
    at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:1226)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1162)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1056)
    at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:990)
    at com.xxl.job.core.util.XxlJobRemotingUtil.postBody(XxlJobRemotingUtil.java:94)
    at com.xxl.job.core.biz.client.AdminBizClient.registry(AdminBizClient.java:41)
    at com.xxl.job.core.thread.ExecutorRegistryThread$1.run(ExecutorRegistryThread.java:48)
    at java.lang.Thread.run(Thread.java:748)
2023-06-07 19:28:47,095 INFO [xxl-job, executor ExecutorRegistryThread] c.x.j.c.t.ExecutorRegistryThread [ExecutorRegistryThread.java : 54] >>>>>>>>>>> xxl-job registry fail, registryParam:RegistryParam{registryGroup='EXECUTOR', registryKey='blade-xxljob', registryValue='127.0.0.1:7018'}, registryResult:ReturnT [code=500, msg=xxl-rpc remoting error(Connection refused: connect), for url : http://127.0.0.1:37012/xxl-job-admin/api/registry, content=null]
2023-06-07 19:29:19,129 ERROR [xxl-job, executor ExecutorRegistryThread] c.x.job.core.util.XxlJobRemotingUtil [XxlJobRemotingUtil.java : 146] Connection refused: connect
java.net.ConnectException: Connection refused: connect
    at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:81)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:476)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:218)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:200)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:162)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:394)
    at java.net.Socket.connect(Socket.java:606)
    at sun.net.NetworkClient.doConnect(NetworkClient.java:175)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:463)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:558)
    at sun.net.www.http.HttpClient.<init>(HttpClient.java:242)
    at sun.net.www.http.HttpClient.New(HttpClient.java:339)
    at sun.net.www.http.HttpClient.New(HttpClient.java:357)
    at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:1226)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1162)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1056)
    at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:990)
    at com.xxl.job.core.util.XxlJobRemotingUtil.postBody(XxlJobRemotingUtil.java:94)
    at com.xxl.job.core.biz.client.AdminBizClient.registry(AdminBizClient.java:41)
    at com.xxl.job.core.thread.ExecutorRegistryThread$1.run(ExecutorRegistryThread.java:48)
    at java.lang.Thread.run(Thread.java:748)
2023-06-07 19:29:19,130 INFO [xxl-job, executor ExecutorRegistryThread] c.x.j.c.t.ExecutorRegistryThread [ExecutorRegistryThread.java : 54] >>>>>>>>>>> xxl-job registry fail, registryParam:RegistryParam{registryGroup='EXECUTOR', registryKey='blade-xxljob', registryValue='127.0.0.1:7018'}, registryResult:ReturnT [code=500, msg=xxl-rpc remoting error(Connection refused: connect), for url : http://127.0.0.1:37012/xxl-job-admin/api/registry, content=null]
2023-06-07 19:29:51,143 ERROR [xxl-job, executor ExecutorRegistryThread] c.x.job.core.util.XxlJobRemotingUtil [XxlJobRemotingUtil.java : 146] Connection refused: connect
java.net.ConnectException: Connection refused: connect
    at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:81)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:476)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:218)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:200)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:162)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:394)
    at java.net.Socket.connect(Socket.java:606)
    at sun.net.NetworkClient.doConnect(NetworkClient.java:175)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:463)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:558)
    at sun.net.www.http.HttpClient.<init>(HttpClient.java:242)
    at sun.net.www.http.HttpClient.New(HttpClient.java:339)
    at sun.net.www.http.HttpClient.New(HttpClient.java:357)
    at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:1226)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1162)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1056)
    at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:990)
    at com.xxl.job.core.util.XxlJobRemotingUtil.postBody(XxlJobRemotingUtil.java:94)
    at com.xxl.job.core.biz.client.AdminBizClient.registry(AdminBizClient.java:41)
    at com.xxl.job.core.thread.ExecutorRegistryThread$1.run(ExecutorRegistryThread.java:48)
    at java.lang.Thread.run(Thread.java:748)
2023-06-07 19:29:51,145 INFO [xxl-job, executor ExecutorRegistryThread] c.x.j.c.t.ExecutorRegistryThread [ExecutorRegistryThread.java : 54] >>>>>>>>>>> xxl-job registry fail, registryParam:RegistryParam{registryGroup='EXECUTOR', registryKey='blade-xxljob', registryValue='127.0.0.1:7018'}, registryResult:ReturnT [code=500, msg=xxl-rpc remoting error(Connection refused: connect), for url : http://127.0.0.1:37012/xxl-job-admin/api/registry, content=null]
2023-06-07 19:30:23,195 ERROR [xxl-job, executor ExecutorRegistryThread] c.x.job.core.util.XxlJobRemotingUtil [XxlJobRemotingUtil.java : 146] Connection refused: connect
java.net.ConnectException: Connection refused: connect
    at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:81)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:476)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:218)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:200)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:162)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:394)
    at java.net.Socket.connect(Socket.java:606)
    at sun.net.NetworkClient.doConnect(NetworkClient.java:175)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:463)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:558)
    at sun.net.www.http.HttpClient.<init>(HttpClient.java:242)
    at sun.net.www.http.HttpClient.New(HttpClient.java:339)
    at sun.net.www.http.HttpClient.New(HttpClient.java:357)
    at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:1226)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1162)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1056)
    at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:990)
    at com.xxl.job.core.util.XxlJobRemotingUtil.postBody(XxlJobRemotingUtil.java:94)
    at com.xxl.job.core.biz.client.AdminBizClient.registry(AdminBizClient.java:41)
    at com.xxl.job.core.thread.ExecutorRegistryThread$1.run(ExecutorRegistryThread.java:48)
    at java.lang.Thread.run(Thread.java:748)
2023-06-07 19:30:23,196 INFO [xxl-job, executor ExecutorRegistryThread] c.x.j.c.t.ExecutorRegistryThread [ExecutorRegistryThread.java : 54] >>>>>>>>>>> xxl-job registry fail, registryParam:RegistryParam{registryGroup='EXECUTOR', registryKey='blade-xxljob', registryValue='127.0.0.1:7018'}, registryResult:ReturnT [code=500, msg=xxl-rpc remoting error(Connection refused: connect), for url : http://127.0.0.1:37012/xxl-job-admin/api/registry, content=null]
2023-06-07 19:30:55,225 ERROR [xxl-job, executor ExecutorRegistryThread] c.x.job.core.util.XxlJobRemotingUtil [XxlJobRemotingUtil.java : 146] Connection refused: connect
java.net.ConnectException: Connection refused: connect
    at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:81)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:476)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:218)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:200)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:162)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:394)
    at java.net.Socket.connect(Socket.java:606)
    at sun.net.NetworkClient.doConnect(NetworkClient.java:175)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:463)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:558)
    at sun.net.www.http.HttpClient.<init>(HttpClient.java:242)
    at sun.net.www.http.HttpClient.New(HttpClient.java:339)
    at sun.net.www.http.HttpClient.New(HttpClient.java:357)
    at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:1226)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1162)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1056)
    at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:990)
    at com.xxl.job.core.util.XxlJobRemotingUtil.postBody(XxlJobRemotingUtil.java:94)
    at com.xxl.job.core.biz.client.AdminBizClient.registry(AdminBizClient.java:41)
    at com.xxl.job.core.thread.ExecutorRegistryThread$1.run(ExecutorRegistryThread.java:48)
    at java.lang.Thread.run(Thread.java:748)
2023-06-07 19:30:55,226 INFO [xxl-job, executor ExecutorRegistryThread] c.x.j.c.t.ExecutorRegistryThread [ExecutorRegistryThread.java : 54] >>>>>>>>>>> xxl-job registry fail, registryParam:RegistryParam{registryGroup='EXECUTOR', registryKey='blade-xxljob', registryValue='127.0.0.1:7018'}, registryResult:ReturnT [code=500, msg=xxl-rpc remoting error(Connection refused: connect), for url : http://127.0.0.1:37012/xxl-job-admin/api/registry, content=null]
2023-06-07 19:31:27,261 ERROR [xxl-job, executor ExecutorRegistryThread] c.x.job.core.util.XxlJobRemotingUtil [XxlJobRemotingUtil.java : 146] Connection refused: connect
java.net.ConnectException: Connection refused: connect
    at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:81)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:476)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:218)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:200)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:162)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:394)
    at java.net.Socket.connect(Socket.java:606)
    at sun.net.NetworkClient.doConnect(NetworkClient.java:175)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:463)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:558)
    at sun.net.www.http.HttpClient.<init>(HttpClient.java:242)
    at sun.net.www.http.HttpClient.New(HttpClient.java:339)
    at sun.net.www.http.HttpClient.New(HttpClient.java:357)
    at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:1226)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1162)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1056)
    at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:990)
    at com.xxl.job.core.util.XxlJobRemotingUtil.postBody(XxlJobRemotingUtil.java:94)
    at com.xxl.job.core.biz.client.AdminBizClient.registry(AdminBizClient.java:41)
    at com.xxl.job.core.thread.ExecutorRegistryThread$1.run(ExecutorRegistryThread.java:48)
    at java.lang.Thread.run(Thread.java:748)
2023-06-07 19:31:27,261 INFO [xxl-job, executor ExecutorRegistryThread] c.x.j.c.t.ExecutorRegistryThread [ExecutorRegistryThread.java : 54] >>>>>>>>>>> xxl-job registry fail, registryParam:RegistryParam{registryGroup='EXECUTOR', registryKey='blade-xxljob', registryValue='127.0.0.1:7018'}, registryResult:ReturnT [code=500, msg=xxl-rpc remoting error(Connection refused: connect), for url : http://127.0.0.1:37012/xxl-job-admin/api/registry, content=null]
2023-06-07 19:31:59,294 ERROR [xxl-job, executor ExecutorRegistryThread] c.x.job.core.util.XxlJobRemotingUtil [XxlJobRemotingUtil.java : 146] Connection refused: connect
java.net.ConnectException: Connection refused: connect
    at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:81)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:476)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:218)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:200)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:162)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:394)
    at java.net.Socket.connect(Socket.java:606)
    at sun.net.NetworkClient.doConnect(NetworkClient.java:175)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:463)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:558)
    at sun.net.www.http.HttpClient.<init>(HttpClient.java:242)
    at sun.net.www.http.HttpClient.New(HttpClient.java:339)
    at sun.net.www.http.HttpClient.New(HttpClient.java:357)
    at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:1226)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1162)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1056)
    at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:990)
    at com.xxl.job.core.util.XxlJobRemotingUtil.postBody(XxlJobRemotingUtil.java:94)
    at com.xxl.job.core.biz.client.AdminBizClient.registry(AdminBizClient.java:41)
    at com.xxl.job.core.thread.ExecutorRegistryThread$1.run(ExecutorRegistryThread.java:48)
    at java.lang.Thread.run(Thread.java:748)
2023-06-07 19:31:59,295 INFO [xxl-job, executor ExecutorRegistryThread] c.x.j.c.t.ExecutorRegistryThread [ExecutorRegistryThread.java : 54] >>>>>>>>>>> xxl-job registry fail, registryParam:RegistryParam{registryGroup='EXECUTOR', registryKey='blade-xxljob', registryValue='127.0.0.1:7018'}, registryResult:ReturnT [code=500, msg=xxl-rpc remoting error(Connection refused: connect), for url : http://127.0.0.1:37012/xxl-job-admin/api/registry, content=null]
2023-06-07 19:32:31,317 ERROR [xxl-job, executor ExecutorRegistryThread] c.x.job.core.util.XxlJobRemotingUtil [XxlJobRemotingUtil.java : 146] Connection refused: connect
java.net.ConnectException: Connection refused: connect
    at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:81)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:476)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:218)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:200)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:162)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:394)
    at java.net.Socket.connect(Socket.java:606)
    at sun.net.NetworkClient.doConnect(NetworkClient.java:175)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:463)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:558)
    at sun.net.www.http.HttpClient.<init>(HttpClient.java:242)
    at sun.net.www.http.HttpClient.New(HttpClient.java:339)
    at sun.net.www.http.HttpClient.New(HttpClient.java:357)
    at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:1226)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1162)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1056)
    at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:990)
    at com.xxl.job.core.util.XxlJobRemotingUtil.postBody(XxlJobRemotingUtil.java:94)
    at com.xxl.job.core.biz.client.AdminBizClient.registry(AdminBizClient.java:41)
    at com.xxl.job.core.thread.ExecutorRegistryThread$1.run(ExecutorRegistryThread.java:48)
    at java.lang.Thread.run(Thread.java:748)
2023-06-07 19:32:31,319 INFO [xxl-job, executor ExecutorRegistryThread] c.x.j.c.t.ExecutorRegistryThread [ExecutorRegistryThread.java : 54] >>>>>>>>>>> xxl-job registry fail, registryParam:RegistryParam{registryGroup='EXECUTOR', registryKey='blade-xxljob', registryValue='127.0.0.1:7018'}, registryResult:ReturnT [code=500, msg=xxl-rpc remoting error(Connection refused: connect), for url : http://127.0.0.1:37012/xxl-job-admin/api/registry, content=null]
2023-06-07 19:33:03,335 ERROR [xxl-job, executor ExecutorRegistryThread] c.x.job.core.util.XxlJobRemotingUtil [XxlJobRemotingUtil.java : 146] Connection refused: connect
java.net.ConnectException: Connection refused: connect
    at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:81)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:476)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:218)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:200)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:162)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:394)
    at java.net.Socket.connect(Socket.java:606)
    at sun.net.NetworkClient.doConnect(NetworkClient.java:175)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:463)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:558)
    at sun.net.www.http.HttpClient.<init>(HttpClient.java:242)
    at sun.net.www.http.HttpClient.New(HttpClient.java:339)
    at sun.net.www.http.HttpClient.New(HttpClient.java:357)
    at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:1226)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1162)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1056)
    at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:990)
    at com.xxl.job.core.util.XxlJobRemotingUtil.postBody(XxlJobRemotingUtil.java:94)
    at com.xxl.job.core.biz.client.AdminBizClient.registry(AdminBizClient.java:41)
    at com.xxl.job.core.thread.ExecutorRegistryThread$1.run(ExecutorRegistryThread.java:48)
    at java.lang.Thread.run(Thread.java:748)
2023-06-07 19:33:03,336 INFO [xxl-job, executor ExecutorRegistryThread] c.x.j.c.t.ExecutorRegistryThread [ExecutorRegistryThread.java : 54] >>>>>>>>>>> xxl-job registry fail, registryParam:RegistryParam{registryGroup='EXECUTOR', registryKey='blade-xxljob', registryValue='127.0.0.1:7018'}, registryResult:ReturnT [code=500, msg=xxl-rpc remoting error(Connection refused: connect), for url : http://127.0.0.1:37012/xxl-job-admin/api/registry, content=null]
2023-06-07 19:33:35,388 ERROR [xxl-job, executor ExecutorRegistryThread] c.x.job.core.util.XxlJobRemotingUtil [XxlJobRemotingUtil.java : 146] Connection refused: connect
java.net.ConnectException: Connection refused: connect
    at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:81)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:476)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:218)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:200)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:162)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:394)
    at java.net.Socket.connect(Socket.java:606)
    at sun.net.NetworkClient.doConnect(NetworkClient.java:175)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:463)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:558)
    at sun.net.www.http.HttpClient.<init>(HttpClient.java:242)
    at sun.net.www.http.HttpClient.New(HttpClient.java:339)
    at sun.net.www.http.HttpClient.New(HttpClient.java:357)
    at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:1226)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1162)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1056)
    at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:990)
    at com.xxl.job.core.util.XxlJobRemotingUtil.postBody(XxlJobRemotingUtil.java:94)
    at com.xxl.job.core.biz.client.AdminBizClient.registry(AdminBizClient.java:41)
    at com.xxl.job.core.thread.ExecutorRegistryThread$1.run(ExecutorRegistryThread.java:48)
    at java.lang.Thread.run(Thread.java:748)
2023-06-07 19:33:35,389 INFO [xxl-job, executor ExecutorRegistryThread] c.x.j.c.t.ExecutorRegistryThread [ExecutorRegistryThread.java : 54] >>>>>>>>>>> xxl-job registry fail, registryParam:RegistryParam{registryGroup='EXECUTOR', registryKey='blade-xxljob', registryValue='127.0.0.1:7018'}, registryResult:ReturnT [code=500, msg=xxl-rpc remoting error(Connection refused: connect), for url : http://127.0.0.1:37012/xxl-job-admin/api/registry, content=null]
2023-06-07 19:34:07,423 ERROR [xxl-job, executor ExecutorRegistryThread] c.x.job.core.util.XxlJobRemotingUtil [XxlJobRemotingUtil.java : 146] Connection refused: connect
java.net.ConnectException: Connection refused: connect
    at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:81)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:476)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:218)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:200)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:162)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:394)
    at java.net.Socket.connect(Socket.java:606)
    at sun.net.NetworkClient.doConnect(NetworkClient.java:175)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:463)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:558)
    at sun.net.www.http.HttpClient.<init>(HttpClient.java:242)
    at sun.net.www.http.HttpClient.New(HttpClient.java:339)
    at sun.net.www.http.HttpClient.New(HttpClient.java:357)
    at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:1226)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1162)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1056)
    at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:990)
    at com.xxl.job.core.util.XxlJobRemotingUtil.postBody(XxlJobRemotingUtil.java:94)
    at com.xxl.job.core.biz.client.AdminBizClient.registry(AdminBizClient.java:41)
    at com.xxl.job.core.thread.ExecutorRegistryThread$1.run(ExecutorRegistryThread.java:48)
    at java.lang.Thread.run(Thread.java:748)
2023-06-07 19:34:07,423 INFO [xxl-job, executor ExecutorRegistryThread] c.x.j.c.t.ExecutorRegistryThread [ExecutorRegistryThread.java : 54] >>>>>>>>>>> xxl-job registry fail, registryParam:RegistryParam{registryGroup='EXECUTOR', registryKey='blade-xxljob', registryValue='127.0.0.1:7018'}, registryResult:ReturnT [code=500, msg=xxl-rpc remoting error(Connection refused: connect), for url : http://127.0.0.1:37012/xxl-job-admin/api/registry, content=null]
2023-06-07 19:34:39,453 ERROR [xxl-job, executor ExecutorRegistryThread] c.x.job.core.util.XxlJobRemotingUtil [XxlJobRemotingUtil.java : 146] Connection refused: connect
java.net.ConnectException: Connection refused: connect
    at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:81)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:476)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:218)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:200)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:162)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:394)
    at java.net.Socket.connect(Socket.java:606)
    at sun.net.NetworkClient.doConnect(NetworkClient.java:175)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:463)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:558)
    at sun.net.www.http.HttpClient.<init>(HttpClient.java:242)
    at sun.net.www.http.HttpClient.New(HttpClient.java:339)
    at sun.net.www.http.HttpClient.New(HttpClient.java:357)
    at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:1226)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1162)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1056)
    at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:990)
    at com.xxl.job.core.util.XxlJobRemotingUtil.postBody(XxlJobRemotingUtil.java:94)
    at com.xxl.job.core.biz.client.AdminBizClient.registry(AdminBizClient.java:41)
    at com.xxl.job.core.thread.ExecutorRegistryThread$1.run(ExecutorRegistryThread.java:48)
    at java.lang.Thread.run(Thread.java:748)
2023-06-07 19:34:39,453 INFO [xxl-job, executor ExecutorRegistryThread] c.x.j.c.t.ExecutorRegistryThread [ExecutorRegistryThread.java : 54] >>>>>>>>>>> xxl-job registry fail, registryParam:RegistryParam{registryGroup='EXECUTOR', registryKey='blade-xxljob', registryValue='127.0.0.1:7018'}, registryResult:ReturnT [code=500, msg=xxl-rpc remoting error(Connection refused: connect), for url : http://127.0.0.1:37012/xxl-job-admin/api/registry, content=null]
2023-06-07 19:35:11,481 ERROR [xxl-job, executor ExecutorRegistryThread] c.x.job.core.util.XxlJobRemotingUtil [XxlJobRemotingUtil.java : 146] Connection refused: connect
java.net.ConnectException: Connection refused: connect
    at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:81)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:476)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:218)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:200)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:162)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:394)
    at java.net.Socket.connect(Socket.java:606)
    at sun.net.NetworkClient.doConnect(NetworkClient.java:175)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:463)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:558)
    at sun.net.www.http.HttpClient.<init>(HttpClient.java:242)
    at sun.net.www.http.HttpClient.New(HttpClient.java:339)
    at sun.net.www.http.HttpClient.New(HttpClient.java:357)
    at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:1226)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1162)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1056)
    at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:990)
    at com.xxl.job.core.util.XxlJobRemotingUtil.postBody(XxlJobRemotingUtil.java:94)
    at com.xxl.job.core.biz.client.AdminBizClient.registry(AdminBizClient.java:41)
    at com.xxl.job.core.thread.ExecutorRegistryThread$1.run(ExecutorRegistryThread.java:48)
    at java.lang.Thread.run(Thread.java:748)
2023-06-07 19:35:11,482 INFO [xxl-job, executor ExecutorRegistryThread] c.x.j.c.t.ExecutorRegistryThread [ExecutorRegistryThread.java : 54] >>>>>>>>>>> xxl-job registry fail, registryParam:RegistryParam{registryGroup='EXECUTOR', registryKey='blade-xxljob', registryValue='127.0.0.1:7018'}, registryResult:ReturnT [code=500, msg=xxl-rpc remoting error(Connection refused: connect), for url : http://127.0.0.1:37012/xxl-job-admin/api/registry, content=null]
2023-06-07 19:35:43,523 ERROR [xxl-job, executor ExecutorRegistryThread] c.x.job.core.util.XxlJobRemotingUtil [XxlJobRemotingUtil.java : 146] Connection refused: connect
java.net.ConnectException: Connection refused: connect
    at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:81)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:476)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:218)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:200)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:162)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:394)
    at java.net.Socket.connect(Socket.java:606)
    at sun.net.NetworkClient.doConnect(NetworkClient.java:175)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:463)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:558)
    at sun.net.www.http.HttpClient.<init>(HttpClient.java:242)
    at sun.net.www.http.HttpClient.New(HttpClient.java:339)
    at sun.net.www.http.HttpClient.New(HttpClient.java:357)
    at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:1226)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1162)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1056)
    at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:990)
    at com.xxl.job.core.util.XxlJobRemotingUtil.postBody(XxlJobRemotingUtil.java:94)
    at com.xxl.job.core.biz.client.AdminBizClient.registry(AdminBizClient.java:41)
    at com.xxl.job.core.thread.ExecutorRegistryThread$1.run(ExecutorRegistryThread.java:48)
    at java.lang.Thread.run(Thread.java:748)
2023-06-07 19:35:43,524 INFO [xxl-job, executor ExecutorRegistryThread] c.x.j.c.t.ExecutorRegistryThread [ExecutorRegistryThread.java : 54] >>>>>>>>>>> xxl-job registry fail, registryParam:RegistryParam{registryGroup='EXECUTOR', registryKey='blade-xxljob', registryValue='127.0.0.1:7018'}, registryResult:ReturnT [code=500, msg=xxl-rpc remoting error(Connection refused: connect), for url : http://127.0.0.1:37012/xxl-job-admin/api/registry, content=null]
2023-06-07 19:35:57,923 WARN [Thread-15] c.a.nacos.common.notify.NotifyCenter [NotifyCenter.java : 136] [NotifyCenter] Start destroying Publisher
2023-06-07 19:35:57,923 WARN [Thread-6] c.a.n.c.http.HttpClientBeanHolder [HttpClientBeanHolder.java : 108] [HttpClientBeanHolder] Start destroying common HttpClient
2023-06-07 19:35:57,925 WARN [Thread-15] c.a.nacos.common.notify.NotifyCenter [NotifyCenter.java : 153] [NotifyCenter] Destruction of the end
2023-06-07 19:35:57,942 WARN [Thread-6] c.a.n.c.http.HttpClientBeanHolder [HttpClientBeanHolder.java : 114] [HttpClientBeanHolder] Destruction of the end
2023-06-07 19:35:58,131 INFO [SpringApplicationShutdownHook] io.undertow [Undertow.java : 259] stopping server: Undertow - 2.2.18.Final
2023-06-07 19:35:58,183 INFO [SpringApplicationShutdownHook] io.undertow.servlet [ServletContextImpl.java : 382] Destroying Spring FrameworkServlet 'dispatcherServlet'
2023-06-07 19:35:58,197 ERROR [SpringApplicationShutdownHook] c.a.cloud.nacos.discovery.NacosWatch [NacosWatch.java : 180] namingService unsubscribe failed, properties:NacosDiscoveryProperties{serverAddr='127.0.0.1:8848', username='', password='', endpoint='', namespace='', watchDelay=30000, logName='', service='ubcs-xxljob', weight=1.0, clusterName='DEFAULT', group='DEFAULT_GROUP', namingLoadCacheAtStart='false', metadata={preserved.register.source=SPRING_CLOUD}, registerEnabled=true, ip='192.168.237.1', networkInterface='', port=36009, secure=false, accessKey='', secretKey='', heartBeatInterval=null, heartBeatTimeout=null, ipDeleteTimeout=null, instanceEnabled=true, ephemeral=true, failureToleranceEnabled=false}, ipDeleteTimeout=null, failFast=true}
2023-06-13 19:27:23,203 INFO [background-preinit] o.h.validator.internal.util.Version [Version.java : 21] HV000001: Hibernate Validator 6.2.3.Final
2023-06-13 19:27:24,897 INFO [main] c.a.n.p.a.s.c.ClientAuthPluginManager [ClientAuthPluginManager.java : 56] [ClientAuthPluginManager] Load ClientAuthService com.alibaba.nacos.client.auth.impl.NacosClientAuthServiceImpl success.
2023-06-13 19:27:24,898 INFO [main] c.a.n.p.a.s.c.ClientAuthPluginManager [ClientAuthPluginManager.java : 56] [ClientAuthPluginManager] Load ClientAuthService com.alibaba.nacos.client.auth.ram.RamClientAuthServiceImpl success.
2023-06-13 19:27:29,866 WARN [main] c.a.c.n.c.NacosPropertySourceBuilder [NacosPropertySourceBuilder.java : 87] Ignore the empty nacos configuration and get it based on dataId[ubcs-xxljob] & group[DEFAULT_GROUP]
2023-06-13 19:27:29,878 WARN [main] c.a.c.n.c.NacosPropertySourceBuilder [NacosPropertySourceBuilder.java : 87] Ignore the empty nacos configuration and get it based on dataId[ubcs-xxljob.yaml] & group[DEFAULT_GROUP]
2023-06-13 19:27:29,887 WARN [main] c.a.c.n.c.NacosPropertySourceBuilder [NacosPropertySourceBuilder.java : 87] Ignore the empty nacos configuration and get it based on dataId[ubcs-xxljob-dev.yaml] & group[DEFAULT_GROUP]
2023-06-13 19:27:29,889 INFO [main] o.s.c.b.c.PropertySourceBootstrapConfiguration [PropertySourceBootstrapConfiguration.java : 109] Located property source: [BootstrapPropertySource {name='bootstrapProperties-ubcs-xxljob-dev.yaml,DEFAULT_GROUP'}, BootstrapPropertySource {name='bootstrapProperties-ubcs-xxljob.yaml,DEFAULT_GROUP'}, BootstrapPropertySource {name='bootstrapProperties-ubcs-xxljob,DEFAULT_GROUP'}, BootstrapPropertySource {name='bootstrapProperties-ubcs-dev.yaml,DEFAULT_GROUP'}, BootstrapPropertySource {name='bootstrapProperties-ubcs.yaml,DEFAULT_GROUP'}]
2023-06-13 19:27:29,927 INFO [main] c.v.ubcs.job.executor.JobApplication [SpringApplication.java : 640] The following 1 profile is active: "dev"
2023-06-13 19:27:32,955 INFO [main] o.s.d.r.c.RepositoryConfigurationDelegate [RepositoryConfigurationDelegate.java : 262] Multiple Spring Data modules found, entering strict repository configuration mode
2023-06-13 19:27:32,960 INFO [main] o.s.d.r.c.RepositoryConfigurationDelegate [RepositoryConfigurationDelegate.java : 132] Bootstrapping Spring Data Redis repositories in DEFAULT mode.
2023-06-13 19:27:33,005 INFO [main] o.s.d.r.c.RepositoryConfigurationDelegate [RepositoryConfigurationDelegate.java : 201] Finished Spring Data repository scanning in 14 ms. Found 0 Redis repository interfaces.
2023-06-13 19:27:33,403 INFO [main] o.s.cloud.context.scope.GenericScope [GenericScope.java : 283] BeanFactory id=8a87525c-4e09-336f-9e65-667cebc7cd92
2023-06-13 19:27:33,410 INFO [main] o.s.c.l.p.BladePropertySourcePostProcessor [BladePropertySourcePostProcessor.java : 150] BladePropertySourcePostProcessor init.
2023-06-13 19:27:33,444 INFO [main] o.s.c.l.p.BladePropertySourcePostProcessor [BladePropertySourcePostProcessor.java : 62] BladePropertySourcePostProcessor process @BladePropertySource bean.
2023-06-13 19:27:33,517 WARN [main] o.s.c.l.p.BladePropertySourcePostProcessor [BladePropertySourcePostProcessor.java : 67] Not found @BladePropertySource on spring bean class.
2023-06-13 19:27:34,238 INFO [main] o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker [PostProcessorRegistrationDelegate.java : 376] Bean 'org.springframework.cloud.commons.config.CommonsConfigAutoConfiguration' of type [org.springframework.cloud.commons.config.CommonsConfigAutoConfiguration] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2023-06-13 19:27:34,246 INFO [main] o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker [PostProcessorRegistrationDelegate.java : 376] Bean 'org.springframework.cloud.client.loadbalancer.LoadBalancerDefaultMappingsProviderAutoConfiguration' of type [org.springframework.cloud.client.loadbalancer.LoadBalancerDefaultMappingsProviderAutoConfiguration] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2023-06-13 19:27:34,249 INFO [main] o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker [PostProcessorRegistrationDelegate.java : 376] Bean 'loadBalancerClientsDefaultsMappingsProvider' of type [org.springframework.cloud.client.loadbalancer.LoadBalancerDefaultMappingsProviderAutoConfiguration$$Lambda$490/381149258] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2023-06-13 19:27:34,254 INFO [main] o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker [PostProcessorRegistrationDelegate.java : 376] Bean 'defaultsBindHandlerAdvisor' of type [org.springframework.cloud.commons.config.DefaultsBindHandlerAdvisor] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2023-06-13 19:27:34,325 INFO [main] o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker [PostProcessorRegistrationDelegate.java : 376] Bean 'spring.cloud.sentinel-com.alibaba.cloud.sentinel.SentinelProperties' of type [com.alibaba.cloud.sentinel.SentinelProperties] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2023-06-13 19:27:34,332 INFO [main] o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker [PostProcessorRegistrationDelegate.java : 376] Bean 'com.alibaba.cloud.sentinel.custom.SentinelAutoConfiguration' of type [com.alibaba.cloud.sentinel.custom.SentinelAutoConfiguration] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2023-06-13 19:27:34,718 WARN [main] io.undertow.websockets.jsr [Bootstrap.java : 68] UT026010: Buffer pool was not set on WebSocketDeploymentInfo, the default pool will be used
2023-06-13 19:27:34,765 INFO [main] io.undertow.servlet [ServletContextImpl.java : 382] Initializing Spring embedded WebApplicationContext
2023-06-13 19:27:34,765 INFO [main] o.s.b.w.s.c.ServletWebServerApplicationContext [ServletWebServerApplicationContext.java : 292] Root WebApplicationContext: initialization completed in 4797 ms
2023-06-13 19:27:35,392 INFO [main] c.v.u.j.executor.config.XxlJobConfig [XxlJobConfig.java : 43] >>>>>>>>>>> xxl-job config init.
2023-06-13 19:27:35,469 INFO [main] c.x.job.core.executor.XxlJobExecutor [XxlJobExecutor.java : 211] >>>>>>>>>>> xxl-job register jobhandler success, name:shardingJobHandler, jobHandler:com.xxl.job.core.handler.impl.MethodJobHandler@1edac3b4[class com.vci.ubcs.job.executor.jobhandler.SampleXxlJob#shardingJobHandler]
2023-06-13 19:27:35,470 INFO [main] c.x.job.core.executor.XxlJobExecutor [XxlJobExecutor.java : 211] >>>>>>>>>>> xxl-job register jobhandler success, name:commandJobHandler, jobHandler:com.xxl.job.core.handler.impl.MethodJobHandler@7641ed02[class com.vci.ubcs.job.executor.jobhandler.SampleXxlJob#commandJobHandler]
2023-06-13 19:27:35,471 INFO [main] c.x.job.core.executor.XxlJobExecutor [XxlJobExecutor.java : 211] >>>>>>>>>>> xxl-job register jobhandler success, name:demoJobHandler2, jobHandler:com.xxl.job.core.handler.impl.MethodJobHandler@4ebed2b3[class com.vci.ubcs.job.executor.jobhandler.SampleXxlJob#demoJobHandler2]
2023-06-13 19:27:35,478 INFO [main] c.x.job.core.executor.XxlJobExecutor [XxlJobExecutor.java : 211] >>>>>>>>>>> xxl-job register jobhandler success, name:demoJobHandler, jobHandler:com.xxl.job.core.handler.impl.MethodJobHandler@11069eac[class com.vci.ubcs.job.executor.jobhandler.SampleXxlJob#demoJobHandler]
2023-06-13 19:27:35,479 INFO [main] c.x.job.core.executor.XxlJobExecutor [XxlJobExecutor.java : 211] >>>>>>>>>>> xxl-job register jobhandler success, name:httpJobHandler, jobHandler:com.xxl.job.core.handler.impl.MethodJobHandler@5909285b[class com.vci.ubcs.job.executor.jobhandler.SampleXxlJob#httpJobHandler]
2023-06-13 19:27:36,268 INFO [main] c.a.c.s.SentinelWebMvcConfigurer [SentinelWebMvcConfigurer.java : 52] [Sentinel Starter] register SentinelWebInterceptor with urlPatterns: [/**].
2023-06-13 19:27:36,364 INFO [main] o.s.c.c.v.BladeRequestMappingHandlerMapping [BladeRequestMappingHandlerMapping.java : 99] Mapped "{ [/error], produces [text/html]}" onto org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController#errorHtml(HttpServletRequest, HttpServletResponse)
2023-06-13 19:27:36,364 INFO [main] o.s.c.c.v.BladeRequestMappingHandlerMapping [BladeRequestMappingHandlerMapping.java : 99] Mapped "{ [/error]}" onto org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController#error(HttpServletRequest)
2023-06-13 19:27:36,365 INFO [main] o.s.c.c.v.BladeRequestMappingHandlerMapping [BladeRequestMappingHandlerMapping.java : 99] Mapped "{GET [/test/testRequest]}" onto com.vci.ubcs.job.executor.controller.TestController#testRequest(String)
2023-06-13 19:27:38,769 INFO [main] com.alibaba.nacos.client.naming [InitUtils.java : 62] initializer namespace from System Property : null
2023-06-13 19:27:38,771 INFO [main] com.alibaba.nacos.client.naming [InitUtils.java : 66] initializer namespace from System Environment :null
2023-06-13 19:27:38,772 INFO [main] com.alibaba.nacos.client.naming [InitUtils.java : 73] initializer namespace from System Property :null
2023-06-13 19:27:38,800 INFO [main] c.a.n.p.a.s.c.ClientAuthPluginManager [ClientAuthPluginManager.java : 56] [ClientAuthPluginManager] Load ClientAuthService com.alibaba.nacos.client.auth.impl.NacosClientAuthServiceImpl success.
2023-06-13 19:27:38,801 INFO [main] c.a.n.p.a.s.c.ClientAuthPluginManager [ClientAuthPluginManager.java : 56] [ClientAuthPluginManager] Load ClientAuthService com.alibaba.nacos.client.auth.ram.RamClientAuthServiceImpl success.
2023-06-13 19:27:38,818 INFO [main] c.alibaba.nacos.common.remote.client [RpcClientFactory.java : 95] [RpcClientFactory] create a new rpc client of 4c02bb09-11a1-4268-a964-ab30e2a46b2a
2023-06-13 19:27:38,819 INFO [main] c.alibaba.nacos.common.remote.client [LoggerUtils.java : 60] [4c02bb09-11a1-4268-a964-ab30e2a46b2a] RpcClient init label, labels = {module=naming, source=sdk}
2023-06-13 19:27:38,823 INFO [main] c.alibaba.nacos.common.remote.client [LoggerUtils.java : 60] [4c02bb09-11a1-4268-a964-ab30e2a46b2a] RpcClient init, ServerListFactory = com.alibaba.nacos.client.naming.core.ServerListManager
2023-06-13 19:27:38,824 INFO [main] c.alibaba.nacos.common.remote.client [LoggerUtils.java : 60] [4c02bb09-11a1-4268-a964-ab30e2a46b2a] Registry connection listener to current client:com.alibaba.nacos.client.naming.remote.gprc.redo.NamingGrpcRedoService
2023-06-13 19:27:38,825 INFO [main] c.alibaba.nacos.common.remote.client [LoggerUtils.java : 60] [4c02bb09-11a1-4268-a964-ab30e2a46b2a] Register server push request handler:com.alibaba.nacos.client.naming.remote.gprc.NamingPushRequestHandler
2023-06-13 19:27:38,826 INFO [main] c.alibaba.nacos.common.remote.client [LoggerUtils.java : 60] [4c02bb09-11a1-4268-a964-ab30e2a46b2a] Try to connect to server on start up, server: {serverIp = 'localhost', server main port = 8848}
2023-06-13 19:27:38,952 INFO [main] c.alibaba.nacos.common.remote.client [LoggerUtils.java : 60] [4c02bb09-11a1-4268-a964-ab30e2a46b2a] Success to connect to server [localhost:8848] on start up, connectionId = 1686655658836_127.0.0.1_61920
2023-06-13 19:27:38,954 INFO [com.alibaba.nacos.client.remote.worker] c.alibaba.nacos.common.remote.client [LoggerUtils.java : 60] [4c02bb09-11a1-4268-a964-ab30e2a46b2a] Notify connected event to listeners.
2023-06-13 19:27:38,953 INFO [main] c.alibaba.nacos.common.remote.client [LoggerUtils.java : 60] [4c02bb09-11a1-4268-a964-ab30e2a46b2a] Register server push request handler:com.alibaba.nacos.common.remote.client.RpcClient$ConnectResetRequestHandler
2023-06-13 19:27:38,956 INFO [com.alibaba.nacos.client.remote.worker] com.alibaba.nacos.client.naming [NamingGrpcRedoService.java : 76] Grpc connection connect
2023-06-13 19:27:38,956 INFO [main] c.alibaba.nacos.common.remote.client [LoggerUtils.java : 60] [4c02bb09-11a1-4268-a964-ab30e2a46b2a] Register server push request handler:com.alibaba.nacos.common.remote.client.RpcClient$$Lambda$376/841721161
2023-06-13 19:27:39,271 INFO [main] o.s.b.a.e.web.EndpointLinksResolver [EndpointLinksResolver.java : 58] Exposing 20 endpoint(s) beneath base path '/actuator'
2023-06-13 19:27:41,244 INFO [main] o.s.b.f.a.AutowiredAnnotationBeanPostProcessor [AutowiredAnnotationBeanPostProcessor.java : 367] Inconsistent constructor declaration on bean with name 'org.springblade.core.launch.server.ServerInfo': single autowire-marked constructor flagged as optional - this constructor is effectively required since there is no default constructor to fall back to: public org.springblade.core.launch.server.ServerInfo(org.springframework.boot.autoconfigure.web.ServerProperties)
2023-06-13 19:27:42,689 WARN [main] o.s.c.l.c.LoadBalancerCacheAutoConfiguration$LoadBalancerCaffeineWarnLogger [LoadBalancerCacheAutoConfiguration.java : 82] Spring Cloud LoadBalancer is currently working with the default cache. While this cache implementation is useful for development and tests, it's recommended to use Caffeine cache in production.You can switch to using Caffeine cache, by adding it and org.springframework.cache.caffeine.CaffeineCacheManager to the classpath.
2023-06-13 19:27:42,774 INFO [main] c.x.r.r.p.XxlRpcProviderFactory [XxlRpcProviderFactory.java : 197] >>>>>>>>>>> xxl-rpc, provider factory add service success. serviceKey = com.xxl.job.core.biz.ExecutorBiz, serviceBean = class com.xxl.job.core.biz.impl.ExecutorBizImpl
2023-06-13 19:27:43,447 INFO [main] com.alibaba.nacos.client.naming [NamingClientProxyDelegate.java : 141] [SUBSCRIBE-SERVICE] service:ubcs-xxljob, group:DEFAULT_GROUP, clusters:DEFAULT
2023-06-13 19:27:43,470 INFO [main] com.alibaba.nacos.client.naming [ServiceInfoHolder.java : 181] init new ips(0) service: DEFAULT_GROUP@@ubcs-xxljob@@DEFAULT -> []
2023-06-13 19:27:43,492 INFO [main] com.alibaba.nacos.client.naming [ServiceInfoHolder.java : 166] current ips:(0) service: DEFAULT_GROUP@@ubcs-xxljob@@DEFAULT -> []
2023-06-13 19:27:43,515 INFO [Thread-64] com.xxl.rpc.remoting.net.Server [NettyHttpServer.java : 66] >>>>>>>>>>> xxl-rpc remoting server start success, nettype = com.xxl.rpc.remoting.net.impl.netty_http.server.NettyHttpServer, port = 7018
2023-06-13 19:27:43,537 INFO [main] io.undertow [Undertow.java : 120] starting server: Undertow - 2.2.18.Final
2023-06-13 19:27:43,554 INFO [main] org.xnio [Xnio.java : 95] XNIO version 3.8.7.Final
2023-06-13 19:27:43,579 INFO [main] org.xnio.nio [NioXnio.java : 58] XNIO NIO Implementation Version 3.8.7.Final
2023-06-13 19:27:43,652 INFO [main] org.jboss.threads [Version.java : 52] JBoss Threads version 3.1.0.Final
2023-06-13 19:27:43,765 INFO [main] o.s.b.w.e.undertow.UndertowWebServer [UndertowWebServer.java : 119] Undertow started on port(s) 36009 (http)
2023-06-13 19:27:43,772 INFO [main] com.alibaba.nacos.client.naming [NamingGrpcClientProxy.java : 111] [REGISTER-SERVICE] public registering service ubcs-xxljob with instance Instance{instanceId='null', ip='192.168.237.1', port=36009, weight=1.0, healthy=true, enabled=true, ephemeral=true, clusterName='DEFAULT', serviceName='null', metadata={preserved.register.source=SPRING_CLOUD}}
2023-06-13 19:27:43,783 INFO [main] c.a.c.n.r.NacosServiceRegistry [NacosServiceRegistry.java : 75] nacos registry, DEFAULT_GROUP ubcs-xxljob 192.168.237.1:36009 register finished
2023-06-13 19:27:44,012 INFO [nacos-grpc-client-executor-localhost-8] c.alibaba.nacos.common.remote.client [LoggerUtils.java : 60] [4c02bb09-11a1-4268-a964-ab30e2a46b2a] Receive server push request, request = NotifySubscriberRequest, requestId = 1078
2023-06-13 19:27:44,018 INFO [nacos-grpc-client-executor-localhost-8] com.alibaba.nacos.client.naming [ServiceInfoHolder.java : 181] init new ips(1) service: DEFAULT_GROUP@@ubcs-xxljob -> [{"ip":"192.168.237.1","port":36009,"weight":1.0,"healthy":true,"enabled":true,"ephemeral":true,"clusterName":"DEFAULT","serviceName":"DEFAULT_GROUP@@ubcs-xxljob","metadata":{"preserved.register.source":"SPRING_CLOUD"},"ipDeleteTimeout":30000,"instanceHeartBeatInterval":5000,"instanceHeartBeatTimeOut":15000}]
2023-06-13 19:27:44,019 INFO [nacos-grpc-client-executor-localhost-8] com.alibaba.nacos.client.naming [ServiceInfoHolder.java : 166] current ips:(1) service: DEFAULT_GROUP@@ubcs-xxljob -> [{"ip":"192.168.237.1","port":36009,"weight":1.0,"healthy":true,"enabled":true,"ephemeral":true,"clusterName":"DEFAULT","serviceName":"DEFAULT_GROUP@@ubcs-xxljob","metadata":{"preserved.register.source":"SPRING_CLOUD"},"ipDeleteTimeout":30000,"instanceHeartBeatInterval":5000,"instanceHeartBeatTimeOut":15000}]
2023-06-13 19:27:44,028 INFO [nacos-grpc-client-executor-localhost-8] c.alibaba.nacos.common.remote.client [LoggerUtils.java : 60] [4c02bb09-11a1-4268-a964-ab30e2a46b2a] Ack server push request, request = NotifySubscriberRequest, requestId = 1078
2023-06-13 19:27:44,106 WARN [Thread-17] c.a.nacos.common.notify.NotifyCenter [NotifyCenter.java : 136] [NotifyCenter] Start destroying Publisher
2023-06-13 19:27:44,106 WARN [Thread-8] c.a.n.c.http.HttpClientBeanHolder [HttpClientBeanHolder.java : 108] [HttpClientBeanHolder] Start destroying common HttpClient
2023-06-13 19:27:44,106 WARN [Thread-17] c.a.nacos.common.notify.NotifyCenter [NotifyCenter.java : 153] [NotifyCenter] Destruction of the end
2023-06-13 19:27:44,107 WARN [Thread-8] c.a.n.c.http.HttpClientBeanHolder [HttpClientBeanHolder.java : 114] [HttpClientBeanHolder] Destruction of the end
2023-06-13 19:27:44,471 INFO [com.alibaba.nacos.client.naming.updater.0] com.alibaba.nacos.client.naming [ServiceInfoHolder.java : 234] new ips(1) service: DEFAULT_GROUP@@ubcs-xxljob@@DEFAULT -> [{"ip":"192.168.237.1","port":36009,"weight":1.0,"healthy":true,"enabled":true,"ephemeral":true,"clusterName":"DEFAULT","serviceName":"DEFAULT_GROUP@@ubcs-xxljob","metadata":{"preserved.register.source":"SPRING_CLOUD"},"ipDeleteTimeout":30000,"instanceHeartBeatInterval":5000,"instanceHeartBeatTimeOut":15000}]
2023-06-13 19:27:44,472 INFO [com.alibaba.nacos.client.naming.updater.0] com.alibaba.nacos.client.naming [ServiceInfoHolder.java : 166] current ips:(1) service: DEFAULT_GROUP@@ubcs-xxljob@@DEFAULT -> [{"ip":"192.168.237.1","port":36009,"weight":1.0,"healthy":true,"enabled":true,"ephemeral":true,"clusterName":"DEFAULT","serviceName":"DEFAULT_GROUP@@ubcs-xxljob","metadata":{"preserved.register.source":"SPRING_CLOUD"},"ipDeleteTimeout":30000,"instanceHeartBeatInterval":5000,"instanceHeartBeatTimeOut":15000}]
2023-06-13 19:27:44,583 INFO [main] o.s.core.launch.StartEventListener [StartEventListener.java : 45] ---[UBCS-XXLJOB]---启动完成,当前使用的端口:[36009],环境变量:[dev]---
2023-06-13 19:27:44,608 INFO [main] c.v.ubcs.job.executor.JobApplication [StartupInfoLogger.java : 61] Started JobApplication in 23.472 seconds (JVM running for 26.279)
2023-06-13 19:27:44,611 INFO [SpringApplicationShutdownHook] io.undertow [Undertow.java : 259] stopping server: Undertow - 2.2.18.Final
2023-06-13 19:27:44,615 INFO [main] c.a.n.client.config.impl.CacheData [CacheData.java : 65] nacos.cache.data.init.snapshot = true
2023-06-13 19:27:44,617 INFO [main] c.a.n.c.config.impl.ClientWorker [ClientWorker.java : 373] [fixed-localhost_8848] [subscribe] ubcs-dev.yaml+DEFAULT_GROUP
2023-06-13 19:27:44,620 INFO [main] c.a.n.client.config.impl.CacheData [CacheData.java : 180] [fixed-localhost_8848] [add-listener] ok, tenant=, dataId=ubcs-dev.yaml, group=DEFAULT_GROUP, cnt=1
2023-06-13 19:27:44,621 INFO [main] c.a.c.n.r.NacosContextRefresher [NacosContextRefresher.java : 105] listening config: dataId=ubcs-dev.yaml, group=DEFAULT_GROUP
2023-06-13 19:27:44,622 INFO [main] c.a.n.c.config.impl.ClientWorker [ClientWorker.java : 373] [fixed-localhost_8848] [subscribe] ubcs-xxljob+DEFAULT_GROUP
2023-06-13 19:27:44,624 INFO [main] c.a.n.client.config.impl.CacheData [CacheData.java : 180] [fixed-localhost_8848] [add-listener] ok, tenant=, dataId=ubcs-xxljob, group=DEFAULT_GROUP, cnt=1
2023-06-13 19:27:44,624 INFO [main] c.a.c.n.r.NacosContextRefresher [NacosContextRefresher.java : 105] listening config: dataId=ubcs-xxljob, group=DEFAULT_GROUP
2023-06-13 19:27:44,626 INFO [main] c.a.n.c.config.impl.ClientWorker [ClientWorker.java : 373] [fixed-localhost_8848] [subscribe] ubcs.yaml+DEFAULT_GROUP
2023-06-13 19:27:44,627 INFO [main] c.a.n.client.config.impl.CacheData [CacheData.java : 180] [fixed-localhost_8848] [add-listener] ok, tenant=, dataId=ubcs.yaml, group=DEFAULT_GROUP, cnt=1
2023-06-13 19:27:44,628 INFO [main] c.a.c.n.r.NacosContextRefresher [NacosContextRefresher.java : 105] listening config: dataId=ubcs.yaml, group=DEFAULT_GROUP
2023-06-13 19:27:44,629 INFO [main] c.a.n.c.config.impl.ClientWorker [ClientWorker.java : 373] [fixed-localhost_8848] [subscribe] ubcs-xxljob.yaml+DEFAULT_GROUP
2023-06-13 19:27:44,629 INFO [main] c.a.n.client.config.impl.CacheData [CacheData.java : 180] [fixed-localhost_8848] [add-listener] ok, tenant=, dataId=ubcs-xxljob.yaml, group=DEFAULT_GROUP, cnt=1
2023-06-13 19:27:44,630 INFO [main] c.a.c.n.r.NacosContextRefresher [NacosContextRefresher.java : 105] listening config: dataId=ubcs-xxljob.yaml, group=DEFAULT_GROUP
2023-06-13 19:27:44,630 INFO [main] c.a.n.c.config.impl.ClientWorker [ClientWorker.java : 373] [fixed-localhost_8848] [subscribe] ubcs-xxljob-dev.yaml+DEFAULT_GROUP
2023-06-13 19:27:44,631 INFO [main] c.a.n.client.config.impl.CacheData [CacheData.java : 180] [fixed-localhost_8848] [add-listener] ok, tenant=, dataId=ubcs-xxljob-dev.yaml, group=DEFAULT_GROUP, cnt=1
2023-06-13 19:27:44,631 INFO [main] c.a.c.n.r.NacosContextRefresher [NacosContextRefresher.java : 105] listening config: dataId=ubcs-xxljob-dev.yaml, group=DEFAULT_GROUP
2023-06-13 19:27:44,636 ERROR [SpringApplicationShutdownHook] c.a.cloud.nacos.discovery.NacosWatch [NacosWatch.java : 180] namingService unsubscribe failed, properties:NacosDiscoveryProperties{serverAddr='localhost:8848', username='', password='', endpoint='', namespace='', watchDelay=30000, logName='', service='ubcs-xxljob', weight=1.0, clusterName='DEFAULT', group='DEFAULT_GROUP', namingLoadCacheAtStart='false', metadata={preserved.register.source=SPRING_CLOUD}, registerEnabled=true, ip='192.168.237.1', networkInterface='', port=36009, secure=false, accessKey='', secretKey='', heartBeatInterval=null, heartBeatTimeout=null, ipDeleteTimeout=null, instanceEnabled=true, ephemeral=true, failureToleranceEnabled=false}, ipDeleteTimeout=null, failFast=true}
java.lang.IllegalStateException: UT015023: This Context has been already destroyed
    at io.undertow.servlet.spec.ServletContextImpl.getDeploymentInfo(ServletContextImpl.java:211)
    at io.undertow.servlet.spec.ServletContextImpl.getInitParameterNames(ServletContextImpl.java:449)
@@ -1096,4 +116,29 @@
    at java.lang.Iterable.forEach(Iterable.java:75)
    at org.springframework.boot.SpringApplicationShutdownHook.run(SpringApplicationShutdownHook.java:114)
    at java.lang.Thread.run(Thread.java:748)
2023-06-07 19:35:58,206 INFO [Thread-66] com.xxl.rpc.remoting.net.Server [NettyHttpServer.java : 74] >>>>>>>>>>> xxl-rpc remoting server stop.
2023-06-13 19:27:44,638 INFO [Thread-64] com.xxl.rpc.remoting.net.Server [NettyHttpServer.java : 74] >>>>>>>>>>> xxl-rpc remoting server stop.
2023-06-13 19:27:45,580 ERROR [xxl-job, executor ExecutorRegistryThread] c.x.job.core.util.XxlJobRemotingUtil [XxlJobRemotingUtil.java : 146] Connection refused: connect
java.net.ConnectException: Connection refused: connect
    at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:81)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:476)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:218)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:200)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:162)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:394)
    at java.net.Socket.connect(Socket.java:606)
    at sun.net.NetworkClient.doConnect(NetworkClient.java:175)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:463)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:558)
    at sun.net.www.http.HttpClient.<init>(HttpClient.java:242)
    at sun.net.www.http.HttpClient.New(HttpClient.java:339)
    at sun.net.www.http.HttpClient.New(HttpClient.java:357)
    at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:1226)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1162)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1056)
    at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:990)
    at com.xxl.job.core.util.XxlJobRemotingUtil.postBody(XxlJobRemotingUtil.java:94)
    at com.xxl.job.core.biz.client.AdminBizClient.registry(AdminBizClient.java:41)
    at com.xxl.job.core.thread.ExecutorRegistryThread$1.run(ExecutorRegistryThread.java:48)
    at java.lang.Thread.run(Thread.java:748)
2023-06-13 19:27:45,581 INFO [xxl-job, executor ExecutorRegistryThread] c.x.j.c.t.ExecutorRegistryThread [ExecutorRegistryThread.java : 54] >>>>>>>>>>> xxl-job registry fail, registryParam:RegistryParam{registryGroup='EXECUTOR', registryKey='blade-xxljob', registryValue='127.0.0.1:7018'}, registryResult:ReturnT [code=500, msg=xxl-rpc remoting error(Connection refused: connect), for url : http://127.0.0.1:37012/xxl-job-admin/api/registry, content=null]
Source/data/applogs/xxl-job/xxl-job-executor-sample-springboot.log.2023-06-07.zip
Binary files differ
Source/data/applogs/xxl-job/xxl-job-executor-sample-springboot.log.2023-06-09.zip
Binary files differ
Source/¸ü¸Ä¹ýµÄjar°ü.zip
Binary files differ
Source/¸ü¸Ä¹ýµÄjar°ü£¨ÓиüУ©.zip
Binary files differ