From 5d2a9e489054a7bc4f453a8fc958fa288ee108be Mon Sep 17 00:00:00 2001 From: TangJ Date: Tue, 13 Sep 2022 01:21:32 +0000 Subject: [PATCH 01/55] update docs/FAQ.md. Signed-off-by: TangJ --- docs/FAQ.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/FAQ.md b/docs/FAQ.md index a99ada0..c553bae 100644 --- a/docs/FAQ.md +++ b/docs/FAQ.md @@ -62,7 +62,7 @@ Lanius常见问题列表 #### Q: 调度平台新增资源库时,提示报错信息“远程资源库连接异常,请检查资源库!”,日志输出“Table 'lanius.r_job' doesn't exist” - 需要先使用设计器初始化资源库,然后才能通过调度平台新增资源库。参考issues: https://gitee.com/yuzhou-big-data-laboratory/lanius-orchestrate/issues/I5NVP2 -#### Q: 调度平台执行job或trans,是用arte方式吗?源代码是哪个文件? +#### Q: 调度平台执行job或trans,是用Carte方式吗?源代码是哪个文件? - 是采用的Carte方式,源代码文件可参考:https://gitee.com/yuzhou-big-data-laboratory/lanius-orchestrate/blob/master/lanius-orchestrate-server/modules/orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/quartz/handler/category/impl/KettleExecutorHandler.java #### Q: 项目构建报错:Could not find artifact org.apache.xerces:com.springsource.org.apache.xerces:pom:2.8.1 ,依赖包拉取失败 -- Gitee From f7d6ed4ac72925486de8d5023070bef926c0c06e Mon Sep 17 00:00:00 2001 From: TangJ Date: Tue, 13 Sep 2022 02:07:15 +0000 Subject: [PATCH 02/55] update docs/FAQ.md. Signed-off-by: TangJ --- docs/FAQ.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/FAQ.md b/docs/FAQ.md index c553bae..4fc4da4 100644 --- a/docs/FAQ.md +++ b/docs/FAQ.md @@ -1,5 +1,6 @@ Lanius常见问题列表 ----------------- +#### 2022-09-09 #### Q: 如何部署并开始使用? - 请参阅《README.md》中的部署教程进行产品的部署,需要注意按部署文档中的说明步骤操作,提高一次性部署成功率,遇到问题可以在QQ群155800768 进行交流。 -- Gitee From c59b62514f77cf0de4bd7c87ed6775d6558b626e Mon Sep 17 00:00:00 2001 From: "hujian@yzbdl.ac.cn" Date: Tue, 13 Sep 2022 18:19:45 +0800 Subject: [PATCH 03/55] =?UTF-8?q?1=E3=80=81=E4=BC=98=E5=8C=96=E8=BE=BE?= =?UTF-8?q?=E6=A2=A6=E6=95=B0=E6=8D=AE=E5=BA=93=E9=80=82=E9=85=8D=E6=96=B9?= =?UTF-8?q?=E5=BC=8F=EF=BC=8C=E7=B2=BE=E7=AE=80=E4=BB=A3=E7=A0=81=202?= =?UTF-8?q?=E3=80=81=E4=BC=98=E5=8C=96=E8=BE=BE=E6=A2=A6=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=BA=93=E5=88=9D=E5=A7=8B=E5=8C=96=E8=84=9A=E6=9C=AC=EF=BC=8C?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=A8=A1=E5=BC=8F=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/.gitignore | 8 + .idea/inspectionProfiles/Project_Default.xml | 36 + .idea/lanius-orchestrate-2.iml | 9 + .idea/modules.xml | 8 + .idea/vcs.xml | 6 + db/lanius_orchestrate_dm.sql | 646 +++++++++--------- .../LaniusOrchestrateApplication.java | 2 +- .../src/main/resources/application-dev.yml | 2 +- .../src/main/resources/application-dm.yml | 4 +- .../lanius-orchestrate-db-adapter-dm/pom.xml | 33 - .../dm/resource/impl/ServerDbAdapterImpl.java | 80 --- .../impl/ServerProgramDbAdapterImpl.java | 89 --- .../impl/TaskResourceConfigDbAdapterImpl.java | 73 -- .../impl/TaskResourceDbAdapterImpl.java | 66 -- .../impl/TaskResourceGroupDbAdapterImpl.java | 54 -- .../dm/system/impl/ManagerDbAdapterImpl.java | 28 - .../dm/system/impl/OrgDbAdapterImpl.java | 53 -- .../system/impl/PermissionDbAdapterImpl.java | 53 -- .../dm/system/impl/RoleDbAdapterImpl.java | 74 -- .../impl/RolePermissionDbAdapterImpl.java | 42 -- .../dm/system/impl/UserDbAdapterImpl.java | 113 --- .../dm/system/impl/UserLogDbAdapterImpl.java | 45 -- .../dm/system/impl/UserOrgDbAdapterImpl.java | 49 -- .../dm/system/impl/UserRoleDbAdapterImpl.java | 41 -- .../dm/system/mapper/PermissionMapper.java | 45 -- .../adapter/dm/system/mapper/RoleMapper.java | 38 -- .../adapter/dm/system/mapper/UserMapper.java | 87 --- .../task/impl/TaskInstanceDbAdapterImpl.java | 132 ---- .../dm/task/impl/TaskPlanDbAdapterImpl.java | 117 ---- .../task/impl/TaskPlanGroupDbAdapterImpl.java | 57 -- .../task/impl/TaskStepLogDbAdapterImpl.java | 46 -- .../mapper/resource/ServerMapper.xml | 15 - .../resource/TaskResourceConfigMapper.xml | 15 - .../mapper/resource/TaskResourceMapper.xml | 5 - .../pom.xml | 33 - .../resource/impl/ServerDbAdapterImpl.java | 80 --- .../impl/ServerProgramDbAdapterImpl.java | 89 --- .../impl/TaskResourceConfigDbAdapterImpl.java | 73 -- .../impl/TaskResourceDbAdapterImpl.java | 66 -- .../impl/TaskResourceGroupDbAdapterImpl.java | 54 -- .../mysql/resource/mapper/ServerMapper.java | 63 -- .../resource/mapper/ServerProgramMapper.java | 70 -- .../mapper/TaskResourceConfigMapper.java | 55 -- .../mapper/TaskResourceGroupMapper.java | 35 - .../resource/mapper/TaskResourceMapper.java | 47 -- .../system/impl/ManagerDbAdapterImpl.java | 28 - .../mysql/system/impl/MenuDbAdapterImpl.java | 29 - .../mysql/system/impl/OrgDbAdapterImpl.java | 53 -- .../system/impl/PermissionDbAdapterImpl.java | 53 -- .../mysql/system/impl/RoleDbAdapterImpl.java | 74 -- .../impl/RolePermissionDbAdapterImpl.java | 42 -- .../mysql/system/impl/UserDbAdapterImpl.java | 112 --- .../system/impl/UserLogDbAdapterImpl.java | 45 -- .../system/impl/UserOrgDbAdapterImpl.java | 49 -- .../system/impl/UserRoleDbAdapterImpl.java | 41 -- .../mysql/system/mapper/ManagerMapper.java | 26 - .../mysql/system/mapper/MenuMapper.java | 32 - .../mysql/system/mapper/OrgMapper.java | 38 -- .../system/mapper/RolePermissionMapper.java | 28 - .../mysql/system/mapper/UserLogMapper.java | 36 - .../mysql/system/mapper/UserOrgMapper.java | 26 - .../mysql/system/mapper/UserRoleMapper.java | 30 - .../task/impl/TaskInstanceDbAdapterImpl.java | 132 ---- .../task/impl/TaskPlanDbAdapterImpl.java | 117 ---- .../task/impl/TaskPlanGroupDbAdapterImpl.java | 57 -- .../task/impl/TaskStepLogDbAdapterImpl.java | 46 -- .../mysql/task/mapper/TaskInstanceMapper.java | 118 ---- .../task/mapper/TaskPlanGroupMapper.java | 49 -- .../mysql/task/mapper/TaskPlanMapper.java | 92 --- .../mysql/task/mapper/TaskStepLogMapper.java | 41 -- .../mapper/resource/ServerMapper.xml | 15 - .../resource/TaskResourceConfigMapper.xml | 15 - .../mapper/resource/TaskResourceMapper.xml | 5 - .../lanius-orchestrate-db-adapter/pom.xml | 28 - .../db/adapter/resource/ServerDbAdapter.java | 61 -- .../resource/ServerProgramDbAdapter.java | 69 -- .../resource/TaskResourceConfigDbAdapter.java | 55 -- .../resource/TaskResourceDbAdapter.java | 52 -- .../resource/TaskResourceGroupDbAdapter.java | 42 -- .../db/adapter/system/MenuDbAdapter.java | 25 - .../db/adapter/system/OrgDbAdapter.java | 43 -- .../adapter/system/PermissionDbAdapter.java | 42 -- .../db/adapter/system/RoleDbAdapter.java | 58 -- .../system/RolePermissionDbAdapter.java | 34 - .../db/adapter/system/UserDbAdapter.java | 91 --- .../db/adapter/system/UserLogDbAdapter.java | 38 -- .../db/adapter/system/UserOrgDbAdapter.java | 39 -- .../db/adapter/system/UserRoleDbAdapter.java | 34 - .../adapter/task/TaskInstanceDbAdapter.java | 106 --- .../db/adapter/task/TaskPlanDbAdapter.java | 95 --- .../adapter/task/TaskPlanGroupDbAdapter.java | 46 -- .../db/adapter/task/TaskStepLogDbAdapter.java | 37 - .../modules/lanius-orchestrate-common/pom.xml | 13 + .../resource/controller/ServerController.java | 3 +- .../controller/ServerProgramController.java | 3 +- .../TaskResourceConfigController.java | 3 +- .../controller/TaskResourceController.java | 3 +- .../TaskResourceGroupController.java | 5 +- .../modules/lanius-orchestrate-serv/pom.xml | 13 - .../serv/mapper/resource}/ServerMapper.java | 11 +- .../mapper/resource}/ServerProgramMapper.java | 4 +- .../resource}/TaskResourceConfigMapper.java | 5 +- .../resource}/TaskResourceGroupMapper.java | 2 +- .../mapper/resource}/TaskResourceMapper.java | 5 +- .../serv/mapper/system}/ManagerMapper.java | 2 +- .../serv/mapper/system}/MenuMapper.java | 9 +- .../serv/mapper/system}/OrgMapper.java | 2 +- .../serv/mapper/system}/PermissionMapper.java | 6 +- .../serv/mapper/system}/RoleMapper.java | 17 +- .../mapper/system}/RolePermissionMapper.java | 7 +- .../serv/mapper/system}/UserLogMapper.java | 9 +- .../serv/mapper/system}/UserMapper.java | 2 +- .../serv/mapper/system}/UserOrgMapper.java | 2 +- .../serv/mapper/system}/UserRoleMapper.java | 8 +- .../serv/mapper/task}/TaskInstanceMapper.java | 4 +- .../mapper/task}/TaskPlanGroupMapper.java | 2 +- .../serv/mapper/task}/TaskPlanMapper.java | 2 +- .../serv/mapper/task}/TaskStepLogMapper.java | 2 +- .../category/impl/KettleExecutorHandler.java | 6 +- .../resource/ResourceScheduledTask.java | 26 +- .../taskplan/TaskPlanQuartzTaskJob.java | 8 +- .../resource/ServerProgramService.java | 3 +- .../serv/service/resource/ServerService.java | 3 +- .../resource/TaskResourceConfigService.java | 3 +- .../resource/TaskResourceGroupService.java | 3 +- .../service/resource/TaskResourceService.java | 3 +- .../impl/ResourceStatisticServiceImpl.java | 24 +- .../impl/ServerProgramServiceImpl.java | 46 +- .../resource/impl/ServerServiceImpl.java | 31 +- .../impl/TaskResourceConfigServiceImpl.java | 33 +- .../impl/TaskResourceGroupServiceImpl.java | 43 +- .../impl/TaskResourceServiceImpl.java | 47 +- .../service/system/ManagerAuthService.java | 4 +- .../serv/service/system/ManagerService.java | 24 +- .../serv/service/system/MenuService.java | 5 +- .../serv/service/system/OrgService.java | 11 +- .../service/system/PermissionService.java | 3 +- .../serv/service/system/RoleService.java | 16 +- .../serv/service/system/UserAuthService.java | 3 +- .../serv/service/system/UserLogService.java | 10 +- .../serv/service/system/UserOrgService.java} | 11 +- .../serv/service/system/UserService.java | 28 +- .../system/impl/ManagerAuthServiceImpl.java | 17 +- .../system/impl/ManagerServiceImpl.java | 44 +- .../service/system/impl/MenuServiceImpl.java | 5 +- .../service/system/impl/OrgServiceImpl.java | 49 +- .../system/impl/PermissionServiceImpl.java | 15 +- .../service/system/impl/RoleServiceImpl.java | 51 +- .../system/impl/UserAuthServiceImpl.java | 30 +- .../system/impl/UserLogServiceImpl.java | 22 +- .../system/impl/UserOrgServiceImpl.java} | 15 +- .../service/system/impl/UserServiceImpl.java | 75 +- .../service/task/TaskInstanceService.java | 3 +- .../service/task/TaskPlanGroupService.java | 3 +- .../serv/service/task/TaskPlanService.java | 3 +- .../serv/service/task/TaskStepLogService.java | 4 +- .../task/impl/TaskInstanceServiceImpl.java | 35 +- .../task/impl/TaskPlanGroupServiceImpl.java | 39 +- .../task/impl/TaskPlanServiceImpl.java | 50 +- .../task/impl/TaskStepLogServiceImpl.java | 12 +- .../mapper/dm/resource/ServerMapper.xml | 27 + .../dm}/resource/ServerProgramMapper.xml | 6 +- .../dm/resource/TaskResourceConfigMapper.xml | 23 + .../dm}/resource/TaskResourceGroupMapper.xml | 2 +- .../mapper/dm/resource/TaskResourceMapper.xml | 11 + .../mapper/dm}/system/MenuMapper.xml | 2 +- .../resources/mapper/dm}/system/OrgMapper.xml | 2 +- .../mapper/dm}/system/PermissionMapper.xml | 2 +- .../mapper/dm}/system/RoleMapper.xml | 2 +- .../dm}/system/RolePermissionMapper.xml | 2 +- .../mapper/dm}/system/UserLogMapper.xml | 2 +- .../mapper/dm}/system/UserMapper.xml | 2 +- .../mapper/dm}/system/UserRoleMapper.xml | 2 +- .../mapper/dm}/task/TaskInstanceMapper.xml | 5 +- .../mapper/dm}/task/TaskPlanGroupMapper.xml | 2 +- .../mapper/dm}/task/TaskPlanMapper.xml | 2 +- .../mapper/dm}/task/TaskStepLogMapper.xml | 2 +- .../mapper/mysql/resource/ServerMapper.xml | 30 + .../mysql}/resource/ServerProgramMapper.xml | 6 +- .../resource/TaskResourceConfigMapper.xml | 23 + .../resource/TaskResourceGroupMapper.xml | 2 +- .../mysql/resource/TaskResourceMapper.xml | 11 + .../mapper/mysql}/system/MenuMapper.xml | 2 +- .../mapper/mysql}/system/OrgMapper.xml | 2 +- .../mapper/mysql}/system/PermissionMapper.xml | 2 +- .../mapper/mysql}/system/RoleMapper.xml | 2 +- .../mysql}/system/RolePermissionMapper.xml | 2 +- .../mapper/mysql}/system/UserLogMapper.xml | 2 +- .../mapper/mysql}/system/UserMapper.xml | 2 +- .../mapper/mysql}/system/UserRoleMapper.xml | 2 +- .../mapper/mysql}/task/TaskInstanceMapper.xml | 6 +- .../mysql}/task/TaskPlanGroupMapper.xml | 2 +- .../mapper/mysql}/task/TaskPlanMapper.xml | 2 +- .../mapper/mysql}/task/TaskStepLogMapper.xml | 2 +- .../controller/ManagerAccountController.java | 6 +- .../controller/ManagerOrgController.java | 7 +- .../system/controller/RoleController.java | 7 +- .../system/controller/UserController.java | 9 +- .../task/controller/TaskPlanController.java | 7 +- .../controller/TaskPlanGroupController.java | 3 +- lanius-orchestrate-server/pom.xml | 6 - 201 files changed, 1009 insertions(+), 5502 deletions(-) create mode 100644 .idea/.gitignore create mode 100644 .idea/inspectionProfiles/Project_Default.xml create mode 100644 .idea/lanius-orchestrate-2.iml create mode 100644 .idea/modules.xml create mode 100644 .idea/vcs.xml delete mode 100644 lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/pom.xml delete mode 100644 lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/resource/impl/ServerDbAdapterImpl.java delete mode 100644 lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/resource/impl/ServerProgramDbAdapterImpl.java delete mode 100644 lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/resource/impl/TaskResourceConfigDbAdapterImpl.java delete mode 100644 lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/resource/impl/TaskResourceDbAdapterImpl.java delete mode 100644 lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/resource/impl/TaskResourceGroupDbAdapterImpl.java delete mode 100644 lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/system/impl/ManagerDbAdapterImpl.java delete mode 100644 lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/system/impl/OrgDbAdapterImpl.java delete mode 100644 lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/system/impl/PermissionDbAdapterImpl.java delete mode 100644 lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/system/impl/RoleDbAdapterImpl.java delete mode 100644 lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/system/impl/RolePermissionDbAdapterImpl.java delete mode 100644 lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/system/impl/UserDbAdapterImpl.java delete mode 100644 lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/system/impl/UserLogDbAdapterImpl.java delete mode 100644 lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/system/impl/UserOrgDbAdapterImpl.java delete mode 100644 lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/system/impl/UserRoleDbAdapterImpl.java delete mode 100644 lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/system/mapper/PermissionMapper.java delete mode 100644 lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/system/mapper/RoleMapper.java delete mode 100644 lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/system/mapper/UserMapper.java delete mode 100644 lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/task/impl/TaskInstanceDbAdapterImpl.java delete mode 100644 lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/task/impl/TaskPlanDbAdapterImpl.java delete mode 100644 lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/task/impl/TaskPlanGroupDbAdapterImpl.java delete mode 100644 lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/task/impl/TaskStepLogDbAdapterImpl.java delete mode 100644 lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/resources/mapper/resource/ServerMapper.xml delete mode 100644 lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/resources/mapper/resource/TaskResourceConfigMapper.xml delete mode 100644 lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/resources/mapper/resource/TaskResourceMapper.xml delete mode 100644 lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/pom.xml delete mode 100644 lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/resource/impl/ServerDbAdapterImpl.java delete mode 100644 lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/resource/impl/ServerProgramDbAdapterImpl.java delete mode 100644 lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/resource/impl/TaskResourceConfigDbAdapterImpl.java delete mode 100644 lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/resource/impl/TaskResourceDbAdapterImpl.java delete mode 100644 lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/resource/impl/TaskResourceGroupDbAdapterImpl.java delete mode 100644 lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/resource/mapper/ServerMapper.java delete mode 100644 lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/resource/mapper/ServerProgramMapper.java delete mode 100644 lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/resource/mapper/TaskResourceConfigMapper.java delete mode 100644 lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/resource/mapper/TaskResourceGroupMapper.java delete mode 100644 lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/resource/mapper/TaskResourceMapper.java delete mode 100644 lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/system/impl/ManagerDbAdapterImpl.java delete mode 100644 lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/system/impl/MenuDbAdapterImpl.java delete mode 100644 lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/system/impl/OrgDbAdapterImpl.java delete mode 100644 lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/system/impl/PermissionDbAdapterImpl.java delete mode 100644 lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/system/impl/RoleDbAdapterImpl.java delete mode 100644 lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/system/impl/RolePermissionDbAdapterImpl.java delete mode 100644 lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/system/impl/UserDbAdapterImpl.java delete mode 100644 lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/system/impl/UserLogDbAdapterImpl.java delete mode 100644 lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/system/impl/UserOrgDbAdapterImpl.java delete mode 100644 lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/system/impl/UserRoleDbAdapterImpl.java delete mode 100644 lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/system/mapper/ManagerMapper.java delete mode 100644 lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/system/mapper/MenuMapper.java delete mode 100644 lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/system/mapper/OrgMapper.java delete mode 100644 lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/system/mapper/RolePermissionMapper.java delete mode 100644 lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/system/mapper/UserLogMapper.java delete mode 100644 lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/system/mapper/UserOrgMapper.java delete mode 100644 lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/system/mapper/UserRoleMapper.java delete mode 100644 lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/task/impl/TaskInstanceDbAdapterImpl.java delete mode 100644 lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/task/impl/TaskPlanDbAdapterImpl.java delete mode 100644 lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/task/impl/TaskPlanGroupDbAdapterImpl.java delete mode 100644 lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/task/impl/TaskStepLogDbAdapterImpl.java delete mode 100644 lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/task/mapper/TaskInstanceMapper.java delete mode 100644 lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/task/mapper/TaskPlanGroupMapper.java delete mode 100644 lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/task/mapper/TaskPlanMapper.java delete mode 100644 lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/task/mapper/TaskStepLogMapper.java delete mode 100644 lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/resources/mapper/resource/ServerMapper.xml delete mode 100644 lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/resources/mapper/resource/TaskResourceConfigMapper.xml delete mode 100644 lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/resources/mapper/resource/TaskResourceMapper.xml delete mode 100644 lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter/pom.xml delete mode 100644 lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter/src/main/java/org/yzbdl/lanius/orchestrate/db/adapter/resource/ServerDbAdapter.java delete mode 100644 lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter/src/main/java/org/yzbdl/lanius/orchestrate/db/adapter/resource/ServerProgramDbAdapter.java delete mode 100644 lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter/src/main/java/org/yzbdl/lanius/orchestrate/db/adapter/resource/TaskResourceConfigDbAdapter.java delete mode 100644 lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter/src/main/java/org/yzbdl/lanius/orchestrate/db/adapter/resource/TaskResourceDbAdapter.java delete mode 100644 lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter/src/main/java/org/yzbdl/lanius/orchestrate/db/adapter/resource/TaskResourceGroupDbAdapter.java delete mode 100644 lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter/src/main/java/org/yzbdl/lanius/orchestrate/db/adapter/system/MenuDbAdapter.java delete mode 100644 lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter/src/main/java/org/yzbdl/lanius/orchestrate/db/adapter/system/OrgDbAdapter.java delete mode 100644 lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter/src/main/java/org/yzbdl/lanius/orchestrate/db/adapter/system/PermissionDbAdapter.java delete mode 100644 lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter/src/main/java/org/yzbdl/lanius/orchestrate/db/adapter/system/RoleDbAdapter.java delete mode 100644 lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter/src/main/java/org/yzbdl/lanius/orchestrate/db/adapter/system/RolePermissionDbAdapter.java delete mode 100644 lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter/src/main/java/org/yzbdl/lanius/orchestrate/db/adapter/system/UserDbAdapter.java delete mode 100644 lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter/src/main/java/org/yzbdl/lanius/orchestrate/db/adapter/system/UserLogDbAdapter.java delete mode 100644 lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter/src/main/java/org/yzbdl/lanius/orchestrate/db/adapter/system/UserOrgDbAdapter.java delete mode 100644 lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter/src/main/java/org/yzbdl/lanius/orchestrate/db/adapter/system/UserRoleDbAdapter.java delete mode 100644 lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter/src/main/java/org/yzbdl/lanius/orchestrate/db/adapter/task/TaskInstanceDbAdapter.java delete mode 100644 lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter/src/main/java/org/yzbdl/lanius/orchestrate/db/adapter/task/TaskPlanDbAdapter.java delete mode 100644 lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter/src/main/java/org/yzbdl/lanius/orchestrate/db/adapter/task/TaskPlanGroupDbAdapter.java delete mode 100644 lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter/src/main/java/org/yzbdl/lanius/orchestrate/db/adapter/task/TaskStepLogDbAdapter.java rename lanius-orchestrate-server/modules/{lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/resource/mapper => lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/mapper/resource}/ServerMapper.java (79%) rename lanius-orchestrate-server/modules/{lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/resource/mapper => lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/mapper/resource}/ServerProgramMapper.java (91%) rename lanius-orchestrate-server/modules/{lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/resource/mapper => lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/mapper/resource}/TaskResourceConfigMapper.java (84%) rename lanius-orchestrate-server/modules/{lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/resource/mapper => lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/mapper/resource}/TaskResourceGroupMapper.java (94%) rename lanius-orchestrate-server/modules/{lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/resource/mapper => lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/mapper/resource}/TaskResourceMapper.java (80%) rename lanius-orchestrate-server/modules/{lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/system/mapper => lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/mapper/system}/ManagerMapper.java (93%) rename lanius-orchestrate-server/modules/{lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/system/mapper => lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/mapper/system}/MenuMapper.java (78%) rename lanius-orchestrate-server/modules/{lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/system/mapper => lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/mapper/system}/OrgMapper.java (94%) rename lanius-orchestrate-server/modules/{lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/system/mapper => lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/mapper/system}/PermissionMapper.java (92%) rename lanius-orchestrate-server/modules/{lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/system/mapper => lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/mapper/system}/RoleMapper.java (80%) rename lanius-orchestrate-server/modules/{lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/system/mapper => lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/mapper/system}/RolePermissionMapper.java (85%) rename lanius-orchestrate-server/modules/{lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/system/mapper => lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/mapper/system}/UserLogMapper.java (86%) rename lanius-orchestrate-server/modules/{lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/system/mapper => lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/mapper/system}/UserMapper.java (97%) rename lanius-orchestrate-server/modules/{lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/system/mapper => lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/mapper/system}/UserOrgMapper.java (93%) rename lanius-orchestrate-server/modules/{lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/system/mapper => lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/mapper/system}/UserRoleMapper.java (85%) rename lanius-orchestrate-server/modules/{lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/task/mapper => lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/mapper/task}/TaskInstanceMapper.java (94%) rename lanius-orchestrate-server/modules/{lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/task/mapper => lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/mapper/task}/TaskPlanGroupMapper.java (95%) rename lanius-orchestrate-server/modules/{lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/task/mapper => lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/mapper/task}/TaskPlanMapper.java (97%) rename lanius-orchestrate-server/modules/{lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/task/mapper => lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/mapper/task}/TaskStepLogMapper.java (95%) rename lanius-orchestrate-server/modules/{lanius-db-adapter/lanius-orchestrate-db-adapter/src/main/java/org/yzbdl/lanius/orchestrate/db/adapter/system/ManagerDbAdapter.java => lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/system/UserOrgService.java} (72%) rename lanius-orchestrate-server/modules/{lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/system/impl/MenuDbAdapterImpl.java => lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/system/impl/UserOrgServiceImpl.java} (61%) create mode 100644 lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/resources/mapper/dm/resource/ServerMapper.xml rename lanius-orchestrate-server/modules/{lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/resources/mapper => lanius-orchestrate-serv/src/main/resources/mapper/dm}/resource/ServerProgramMapper.xml (89%) create mode 100644 lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/resources/mapper/dm/resource/TaskResourceConfigMapper.xml rename lanius-orchestrate-server/modules/{lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/resources/mapper => lanius-orchestrate-serv/src/main/resources/mapper/dm}/resource/TaskResourceGroupMapper.xml (77%) create mode 100644 lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/resources/mapper/dm/resource/TaskResourceMapper.xml rename lanius-orchestrate-server/modules/{lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/resources/mapper => lanius-orchestrate-serv/src/main/resources/mapper/dm}/system/MenuMapper.xml (61%) rename lanius-orchestrate-server/modules/{lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/resources/mapper => lanius-orchestrate-serv/src/main/resources/mapper/dm}/system/OrgMapper.xml (86%) rename lanius-orchestrate-server/modules/{lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/resources/mapper => lanius-orchestrate-serv/src/main/resources/mapper/dm}/system/PermissionMapper.xml (92%) rename lanius-orchestrate-server/modules/{lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/resources/mapper => lanius-orchestrate-serv/src/main/resources/mapper/dm}/system/RoleMapper.xml (95%) rename lanius-orchestrate-server/modules/{lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/resources/mapper => lanius-orchestrate-serv/src/main/resources/mapper/dm}/system/RolePermissionMapper.xml (81%) rename lanius-orchestrate-server/modules/{lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/resources/mapper => lanius-orchestrate-serv/src/main/resources/mapper/dm}/system/UserLogMapper.xml (89%) rename lanius-orchestrate-server/modules/{lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/resources/mapper => lanius-orchestrate-serv/src/main/resources/mapper/dm}/system/UserMapper.xml (98%) rename lanius-orchestrate-server/modules/{lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/resources/mapper => lanius-orchestrate-serv/src/main/resources/mapper/dm}/system/UserRoleMapper.xml (80%) rename lanius-orchestrate-server/modules/{lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/resources/mapper => lanius-orchestrate-serv/src/main/resources/mapper/dm}/task/TaskInstanceMapper.xml (96%) rename lanius-orchestrate-server/modules/{lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/resources/mapper => lanius-orchestrate-serv/src/main/resources/mapper/dm}/task/TaskPlanGroupMapper.xml (90%) rename lanius-orchestrate-server/modules/{lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/resources/mapper => lanius-orchestrate-serv/src/main/resources/mapper/dm}/task/TaskPlanMapper.xml (98%) rename lanius-orchestrate-server/modules/{lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/resources/mapper => lanius-orchestrate-serv/src/main/resources/mapper/dm}/task/TaskStepLogMapper.xml (90%) create mode 100644 lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/resources/mapper/mysql/resource/ServerMapper.xml rename lanius-orchestrate-server/modules/{lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/resources/mapper => lanius-orchestrate-serv/src/main/resources/mapper/mysql}/resource/ServerProgramMapper.xml (89%) create mode 100644 lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/resources/mapper/mysql/resource/TaskResourceConfigMapper.xml rename lanius-orchestrate-server/modules/{lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/resources/mapper => lanius-orchestrate-serv/src/main/resources/mapper/mysql}/resource/TaskResourceGroupMapper.xml (86%) create mode 100644 lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/resources/mapper/mysql/resource/TaskResourceMapper.xml rename lanius-orchestrate-server/modules/{lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/resources/mapper => lanius-orchestrate-serv/src/main/resources/mapper/mysql}/system/MenuMapper.xml (60%) rename lanius-orchestrate-server/modules/{lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/resources/mapper => lanius-orchestrate-serv/src/main/resources/mapper/mysql}/system/OrgMapper.xml (86%) rename lanius-orchestrate-server/modules/{lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/resources/mapper => lanius-orchestrate-serv/src/main/resources/mapper/mysql}/system/PermissionMapper.xml (92%) rename lanius-orchestrate-server/modules/{lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/resources/mapper => lanius-orchestrate-serv/src/main/resources/mapper/mysql}/system/RoleMapper.xml (95%) rename lanius-orchestrate-server/modules/{lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/resources/mapper => lanius-orchestrate-serv/src/main/resources/mapper/mysql}/system/RolePermissionMapper.xml (80%) rename lanius-orchestrate-server/modules/{lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/resources/mapper => lanius-orchestrate-serv/src/main/resources/mapper/mysql}/system/UserLogMapper.xml (89%) rename lanius-orchestrate-server/modules/{lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/resources/mapper => lanius-orchestrate-serv/src/main/resources/mapper/mysql}/system/UserMapper.xml (98%) rename lanius-orchestrate-server/modules/{lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/resources/mapper => lanius-orchestrate-serv/src/main/resources/mapper/mysql}/system/UserRoleMapper.xml (80%) rename lanius-orchestrate-server/modules/{lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/resources/mapper => lanius-orchestrate-serv/src/main/resources/mapper/mysql}/task/TaskInstanceMapper.xml (96%) rename lanius-orchestrate-server/modules/{lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/resources/mapper => lanius-orchestrate-serv/src/main/resources/mapper/mysql}/task/TaskPlanGroupMapper.xml (92%) rename lanius-orchestrate-server/modules/{lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/resources/mapper => lanius-orchestrate-serv/src/main/resources/mapper/mysql}/task/TaskPlanMapper.xml (98%) rename lanius-orchestrate-server/modules/{lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/resources/mapper => lanius-orchestrate-serv/src/main/resources/mapper/mysql}/task/TaskStepLogMapper.xml (90%) diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..6560a98 --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,36 @@ + + + + \ No newline at end of file diff --git a/.idea/lanius-orchestrate-2.iml b/.idea/lanius-orchestrate-2.iml new file mode 100644 index 0000000..d6ebd48 --- /dev/null +++ b/.idea/lanius-orchestrate-2.iml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..f6f9952 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/db/lanius_orchestrate_dm.sql b/db/lanius_orchestrate_dm.sql index 3c9512b..8aaf110 100644 --- a/db/lanius_orchestrate_dm.sql +++ b/db/lanius_orchestrate_dm.sql @@ -1,403 +1,405 @@ -- ---------------------------- --- Table structure for lo_manager +-- Table structure for LANIUS.lo_manager -- --------------------------- -DROP TABLE IF EXISTS lo_manager; -CREATE TABLE lo_manager ( - id bigint NOT NULL, - user_name varchar(64), - password varchar(512), - create_time TIMESTAMP, - PRIMARY KEY (id) +DROP TABLE IF EXISTS LANIUS.lo_manager; +CREATE TABLE LANIUS.lo_manager ( + id bigint NOT NULL, + user_name varchar(64), + password varchar(512), + create_time TIMESTAMP, + PRIMARY KEY (id) ); -- ---------------------------- --- Records of lo_manager +-- Records of LANIUS.lo_manager -- ---------------------------- -INSERT INTO lo_manager VALUES (1519516605054758913, 'admin', '$2a$10$ASCA3cm8IcdQ3Ul83aRff.0HTAATo263PThnzEe25JLi5y8KULfgq', '2022-04-28 11:19:24'); +INSERT INTO LANIUS.lo_manager VALUES (1519516605054758913, 'admin', '$2a$10$ASCA3cm8IcdQ3Ul83aRff.0HTAATo263PThnzEe25JLi5y8KULfgq', '2022-04-28 11:19:24'); -- ---------------------------- --- Table structure for lo_menu +-- Table structure for LANIUS.lo_menu -- ---------------------------- -DROP TABLE IF EXISTS lo_menu; -CREATE TABLE lo_menu ( - id bigint NOT NULL, - menu_name varchar(64), - menu_url varchar(128), - PRIMARY KEY (id) +DROP TABLE IF EXISTS LANIUS.lo_menu; +CREATE TABLE LANIUS.lo_menu ( + id bigint NOT NULL, + menu_name varchar(64), + menu_url varchar(128), + PRIMARY KEY (id) ); -- ---------------------------- --- Records of lo_menu +-- Records of LANIUS.lo_menu -- ---------------------------- -INSERT INTO lo_menu VALUES (1513357791062450177, '用户管理', '/user'); -INSERT INTO lo_menu VALUES (1514493518265548802, '角色管理', '/role'); -INSERT INTO lo_menu VALUES (1514505549144240129, '主机配置', '/resource/server'); -INSERT INTO lo_menu VALUES (1516241554120908804, '服务节点', '/resource/serverProgram'); -INSERT INTO lo_menu VALUES (1516241554120908805, '资源配置', '/resource/taskResourceConfig'); -INSERT INTO lo_menu VALUES (1516241554120908806, '任务资源', '/resource/taskResource'); -INSERT INTO lo_menu VALUES (1516241554120908807, '总览查询', '/tatistic'); -INSERT INTO lo_menu VALUES (1516241554120908874, '用户日志', '/userLog'); -INSERT INTO lo_menu VALUES (1516241554120908876, '任务编排', '/task'); -INSERT INTO lo_menu VALUES (1516241554120908877, '任务实例', '/task/instance'); +INSERT INTO LANIUS.lo_menu VALUES (1513357791062450177, '用户管理', '/user'); +INSERT INTO LANIUS.lo_menu VALUES (1514493518265548802, '角色管理', '/role'); +INSERT INTO LANIUS.lo_menu VALUES (1514505549144240129, '主机配置', '/resource/server'); +INSERT INTO LANIUS.lo_menu VALUES (1516241554120908804, '服务节点', '/resource/serverProgram'); +INSERT INTO LANIUS.lo_menu VALUES (1516241554120908805, '资源配置', '/resource/taskResourceConfig'); +INSERT INTO LANIUS.lo_menu VALUES (1516241554120908806, '任务资源', '/resource/taskResource'); +INSERT INTO LANIUS.lo_menu VALUES (1516241554120908807, '总览查询', '/tatistic'); +INSERT INTO LANIUS.lo_menu VALUES (1516241554120908874, '用户日志', '/userLog'); +INSERT INTO LANIUS.lo_menu VALUES (1516241554120908876, '任务编排', '/task'); +INSERT INTO LANIUS.lo_menu VALUES (1516241554120908877, '任务实例', '/task/instance'); -- ---------------------------- --- Table structure for lo_monitor_indicator +-- Table structure for LANIUS.lo_monitor_indicator -- ---------------------------- -DROP TABLE IF EXISTS lo_monitor_indicator; -CREATE TABLE lo_monitor_indicator ( - id bigint NOT NULL, - indicator_name varchar(128), - indicator_type tinyint, - remark varchar(512), - code varchar(64), - org_id bigint, - PRIMARY KEY (id) +DROP TABLE IF EXISTS LANIUS.lo_monitor_indicator; +CREATE TABLE LANIUS.lo_monitor_indicator ( + id bigint NOT NULL, + indicator_name varchar(128), + indicator_type bigint, + remark varchar(512), + code varchar(64), + org_id bigint, + PRIMARY KEY (id) ); -- ---------------------------- --- Table structure for lo_monitor_statistics +-- Table structure for LANIUS.lo_monitor_statistics -- ---------------------------- -DROP TABLE IF EXISTS lo_monitor_statistics; -CREATE TABLE lo_monitor_statistics ( - id bigint NOT NULL, - indicator_id bigint NOT NULL, - statistic varchar(128) NOT NULL, - statistic_unit tinyint NOT NULL, - statistic_time TIMESTAMP NOT NULL, - target_id bigint NOT NULL, - target_symbol varchar(64) NOT NULL, - PRIMARY KEY (id) +DROP TABLE IF EXISTS LANIUS.lo_monitor_statistics; +CREATE TABLE LANIUS.lo_monitor_statistics ( + id bigint NOT NULL, + indicator_id bigint NOT NULL, + statistic varchar(128) NOT NULL, + statistic_unit bigint NOT NULL, + statistic_time TIMESTAMP NOT NULL, + target_id bigint NOT NULL, + target_symbol varchar(64) NOT NULL, + PRIMARY KEY (id) ); -- ---------------------------- --- Table structure for lo_org +-- Table structure for LANIUS.lo_org -- ---------------------------- -DROP TABLE IF EXISTS lo_org; -CREATE TABLE lo_org ( - id bigint NOT NULL, - org_name varchar(64) NOT NULL, - create_time TIMESTAMP NOT NULL, - frozen bit, - PRIMARY KEY (id) +DROP TABLE IF EXISTS LANIUS.lo_org; +CREATE TABLE LANIUS.lo_org ( + id bigint NOT NULL, + org_name varchar(64) NOT NULL, + create_time TIMESTAMP NOT NULL, + frozen bit, + PRIMARY KEY (id) ); -- ---------------------------- --- Table structure for lo_permission +-- Table structure for LANIUS.lo_permission -- ---------------------------- -DROP TABLE IF EXISTS lo_permission; -CREATE TABLE lo_permission ( - id bigint NOT NULL, - permission_name varchar(64) NOT NULL, - menu_id bigint NOT NULL, - permission_code varchar(64), - sort tinyint, - PRIMARY KEY (id) +DROP TABLE IF EXISTS LANIUS.lo_permission; +CREATE TABLE LANIUS.lo_permission ( + id bigint NOT NULL, + permission_name varchar(64) NOT NULL, + menu_id bigint NOT NULL, + permission_code varchar(64), + sort bigint, + PRIMARY KEY (id) ); -- ---------------------------- --- Records of lo_permission --- ---------------------------- -INSERT INTO lo_permission VALUES (1513749187481149441, '编辑', 1513357791062450177, 'system::user::edit', 0); -INSERT INTO lo_permission VALUES (1513749728030408705, '查询', 1513357791062450177, 'system::user::query', 0); -INSERT INTO lo_permission VALUES (1514847509251997698, '编辑', 1514493518265548802, 'system::role::edit', 0); -INSERT INTO lo_permission VALUES (1514847629699825666, '查询', 1514493518265548802, 'system::role::query', 0); -INSERT INTO lo_permission VALUES (1516238191002214402, '查询', 1514505549144240129, 'resource::server::query', 0); -INSERT INTO lo_permission VALUES (1516238191002214403, '编辑', 1514505549144240129, 'resource::server::edit', 0); -INSERT INTO lo_permission VALUES (1516238191002214404, '查询', 1516241554120908804, 'resource::serverProgram::query', 0); -INSERT INTO lo_permission VALUES (1516238191002214405, '编辑', 1516241554120908805, 'resource::taskResourceConfig::edit', 0); -INSERT INTO lo_permission VALUES (1516238191002214406, '查询', 1516241554120908805, 'resource::taskResourceConfig::query', 0); -INSERT INTO lo_permission VALUES (1516238191002214407, '编辑', 1516241554120908806, 'resource::taskResource::edit', 0); -INSERT INTO lo_permission VALUES (1516238191002214408, '查询', 1516241554120908806, 'resource::taskResource::query', 0); -INSERT INTO lo_permission VALUES (1516241554120908804, '编辑', 1516241554120908804, 'resource::serverProgram::edit', 0); -INSERT INTO lo_permission VALUES (1516241554120908808, '查询', 1516241554120908807, 'resource::statistic::query', 0); -INSERT INTO lo_permission VALUES (1516241554120908872, '删除', 1513357791062450177, 'system::user::delete', 0); -INSERT INTO lo_permission VALUES (1516241554120908873, '删除', 1514493518265548802, 'system::role::delete', 0); -INSERT INTO lo_permission VALUES (1516241554120908875, '查询', 1516241554120908874, 'system::userLog::query', 0); -INSERT INTO lo_permission VALUES (1516241554120908878, '查询', 1516241554120908876, 'task::plan::query', 0); -INSERT INTO lo_permission VALUES (1516241554120908879, '编辑', 1516241554120908876, 'task::plan::edit', 0); -INSERT INTO lo_permission VALUES (1516241554120908880, '删除', 1516241554120908876, 'task::plan::delete', 0); -INSERT INTO lo_permission VALUES (1516241554120908881, '查询', 1516241554120908877, 'task::plan::instance::query', 0); - --- ---------------------------- --- Table structure for lo_role --- ---------------------------- -DROP TABLE IF EXISTS lo_role; -CREATE TABLE lo_role ( - id bigint NOT NULL, - role_name varchar(64) NOT NULL, - create_time TIMESTAMP, - create_id varchar(64), - last_modify TIMESTAMP, - modified varchar(64), - org_id bigint NOT NULL, - deleted bit, - PRIMARY KEY (id) +-- Records of LANIUS.lo_permission +-- ---------------------------- +INSERT INTO LANIUS.lo_permission VALUES (1513749187481149441, '编辑', 1513357791062450177, 'system::user::edit', 0); +INSERT INTO LANIUS.lo_permission VALUES (1513749728030408705, '查询', 1513357791062450177, 'system::user::query', 0); +INSERT INTO LANIUS.lo_permission VALUES (1514847509251997698, '编辑', 1514493518265548802, 'system::role::edit', 0); +INSERT INTO LANIUS.lo_permission VALUES (1514847629699825666, '查询', 1514493518265548802, 'system::role::query', 0); +INSERT INTO LANIUS.lo_permission VALUES (1516238191002214402, '查询', 1514505549144240129, 'resource::server::query', 0); +INSERT INTO LANIUS.lo_permission VALUES (1516238191002214403, '编辑', 1514505549144240129, 'resource::server::edit', 0); +INSERT INTO LANIUS.lo_permission VALUES (1516238191002214404, '查询', 1516241554120908804, 'resource::serverProgram::query', 0); +INSERT INTO LANIUS.lo_permission VALUES (1516238191002214405, '编辑', 1516241554120908805, 'resource::taskResourceConfig::edit', 0); +INSERT INTO LANIUS.lo_permission VALUES (1516238191002214406, '查询', 1516241554120908805, 'resource::taskResourceConfig::query', 0); +INSERT INTO LANIUS.lo_permission VALUES (1516238191002214407, '编辑', 1516241554120908806, 'resource::taskResource::edit', 0); +INSERT INTO LANIUS.lo_permission VALUES (1516238191002214408, '查询', 1516241554120908806, 'resource::taskResource::query', 0); +INSERT INTO LANIUS.lo_permission VALUES (1516241554120908804, '编辑', 1516241554120908804, 'resource::serverProgram::edit', 0); +INSERT INTO LANIUS.lo_permission VALUES (1516241554120908808, '查询', 1516241554120908807, 'resource::statistic::query', 0); +INSERT INTO LANIUS.lo_permission VALUES (1516241554120908872, '删除', 1513357791062450177, 'system::user::delete', 0); +INSERT INTO LANIUS.lo_permission VALUES (1516241554120908873, '删除', 1514493518265548802, 'system::role::delete', 0); +INSERT INTO LANIUS.lo_permission VALUES (1516241554120908875, '查询', 1516241554120908874, 'system::userLog::query', 0); +INSERT INTO LANIUS.lo_permission VALUES (1516241554120908878, '查询', 1516241554120908876, 'task::plan::query', 0); +INSERT INTO LANIUS.lo_permission VALUES (1516241554120908879, '编辑', 1516241554120908876, 'task::plan::edit', 0); +INSERT INTO LANIUS.lo_permission VALUES (1516241554120908880, '删除', 1516241554120908876, 'task::plan::delete', 0); +INSERT INTO LANIUS.lo_permission VALUES (1516241554120908881, '查询', 1516241554120908877, 'task::plan::instance::query', 0); + +-- ---------------------------- +-- Table structure for LANIUS.lo_role +-- ---------------------------- +DROP TABLE IF EXISTS LANIUS.lo_role; +CREATE TABLE LANIUS.lo_role ( + id bigint NOT NULL, + role_name varchar(64) NOT NULL, + create_time TIMESTAMP, + create_id varchar(64), + last_modify TIMESTAMP, + modified varchar(64), + org_id bigint NOT NULL, + deleted bit, + PRIMARY KEY (id) ); -- ---------------------------- --- Table structure for lo_role_permission +-- Table structure for LANIUS.lo_role_permission -- ---------------------------- -DROP TABLE IF EXISTS lo_role_permission; -CREATE TABLE lo_role_permission ( - id bigint NOT NULL, - role_id bigint NOT NULL, - permission_id bigint NOT NULL, - PRIMARY KEY (id) +DROP TABLE IF EXISTS LANIUS.lo_role_permission; +CREATE TABLE LANIUS.lo_role_permission ( + id bigint NOT NULL, + role_id bigint NOT NULL, + permission_id bigint NOT NULL, + PRIMARY KEY (id) ); -- ---------------------------- --- Table structure for lo_server --- ---------------------------- -DROP TABLE IF EXISTS lo_server; -CREATE TABLE lo_server ( - id bigint NOT NULL, - server_name varchar(64) NOT NULL, - server_ip varchar(64) NOT NULL, - server_port bigint NOT NULL, - account_name varchar(64) NOT NULL, - password varchar(128) NOT NULL, - remark varchar(512), - status tinyint NOT NULL, - org_id bigint NOT NULL, - create_time TIMESTAMP, - create_id bigint , - last_modify TIMESTAMP, - modified bigint, - deleted bit, - PRIMARY KEY (id) +-- Table structure for LANIUS.lo_server +-- ---------------------------- +DROP TABLE IF EXISTS LANIUS.lo_server; +CREATE TABLE LANIUS.lo_server ( + id bigint NOT NULL, + server_name varchar(64) NOT NULL, + server_ip varchar(64) NOT NULL, + server_port bigint NOT NULL, + account_name varchar(64) NOT NULL, + password varchar(128) NOT NULL, + remark varchar(512), + status bigint NOT NULL, + org_id bigint NOT NULL, + create_time TIMESTAMP, + create_id bigint , + last_modify TIMESTAMP, + modified bigint, + deleted bit, + PRIMARY KEY (id) ); -- ---------------------------- --- Table structure for lo_server_program --- ---------------------------- -DROP TABLE IF EXISTS lo_server_program; -CREATE TABLE lo_server_program ( - id bigint NOT NULL, - program_name varchar(64) NOT NULL, - server_id bigint NOT NULL, - program_port bigint NOT NULL, - category tinyint NOT NULL, - remark varchar(512), - program_config tinyint, - status tinyint NOT NULL, - auth_config LONGVARCHAR NOT NULL, - org_id bigint NOT NULL, - create_time TIMESTAMP NOT NULL, - create_id bigint NOT NULL, - last_modify TIMESTAMP, - modified bigint, - deleted bit, - PRIMARY KEY (id) +-- Table structure for LANIUS.lo_server_program +-- ---------------------------- +DROP TABLE IF EXISTS LANIUS.lo_server_program; +CREATE TABLE LANIUS.lo_server_program ( + id bigint NOT NULL, + program_name varchar(64) NOT NULL, + server_id bigint NOT NULL, + program_port bigint NOT NULL, + category bigint NOT NULL, + remark varchar(512), + program_config bigint, + status bigint NOT NULL, + auth_config LONGVARCHAR NOT NULL, + org_id bigint NOT NULL, + create_time TIMESTAMP NOT NULL, + create_id bigint NOT NULL, + last_modify TIMESTAMP, + modified bigint, + deleted bit, + PRIMARY KEY (id) ); -- ---------------------------- --- Table structure for lo_task_instance --- ---------------------------- -DROP TABLE IF EXISTS lo_task_instance; -CREATE TABLE lo_task_instance ( - id bigint NOT NULL, - task_plan_id bigint NOT NULL, - begin_time TIMESTAMP NOT NULL, - end_time TIMESTAMP, - status tinyint NOT NULL, - server_program_id bigint NOT NULL, - create_time TIMESTAMP NOT NULL, - task_info LONGVARCHAR, - org_id bigint, - log_level tinyint NOT NULL, - task_resource_id bigint NOT NULL, - PRIMARY KEY (id) +-- Table structure for LANIUS.lo_task_instance +-- ---------------------------- +DROP TABLE IF EXISTS LANIUS.lo_task_instance; +CREATE TABLE LANIUS.lo_task_instance ( + id bigint NOT NULL, + task_plan_id bigint NOT NULL, + begin_time TIMESTAMP NOT NULL, + end_time TIMESTAMP, + status bigint NOT NULL, + server_program_id bigint NOT NULL, + create_time TIMESTAMP NOT NULL, + task_info LONGVARCHAR, + org_id bigint, + log_level bigint NOT NULL, + task_resource_id bigint NOT NULL, + PRIMARY KEY (id) ); -create index lo_task_instance_org_id_index on lo_task_instance(org_id); - --- ---------------------------- --- Table structure for lo_task_plan --- ---------------------------- -DROP TABLE IF EXISTS lo_task_plan; -CREATE TABLE lo_task_plan ( - id bigint NOT NULL, - task_name varchar(64) NOT NULL, - task_cron varchar(512) NOT NULL, - server_program_id bigint NOT NULL, - task_resource_id bigint NOT NULL, - remark varchar(512), - json_config LONGVARCHAR, - status tinyint NOT NULL, - group_id bigint, - log_level tinyint NOT NULL, - org_id bigint, - create_id bigint, - create_time TIMESTAMP, - last_modify TIMESTAMP, - modified bigint, - PRIMARY KEY (id) +create index lo_task_instance_org_id_index on LANIUS.lo_task_instance(org_id); + +-- ---------------------------- +-- Table structure for LANIUS.lo_task_plan +-- ---------------------------- +DROP TABLE IF EXISTS LANIUS.lo_task_plan; +CREATE TABLE LANIUS.lo_task_plan ( + id bigint NOT NULL, + task_name varchar(64) NOT NULL, + task_cron varchar(512) NOT NULL, + server_program_id bigint NOT NULL, + task_resource_id bigint NOT NULL, + remark varchar(512), + json_config LONGVARCHAR, + status bigint NOT NULL, + group_id bigint, + log_level bigint NOT NULL, + org_id bigint, + create_id bigint, + create_time TIMESTAMP, + last_modify TIMESTAMP, + modified bigint, + PRIMARY KEY (id) ); -create index lo_task_plan_org_id_index on lo_task_plan(org_id); +create index lo_task_plan_org_id_index on LANIUS.lo_task_plan(org_id); -- ---------------------------- --- Table structure for lo_task_plan_group +-- Table structure for LANIUS.lo_task_plan_group -- ---------------------------- -DROP TABLE IF EXISTS lo_task_plan_group; -CREATE TABLE lo_task_plan_group ( - id bigint NOT NULL, - group_name varchar(64), - org_id bigint NOT NULL, - pid bigint, - PRIMARY KEY (id) +DROP TABLE IF EXISTS LANIUS.lo_task_plan_group; +CREATE TABLE LANIUS.lo_task_plan_group ( + id bigint NOT NULL, + group_name varchar(64), + org_id bigint NOT NULL, + pid bigint, + PRIMARY KEY (id) ); -create index lo_task_plan_group_org_id_index on lo_task_plan_group(org_id); - --- ---------------------------- --- Table structure for lo_task_resource --- ---------------------------- -DROP TABLE IF EXISTS lo_task_resource; -CREATE TABLE lo_task_resource ( - id bigint NOT NULL, - resource_type tinyint NOT NULL, - remark varchar(512), - resource_content LONGVARCHAR , - resource_config_id bigint NOT NULL, - create_id bigint NOT NULL, - create_time TIMESTAMP NOT NULL, - modified bigint , - last_modify TIMESTAMP, - group_id bigint, - org_id bigint NOT NULL, - resource_name varchar(64) NOT NULL, - deleted bit, - PRIMARY KEY (id) +create index lo_task_plan_group_org_id_index on LANIUS.lo_task_plan_group(org_id); + +-- ---------------------------- +-- Table structure for LANIUS.lo_task_resource +-- ---------------------------- +DROP TABLE IF EXISTS LANIUS.lo_task_resource; +CREATE TABLE LANIUS.lo_task_resource ( + id bigint NOT NULL, + resource_type bigint NOT NULL, + remark varchar(512), + resource_content LONGVARCHAR , + resource_config_id bigint NOT NULL, + create_id bigint NOT NULL, + create_time TIMESTAMP NOT NULL, + modified bigint , + last_modify TIMESTAMP, + group_id bigint, + org_id bigint NOT NULL, + resource_name varchar(64) NOT NULL, + deleted bit, + PRIMARY KEY (id) ); -create index lo_task_resource_org_id_index on lo_task_resource(org_id); - --- ---------------------------- --- Table structure for lo_task_resource_config --- ---------------------------- -DROP TABLE IF EXISTS lo_task_resource_config; -CREATE TABLE lo_task_resource_config ( - id bigint NOT NULL, - connect_name varchar(64) NOT NULL, - connect_url varchar(512) NOT NULL, - connect_account varchar(64) NOT NULL, - connect_password varchar(128), - remark varchar(512), - create_id bigint NOT NULL, - create_time TIMESTAMP NOT NULL, - modified bigint, - last_modify TIMESTAMP, - org_id bigint NOT NULL, - connect_category tinyint NOT NULL, - deleted bit, - status tinyint, - PRIMARY KEY (id) +create index lo_task_resource_org_id_index on LANIUS.lo_task_resource(org_id); + +-- ---------------------------- +-- Table structure for LANIUS.lo_task_resource_config +-- ---------------------------- +DROP TABLE IF EXISTS LANIUS.lo_task_resource_config; +CREATE TABLE LANIUS.lo_task_resource_config ( + id bigint NOT NULL, + connect_name varchar(64) NOT NULL, + connect_url varchar(512) NOT NULL, + connect_account varchar(64) NOT NULL, + connect_password varchar(128), + remark varchar(512), + create_id bigint NOT NULL, + create_time TIMESTAMP NOT NULL, + modified bigint, + last_modify TIMESTAMP, + org_id bigint NOT NULL, + connect_category bigint NOT NULL, + deleted bit, + status bigint, + PRIMARY KEY (id) ); -create index lo_task_resource_config_org_id_index on lo_task_resource_config(org_id); +create index lo_task_resource_config_org_id_index on LANIUS.lo_task_resource_config(org_id); -- ---------------------------- --- Table structure for lo_task_resource_group +-- Table structure for LANIUS.lo_task_resource_group -- ---------------------------- -DROP TABLE IF EXISTS lo_task_resource_group; -CREATE TABLE lo_task_resource_group ( - id bigint NOT NULL, - group_name varchar(64), - org_id bigint NOT NULL, - pid bigint, - create_time TIMESTAMP, - create_id bigint, - last_modify TIMESTAMP, - modified bigint, - deleted bit, - PRIMARY KEY (id) +DROP TABLE IF EXISTS LANIUS.lo_task_resource_group; +CREATE TABLE LANIUS.lo_task_resource_group ( + id bigint NOT NULL, + group_name varchar(64), + org_id bigint NOT NULL, + pid bigint, + create_time TIMESTAMP, + create_id bigint, + last_modify TIMESTAMP, + modified bigint, + deleted bit, + PRIMARY KEY (id) ); -create index lo_task_resource_group_org_id_index on lo_task_resource_group(org_id); - --- ---------------------------- --- Table structure for lo_task_step_log --- ---------------------------- -DROP TABLE IF EXISTS lo_task_step_log; -CREATE TABLE lo_task_step_log ( - id bigint NOT NULL, - task_instance_id bigint, - log_date varchar(30), - trans_name LONGVARCHAR, - step_name varchar(100) NOT NULL, - step_copy bigint, - lines_read bigint, - lines_written bigint, - lines_updated bigint, - lines_input bigint, - lines_output bigint, - lines_rejected bigint, - errors bigint, - status_description varchar(20), - input_buffer_rows bigint, - output_buffer_rows bigint, - speed bigint, - running_time double, - PRIMARY KEY (id) +create index lo_task_resource_group_org_id_index on LANIUS.lo_task_resource_group(org_id); + +-- ---------------------------- +-- Table structure for LANIUS.lo_task_step_log +-- ---------------------------- +DROP TABLE IF EXISTS LANIUS.lo_task_step_log; +CREATE TABLE LANIUS.lo_task_step_log ( + id bigint NOT NULL, + task_instance_id bigint, + log_date varchar(30), + trans_name LONGVARCHAR, + step_name varchar(100) NOT NULL, + step_copy bigint, + lines_read bigint, + lines_written bigint, + lines_updated bigint, + lines_input bigint, + lines_output bigint, + lines_rejected bigint, + errors bigint, + status_description varchar(20), + input_buffer_rows bigint, + output_buffer_rows bigint, + speed bigint, + running_time double, + PRIMARY KEY (id) ); -- ---------------------------- --- Table structure for lo_user --- ---------------------------- -DROP TABLE IF EXISTS lo_user; -CREATE TABLE lo_user ( - id bigint NOT NULL, - user_name varchar(64) NOT NULL, - password varchar(512) NOT NULL, - nick_name varchar(64) NOT NULL, - create_time TIMESTAMP, - create_id varchar(64), - last_modify TIMESTAMP, - modified varchar(64), - deleted bit, - status tinyint +-- Table structure for LANIUS.lo_user +-- ---------------------------- +DROP TABLE IF EXISTS LANIUS.lo_user; +CREATE TABLE LANIUS.lo_user ( + id bigint NOT NULL, + user_name varchar(64) NOT NULL, + password varchar(512) NOT NULL, + nick_name varchar(64) NOT NULL, + phone varchar(11), + email varchar(64), + create_time TIMESTAMP, + create_id varchar(64), + last_modify TIMESTAMP, + modified varchar(64), + deleted bit, + status bigint ); -- ---------------------------- --- Table structure for lo_user_log +-- Table structure for LANIUS.lo_user_log -- ---------------------------- -DROP TABLE IF EXISTS lo_user_log; -CREATE TABLE lo_user_log ( - id bigint NOT NULL, - create_time TIMESTAMP, - create_id bigint, - url varchar(512), - method varchar(32), - event_name varchar(64), - event_content varchar(512), - org_id bigint, - PRIMARY KEY (id) +DROP TABLE IF EXISTS LANIUS.lo_user_log; +CREATE TABLE LANIUS.lo_user_log ( + id bigint NOT NULL, + create_time TIMESTAMP, + create_id bigint, + url varchar(512), + method varchar(32), + event_name varchar(64), + event_content varchar(512), + org_id bigint, + PRIMARY KEY (id) ); -create index lo_user_log_org_id_index on lo_user_log(org_id); +create index lo_user_log_org_id_index on LANIUS.lo_user_log(org_id); -- ---------------------------- --- Table structure for lo_user_org +-- Table structure for LANIUS.lo_user_org -- ---------------------------- -DROP TABLE IF EXISTS lo_user_org; -CREATE TABLE lo_user_org ( - id bigint NOT NULL, - user_id bigint NOT NULL, - org_id bigint NOT NULL, - org_chief bit, - PRIMARY KEY (id) +DROP TABLE IF EXISTS LANIUS.lo_user_org; +CREATE TABLE LANIUS.lo_user_org ( + id bigint NOT NULL, + user_id bigint NOT NULL, + org_id bigint NOT NULL, + org_chief bit, + PRIMARY KEY (id) ); -- ---------------------------- --- Table structure for lo_user_role +-- Table structure for LANIUS.lo_user_role -- ---------------------------- -DROP TABLE IF EXISTS lo_user_role; -CREATE TABLE lo_user_role ( - id bigint NOT NULL, - user_id bigint NOT NULL, - role_id bigint NOT NULL, - PRIMARY KEY (id) +DROP TABLE IF EXISTS LANIUS.lo_user_role; +CREATE TABLE LANIUS.lo_user_role ( + id bigint NOT NULL, + user_id bigint NOT NULL, + role_id bigint NOT NULL, + PRIMARY KEY (id) ); diff --git a/lanius-orchestrate-server/lanius-orchestrate/src/main/java/org/yzbdl/lanius/orchestrate/LaniusOrchestrateApplication.java b/lanius-orchestrate-server/lanius-orchestrate/src/main/java/org/yzbdl/lanius/orchestrate/LaniusOrchestrateApplication.java index 157f602..6a9d862 100644 --- a/lanius-orchestrate-server/lanius-orchestrate/src/main/java/org/yzbdl/lanius/orchestrate/LaniusOrchestrateApplication.java +++ b/lanius-orchestrate-server/lanius-orchestrate/src/main/java/org/yzbdl/lanius/orchestrate/LaniusOrchestrateApplication.java @@ -25,7 +25,7 @@ import org.springframework.web.servlet.config.annotation.EnableWebMvc; "org.yzbdl.lanius.**" }) @MapperScan(basePackages = { - "org.yzbdl.lanius.orchestrate.adapter.**" + "org.yzbdl.lanius.orchestrate.serv.mapper" }) @EnableWebMvc @EnableScheduling diff --git a/lanius-orchestrate-server/lanius-orchestrate/src/main/resources/application-dev.yml b/lanius-orchestrate-server/lanius-orchestrate/src/main/resources/application-dev.yml index 1c11e57..65a7373 100644 --- a/lanius-orchestrate-server/lanius-orchestrate/src/main/resources/application-dev.yml +++ b/lanius-orchestrate-server/lanius-orchestrate/src/main/resources/application-dev.yml @@ -2,7 +2,7 @@ mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl map-underscore-to-camel-case: true - mapper-locations: classpath*:/mapper/**/*.xml + mapper-locations: classpath*:/mapper/mysql/**/*.xml spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver diff --git a/lanius-orchestrate-server/lanius-orchestrate/src/main/resources/application-dm.yml b/lanius-orchestrate-server/lanius-orchestrate/src/main/resources/application-dm.yml index 0d879ff..aefe558 100644 --- a/lanius-orchestrate-server/lanius-orchestrate/src/main/resources/application-dm.yml +++ b/lanius-orchestrate-server/lanius-orchestrate/src/main/resources/application-dm.yml @@ -2,11 +2,11 @@ mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl map-underscore-to-camel-case: true - mapper-locations: classpath*:/mapper/**/*.xml + mapper-locations: classpath*:/mapper/dm/**/*.xml spring: datasource: driver-class-name: dm.jdbc.driver.DmDriver - url: jdbc:dm://localhost:5236/LANIUS_ORCH + url: jdbc:dm://localhost:5236?schema=LANIUS username: SYSDBA password: 123456789 servlet: diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/pom.xml b/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/pom.xml deleted file mode 100644 index d013302..0000000 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/pom.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - org.yzbdl.lanius - lanius-orchestrate-server - 1.0-SNAPSHOT - ../../../pom.xml - - - org.yzbdl.lanius - lanius-orchestrate-db-adapter-dm - 0.0.1-SNAPSHOT - lanius-orchestrate-db-adapter-dm - 达梦数据库适配模块 - - 4.0.0 - - - - org.yzbdl.lanius - lanius-orchestrate-common - ${lanius.module.common.version} - - - org.yzbdl.lanius - lanius-orchestrate-db-adapter - ${lanius.module.db.adapter.version} - - - - \ No newline at end of file diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/resource/impl/ServerDbAdapterImpl.java b/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/resource/impl/ServerDbAdapterImpl.java deleted file mode 100644 index 3adea93..0000000 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/resource/impl/ServerDbAdapterImpl.java +++ /dev/null @@ -1,80 +0,0 @@ -/* Copyright (c) 2022 渝州大数据实验室 - * - * Lanius is licensed under Mulan PSL v2. - * You can use this software according to the terms and conditions of the Mulan PSL v2. - * You may obtain a copy of Mulan PSL v2 at: - * - * http://license.coscl.org.cn/MulanPSL2 - * - * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. - * See the Mulan PSL v2 for more details. - */ -package org.yzbdl.lanius.orchestrate.adapter.dm.resource.impl; - -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import org.springframework.stereotype.Service; -import org.yzbdl.lanius.orchestrate.adapter.dm.resource.mapper.ServerMapper; -import org.yzbdl.lanius.orchestrate.common.dto.resource.StatusStatisticDto; -import org.yzbdl.lanius.orchestrate.common.entity.resource.ServerEntity; -import org.yzbdl.lanius.orchestrate.db.adapter.resource.ServerDbAdapter; - -import java.util.List; - -/** - * 服务节点信息数据库适配接口实现类 - * - * @author hujian@yzbdl.ac.cn - * @since 2022-08-16 17:01 - */ -@Service -public class ServerDbAdapterImpl extends ServiceImpl implements ServerDbAdapter { - - /** - * 状态统计接口 - * @return 状态统计 - */ - @Override - public List getStatusGroupCount() { - return this.baseMapper.getStatusGroupCount(); - } - - /** - * 获取所有服务器数据不区分主租户 - * @return list务器数据 - */ - @Override - public List getAllServer() { - return this.baseMapper.getAllServer(); - } - - /** - * 更新服务器信息 - * @param list list务器数据 - */ - @Override - public void batchUpdate(List list) { - this.baseMapper.batchUpdate(list); - } - - /** - * 根据id获取服务器信息 - * @param id 服务器id - * @return 服务器信息 - */ - @Override - public ServerEntity getServerInfoById(Long id) { - return this.baseMapper.getServerInfoById(id); - } - - /** - * 查询数据是否存在 - * @param wrapper 筛选条件 - * @return 返回结果 - */ - @Override - public Boolean exists(LambdaQueryWrapper wrapper) { - return this.baseMapper.exists(wrapper); - } - -} diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/resource/impl/ServerProgramDbAdapterImpl.java b/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/resource/impl/ServerProgramDbAdapterImpl.java deleted file mode 100644 index 48b9c3e..0000000 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/resource/impl/ServerProgramDbAdapterImpl.java +++ /dev/null @@ -1,89 +0,0 @@ -/* Copyright (c) 2022 渝州大数据实验室 - * - * Lanius is licensed under Mulan PSL v2. - * You can use this software according to the terms and conditions of the Mulan PSL v2. - * You may obtain a copy of Mulan PSL v2 at: - * - * http://license.coscl.org.cn/MulanPSL2 - * - * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. - * See the Mulan PSL v2 for more details. - */ -package org.yzbdl.lanius.orchestrate.adapter.dm.resource.impl; - -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import org.springframework.stereotype.Service; -import org.yzbdl.lanius.orchestrate.adapter.dm.resource.mapper.ServerProgramMapper; -import org.yzbdl.lanius.orchestrate.common.dto.resource.ServerProgramAndServerDto; -import org.yzbdl.lanius.orchestrate.common.dto.resource.ServerProgramInfoDTO; -import org.yzbdl.lanius.orchestrate.common.dto.resource.StatusStatisticDto; -import org.yzbdl.lanius.orchestrate.common.entity.resource.ServerProgramEntity; -import org.yzbdl.lanius.orchestrate.db.adapter.resource.ServerProgramDbAdapter; - -import java.util.List; - -/** - * 数据节点数据适配接口实现类 - * - * @author hujian@yzbdl.ac.cn - * @since 2022-08-17 10:20 - */ -@Service -public class ServerProgramDbAdapterImpl extends ServiceImpl implements ServerProgramDbAdapter { - - /** - * 获取服务节点详细信息,(包含关联的节点信息) - *

- * 任务调度专用接口,忽略租户 - *

- * - * @param programId - * 服务节点ID - * @return - * 数据 - */ - @Override - public ServerProgramInfoDTO getServerProgramInfoByIdIgnoreTenantId(Long programId) { - return this.baseMapper.getServerProgramInfoByIdIgnoreTenantId(programId); - } - - - /** - * 获取服务节点和服务器信息数据 - * @return 节点和服务器数据 - */ - @Override - public List getAllServerProgramAndServerInfo() { - return this.baseMapper.getAllServerProgramAndServerInfo(); - } - - /** - * 状态统计接口 - * @return 状态统计 - */ - @Override - public List getStatusGroupCount() { - return this.baseMapper.getStatusGroupCount(); - } - - /** - * 批量更新服务节点状态 - * @param list list服务节点 - */ - @Override - public void batchUpdate(List list) { - this.baseMapper.batchUpdate(list); - } - - /** - * 查询数据是否存在 - * @param wrapper 筛选条件 - * @return 返回结果 - */ - @Override - public Boolean exists(LambdaQueryWrapper wrapper) { - return this.baseMapper.exists(wrapper); - } -} diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/resource/impl/TaskResourceConfigDbAdapterImpl.java b/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/resource/impl/TaskResourceConfigDbAdapterImpl.java deleted file mode 100644 index 3714d51..0000000 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/resource/impl/TaskResourceConfigDbAdapterImpl.java +++ /dev/null @@ -1,73 +0,0 @@ -/* Copyright (c) 2022 渝州大数据实验室 - * - * Lanius is licensed under Mulan PSL v2. - * You can use this software according to the terms and conditions of the Mulan PSL v2. - * You may obtain a copy of Mulan PSL v2 at: - * - * http://license.coscl.org.cn/MulanPSL2 - * - * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. - * See the Mulan PSL v2 for more details. - */ -package org.yzbdl.lanius.orchestrate.adapter.dm.resource.impl; - -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import org.springframework.stereotype.Service; -import org.yzbdl.lanius.orchestrate.adapter.dm.resource.mapper.TaskResourceConfigMapper; -import org.yzbdl.lanius.orchestrate.common.dto.resource.StatusStatisticDto; -import org.yzbdl.lanius.orchestrate.common.entity.resource.TaskResourceConfigEntity; -import org.yzbdl.lanius.orchestrate.db.adapter.resource.TaskResourceConfigDbAdapter; - -import java.util.List; - -/** - * 任务资源配置数据适配接口实现类 - * - * @author hujian@yzbdl.ac.cn - * @since 2022-08-17 10:30 - */ -@Service -public class TaskResourceConfigDbAdapterImpl extends ServiceImpl implements TaskResourceConfigDbAdapter { - - /** - * 获取所有任务资源配置不区分主租户 - * @return list任务资源配置 - */ - @Override - public List getAllTaskResource() { - return this.baseMapper.getAllTaskResource(); - } - - /** - * 状态统计接口 - * @return 状态统计 - */ - @Override - public List getStatusGroupCount(){ - return this.baseMapper.getStatusGroupCount(); - } - - /** - * 批量更新任务资源配置状态 - * @param list list配置数据 - */ - @Override - public void batchUpdate(List list){ - this.baseMapper.batchUpdate(list); - } - - - /** - * 查询数据是否存在 - * @param wrapper 筛选条件 - * @return 返回结果 - */ - @Override - public Boolean exists(LambdaQueryWrapper wrapper) { - return this.baseMapper.exists(wrapper); - } - -} - diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/resource/impl/TaskResourceDbAdapterImpl.java b/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/resource/impl/TaskResourceDbAdapterImpl.java deleted file mode 100644 index bb2c26a..0000000 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/resource/impl/TaskResourceDbAdapterImpl.java +++ /dev/null @@ -1,66 +0,0 @@ -/* Copyright (c) 2022 渝州大数据实验室 - * - * Lanius is licensed under Mulan PSL v2. - * You can use this software according to the terms and conditions of the Mulan PSL v2. - * You may obtain a copy of Mulan PSL v2 at: - * - * http://license.coscl.org.cn/MulanPSL2 - * - * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. - * See the Mulan PSL v2 for more details. - */ -package org.yzbdl.lanius.orchestrate.adapter.dm.resource.impl; - -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import org.springframework.stereotype.Service; -import org.yzbdl.lanius.orchestrate.adapter.dm.resource.mapper.TaskResourceMapper; -import org.yzbdl.lanius.orchestrate.common.dto.resource.TaskResourceGroupCountDto; -import org.yzbdl.lanius.orchestrate.common.dto.resource.TaskResourceTypeStatisticDto; -import org.yzbdl.lanius.orchestrate.common.entity.resource.TaskResourceEntity; -import org.yzbdl.lanius.orchestrate.db.adapter.resource.TaskResourceDbAdapter; - -import java.util.List; - -/** - * 任务资源数据适配接口实现类 - * - * @author hujian@yzbdl.ac.cn - * @since 2022-08-17 10:34 - */ -@Service -public class TaskResourceDbAdapterImpl extends ServiceImpl implements TaskResourceDbAdapter { - - /** - * 获取不同资源分组计数 - * - * @return 分组计数值 - */ - @Override - public List getResourceCount() { - return this.baseMapper.getResourceCount(); - } - - /** - * 状态统计接口 - * - * @return 状态统计 - */ - @Override - public List getStatusGroupCount() { - return this.baseMapper.getStatusGroupCount(); - } - - /** - * 查询数据是否存在 - * @param wrapper 筛选条件 - * @return 返回结果 - */ - @Override - public Boolean exists(LambdaQueryWrapper wrapper) { - return this.baseMapper.exists(wrapper); - } - -} - diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/resource/impl/TaskResourceGroupDbAdapterImpl.java b/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/resource/impl/TaskResourceGroupDbAdapterImpl.java deleted file mode 100644 index 49986d2..0000000 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/resource/impl/TaskResourceGroupDbAdapterImpl.java +++ /dev/null @@ -1,54 +0,0 @@ -/* Copyright (c) 2022 渝州大数据实验室 - * - * Lanius is licensed under Mulan PSL v2. - * You can use this software according to the terms and conditions of the Mulan PSL v2. - * You may obtain a copy of Mulan PSL v2 at: - * - * http://license.coscl.org.cn/MulanPSL2 - * - * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. - * See the Mulan PSL v2 for more details. - */ -package org.yzbdl.lanius.orchestrate.adapter.dm.resource.impl; - -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import org.springframework.stereotype.Service; -import org.yzbdl.lanius.orchestrate.adapter.dm.resource.mapper.TaskResourceGroupMapper; -import org.yzbdl.lanius.orchestrate.common.entity.resource.TaskResourceGroupEntity; -import org.yzbdl.lanius.orchestrate.db.adapter.resource.TaskResourceGroupDbAdapter; - -import java.util.List; - -/** - * 任务资源组数据适配接口实现类 - * - * @author hujian@yzbdl.ac.cn - * @date 2022-08-17 10:38 - */ -@Service -public class TaskResourceGroupDbAdapterImpl extends ServiceImpl implements TaskResourceGroupDbAdapter { - - /** - * 根据id获取所有父类数据 - * @param id id - * @return 所有父级 - */ - @Override - public List getParentsById(Long id) { - return this.baseMapper.getParentsById(id); - } - - - /** - * 查询数据是否存在 - * @param wrapper 筛选条件 - * @return 返回结果 - */ - @Override - public Boolean exists(LambdaQueryWrapper wrapper) { - return this.baseMapper.exists(wrapper); - } - -} \ No newline at end of file diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/system/impl/ManagerDbAdapterImpl.java b/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/system/impl/ManagerDbAdapterImpl.java deleted file mode 100644 index e23203b..0000000 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/system/impl/ManagerDbAdapterImpl.java +++ /dev/null @@ -1,28 +0,0 @@ -/* Copyright (c) 2022 渝州大数据实验室 - * - * Lanius is licensed under Mulan PSL v2. - * You can use this software according to the terms and conditions of the Mulan PSL v2. - * You may obtain a copy of Mulan PSL v2 at: - * - * http://license.coscl.org.cn/MulanPSL2 - * - * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. - * See the Mulan PSL v2 for more details. - */ -package org.yzbdl.lanius.orchestrate.adapter.dm.system.impl; - -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import org.springframework.stereotype.Service; -import org.yzbdl.lanius.orchestrate.adapter.dm.system.mapper.ManagerMapper; -import org.yzbdl.lanius.orchestrate.common.entity.system.ManagerEntity; -import org.yzbdl.lanius.orchestrate.db.adapter.system.ManagerDbAdapter; - -/** - * 管理员数据适配接口实现类 - * - * @author hujian@yzbdl.ac.cn - * @date 2022-08-17 10:40 - */ -@Service -public class ManagerDbAdapterImpl extends ServiceImpl implements ManagerDbAdapter { -} diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/system/impl/OrgDbAdapterImpl.java b/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/system/impl/OrgDbAdapterImpl.java deleted file mode 100644 index 0af4e0b..0000000 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/system/impl/OrgDbAdapterImpl.java +++ /dev/null @@ -1,53 +0,0 @@ -/* Copyright (c) 2022 渝州大数据实验室 - * - * Lanius is licensed under Mulan PSL v2. - * You can use this software according to the terms and conditions of the Mulan PSL v2. - * You may obtain a copy of Mulan PSL v2 at: - * - * http://license.coscl.org.cn/MulanPSL2 - * - * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. - * See the Mulan PSL v2 for more details. - */ -package org.yzbdl.lanius.orchestrate.adapter.dm.system.impl; - -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import org.springframework.stereotype.Service; -import org.yzbdl.lanius.orchestrate.adapter.dm.system.mapper.OrgMapper; -import org.yzbdl.lanius.orchestrate.common.entity.system.OrgEntity; -import org.yzbdl.lanius.orchestrate.db.adapter.system.OrgDbAdapter; - -import java.util.List; - -/** - * 组织数据适配接口实现类 - * - * @author hujian@yzbdl.ac.cn - * @date 2022-08-17 10:45 - */ -@Service -public class OrgDbAdapterImpl extends ServiceImpl implements OrgDbAdapter { - - - /** - * 查看用户关联的组织 - * 改组织未冻结 - * @param userId 用户id - * @return 组织列表 - */ - @Override - public List queryOrgByUserId(Long userId) { - return this.baseMapper.queryOrgByUserId(userId); - } - - /** - * 查询数据是否存在 - * @param wrapper 筛选条件 - * @return 返回结果 - */ - @Override - public Boolean exists(LambdaQueryWrapper wrapper) { - return this.baseMapper.exists(wrapper); - } -} diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/system/impl/PermissionDbAdapterImpl.java b/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/system/impl/PermissionDbAdapterImpl.java deleted file mode 100644 index 858e692..0000000 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/system/impl/PermissionDbAdapterImpl.java +++ /dev/null @@ -1,53 +0,0 @@ -/* Copyright (c) 2022 渝州大数据实验室 - * - * Lanius is licensed under Mulan PSL v2. - * You can use this software according to the terms and conditions of the Mulan PSL v2. - * You may obtain a copy of Mulan PSL v2 at: - * - * http://license.coscl.org.cn/MulanPSL2 - * - * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. - * See the Mulan PSL v2 for more details. - */ -package org.yzbdl.lanius.orchestrate.adapter.dm.system.impl; - -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import org.springframework.stereotype.Service; -import org.yzbdl.lanius.orchestrate.adapter.dm.system.mapper.PermissionMapper; -import org.yzbdl.lanius.orchestrate.common.entity.system.PermissionEntity; -import org.yzbdl.lanius.orchestrate.common.vo.system.PermissionMenuUrlVo; -import org.yzbdl.lanius.orchestrate.db.adapter.system.PermissionDbAdapter; - -import java.util.List; - -/** - * 权限数据适配接口实现类 - * - * @author hujian@yzbdl.ac.cn - * @date 2022-08-17 10:47 - */ -@Service -public class PermissionDbAdapterImpl extends - ServiceImpl implements PermissionDbAdapter { - - - /** - * 根据用户查询权限 - * @param userId 用户id - * @return 权限列表 - */ - @Override - public List queryPermissionsByUserId(Long userId) { - return this.baseMapper.queryPermissionsByUserId(userId); - } - - - /** - * 查询权限列表 - * @return - */ - @Override - public List listPermissionsWithMenuUrl() { - return this.baseMapper.listPermissionsWithMenuUrl(); - } -} diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/system/impl/RoleDbAdapterImpl.java b/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/system/impl/RoleDbAdapterImpl.java deleted file mode 100644 index 45065af..0000000 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/system/impl/RoleDbAdapterImpl.java +++ /dev/null @@ -1,74 +0,0 @@ -/* Copyright (c) 2022 渝州大数据实验室 - * - * Lanius is licensed under Mulan PSL v2. - * You can use this software according to the terms and conditions of the Mulan PSL v2. - * You may obtain a copy of Mulan PSL v2 at: - * - * http://license.coscl.org.cn/MulanPSL2 - * - * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. - * See the Mulan PSL v2 for more details. - */ -package org.yzbdl.lanius.orchestrate.adapter.dm.system.impl; - -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import org.springframework.stereotype.Service; -import org.yzbdl.lanius.orchestrate.adapter.dm.system.mapper.RoleMapper; -import org.yzbdl.lanius.orchestrate.common.entity.system.RoleEntity; -import org.yzbdl.lanius.orchestrate.common.vo.system.RoleVo; -import org.yzbdl.lanius.orchestrate.db.adapter.system.RoleDbAdapter; - -import java.util.List; - -/** - * 角色数据适配接口实现类 - * - * @author hujian@yzbdl.ac.cn - * @date 2022-08-17 10:49 - */ -@Service -public class RoleDbAdapterImpl extends ServiceImpl implements RoleDbAdapter { - - /** - * 查询数据是否存在 - * @param wrapper 筛选条件 - * @return 返回结果 - */ - @Override - public Boolean exists(LambdaQueryWrapper wrapper) { - return this.baseMapper.exists(wrapper); - } - - /** - * 根据ID删除数据 - * @param id id - * @return 返回结果 - */ - @Override - public int deleteById(Long id) { - return this.baseMapper.deleteById(id); - } - - /** - * 统计角色数据 - * @param wrapper 查询条件 - * @return 返回数据 - */ - @Override - public int countRoleVo(LambdaQueryWrapper wrapper) { - return this.baseMapper.countRoleVo(wrapper); - } - - /** - * 查询符合条件的角色集合 - * @param skip 页码 - * @param pageSize 每页条数 - * @param wrapper 查询条件 - * @return 返回数据 - */ - @Override - public List queryRoleVo(Long skip, Long pageSize, LambdaQueryWrapper wrapper) { - return this.baseMapper.queryRoleVo(skip, pageSize, wrapper); - } -} diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/system/impl/RolePermissionDbAdapterImpl.java b/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/system/impl/RolePermissionDbAdapterImpl.java deleted file mode 100644 index 270bec0..0000000 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/system/impl/RolePermissionDbAdapterImpl.java +++ /dev/null @@ -1,42 +0,0 @@ -/* Copyright (c) 2022 渝州大数据实验室 - * - * Lanius is licensed under Mulan PSL v2. - * You can use this software according to the terms and conditions of the Mulan PSL v2. - * You may obtain a copy of Mulan PSL v2 at: - * - * http://license.coscl.org.cn/MulanPSL2 - * - * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. - * See the Mulan PSL v2 for more details. - */ -package org.yzbdl.lanius.orchestrate.adapter.dm.system.impl; - -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import org.springframework.stereotype.Service; -import org.yzbdl.lanius.orchestrate.adapter.dm.system.mapper.RolePermissionMapper; -import org.yzbdl.lanius.orchestrate.common.entity.system.RolePermissionEntity; -import org.yzbdl.lanius.orchestrate.db.adapter.system.RolePermissionDbAdapter; - -import java.util.List; - -/** - * 角色权限关联数据适配接口实现类 - * - * @author hujian@yzbdl.ac.cn - * @date 2022-08-17 10:52 - */ -@Service -public class RolePermissionDbAdapterImpl extends - ServiceImpl implements RolePermissionDbAdapter { - - /** - * 角色权限批量插入接口 - * - * @param rolePermissionEntityList 数据集合 - * @return 插入数据条数 - */ - @Override - public int insertBatch(List rolePermissionEntityList) { - return this.baseMapper.insertBatch(rolePermissionEntityList); - } -} diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/system/impl/UserDbAdapterImpl.java b/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/system/impl/UserDbAdapterImpl.java deleted file mode 100644 index c514f18..0000000 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/system/impl/UserDbAdapterImpl.java +++ /dev/null @@ -1,113 +0,0 @@ -/* Copyright (c) 2022 渝州大数据实验室 - * - * Lanius is licensed under Mulan PSL v2. - * You can use this software according to the terms and conditions of the Mulan PSL v2. - * You may obtain a copy of Mulan PSL v2 at: - * - * http://license.coscl.org.cn/MulanPSL2 - * - * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. - * See the Mulan PSL v2 for more details. - */ -package org.yzbdl.lanius.orchestrate.adapter.dm.system.impl; - -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import org.springframework.stereotype.Service; -import org.yzbdl.lanius.orchestrate.adapter.dm.system.mapper.UserMapper; -import org.yzbdl.lanius.orchestrate.common.dto.system.SimpleUserVO; -import org.yzbdl.lanius.orchestrate.common.entity.system.UserEntity; -import org.yzbdl.lanius.orchestrate.common.vo.system.AccountVO; -import org.yzbdl.lanius.orchestrate.common.vo.system.UserVo; -import org.yzbdl.lanius.orchestrate.db.adapter.system.UserDbAdapter; - -import java.util.List; - -/** - * 用户数据适配接口实现类 - * - * @author hujian@yzbdl.ac.cn - * @date 2022-08-17 11:01 - */ -@Service -public class UserDbAdapterImpl extends ServiceImpl implements UserDbAdapter { - - - /** - * 根据组织获取用户 - * - * @param orgId 组织id - * @param pageSize 每页条数 - * @param skip 页码 - * @param wrapper mybatis-plus条件 - * @return 用户视图列表 - */ - @Override - public List queryUserVoByOrgId(Long orgId, Long skip, Long pageSize, LambdaQueryWrapper wrapper) { - return this.baseMapper.queryUserVoByOrgId(orgId, skip, pageSize, wrapper); - } - - /** - * 根据组织id统计用户 - * - * @param orgId 组织id - * @param wrapper 筛选条件 - * @return 统计条数 - */ - @Override - public int countUserVoByOrgId(Long orgId, LambdaQueryWrapper wrapper) { - return this.baseMapper.countUserVoByOrgId(orgId, wrapper); - } - - /** - * 根据组织id查询用户列表 - * - * @param orgId 组织id - * @param page 分页 - * @param wrapper mybatis-plus条件 - * @return 用户列表 - */ - @Override - public Page queryUserByOrgId(Long orgId, IPage page, LambdaQueryWrapper wrapper) { - return this.baseMapper.queryUserByOrgId(orgId, page, wrapper); - } - - /** - * 查询第一个用户,用来判断存不存在 - * 没有使用数据库自带的exist,减少数据库语法依赖 - * - * @param orgId 组织id - * @return userid - */ - @Override - public Long getFirstUserIdByOrgId(Long orgId) { - return this.baseMapper.getFirstUserIdByOrgId(orgId); - } - - /** - * 管理员查询用户接口 - * - * @param skip 跳过页数 - * @param pageSize 页面大小 - * @param wrapper 查询条件 - * @return 账号列表 - */ - @Override - public List queryAccountVO(Long skip, Long pageSize, LambdaQueryWrapper wrapper){ - return baseMapper.queryAccountVO(skip,pageSize,wrapper); - } - - /** - * 获取不在该组织的用户 - * @param orgId 组织id - * @param likeUserName 模糊查询用户名称 - * @return 用户列表 - */ - @Override - public List listUsersNotInOrg(Long orgId, String likeUserName) { - return baseMapper.listUsersNotInOrg(orgId, likeUserName); - } - -} diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/system/impl/UserLogDbAdapterImpl.java b/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/system/impl/UserLogDbAdapterImpl.java deleted file mode 100644 index e3c958b..0000000 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/system/impl/UserLogDbAdapterImpl.java +++ /dev/null @@ -1,45 +0,0 @@ -/* Copyright (c) 2022 渝州大数据实验室 - * - * Lanius is licensed under Mulan PSL v2. - * You can use this software according to the terms and conditions of the Mulan PSL v2. - * You may obtain a copy of Mulan PSL v2 at: - * - * http://license.coscl.org.cn/MulanPSL2 - * - * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. - * See the Mulan PSL v2 for more details. - */ -package org.yzbdl.lanius.orchestrate.adapter.dm.system.impl; - -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import org.springframework.stereotype.Service; -import org.yzbdl.lanius.orchestrate.adapter.dm.system.mapper.UserLogMapper; -import org.yzbdl.lanius.orchestrate.common.entity.system.UserLogEntity; -import org.yzbdl.lanius.orchestrate.common.vo.system.UserLogVo; -import org.yzbdl.lanius.orchestrate.db.adapter.system.UserLogDbAdapter; - -/** - * 用户日志数据适配接口实现类 - * - * @author hujian@yzbdl.ac.cn - * @date 2022-08-17 11:06 - */ -@Service -public class UserLogDbAdapterImpl extends ServiceImpl implements UserLogDbAdapter { - /** - * 分页查询用户日志 - * - * @param nickName 用户昵称 - * @param wrapper 筛选条件 - * @param page 分页对象 - * @return 数据集合 - */ - @Override - public Page queryUserLogByNickName(String nickName, - LambdaQueryWrapper wrapper, IPage page) { - return this.baseMapper.queryUserLogByNickName(nickName, wrapper, page); - } -} diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/system/impl/UserOrgDbAdapterImpl.java b/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/system/impl/UserOrgDbAdapterImpl.java deleted file mode 100644 index ff822a3..0000000 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/system/impl/UserOrgDbAdapterImpl.java +++ /dev/null @@ -1,49 +0,0 @@ -/* Copyright (c) 2022 渝州大数据实验室 - * - * Lanius is licensed under Mulan PSL v2. - * You can use this software according to the terms and conditions of the Mulan PSL v2. - * You may obtain a copy of Mulan PSL v2 at: - * - * http://license.coscl.org.cn/MulanPSL2 - * - * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. - * See the Mulan PSL v2 for more details. - */ -package org.yzbdl.lanius.orchestrate.adapter.dm.system.impl; - -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import org.springframework.stereotype.Service; -import org.yzbdl.lanius.orchestrate.adapter.dm.system.mapper.UserOrgMapper; -import org.yzbdl.lanius.orchestrate.common.entity.system.UserOrgEntity; -import org.yzbdl.lanius.orchestrate.db.adapter.system.UserOrgDbAdapter; - -/** - * 用户角色关联数据适配接口实现类 - * - * @author hujian@yzbdl.ac.cn - * @date 2022-08-17 11:10 - */ -@Service -public class UserOrgDbAdapterImpl extends ServiceImpl implements UserOrgDbAdapter { - - /** - * 查询数据是否存在 - * @param wrapper 筛选条件 - * @return 返回结果 - */ - @Override - public Boolean exists(LambdaQueryWrapper wrapper) { - return this.baseMapper.exists(wrapper); - } - - /** - * 插入用户组织数据 - * @param entity 实体 - * @return 返回结果 - */ - @Override - public int insert(UserOrgEntity entity) { - return this.baseMapper.insert(entity); - } -} diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/system/impl/UserRoleDbAdapterImpl.java b/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/system/impl/UserRoleDbAdapterImpl.java deleted file mode 100644 index 67afdc4..0000000 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/system/impl/UserRoleDbAdapterImpl.java +++ /dev/null @@ -1,41 +0,0 @@ -/* Copyright (c) 2022 渝州大数据实验室 - * - * Lanius is licensed under Mulan PSL v2. - * You can use this software according to the terms and conditions of the Mulan PSL v2. - * You may obtain a copy of Mulan PSL v2 at: - * - * http://license.coscl.org.cn/MulanPSL2 - * - * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. - * See the Mulan PSL v2 for more details. - */ -package org.yzbdl.lanius.orchestrate.adapter.dm.system.impl; - -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import org.springframework.stereotype.Service; -import org.yzbdl.lanius.orchestrate.adapter.dm.system.mapper.UserRoleMapper; -import org.yzbdl.lanius.orchestrate.common.entity.system.UserRoleEntity; -import org.yzbdl.lanius.orchestrate.db.adapter.system.UserRoleDbAdapter; - -import java.util.List; - -/** - * 用户角色关联数据适配接口实现类 - * - * @author hujian@yzbdl.ac.cn - * @date 2022-08-17 11:11 - */ -@Service -public class UserRoleDbAdapterImpl extends ServiceImpl implements UserRoleDbAdapter { - - /** - * 批量插入用户角色关联数据 - * - * @param userRoleEntityList 数据集合 - * @return 返回结果 - */ - @Override - public int insertBatch(List userRoleEntityList) { - return this.baseMapper.insertBatch(userRoleEntityList); - } -} diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/system/mapper/PermissionMapper.java b/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/system/mapper/PermissionMapper.java deleted file mode 100644 index 5a6e746..0000000 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/system/mapper/PermissionMapper.java +++ /dev/null @@ -1,45 +0,0 @@ -/* Copyright (c) 2022 渝州大数据实验室 - * - * Lanius is licensed under Mulan PSL v2. - * You can use this software according to the terms and conditions of the Mulan PSL v2. - * You may obtain a copy of Mulan PSL v2 at: - * - * http://license.coscl.org.cn/MulanPSL2 - * - * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. - * See the Mulan PSL v2 for more details. - */ -package org.yzbdl.lanius.orchestrate.adapter.dm.system.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Param; -import org.yzbdl.lanius.orchestrate.common.entity.system.PermissionEntity; -import org.yzbdl.lanius.orchestrate.common.vo.system.PermissionMenuUrlVo; - -import java.util.List; - -/** - * 权限mapper - * - * @author chenjunhao@yzbdl.ac.cn - * @date 2022-04-11 09:21 - */ -@Mapper -public interface PermissionMapper extends BaseMapper { - - - /** - * 根据用户查询权限 - * @param userId 用户id - * @return 权限列表 - */ - List queryPermissionsByUserId(@Param("userId") Long userId); - - - /** - * - * @return - */ - List listPermissionsWithMenuUrl(); -} diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/system/mapper/RoleMapper.java b/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/system/mapper/RoleMapper.java deleted file mode 100644 index 049f032..0000000 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/system/mapper/RoleMapper.java +++ /dev/null @@ -1,38 +0,0 @@ -/* Copyright (c) 2022 渝州大数据实验室 - * - * Lanius is licensed under Mulan PSL v2. - * You can use this software according to the terms and conditions of the Mulan PSL v2. - * You may obtain a copy of Mulan PSL v2 at: - * - * http://license.coscl.org.cn/MulanPSL2 - * - * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. - * See the Mulan PSL v2 for more details. - */ -package org.yzbdl.lanius.orchestrate.adapter.dm.system.mapper; - -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Param; -import org.yzbdl.lanius.orchestrate.common.entity.system.RoleEntity; -import org.yzbdl.lanius.orchestrate.common.vo.system.RoleVo; - -import java.util.List; - -/** - * 角色mapper - * - * @author chenjunhao@yzbdl.ac.cn - * @date 2022-04-07 16:46 - */ -@Mapper -public interface RoleMapper extends BaseMapper { - - - //public List getRolesByMenuId(Long menuId); - - int countRoleVo(@Param("ew") LambdaQueryWrapper wapper); - - List queryRoleVo(@Param("skip") Long skip, @Param("pageSize") Long pageSize, @Param("ew") LambdaQueryWrapper wapper); -} diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/system/mapper/UserMapper.java b/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/system/mapper/UserMapper.java deleted file mode 100644 index cd492e3..0000000 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/system/mapper/UserMapper.java +++ /dev/null @@ -1,87 +0,0 @@ -/* Copyright (c) 2022 渝州大数据实验室 - * - * Lanius is licensed under Mulan PSL v2. - * You can use this software according to the terms and conditions of the Mulan PSL v2. - * You may obtain a copy of Mulan PSL v2 at: - * - * http://license.coscl.org.cn/MulanPSL2 - * - * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. - * See the Mulan PSL v2 for more details. - */ -package org.yzbdl.lanius.orchestrate.adapter.dm.system.mapper; - -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Param; -import org.yzbdl.lanius.orchestrate.common.dto.system.SimpleUserVO; -import org.yzbdl.lanius.orchestrate.common.entity.system.UserEntity; -import org.yzbdl.lanius.orchestrate.common.vo.system.AccountVO; -import org.yzbdl.lanius.orchestrate.common.vo.system.UserVo; - -import java.util.List; - -/** - * 用户mapper - * - * @author chenjunhao@yzbdl.ac.cn - * @date 2022-04-07 14:16 - */ -@Mapper -public interface UserMapper extends BaseMapper { - - /** - * 根据组织获取用户 - * @param orgId 组织id - * @param wapper mybatisplus条件 - * @return 用户视图列表 - */ - List queryUserVoByOrgId(@Param("orgId") Long orgId, @Param("skip") Long skip, @Param("pageSize") Long pageSize, @Param("ew") LambdaQueryWrapper wapper); - - /** - * 根据组织id统计用户 - * @param orgId 组织id - * @param wapper 筛选条件 - * @return - */ - int countUserVoByOrgId(@Param("orgId") Long orgId,@Param("ew") LambdaQueryWrapper wapper); - - /** - * 根据组织id查询用户列表 - * @param orgId 组织id - * @param page 分页 - * @param wapper mybatisplus条件 - * @return 用户列表 - */ - Page queryUserByOrgId(@Param("orgId") Long orgId, IPage page, @Param("ew") LambdaQueryWrapper wapper); - - /** - * 查询第一个用户,用来判断存不存在 - * 没有使用数据库自带的exist,减少数据库语法依赖 - * @param orgId 组织id - * @return userid - */ - Long getFirstUserIdByOrgId(@Param("orgId") Long orgId); - - /** - * 管理员查询用户接口 - * - * @param skip 跳过页数 - * @param pageSize 页面大小 - * @param wrapper 查询条件 - * @return 账号列表 - */ - List queryAccountVO(@Param("skip") Long skip, @Param("pageSize") Long pageSize, @Param("ew") LambdaQueryWrapper wrapper); - - /** - * 获取不在改组织的用户 - * @param orgId 组织id - * @param likeUserName 模糊查询用户名称 - * @return 用户列表 - */ - List listUsersNotInOrg(Long orgId, String likeUserName); - -} diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/task/impl/TaskInstanceDbAdapterImpl.java b/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/task/impl/TaskInstanceDbAdapterImpl.java deleted file mode 100644 index 7ac803b..0000000 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/task/impl/TaskInstanceDbAdapterImpl.java +++ /dev/null @@ -1,132 +0,0 @@ -/* Copyright (c) 2022 渝州大数据实验室 - * - * Lanius is licensed under Mulan PSL v2. - * You can use this software according to the terms and conditions of the Mulan PSL v2. - * You may obtain a copy of Mulan PSL v2 at: - * - * http://license.coscl.org.cn/MulanPSL2 - * - * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. - * See the Mulan PSL v2 for more details. - */ -package org.yzbdl.lanius.orchestrate.adapter.dm.task.impl; - -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import org.springframework.stereotype.Service; -import org.yzbdl.lanius.orchestrate.adapter.dm.task.mapper.TaskInstanceMapper; -import org.yzbdl.lanius.orchestrate.common.dto.task.TaskInstanceQueryDTO; -import org.yzbdl.lanius.orchestrate.common.dto.task.TaskInstanceResourceDTO; -import org.yzbdl.lanius.orchestrate.common.entity.task.TaskInstance; -import org.yzbdl.lanius.orchestrate.common.vo.task.ScheduleTaskInstanceVO; -import org.yzbdl.lanius.orchestrate.common.vo.task.TaskInstanceVO; -import org.yzbdl.lanius.orchestrate.db.adapter.task.TaskInstanceDbAdapter; - -import java.util.List; - -/** - * 任务实例数据适配接口实现类 - * - * @author hujian@yzbdl.ac.cn - * @date 2022-08-17 11:13 - */ -@Service -public class TaskInstanceDbAdapterImpl extends - ServiceImpl implements TaskInstanceDbAdapter { - - /** - * 分页查询任务实例列表 - * - * @param page - * 分页信息 - * @param instanceQueryDTO - * 查询条件 - * @param pageSize - * 每页条数 - * @param startIndex - * 起始索引 - * @return - * 结果信息 - */ - @Override - public IPage queryPage(Page page, - TaskInstanceQueryDTO instanceQueryDTO, long startIndex, long pageSize) { - return this.baseMapper.queryPage(page, instanceQueryDTO, startIndex, pageSize); - } - - /** - * 获取调度总览之任务实例 - * - * @return - * 结果信息 - */ - @Override - public List getSchedulerViewStatistics() { - return this.baseMapper.getSchedulerViewStatistics(); - } - - /** - * 获取任务实例信息,忽略租户 - * - * @param taskInstanceId - * 任务实例ID - * @return - * 任务实例 - */ - @Override - public TaskInstance getByIdIgnoreTenantId(Long taskInstanceId) { - return this.baseMapper.getByIdIgnoreTenantId(taskInstanceId); - } - - /** - * 判断是否存在运行的任务示例 - * @param taskResourceId 任务资源id - * @return 任务实例 - */ - @Override - public TaskInstance getRunningTaskInstance(Long taskResourceId) { - return this.baseMapper.getRunningTaskInstance(taskResourceId); - } - - /** - * 获取一条运行中的实例,根据任务编排ID - * - * @param runStateList - * 运行状态 - * @param taskPlanId - * 任务编排ID - * @return - * 任务实例 - */ - @Override - public TaskInstance getOneInstanceForRunIgnoreTenantId(List runStateList, Long taskPlanId) { - return this.baseMapper.getOneInstanceForRunIgnoreTenantId(runStateList, taskPlanId); - } - - /** - * 根据id更新实例,忽略租户ID - * - * @param taskInstance - * 实例 - * @return - * 影响条数 - */ - @Override - public int updateByIdIgnoreTenantId(TaskInstance taskInstance) { - return this.baseMapper.updateByIdIgnoreTenantId(taskInstance); - } - - /** - * 获取任务实例资源信息 - * - * @param taskInstanceId - * 任务实例ID - * @return - * 任务实例资源信息 - */ - @Override - public TaskInstanceResourceDTO getTaskInstanceResourceIgnoreTenantId(Long taskInstanceId) { - return this.baseMapper.getTaskInstanceResourceIgnoreTenantId(taskInstanceId); - } -} diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/task/impl/TaskPlanDbAdapterImpl.java b/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/task/impl/TaskPlanDbAdapterImpl.java deleted file mode 100644 index 9a74948..0000000 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/task/impl/TaskPlanDbAdapterImpl.java +++ /dev/null @@ -1,117 +0,0 @@ -/* Copyright (c) 2022 渝州大数据实验室 - * - * Lanius is licensed under Mulan PSL v2. - * You can use this software according to the terms and conditions of the Mulan PSL v2. - * You may obtain a copy of Mulan PSL v2 at: - * - * http://license.coscl.org.cn/MulanPSL2 - * - * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. - * See the Mulan PSL v2 for more details. - */ -package org.yzbdl.lanius.orchestrate.adapter.dm.task.impl; - -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import org.springframework.stereotype.Service; -import org.yzbdl.lanius.orchestrate.adapter.dm.task.mapper.TaskPlanMapper; -import org.yzbdl.lanius.orchestrate.common.dto.task.TaskPlanQueryDTO; -import org.yzbdl.lanius.orchestrate.common.dto.task.TaskPlanResourceDTO; -import org.yzbdl.lanius.orchestrate.common.entity.task.TaskPlan; -import org.yzbdl.lanius.orchestrate.common.vo.task.ScheduleTaskPlanVO; -import org.yzbdl.lanius.orchestrate.common.vo.task.TaskPlanVO; -import org.yzbdl.lanius.orchestrate.db.adapter.task.TaskPlanDbAdapter; - -import java.util.List; - -/** - * 任务编排数据适配接口实现类 - * - * @author hujian@yzbdl.ac.cn - * @date 2022-08-17 13:40 - */ -@Service -public class TaskPlanDbAdapterImpl extends ServiceImpl implements TaskPlanDbAdapter { - - /** - * 分页查询任务编排列表 - * - * @param page 分页信息 - * @param taskPlanQueryDto 查询参数 - * @return 结果信息 - */ - @Override - public IPage queryPage( - Page page, TaskPlanQueryDTO taskPlanQueryDto) { - return this.baseMapper.queryPage(page, taskPlanQueryDto); - } - - /** - * 获取任务编排及对应的分组信息 - * - * @param taskPlanId - * 任务编排ID - * @return - * 结果信息 - */ - @Override - public TaskPlanVO getOneAndGroup(Long taskPlanId) { - return this.baseMapper.getOneAndGroup(taskPlanId); - } - - /** - * 根据任务ID获取任务资源、配置信息 - *

- * 任务调度专用接口,忽略租户 - *

- * - * @param taskPlanId - * 任务编排ID - * @return - * 数据信息 - */ - @Override - public TaskPlanResourceDTO getTaskPlanAndResourceInfoIgnoreTenantId(Long taskPlanId) { - return this.baseMapper.getTaskPlanAndResourceInfoIgnoreTenantId(taskPlanId); - } - - /** - * 获取调度总览之任务编排 - *

- * 任务调度专用接口,忽略租户 - *

- * - * @return - * 结果信息 - */ - @Override - public List getSchedulerViewStatistics() { - return this.baseMapper.getSchedulerViewStatistics(); - } - - /** - * 获取所有的任务编排数据 - *

- * 整个系统的数据 - *

- * - * @return - * 结果信息 - */ - @Override - public List getAllListIgnoreTenantId() { - return this.baseMapper.getAllListIgnoreTenantId(); - } - - /** - * 查询数据是否存在 - * @param wrapper 筛选条件 - * @return 返回结果 - */ - @Override - public Boolean exists(LambdaQueryWrapper wrapper) { - return this.baseMapper.exists(wrapper); - } -} diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/task/impl/TaskPlanGroupDbAdapterImpl.java b/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/task/impl/TaskPlanGroupDbAdapterImpl.java deleted file mode 100644 index 671c890..0000000 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/task/impl/TaskPlanGroupDbAdapterImpl.java +++ /dev/null @@ -1,57 +0,0 @@ -/* Copyright (c) 2022 渝州大数据实验室 - * - * Lanius is licensed under Mulan PSL v2. - * You can use this software according to the terms and conditions of the Mulan PSL v2. - * You may obtain a copy of Mulan PSL v2 at: - * - * http://license.coscl.org.cn/MulanPSL2 - * - * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. - * See the Mulan PSL v2 for more details. - */ -package org.yzbdl.lanius.orchestrate.adapter.dm.task.impl; - -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import org.springframework.stereotype.Service; -import org.yzbdl.lanius.orchestrate.adapter.dm.task.mapper.TaskPlanGroupMapper; -import org.yzbdl.lanius.orchestrate.common.entity.task.TaskPlanGroup; -import org.yzbdl.lanius.orchestrate.common.vo.task.TaskPlanGroupVO; -import org.yzbdl.lanius.orchestrate.db.adapter.task.TaskPlanGroupDbAdapter; - -import java.util.List; - -/** - * 任务编排分组数据适配接口实现类 - * - * @author hujian@yzbdl.ac.cn - * @date 2022-08-17 13:46 - */ -@Service -public class TaskPlanGroupDbAdapterImpl extends - ServiceImpl implements TaskPlanGroupDbAdapter { - - - /** - * 分组树形结构并统计任务编排数量 - * - * @return - * 结果信息 - */ - @Override - public List treeList() { - return this.baseMapper.treeList(); - } - - /** - * 根据id获取所有的上级 - * - * @param id - * 分组ID - * @return - * 上级 - */ - @Override - public List getParentsById(Long id) { - return this.baseMapper.getParentsById(id); - } -} diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/task/impl/TaskStepLogDbAdapterImpl.java b/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/task/impl/TaskStepLogDbAdapterImpl.java deleted file mode 100644 index a1bdeac..0000000 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/task/impl/TaskStepLogDbAdapterImpl.java +++ /dev/null @@ -1,46 +0,0 @@ -/* Copyright (c) 2022 渝州大数据实验室 - * - * Lanius is licensed under Mulan PSL v2. - * You can use this software according to the terms and conditions of the Mulan PSL v2. - * You may obtain a copy of Mulan PSL v2 at: - * - * http://license.coscl.org.cn/MulanPSL2 - * - * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. - * See the Mulan PSL v2 for more details. - */ -package org.yzbdl.lanius.orchestrate.adapter.dm.task.impl; - -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import org.springframework.stereotype.Service; -import org.yzbdl.lanius.orchestrate.adapter.dm.task.mapper.TaskStepLogMapper; -import org.yzbdl.lanius.orchestrate.common.entity.task.TaskStepLog; -import org.yzbdl.lanius.orchestrate.common.vo.task.TaskStepLogVO; -import org.yzbdl.lanius.orchestrate.db.adapter.task.TaskStepLogDbAdapter; - -import java.util.List; - -/** - * 任务步骤日志数据适配接口实现类 - * - * @author hujian@yzbdl.ac.cn - * @date 2022-08-17 13:48 - */ -@Service -public class TaskStepLogDbAdapterImpl extends - ServiceImpl implements TaskStepLogDbAdapter { - - /** - * 获取步骤度量 - * - * @param taskInstanceId - * 任务实例ID - * @return - * 结果数据 - */ - @Override - public List getStepLogByTaskInstanceId(Long taskInstanceId) { - return this.baseMapper.getStepLogByTaskInstanceId(taskInstanceId); - } - -} diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/resources/mapper/resource/ServerMapper.xml b/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/resources/mapper/resource/ServerMapper.xml deleted file mode 100644 index 10131a2..0000000 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/resources/mapper/resource/ServerMapper.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - update lo_server - - status = #{item.status} - - where id = #{item.id} - - - - \ No newline at end of file diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/resources/mapper/resource/TaskResourceConfigMapper.xml b/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/resources/mapper/resource/TaskResourceConfigMapper.xml deleted file mode 100644 index 1f6669e..0000000 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/resources/mapper/resource/TaskResourceConfigMapper.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - update lo_task_resource_config - - status = #{item.status} - - where id = #{item.id} - - - - \ No newline at end of file diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/resources/mapper/resource/TaskResourceMapper.xml b/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/resources/mapper/resource/TaskResourceMapper.xml deleted file mode 100644 index e84aac9..0000000 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/resources/mapper/resource/TaskResourceMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/pom.xml b/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/pom.xml deleted file mode 100644 index 644e12d..0000000 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/pom.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - org.yzbdl.lanius - lanius-orchestrate-server - 1.0-SNAPSHOT - ../../../pom.xml - - - org.yzbdl.lanius - lanius-orchestrate-db-adapter-mysql - 0.0.1-SNAPSHOT - lanius-orchestrate-db-adapter-mysql - mysql数据库适配模块 - - 4.0.0 - - - - org.yzbdl.lanius - lanius-orchestrate-common - ${lanius.module.common.version} - - - org.yzbdl.lanius - lanius-orchestrate-db-adapter - ${lanius.module.db.adapter.version} - - - - \ No newline at end of file diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/resource/impl/ServerDbAdapterImpl.java b/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/resource/impl/ServerDbAdapterImpl.java deleted file mode 100644 index 57f6a28..0000000 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/resource/impl/ServerDbAdapterImpl.java +++ /dev/null @@ -1,80 +0,0 @@ -/* Copyright (c) 2022 渝州大数据实验室 - * - * Lanius is licensed under Mulan PSL v2. - * You can use this software according to the terms and conditions of the Mulan PSL v2. - * You may obtain a copy of Mulan PSL v2 at: - * - * http://license.coscl.org.cn/MulanPSL2 - * - * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. - * See the Mulan PSL v2 for more details. - */ -package org.yzbdl.lanius.orchestrate.adapter.mysql.resource.impl; - -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import org.springframework.stereotype.Service; -import org.yzbdl.lanius.orchestrate.adapter.mysql.resource.mapper.ServerMapper; -import org.yzbdl.lanius.orchestrate.common.dto.resource.StatusStatisticDto; -import org.yzbdl.lanius.orchestrate.common.entity.resource.ServerEntity; -import org.yzbdl.lanius.orchestrate.db.adapter.resource.ServerDbAdapter; - -import java.util.List; - -/** - * 服务节点信息数据库适配接口实现类 - * - * @author hujian@yzbdl.ac.cn - * @since 2022-08-16 17:01 - */ -@Service -public class ServerDbAdapterImpl extends ServiceImpl implements ServerDbAdapter { - - /** - * 状态统计接口 - * @return 状态统计 - */ - @Override - public List getStatusGroupCount() { - return this.baseMapper.getStatusGroupCount(); - } - - /** - * 获取所有服务器数据不区分主租户 - * @return list务器数据 - */ - @Override - public List getAllServer() { - return this.baseMapper.getAllServer(); - } - - /** - * 更新服务器信息 - * @param list list务器数据 - */ - @Override - public void batchUpdate(List list) { - this.baseMapper.batchUpdate(list); - } - - /** - * 根据id获取服务器信息 - * @param id 服务器id - * @return 服务器信息 - */ - @Override - public ServerEntity getServerInfoById(Long id) { - return this.baseMapper.getServerInfoById(id); - } - - /** - * 查询数据是否存在 - * @param wrapper 筛选条件 - * @return 返回结果 - */ - @Override - public Boolean exists(LambdaQueryWrapper wrapper) { - return this.baseMapper.exists(wrapper); - } - -} diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/resource/impl/ServerProgramDbAdapterImpl.java b/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/resource/impl/ServerProgramDbAdapterImpl.java deleted file mode 100644 index 6a87964..0000000 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/resource/impl/ServerProgramDbAdapterImpl.java +++ /dev/null @@ -1,89 +0,0 @@ -/* Copyright (c) 2022 渝州大数据实验室 - * - * Lanius is licensed under Mulan PSL v2. - * You can use this software according to the terms and conditions of the Mulan PSL v2. - * You may obtain a copy of Mulan PSL v2 at: - * - * http://license.coscl.org.cn/MulanPSL2 - * - * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. - * See the Mulan PSL v2 for more details. - */ -package org.yzbdl.lanius.orchestrate.adapter.mysql.resource.impl; - -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import org.springframework.stereotype.Service; -import org.yzbdl.lanius.orchestrate.adapter.mysql.resource.mapper.ServerProgramMapper; -import org.yzbdl.lanius.orchestrate.common.dto.resource.ServerProgramAndServerDto; -import org.yzbdl.lanius.orchestrate.common.dto.resource.ServerProgramInfoDTO; -import org.yzbdl.lanius.orchestrate.common.dto.resource.StatusStatisticDto; -import org.yzbdl.lanius.orchestrate.common.entity.resource.ServerProgramEntity; -import org.yzbdl.lanius.orchestrate.db.adapter.resource.ServerProgramDbAdapter; - -import java.util.List; - -/** - * 数据节点数据适配接口实现类 - * - * @author hujian@yzbdl.ac.cn - * @since 2022-08-17 10:20 - */ -@Service -public class ServerProgramDbAdapterImpl extends ServiceImpl implements ServerProgramDbAdapter { - - /** - * 获取服务节点详细信息,(包含关联的节点信息) - *

- * 任务调度专用接口,忽略租户 - *

- * - * @param programId - * 服务节点ID - * @return - * 数据 - */ - @Override - public ServerProgramInfoDTO getServerProgramInfoByIdIgnoreTenantId(Long programId) { - return this.baseMapper.getServerProgramInfoByIdIgnoreTenantId(programId); - } - - - /** - * 获取服务节点和服务器信息数据 - * @return 节点和服务器数据 - */ - @Override - public List getAllServerProgramAndServerInfo() { - return this.baseMapper.getAllServerProgramAndServerInfo(); - } - - /** - * 状态统计接口 - * @return 状态统计 - */ - @Override - public List getStatusGroupCount() { - return this.baseMapper.getStatusGroupCount(); - } - - /** - * 批量更新服务节点状态 - * @param list list服务节点 - */ - @Override - public void batchUpdate(List list) { - this.baseMapper.batchUpdate(list); - } - - /** - * 查询数据是否存在 - * @param wrapper 筛选条件 - * @return 返回结果 - */ - @Override - public Boolean exists(LambdaQueryWrapper wrapper) { - return this.baseMapper.exists(wrapper); - } -} diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/resource/impl/TaskResourceConfigDbAdapterImpl.java b/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/resource/impl/TaskResourceConfigDbAdapterImpl.java deleted file mode 100644 index 5c0da53..0000000 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/resource/impl/TaskResourceConfigDbAdapterImpl.java +++ /dev/null @@ -1,73 +0,0 @@ -/* Copyright (c) 2022 渝州大数据实验室 - * - * Lanius is licensed under Mulan PSL v2. - * You can use this software according to the terms and conditions of the Mulan PSL v2. - * You may obtain a copy of Mulan PSL v2 at: - * - * http://license.coscl.org.cn/MulanPSL2 - * - * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. - * See the Mulan PSL v2 for more details. - */ -package org.yzbdl.lanius.orchestrate.adapter.mysql.resource.impl; - -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import org.springframework.stereotype.Service; -import org.yzbdl.lanius.orchestrate.adapter.mysql.resource.mapper.TaskResourceConfigMapper; -import org.yzbdl.lanius.orchestrate.common.dto.resource.StatusStatisticDto; -import org.yzbdl.lanius.orchestrate.common.entity.resource.TaskResourceConfigEntity; -import org.yzbdl.lanius.orchestrate.db.adapter.resource.TaskResourceConfigDbAdapter; - -import java.util.List; - -/** - * 任务资源配置数据适配接口实现类 - * - * @author hujian@yzbdl.ac.cn - * @since 2022-08-17 10:30 - */ -@Service -public class TaskResourceConfigDbAdapterImpl extends ServiceImpl implements TaskResourceConfigDbAdapter { - - /** - * 获取所有任务资源配置不区分主租户 - * @return list任务资源配置 - */ - @Override - public List getAllTaskResource() { - return this.baseMapper.getAllTaskResource(); - } - - /** - * 状态统计接口 - * @return 状态统计 - */ - @Override - public List getStatusGroupCount(){ - return this.baseMapper.getStatusGroupCount(); - } - - /** - * 批量更新任务资源配置状态 - * @param list list配置数据 - */ - @Override - public void batchUpdate(List list){ - this.baseMapper.batchUpdate(list); - } - - - /** - * 查询数据是否存在 - * @param wrapper 筛选条件 - * @return 返回结果 - */ - @Override - public Boolean exists(LambdaQueryWrapper wrapper) { - return this.baseMapper.exists(wrapper); - } - -} - diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/resource/impl/TaskResourceDbAdapterImpl.java b/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/resource/impl/TaskResourceDbAdapterImpl.java deleted file mode 100644 index 8033272..0000000 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/resource/impl/TaskResourceDbAdapterImpl.java +++ /dev/null @@ -1,66 +0,0 @@ -/* Copyright (c) 2022 渝州大数据实验室 - * - * Lanius is licensed under Mulan PSL v2. - * You can use this software according to the terms and conditions of the Mulan PSL v2. - * You may obtain a copy of Mulan PSL v2 at: - * - * http://license.coscl.org.cn/MulanPSL2 - * - * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. - * See the Mulan PSL v2 for more details. - */ -package org.yzbdl.lanius.orchestrate.adapter.mysql.resource.impl; - -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import org.springframework.stereotype.Service; -import org.yzbdl.lanius.orchestrate.adapter.mysql.resource.mapper.TaskResourceMapper; -import org.yzbdl.lanius.orchestrate.common.dto.resource.TaskResourceGroupCountDto; -import org.yzbdl.lanius.orchestrate.common.dto.resource.TaskResourceTypeStatisticDto; -import org.yzbdl.lanius.orchestrate.common.entity.resource.TaskResourceEntity; -import org.yzbdl.lanius.orchestrate.db.adapter.resource.TaskResourceDbAdapter; - -import java.util.List; - -/** - * 任务资源数据适配接口实现类 - * - * @author hujian@yzbdl.ac.cn - * @since 2022-08-17 10:34 - */ -@Service -public class TaskResourceDbAdapterImpl extends ServiceImpl implements TaskResourceDbAdapter { - - /** - * 获取不同资源分组计数 - * - * @return 分组计数值 - */ - @Override - public List getResourceCount() { - return this.baseMapper.getResourceCount(); - } - - /** - * 状态统计接口 - * - * @return 状态统计 - */ - @Override - public List getStatusGroupCount() { - return this.baseMapper.getStatusGroupCount(); - } - - /** - * 查询数据是否存在 - * @param wrapper 筛选条件 - * @return 返回结果 - */ - @Override - public Boolean exists(LambdaQueryWrapper wrapper) { - return this.baseMapper.exists(wrapper); - } - -} - diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/resource/impl/TaskResourceGroupDbAdapterImpl.java b/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/resource/impl/TaskResourceGroupDbAdapterImpl.java deleted file mode 100644 index c220fc1..0000000 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/resource/impl/TaskResourceGroupDbAdapterImpl.java +++ /dev/null @@ -1,54 +0,0 @@ -/* Copyright (c) 2022 渝州大数据实验室 - * - * Lanius is licensed under Mulan PSL v2. - * You can use this software according to the terms and conditions of the Mulan PSL v2. - * You may obtain a copy of Mulan PSL v2 at: - * - * http://license.coscl.org.cn/MulanPSL2 - * - * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. - * See the Mulan PSL v2 for more details. - */ -package org.yzbdl.lanius.orchestrate.adapter.mysql.resource.impl; - -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import org.springframework.stereotype.Service; -import org.yzbdl.lanius.orchestrate.adapter.mysql.resource.mapper.TaskResourceGroupMapper; -import org.yzbdl.lanius.orchestrate.common.entity.resource.TaskResourceGroupEntity; -import org.yzbdl.lanius.orchestrate.db.adapter.resource.TaskResourceGroupDbAdapter; - -import java.util.List; - -/** - * 任务资源组数据适配接口实现类 - * - * @author hujian@yzbdl.ac.cn - * @date 2022-08-17 10:38 - */ -@Service -public class TaskResourceGroupDbAdapterImpl extends ServiceImpl implements TaskResourceGroupDbAdapter { - - /** - * 根据id获取所有父类数据 - * @param id id - * @return 所有父级 - */ - @Override - public List getParentsById(Long id) { - return this.baseMapper.getParentsById(id); - } - - - /** - * 查询数据是否存在 - * @param wrapper 筛选条件 - * @return 返回结果 - */ - @Override - public Boolean exists(LambdaQueryWrapper wrapper) { - return this.baseMapper.exists(wrapper); - } - -} \ No newline at end of file diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/resource/mapper/ServerMapper.java b/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/resource/mapper/ServerMapper.java deleted file mode 100644 index d13d487..0000000 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/resource/mapper/ServerMapper.java +++ /dev/null @@ -1,63 +0,0 @@ -/* Copyright (c) 2022 渝州大数据实验室 - * - * Lanius is licensed under Mulan PSL v2. - * You can use this software according to the terms and conditions of the Mulan PSL v2. - * You may obtain a copy of Mulan PSL v2 at: - * - * http://license.coscl.org.cn/MulanPSL2 - * - * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. - * See the Mulan PSL v2 for more details. - */ -package org.yzbdl.lanius.orchestrate.adapter.mysql.resource.mapper; - -import com.baomidou.mybatisplus.annotation.InterceptorIgnore; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Select; -import org.yzbdl.lanius.orchestrate.common.dto.resource.StatusStatisticDto; -import org.yzbdl.lanius.orchestrate.common.entity.resource.ServerEntity; - -import java.util.List; - -/** - * 服务器数据操作层 - * - * @author zhuhongji@yzbdl.ac.cn - * @since 2022-03-29 14:46 - */ -@Mapper -public interface ServerMapper extends BaseMapper { - - /** - * 状态统计接口 - * @return 状态统计 - */ - @Select("select count(*) as count, status from lo_server where deleted = false group by status") - List getStatusGroupCount(); - - /** - * 获取所有服务器数据不区分主租户 - * @return list务器数据 - */ - @InterceptorIgnore(tenantLine = "on") - @Select("select * from lo_server where deleted = false") - List getAllServer(); - - /** - * 更新服务器信息 - * @param list list务器数据 - */ - @InterceptorIgnore(tenantLine = "on") - void batchUpdate(List list); - - /** - * 根据id获取服务器信息 - * @param id 服务器id - * @return 服务器信息 - */ - @InterceptorIgnore(tenantLine = "on") - @Select("select * from lo_server where id = #{id}") - ServerEntity getServerInfoById(Long id); - -} diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/resource/mapper/ServerProgramMapper.java b/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/resource/mapper/ServerProgramMapper.java deleted file mode 100644 index 2154ea2..0000000 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/resource/mapper/ServerProgramMapper.java +++ /dev/null @@ -1,70 +0,0 @@ -/* Copyright (c) 2022 渝州大数据实验室 - * - * Lanius is licensed under Mulan PSL v2. - * You can use this software according to the terms and conditions of the Mulan PSL v2. - * You may obtain a copy of Mulan PSL v2 at: - * - * http://license.coscl.org.cn/MulanPSL2 - * - * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. - * See the Mulan PSL v2 for more details. - */ -package org.yzbdl.lanius.orchestrate.adapter.mysql.resource.mapper; - -import com.baomidou.mybatisplus.annotation.InterceptorIgnore; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Param; -import org.apache.ibatis.annotations.Select; -import org.yzbdl.lanius.orchestrate.common.dto.resource.ServerProgramAndServerDto; -import org.yzbdl.lanius.orchestrate.common.dto.resource.ServerProgramInfoDTO; -import org.yzbdl.lanius.orchestrate.common.dto.resource.StatusStatisticDto; -import org.yzbdl.lanius.orchestrate.common.entity.resource.ServerProgramEntity; - -import java.util.List; - -/** - * 数据节点数据操作层 - * - * @author zhuhongji@yzbdl.ac.cn - * @since 2022-04-08 15:35 - */ -@Mapper -public interface ServerProgramMapper extends BaseMapper { - - /** - * 获取服务节点详细信息,(包含关联的节点信息) - *

- * 任务调度专用接口,忽略租户 - *

- * - * @param programId - * 服务节点ID - * @return - * 数据 - */ - @InterceptorIgnore(tenantLine = "on") - ServerProgramInfoDTO getServerProgramInfoByIdIgnoreTenantId(@Param("programId") Long programId); - - - /** - * 获取服务节点和服务器信息数据 - * @return 节点和服务器数据 - */ - @InterceptorIgnore(tenantLine = "on") - List getAllServerProgramAndServerInfo(); - - /** - * 状态统计接口 - * @return 状态统计 - */ - @Select("select count(*) as count, status from lo_server_program where deleted = false group by status") - List getStatusGroupCount(); - - /** - * 批量更新服务节点状态 - * @param list list服务节点 - */ - @InterceptorIgnore(tenantLine = "on") - void batchUpdate(List list); -} diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/resource/mapper/TaskResourceConfigMapper.java b/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/resource/mapper/TaskResourceConfigMapper.java deleted file mode 100644 index 35bf6ef..0000000 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/resource/mapper/TaskResourceConfigMapper.java +++ /dev/null @@ -1,55 +0,0 @@ -/* Copyright (c) 2022 渝州大数据实验室 - * - * Lanius is licensed under Mulan PSL v2. - * You can use this software according to the terms and conditions of the Mulan PSL v2. - * You may obtain a copy of Mulan PSL v2 at: - * - * http://license.coscl.org.cn/MulanPSL2 - * - * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. - * See the Mulan PSL v2 for more details. - */ -package org.yzbdl.lanius.orchestrate.adapter.mysql.resource.mapper; - -import com.baomidou.mybatisplus.annotation.InterceptorIgnore; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Select; -import org.yzbdl.lanius.orchestrate.common.dto.resource.StatusStatisticDto; -import org.yzbdl.lanius.orchestrate.common.entity.resource.TaskResourceConfigEntity; - -import java.util.List; - -/** - * 任务资源配置数据操作层 - * - * @author zhuhongji@yzbdl.ac.cn - * @since 2022-04-08 16:14 - */ -@Mapper -public interface TaskResourceConfigMapper extends BaseMapper { - - /** - * 获取所有任务资源配置不区分主租户 - * @return list任务资源配置 - */ - @InterceptorIgnore(tenantLine = "on") - @Select("select * from lo_task_resource_config where deleted = false") - List getAllTaskResource(); - - /** - * 状态统计接口 - * @return 状态统计 - */ - @Select("select count(*) as count, status from lo_task_resource_config where deleted = false group by status") - List getStatusGroupCount(); - - /** - * 批量更新任务资源配置状态 - * @param list list配置数据 - */ - @InterceptorIgnore(tenantLine = "on") - void batchUpdate(List list); - -} - diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/resource/mapper/TaskResourceGroupMapper.java b/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/resource/mapper/TaskResourceGroupMapper.java deleted file mode 100644 index bcfcd81..0000000 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/resource/mapper/TaskResourceGroupMapper.java +++ /dev/null @@ -1,35 +0,0 @@ -/* Copyright (c) 2022 渝州大数据实验室 - * - * Lanius is licensed under Mulan PSL v2. - * You can use this software according to the terms and conditions of the Mulan PSL v2. - * You may obtain a copy of Mulan PSL v2 at: - * - * http://license.coscl.org.cn/MulanPSL2 - * - * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. - * See the Mulan PSL v2 for more details. - */ -package org.yzbdl.lanius.orchestrate.adapter.mysql.resource.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Param; -import org.yzbdl.lanius.orchestrate.common.entity.resource.TaskResourceGroupEntity; - -import java.util.List; - -/** - * @author zhuhongji@yzbdl.ac.cn - * @date 2022-04-11 11:32 - */ -@Mapper -public interface TaskResourceGroupMapper extends BaseMapper { - - /** - * 根据id获取所有父类数据 - * @param id id - * @return 所有父级 - */ - List getParentsById(@Param("id") Long id); - -} \ No newline at end of file diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/resource/mapper/TaskResourceMapper.java b/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/resource/mapper/TaskResourceMapper.java deleted file mode 100644 index f3bcc3d..0000000 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/resource/mapper/TaskResourceMapper.java +++ /dev/null @@ -1,47 +0,0 @@ -/* Copyright (c) 2022 渝州大数据实验室 - * - * Lanius is licensed under Mulan PSL v2. - * You can use this software according to the terms and conditions of the Mulan PSL v2. - * You may obtain a copy of Mulan PSL v2 at: - * - * http://license.coscl.org.cn/MulanPSL2 - * - * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. - * See the Mulan PSL v2 for more details. - */ -package org.yzbdl.lanius.orchestrate.adapter.mysql.resource.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Select; -import org.yzbdl.lanius.orchestrate.common.dto.resource.TaskResourceGroupCountDto; -import org.yzbdl.lanius.orchestrate.common.dto.resource.TaskResourceTypeStatisticDto; -import org.yzbdl.lanius.orchestrate.common.entity.resource.TaskResourceEntity; - -import java.util.List; - -/** - * 任务资源数据操作层 - * - * @author zhuhongji@yzbdl.ac.cn - * @since 2022-04-08 16:49 - */ -@Mapper -public interface TaskResourceMapper extends BaseMapper { - - /** - * 获取不同资源分组计数 - * @return 分组计数值 - */ - @Select("select group_id, count(*) as count from lo_task_resource where deleted = false group by group_id;") - List getResourceCount(); - - /** - * 状态统计接口 - * @return 状态统计 - */ - @Select("select count(*) as count, resource_type from lo_task_resource where deleted = false group by resource_type") - List getStatusGroupCount(); - -} - diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/system/impl/ManagerDbAdapterImpl.java b/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/system/impl/ManagerDbAdapterImpl.java deleted file mode 100644 index e8c4722..0000000 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/system/impl/ManagerDbAdapterImpl.java +++ /dev/null @@ -1,28 +0,0 @@ -/* Copyright (c) 2022 渝州大数据实验室 - * - * Lanius is licensed under Mulan PSL v2. - * You can use this software according to the terms and conditions of the Mulan PSL v2. - * You may obtain a copy of Mulan PSL v2 at: - * - * http://license.coscl.org.cn/MulanPSL2 - * - * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. - * See the Mulan PSL v2 for more details. - */ -package org.yzbdl.lanius.orchestrate.adapter.mysql.system.impl; - -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import org.springframework.stereotype.Service; -import org.yzbdl.lanius.orchestrate.adapter.mysql.system.mapper.ManagerMapper; -import org.yzbdl.lanius.orchestrate.common.entity.system.ManagerEntity; -import org.yzbdl.lanius.orchestrate.db.adapter.system.ManagerDbAdapter; - -/** - * 管理员数据适配接口实现类 - * - * @author hujian@yzbdl.ac.cn - * @date 2022-08-17 10:40 - */ -@Service -public class ManagerDbAdapterImpl extends ServiceImpl implements ManagerDbAdapter { -} diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/system/impl/MenuDbAdapterImpl.java b/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/system/impl/MenuDbAdapterImpl.java deleted file mode 100644 index 53449f6..0000000 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/system/impl/MenuDbAdapterImpl.java +++ /dev/null @@ -1,29 +0,0 @@ -/* Copyright (c) 2022 渝州大数据实验室 - * - * Lanius is licensed under Mulan PSL v2. - * You can use this software according to the terms and conditions of the Mulan PSL v2. - * You may obtain a copy of Mulan PSL v2 at: - * - * http://license.coscl.org.cn/MulanPSL2 - * - * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. - * See the Mulan PSL v2 for more details. - */ -package org.yzbdl.lanius.orchestrate.adapter.mysql.system.impl; - -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import org.springframework.stereotype.Service; -import org.yzbdl.lanius.orchestrate.adapter.mysql.system.mapper.MenuMapper; -import org.yzbdl.lanius.orchestrate.common.entity.system.MenuEntity; -import org.yzbdl.lanius.orchestrate.db.adapter.system.MenuDbAdapter; - -/** - * 菜单数据适配接口实现类 - * - * @author hujian@yzbdl.ac.cn - * @date 2022-08-17 10:41 - */ -@Service -public class MenuDbAdapterImpl extends ServiceImpl implements MenuDbAdapter { - -} diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/system/impl/OrgDbAdapterImpl.java b/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/system/impl/OrgDbAdapterImpl.java deleted file mode 100644 index 2191bb2..0000000 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/system/impl/OrgDbAdapterImpl.java +++ /dev/null @@ -1,53 +0,0 @@ -/* Copyright (c) 2022 渝州大数据实验室 - * - * Lanius is licensed under Mulan PSL v2. - * You can use this software according to the terms and conditions of the Mulan PSL v2. - * You may obtain a copy of Mulan PSL v2 at: - * - * http://license.coscl.org.cn/MulanPSL2 - * - * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. - * See the Mulan PSL v2 for more details. - */ -package org.yzbdl.lanius.orchestrate.adapter.mysql.system.impl; - -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import org.springframework.stereotype.Service; -import org.yzbdl.lanius.orchestrate.adapter.mysql.system.mapper.OrgMapper; -import org.yzbdl.lanius.orchestrate.common.entity.system.OrgEntity; -import org.yzbdl.lanius.orchestrate.db.adapter.system.OrgDbAdapter; - -import java.util.List; - -/** - * 组织数据适配接口实现类 - * - * @author hujian@yzbdl.ac.cn - * @date 2022-08-17 10:45 - */ -@Service -public class OrgDbAdapterImpl extends ServiceImpl implements OrgDbAdapter { - - - /** - * 查看用户关联的组织 - * 改组织未冻结 - * @param userId 用户id - * @return 组织列表 - */ - @Override - public List queryOrgByUserId(Long userId) { - return this.baseMapper.queryOrgByUserId(userId); - } - - /** - * 查询数据是否存在 - * @param wrapper 筛选条件 - * @return 返回结果 - */ - @Override - public Boolean exists(LambdaQueryWrapper wrapper) { - return this.baseMapper.exists(wrapper); - } -} diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/system/impl/PermissionDbAdapterImpl.java b/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/system/impl/PermissionDbAdapterImpl.java deleted file mode 100644 index a53b5ad..0000000 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/system/impl/PermissionDbAdapterImpl.java +++ /dev/null @@ -1,53 +0,0 @@ -/* Copyright (c) 2022 渝州大数据实验室 - * - * Lanius is licensed under Mulan PSL v2. - * You can use this software according to the terms and conditions of the Mulan PSL v2. - * You may obtain a copy of Mulan PSL v2 at: - * - * http://license.coscl.org.cn/MulanPSL2 - * - * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. - * See the Mulan PSL v2 for more details. - */ -package org.yzbdl.lanius.orchestrate.adapter.mysql.system.impl; - -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import org.springframework.stereotype.Service; -import org.yzbdl.lanius.orchestrate.adapter.mysql.system.mapper.PermissionMapper; -import org.yzbdl.lanius.orchestrate.common.entity.system.PermissionEntity; -import org.yzbdl.lanius.orchestrate.common.vo.system.PermissionMenuUrlVo; -import org.yzbdl.lanius.orchestrate.db.adapter.system.PermissionDbAdapter; - -import java.util.List; - -/** - * 权限数据适配接口实现类 - * - * @author hujian@yzbdl.ac.cn - * @date 2022-08-17 10:47 - */ -@Service -public class PermissionDbAdapterImpl extends - ServiceImpl implements PermissionDbAdapter { - - - /** - * 根据用户查询权限 - * @param userId 用户id - * @return 权限列表 - */ - @Override - public List queryPermissionsByUserId(Long userId) { - return this.baseMapper.queryPermissionsByUserId(userId); - } - - - /** - * 查询权限列表 - * @return - */ - @Override - public List listPermissionsWithMenuUrl() { - return this.baseMapper.listPermissionsWithMenuUrl(); - } -} diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/system/impl/RoleDbAdapterImpl.java b/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/system/impl/RoleDbAdapterImpl.java deleted file mode 100644 index 0e35af8..0000000 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/system/impl/RoleDbAdapterImpl.java +++ /dev/null @@ -1,74 +0,0 @@ -/* Copyright (c) 2022 渝州大数据实验室 - * - * Lanius is licensed under Mulan PSL v2. - * You can use this software according to the terms and conditions of the Mulan PSL v2. - * You may obtain a copy of Mulan PSL v2 at: - * - * http://license.coscl.org.cn/MulanPSL2 - * - * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. - * See the Mulan PSL v2 for more details. - */ -package org.yzbdl.lanius.orchestrate.adapter.mysql.system.impl; - -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import org.springframework.stereotype.Service; -import org.yzbdl.lanius.orchestrate.adapter.mysql.system.mapper.RoleMapper; -import org.yzbdl.lanius.orchestrate.common.entity.system.RoleEntity; -import org.yzbdl.lanius.orchestrate.common.vo.system.RoleVo; -import org.yzbdl.lanius.orchestrate.db.adapter.system.RoleDbAdapter; - -import java.util.List; - -/** - * 角色数据适配接口实现类 - * - * @author hujian@yzbdl.ac.cn - * @date 2022-08-17 10:49 - */ -@Service -public class RoleDbAdapterImpl extends ServiceImpl implements RoleDbAdapter { - - /** - * 查询数据是否存在 - * @param wrapper 筛选条件 - * @return 返回结果 - */ - @Override - public Boolean exists(LambdaQueryWrapper wrapper) { - return this.baseMapper.exists(wrapper); - } - - /** - * 根据ID删除数据 - * @param id id - * @return 返回结果 - */ - @Override - public int deleteById(Long id) { - return this.baseMapper.deleteById(id); - } - - /** - * 统计角色数据 - * @param wrapper 查询条件 - * @return 返回数据 - */ - @Override - public int countRoleVo(LambdaQueryWrapper wrapper) { - return this.baseMapper.countRoleVo(wrapper); - } - - /** - * 查询符合条件的角色集合 - * @param skip 页码 - * @param pageSize 每页条数 - * @param wrapper 查询条件 - * @return 返回数据 - */ - @Override - public List queryRoleVo(Long skip, Long pageSize, LambdaQueryWrapper wrapper) { - return this.baseMapper.queryRoleVo(skip, pageSize, wrapper); - } -} diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/system/impl/RolePermissionDbAdapterImpl.java b/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/system/impl/RolePermissionDbAdapterImpl.java deleted file mode 100644 index f591083..0000000 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/system/impl/RolePermissionDbAdapterImpl.java +++ /dev/null @@ -1,42 +0,0 @@ -/* Copyright (c) 2022 渝州大数据实验室 - * - * Lanius is licensed under Mulan PSL v2. - * You can use this software according to the terms and conditions of the Mulan PSL v2. - * You may obtain a copy of Mulan PSL v2 at: - * - * http://license.coscl.org.cn/MulanPSL2 - * - * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. - * See the Mulan PSL v2 for more details. - */ -package org.yzbdl.lanius.orchestrate.adapter.mysql.system.impl; - -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import org.springframework.stereotype.Service; -import org.yzbdl.lanius.orchestrate.adapter.mysql.system.mapper.RolePermissionMapper; -import org.yzbdl.lanius.orchestrate.common.entity.system.RolePermissionEntity; -import org.yzbdl.lanius.orchestrate.db.adapter.system.RolePermissionDbAdapter; - -import java.util.List; - -/** - * 角色权限关联数据适配接口实现类 - * - * @author hujian@yzbdl.ac.cn - * @date 2022-08-17 10:52 - */ -@Service -public class RolePermissionDbAdapterImpl extends - ServiceImpl implements RolePermissionDbAdapter { - - /** - * 角色权限批量插入接口 - * - * @param rolePermissionEntityList 数据集合 - * @return 插入数据条数 - */ - @Override - public int insertBatch(List rolePermissionEntityList) { - return this.baseMapper.insertBatch(rolePermissionEntityList); - } -} diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/system/impl/UserDbAdapterImpl.java b/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/system/impl/UserDbAdapterImpl.java deleted file mode 100644 index 2fb1579..0000000 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/system/impl/UserDbAdapterImpl.java +++ /dev/null @@ -1,112 +0,0 @@ -/* Copyright (c) 2022 渝州大数据实验室 - * - * Lanius is licensed under Mulan PSL v2. - * You can use this software according to the terms and conditions of the Mulan PSL v2. - * You may obtain a copy of Mulan PSL v2 at: - * - * http://license.coscl.org.cn/MulanPSL2 - * - * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. - * See the Mulan PSL v2 for more details. - */ -package org.yzbdl.lanius.orchestrate.adapter.mysql.system.impl; - -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import org.apache.ibatis.annotations.Param; -import org.springframework.stereotype.Service; -import org.yzbdl.lanius.orchestrate.adapter.mysql.system.mapper.UserMapper; -import org.yzbdl.lanius.orchestrate.common.dto.system.SimpleUserVO; -import org.yzbdl.lanius.orchestrate.common.entity.system.UserEntity; -import org.yzbdl.lanius.orchestrate.common.vo.system.AccountVO; -import org.yzbdl.lanius.orchestrate.common.vo.system.UserVo; -import org.yzbdl.lanius.orchestrate.db.adapter.system.UserDbAdapter; - -import java.util.List; - -/** - * 用户数据适配接口实现类 - * - * @author hujian@yzbdl.ac.cn - * @date 2022-08-17 11:01 - */ -@Service -public class UserDbAdapterImpl extends ServiceImpl implements UserDbAdapter { - - /** - * 根据组织获取用户 - * - * @param orgId 组织id - * @param pageSize 每页条数 - * @param skip 页码 - * @param wrapper mybatis-plus条件 - * @return 用户视图列表 - */ - @Override - public List queryUserVoByOrgId(Long orgId, Long skip, Long pageSize, LambdaQueryWrapper wrapper) { - return this.baseMapper.queryUserVoByOrgId(orgId, skip, pageSize, wrapper); - } - - /** - * 根据组织id统计用户 - * - * @param orgId 组织id - * @param wrapper 筛选条件 - * @return 统计条数 - */ - @Override - public int countUserVoByOrgId(Long orgId, LambdaQueryWrapper wrapper) { - return this.baseMapper.countUserVoByOrgId(orgId, wrapper); - } - - /** - * 根据组织id查询用户列表 - * - * @param orgId 组织id - * @param page 分页 - * @param wrapper mybatis-plus条件 - * @return 用户列表 - */ - @Override - public Page queryUserByOrgId(Long orgId, IPage page, LambdaQueryWrapper wrapper) { - return this.baseMapper.queryUserByOrgId(orgId, page, wrapper); - } - - /** - * 查询第一个用户,用来判断存不存在 - * 没有使用数据库自带的exist,减少数据库语法依赖 - * - * @param orgId 组织id - * @return userid - */ - @Override - public Long getFirstUserIdByOrgId(Long orgId) { - return this.baseMapper.getFirstUserIdByOrgId(orgId); - } - - /** - * 查询账号信息 - * @param skip 跳过页数 - * @param pageSize 页面大小 - * @param wrapper 查询条件 - * @return 账号列表 - */ - @Override - public List queryAccountVO(Long skip, Long pageSize, LambdaQueryWrapper wrapper){ - return baseMapper.queryAccountVO(skip,pageSize,wrapper); - } - - /** - * 获取不在该组织的用户 - * @param orgId 组织id - * @param likeUserName 模糊查询用户名称 - * @return 用户列表 - */ - @Override - public List listUsersNotInOrg(Long orgId, String likeUserName){ - return baseMapper.listUsersNotInOrg(orgId, likeUserName); - } - -} diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/system/impl/UserLogDbAdapterImpl.java b/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/system/impl/UserLogDbAdapterImpl.java deleted file mode 100644 index 825f003..0000000 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/system/impl/UserLogDbAdapterImpl.java +++ /dev/null @@ -1,45 +0,0 @@ -/* Copyright (c) 2022 渝州大数据实验室 - * - * Lanius is licensed under Mulan PSL v2. - * You can use this software according to the terms and conditions of the Mulan PSL v2. - * You may obtain a copy of Mulan PSL v2 at: - * - * http://license.coscl.org.cn/MulanPSL2 - * - * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. - * See the Mulan PSL v2 for more details. - */ -package org.yzbdl.lanius.orchestrate.adapter.mysql.system.impl; - -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import org.springframework.stereotype.Service; -import org.yzbdl.lanius.orchestrate.adapter.mysql.system.mapper.UserLogMapper; -import org.yzbdl.lanius.orchestrate.common.entity.system.UserLogEntity; -import org.yzbdl.lanius.orchestrate.common.vo.system.UserLogVo; -import org.yzbdl.lanius.orchestrate.db.adapter.system.UserLogDbAdapter; - -/** - * 用户日志数据适配接口实现类 - * - * @author hujian@yzbdl.ac.cn - * @date 2022-08-17 11:06 - */ -@Service -public class UserLogDbAdapterImpl extends ServiceImpl implements UserLogDbAdapter { - /** - * 分页查询用户日志 - * - * @param nickName 用户昵称 - * @param wrapper 筛选条件 - * @param page 分页对象 - * @return 数据集合 - */ - @Override - public Page queryUserLogByNickName(String nickName, - LambdaQueryWrapper wrapper, IPage page) { - return this.baseMapper.queryUserLogByNickName(nickName, wrapper, page); - } -} diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/system/impl/UserOrgDbAdapterImpl.java b/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/system/impl/UserOrgDbAdapterImpl.java deleted file mode 100644 index 6b6c735..0000000 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/system/impl/UserOrgDbAdapterImpl.java +++ /dev/null @@ -1,49 +0,0 @@ -/* Copyright (c) 2022 渝州大数据实验室 - * - * Lanius is licensed under Mulan PSL v2. - * You can use this software according to the terms and conditions of the Mulan PSL v2. - * You may obtain a copy of Mulan PSL v2 at: - * - * http://license.coscl.org.cn/MulanPSL2 - * - * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. - * See the Mulan PSL v2 for more details. - */ -package org.yzbdl.lanius.orchestrate.adapter.mysql.system.impl; - -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import org.springframework.stereotype.Service; -import org.yzbdl.lanius.orchestrate.adapter.mysql.system.mapper.UserOrgMapper; -import org.yzbdl.lanius.orchestrate.common.entity.system.UserOrgEntity; -import org.yzbdl.lanius.orchestrate.db.adapter.system.UserOrgDbAdapter; - -/** - * 用户角色关联数据适配接口实现类 - * - * @author hujian@yzbdl.ac.cn - * @date 2022-08-17 11:10 - */ -@Service -public class UserOrgDbAdapterImpl extends ServiceImpl implements UserOrgDbAdapter { - - /** - * 查询数据是否存在 - * @param wrapper 筛选条件 - * @return 返回结果 - */ - @Override - public Boolean exists(LambdaQueryWrapper wrapper) { - return this.baseMapper.exists(wrapper); - } - - /** - * 插入用户组织数据 - * @param entity 实体 - * @return 返回结果 - */ - @Override - public int insert(UserOrgEntity entity) { - return this.baseMapper.insert(entity); - } -} diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/system/impl/UserRoleDbAdapterImpl.java b/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/system/impl/UserRoleDbAdapterImpl.java deleted file mode 100644 index f3fc086..0000000 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/system/impl/UserRoleDbAdapterImpl.java +++ /dev/null @@ -1,41 +0,0 @@ -/* Copyright (c) 2022 渝州大数据实验室 - * - * Lanius is licensed under Mulan PSL v2. - * You can use this software according to the terms and conditions of the Mulan PSL v2. - * You may obtain a copy of Mulan PSL v2 at: - * - * http://license.coscl.org.cn/MulanPSL2 - * - * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. - * See the Mulan PSL v2 for more details. - */ -package org.yzbdl.lanius.orchestrate.adapter.mysql.system.impl; - -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import org.springframework.stereotype.Service; -import org.yzbdl.lanius.orchestrate.adapter.mysql.system.mapper.UserRoleMapper; -import org.yzbdl.lanius.orchestrate.common.entity.system.UserRoleEntity; -import org.yzbdl.lanius.orchestrate.db.adapter.system.UserRoleDbAdapter; - -import java.util.List; - -/** - * 用户角色关联数据适配接口实现类 - * - * @author hujian@yzbdl.ac.cn - * @date 2022-08-17 11:11 - */ -@Service -public class UserRoleDbAdapterImpl extends ServiceImpl implements UserRoleDbAdapter { - - /** - * 批量插入用户角色关联数据 - * - * @param userRoleEntityList 数据集合 - * @return 返回结果 - */ - @Override - public int insertBatch(List userRoleEntityList) { - return this.baseMapper.insertBatch(userRoleEntityList); - } -} diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/system/mapper/ManagerMapper.java b/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/system/mapper/ManagerMapper.java deleted file mode 100644 index 1967931..0000000 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/system/mapper/ManagerMapper.java +++ /dev/null @@ -1,26 +0,0 @@ -/* Copyright (c) 2022 渝州大数据实验室 - * - * Lanius is licensed under Mulan PSL v2. - * You can use this software according to the terms and conditions of the Mulan PSL v2. - * You may obtain a copy of Mulan PSL v2 at: - * - * http://license.coscl.org.cn/MulanPSL2 - * - * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. - * See the Mulan PSL v2 for more details. - */ -package org.yzbdl.lanius.orchestrate.adapter.mysql.system.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import org.apache.ibatis.annotations.Mapper; -import org.yzbdl.lanius.orchestrate.common.entity.system.ManagerEntity; - -/** - * 管理员mapper - * - * @author chenjunhao@yzbdl.ac.cn - * @date 2022-04-08 11:01 - */ -@Mapper -public interface ManagerMapper extends BaseMapper { -} diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/system/mapper/MenuMapper.java b/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/system/mapper/MenuMapper.java deleted file mode 100644 index 4f8921f..0000000 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/system/mapper/MenuMapper.java +++ /dev/null @@ -1,32 +0,0 @@ -/* Copyright (c) 2022 渝州大数据实验室 - * - * Lanius is licensed under Mulan PSL v2. - * You can use this software according to the terms and conditions of the Mulan PSL v2. - * You may obtain a copy of Mulan PSL v2 at: - * - * http://license.coscl.org.cn/MulanPSL2 - * - * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. - * See the Mulan PSL v2 for more details. - */ -package org.yzbdl.lanius.orchestrate.adapter.mysql.system.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import org.apache.ibatis.annotations.Mapper; -import org.yzbdl.lanius.orchestrate.common.entity.system.MenuEntity; - -/** - * 菜单mapper - * - * @author chenjunhao@yzbdl.ac.cn - * @date 2022-04-08 17:30 - */ -@Mapper -public interface MenuMapper extends BaseMapper { - /** - * 根据权限id获取菜单 - * @param permissionIds 权限id - * @return 菜单列表 - */ - //List queryMenusByPermissionIds(List permissionIds); -} diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/system/mapper/OrgMapper.java b/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/system/mapper/OrgMapper.java deleted file mode 100644 index 3fbd820..0000000 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/system/mapper/OrgMapper.java +++ /dev/null @@ -1,38 +0,0 @@ -/* Copyright (c) 2022 渝州大数据实验室 - * - * Lanius is licensed under Mulan PSL v2. - * You can use this software according to the terms and conditions of the Mulan PSL v2. - * You may obtain a copy of Mulan PSL v2 at: - * - * http://license.coscl.org.cn/MulanPSL2 - * - * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. - * See the Mulan PSL v2 for more details. - */ -package org.yzbdl.lanius.orchestrate.adapter.mysql.system.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Param; -import org.yzbdl.lanius.orchestrate.common.entity.system.OrgEntity; - -import java.util.List; - -/** - * 组织 Mapper - * - * @author chenjunhao@yzbdl.ac.cn - * @date 2022-04-08 13:29 - */ -@Mapper -public interface OrgMapper extends BaseMapper { - - - /** - * 查看用户关联的组织 - * 改组织未冻结 - * @param userId 用户id - * @return 组织列表 - */ - List queryOrgByUserId(@Param("userId") Long userId); -} diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/system/mapper/RolePermissionMapper.java b/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/system/mapper/RolePermissionMapper.java deleted file mode 100644 index 0ac9aa1..0000000 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/system/mapper/RolePermissionMapper.java +++ /dev/null @@ -1,28 +0,0 @@ -/* Copyright (c) 2022 渝州大数据实验室 - * - * Lanius is licensed under Mulan PSL v2. - * You can use this software according to the terms and conditions of the Mulan PSL v2. - * You may obtain a copy of Mulan PSL v2 at: - * - * http://license.coscl.org.cn/MulanPSL2 - * - * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. - * See the Mulan PSL v2 for more details. - */ -package org.yzbdl.lanius.orchestrate.adapter.mysql.system.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import org.yzbdl.lanius.orchestrate.common.entity.system.RolePermissionEntity; - -import java.util.List; - -/** - * 角色权限关联mapper - * - * @author chenjunhao@yzbdl.ac.cn - * @date 2022-04-11 09:29 - */ -public interface RolePermissionMapper extends BaseMapper { - - int insertBatch(List rolePermissionEntityList); -} diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/system/mapper/UserLogMapper.java b/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/system/mapper/UserLogMapper.java deleted file mode 100644 index 8a04ce6..0000000 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/system/mapper/UserLogMapper.java +++ /dev/null @@ -1,36 +0,0 @@ -/* Copyright (c) 2022 渝州大数据实验室 - * - * Lanius is licensed under Mulan PSL v2. - * You can use this software according to the terms and conditions of the Mulan PSL v2. - * You may obtain a copy of Mulan PSL v2 at: - * - * http://license.coscl.org.cn/MulanPSL2 - * - * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. - * See the Mulan PSL v2 for more details. - */ -package org.yzbdl.lanius.orchestrate.adapter.mysql.system.mapper; - -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Param; -import org.yzbdl.lanius.orchestrate.common.entity.system.UserLogEntity; -import org.yzbdl.lanius.orchestrate.common.vo.system.UserLogVo; - -/** - * 用户日志mapper - * - * @author chenjunhao@yzbdl.ac.cn - * @date 2022-04-13 15:31 - */ -@Mapper -public interface UserLogMapper extends BaseMapper { - Page queryUserLogByNickName( - @Param("nickName") String nickName, - @Param("ew") LambdaQueryWrapper wapper, - IPage page - ); -} diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/system/mapper/UserOrgMapper.java b/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/system/mapper/UserOrgMapper.java deleted file mode 100644 index ca63010..0000000 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/system/mapper/UserOrgMapper.java +++ /dev/null @@ -1,26 +0,0 @@ -/* Copyright (c) 2022 渝州大数据实验室 - * - * Lanius is licensed under Mulan PSL v2. - * You can use this software according to the terms and conditions of the Mulan PSL v2. - * You may obtain a copy of Mulan PSL v2 at: - * - * http://license.coscl.org.cn/MulanPSL2 - * - * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. - * See the Mulan PSL v2 for more details. - */ -package org.yzbdl.lanius.orchestrate.adapter.mysql.system.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import org.apache.ibatis.annotations.Mapper; -import org.yzbdl.lanius.orchestrate.common.entity.system.UserOrgEntity; - -/** - * 用户角色关联mapper - * - * @author chenjunhao@yzbdl.ac.cn - * @date 2022-04-08 15:07 - */ -@Mapper -public interface UserOrgMapper extends BaseMapper { -} diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/system/mapper/UserRoleMapper.java b/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/system/mapper/UserRoleMapper.java deleted file mode 100644 index e90e779..0000000 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/system/mapper/UserRoleMapper.java +++ /dev/null @@ -1,30 +0,0 @@ -/* Copyright (c) 2022 渝州大数据实验室 - * - * Lanius is licensed under Mulan PSL v2. - * You can use this software according to the terms and conditions of the Mulan PSL v2. - * You may obtain a copy of Mulan PSL v2 at: - * - * http://license.coscl.org.cn/MulanPSL2 - * - * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. - * See the Mulan PSL v2 for more details. - */ -package org.yzbdl.lanius.orchestrate.adapter.mysql.system.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import org.apache.ibatis.annotations.Mapper; -import org.yzbdl.lanius.orchestrate.common.entity.system.UserRoleEntity; - -import java.util.List; - -/** - * 用户角色关联mapper - * - * @author chenjunhao@yzbdl.ac.cn - * @date 2022-04-12 13:47 - */ -@Mapper -public interface UserRoleMapper extends BaseMapper { - - int insertBatch(List userRoleEntityList); -} diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/task/impl/TaskInstanceDbAdapterImpl.java b/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/task/impl/TaskInstanceDbAdapterImpl.java deleted file mode 100644 index a2cc4b3..0000000 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/task/impl/TaskInstanceDbAdapterImpl.java +++ /dev/null @@ -1,132 +0,0 @@ -/* Copyright (c) 2022 渝州大数据实验室 - * - * Lanius is licensed under Mulan PSL v2. - * You can use this software according to the terms and conditions of the Mulan PSL v2. - * You may obtain a copy of Mulan PSL v2 at: - * - * http://license.coscl.org.cn/MulanPSL2 - * - * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. - * See the Mulan PSL v2 for more details. - */ -package org.yzbdl.lanius.orchestrate.adapter.mysql.task.impl; - -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import org.springframework.stereotype.Service; -import org.yzbdl.lanius.orchestrate.adapter.mysql.task.mapper.TaskInstanceMapper; -import org.yzbdl.lanius.orchestrate.common.dto.task.TaskInstanceQueryDTO; -import org.yzbdl.lanius.orchestrate.common.dto.task.TaskInstanceResourceDTO; -import org.yzbdl.lanius.orchestrate.common.entity.task.TaskInstance; -import org.yzbdl.lanius.orchestrate.common.vo.task.ScheduleTaskInstanceVO; -import org.yzbdl.lanius.orchestrate.common.vo.task.TaskInstanceVO; -import org.yzbdl.lanius.orchestrate.db.adapter.task.TaskInstanceDbAdapter; - -import java.util.List; - -/** - * 任务实例数据适配接口实现类 - * - * @author hujian@yzbdl.ac.cn - * @date 2022-08-17 11:13 - */ -@Service -public class TaskInstanceDbAdapterImpl extends - ServiceImpl implements TaskInstanceDbAdapter { - - /** - * 分页查询任务实例列表 - * - * @param page - * 分页信息 - * @param instanceQueryDTO - * 查询条件 - * @param pageSize - * 每页条数 - * @param startIndex - * 起始索引 - * @return - * 结果信息 - */ - @Override - public IPage queryPage(Page page, - TaskInstanceQueryDTO instanceQueryDTO, long startIndex, long pageSize) { - return this.baseMapper.queryPage(page, instanceQueryDTO, startIndex, pageSize); - } - - /** - * 获取调度总览之任务实例 - * - * @return - * 结果信息 - */ - @Override - public List getSchedulerViewStatistics() { - return this.baseMapper.getSchedulerViewStatistics(); - } - - /** - * 获取任务实例信息,忽略租户 - * - * @param taskInstanceId - * 任务实例ID - * @return - * 任务实例 - */ - @Override - public TaskInstance getByIdIgnoreTenantId(Long taskInstanceId) { - return this.baseMapper.getByIdIgnoreTenantId(taskInstanceId); - } - - /** - * 判断是否存在运行的任务示例 - * @param taskResourceId 任务资源id - * @return 任务实例 - */ - @Override - public TaskInstance getRunningTaskInstance(Long taskResourceId) { - return this.baseMapper.getRunningTaskInstance(taskResourceId); - } - - /** - * 获取一条运行中的实例,根据任务编排ID - * - * @param runStateList - * 运行状态 - * @param taskPlanId - * 任务编排ID - * @return - * 任务实例 - */ - @Override - public TaskInstance getOneInstanceForRunIgnoreTenantId(List runStateList, Long taskPlanId) { - return this.baseMapper.getOneInstanceForRunIgnoreTenantId(runStateList, taskPlanId); - } - - /** - * 根据id更新实例,忽略租户ID - * - * @param taskInstance - * 实例 - * @return - * 影响条数 - */ - @Override - public int updateByIdIgnoreTenantId(TaskInstance taskInstance) { - return this.baseMapper.updateByIdIgnoreTenantId(taskInstance); - } - - /** - * 获取任务实例资源信息 - * - * @param taskInstanceId - * 任务实例ID - * @return - * 任务实例资源信息 - */ - @Override - public TaskInstanceResourceDTO getTaskInstanceResourceIgnoreTenantId(Long taskInstanceId) { - return this.baseMapper.getTaskInstanceResourceIgnoreTenantId(taskInstanceId); - } -} diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/task/impl/TaskPlanDbAdapterImpl.java b/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/task/impl/TaskPlanDbAdapterImpl.java deleted file mode 100644 index 63332eb..0000000 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/task/impl/TaskPlanDbAdapterImpl.java +++ /dev/null @@ -1,117 +0,0 @@ -/* Copyright (c) 2022 渝州大数据实验室 - * - * Lanius is licensed under Mulan PSL v2. - * You can use this software according to the terms and conditions of the Mulan PSL v2. - * You may obtain a copy of Mulan PSL v2 at: - * - * http://license.coscl.org.cn/MulanPSL2 - * - * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. - * See the Mulan PSL v2 for more details. - */ -package org.yzbdl.lanius.orchestrate.adapter.mysql.task.impl; - -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import org.springframework.stereotype.Service; -import org.yzbdl.lanius.orchestrate.adapter.mysql.task.mapper.TaskPlanMapper; -import org.yzbdl.lanius.orchestrate.common.dto.task.TaskPlanQueryDTO; -import org.yzbdl.lanius.orchestrate.common.dto.task.TaskPlanResourceDTO; -import org.yzbdl.lanius.orchestrate.common.entity.task.TaskPlan; -import org.yzbdl.lanius.orchestrate.common.vo.task.ScheduleTaskPlanVO; -import org.yzbdl.lanius.orchestrate.common.vo.task.TaskPlanVO; -import org.yzbdl.lanius.orchestrate.db.adapter.task.TaskPlanDbAdapter; - -import java.util.List; - -/** - * 任务编排数据适配接口实现类 - * - * @author hujian@yzbdl.ac.cn - * @date 2022-08-17 13:40 - */ -@Service -public class TaskPlanDbAdapterImpl extends ServiceImpl implements TaskPlanDbAdapter { - - /** - * 分页查询任务编排列表 - * - * @param page 分页信息 - * @param taskPlanQueryDto 查询参数 - * @return 结果信息 - */ - @Override - public IPage queryPage( - Page page, TaskPlanQueryDTO taskPlanQueryDto) { - return this.baseMapper.queryPage(page, taskPlanQueryDto); - } - - /** - * 获取任务编排及对应的分组信息 - * - * @param taskPlanId - * 任务编排ID - * @return - * 结果信息 - */ - @Override - public TaskPlanVO getOneAndGroup(Long taskPlanId) { - return this.baseMapper.getOneAndGroup(taskPlanId); - } - - /** - * 根据任务ID获取任务资源、配置信息 - *

- * 任务调度专用接口,忽略租户 - *

- * - * @param taskPlanId - * 任务编排ID - * @return - * 数据信息 - */ - @Override - public TaskPlanResourceDTO getTaskPlanAndResourceInfoIgnoreTenantId(Long taskPlanId) { - return this.baseMapper.getTaskPlanAndResourceInfoIgnoreTenantId(taskPlanId); - } - - /** - * 获取调度总览之任务编排 - *

- * 任务调度专用接口,忽略租户 - *

- * - * @return - * 结果信息 - */ - @Override - public List getSchedulerViewStatistics() { - return this.baseMapper.getSchedulerViewStatistics(); - } - - /** - * 获取所有的任务编排数据 - *

- * 整个系统的数据 - *

- * - * @return - * 结果信息 - */ - @Override - public List getAllListIgnoreTenantId() { - return this.baseMapper.getAllListIgnoreTenantId(); - } - - /** - * 查询数据是否存在 - * @param wrapper 筛选条件 - * @return 返回结果 - */ - @Override - public Boolean exists(LambdaQueryWrapper wrapper) { - return this.baseMapper.exists(wrapper); - } -} diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/task/impl/TaskPlanGroupDbAdapterImpl.java b/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/task/impl/TaskPlanGroupDbAdapterImpl.java deleted file mode 100644 index 1f2976b..0000000 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/task/impl/TaskPlanGroupDbAdapterImpl.java +++ /dev/null @@ -1,57 +0,0 @@ -/* Copyright (c) 2022 渝州大数据实验室 - * - * Lanius is licensed under Mulan PSL v2. - * You can use this software according to the terms and conditions of the Mulan PSL v2. - * You may obtain a copy of Mulan PSL v2 at: - * - * http://license.coscl.org.cn/MulanPSL2 - * - * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. - * See the Mulan PSL v2 for more details. - */ -package org.yzbdl.lanius.orchestrate.adapter.mysql.task.impl; - -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import org.springframework.stereotype.Service; -import org.yzbdl.lanius.orchestrate.adapter.mysql.task.mapper.TaskPlanGroupMapper; -import org.yzbdl.lanius.orchestrate.common.entity.task.TaskPlanGroup; -import org.yzbdl.lanius.orchestrate.common.vo.task.TaskPlanGroupVO; -import org.yzbdl.lanius.orchestrate.db.adapter.task.TaskPlanGroupDbAdapter; - -import java.util.List; - -/** - * 任务编排分组数据适配接口实现类 - * - * @author hujian@yzbdl.ac.cn - * @date 2022-08-17 13:46 - */ -@Service -public class TaskPlanGroupDbAdapterImpl extends - ServiceImpl implements TaskPlanGroupDbAdapter { - - - /** - * 分组树形结构并统计任务编排数量 - * - * @return - * 结果信息 - */ - @Override - public List treeList() { - return this.baseMapper.treeList(); - } - - /** - * 根据id获取所有的上级 - * - * @param id - * 分组ID - * @return - * 上级 - */ - @Override - public List getParentsById(Long id) { - return this.baseMapper.getParentsById(id); - } -} diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/task/impl/TaskStepLogDbAdapterImpl.java b/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/task/impl/TaskStepLogDbAdapterImpl.java deleted file mode 100644 index b85cdb5..0000000 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/task/impl/TaskStepLogDbAdapterImpl.java +++ /dev/null @@ -1,46 +0,0 @@ -/* Copyright (c) 2022 渝州大数据实验室 - * - * Lanius is licensed under Mulan PSL v2. - * You can use this software according to the terms and conditions of the Mulan PSL v2. - * You may obtain a copy of Mulan PSL v2 at: - * - * http://license.coscl.org.cn/MulanPSL2 - * - * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. - * See the Mulan PSL v2 for more details. - */ -package org.yzbdl.lanius.orchestrate.adapter.mysql.task.impl; - -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import org.springframework.stereotype.Service; -import org.yzbdl.lanius.orchestrate.adapter.mysql.task.mapper.TaskStepLogMapper; -import org.yzbdl.lanius.orchestrate.common.entity.task.TaskStepLog; -import org.yzbdl.lanius.orchestrate.common.vo.task.TaskStepLogVO; -import org.yzbdl.lanius.orchestrate.db.adapter.task.TaskStepLogDbAdapter; - -import java.util.List; - -/** - * 任务步骤日志数据适配接口实现类 - * - * @author hujian@yzbdl.ac.cn - * @date 2022-08-17 13:48 - */ -@Service -public class TaskStepLogDbAdapterImpl extends - ServiceImpl implements TaskStepLogDbAdapter { - - /** - * 获取步骤度量 - * - * @param taskInstanceId - * 任务实例ID - * @return - * 结果数据 - */ - @Override - public List getStepLogByTaskInstanceId(Long taskInstanceId) { - return this.baseMapper.getStepLogByTaskInstanceId(taskInstanceId); - } - -} diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/task/mapper/TaskInstanceMapper.java b/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/task/mapper/TaskInstanceMapper.java deleted file mode 100644 index 62d4e7c..0000000 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/task/mapper/TaskInstanceMapper.java +++ /dev/null @@ -1,118 +0,0 @@ -/* Copyright (c) 2022 渝州大数据实验室 - * - * Lanius is licensed under Mulan PSL v2. - * You can use this software according to the terms and conditions of the Mulan PSL v2. - * You may obtain a copy of Mulan PSL v2 at: - * - * http://license.coscl.org.cn/MulanPSL2 - * - * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. - * See the Mulan PSL v2 for more details. - */ -package org.yzbdl.lanius.orchestrate.adapter.mysql.task.mapper; - -import java.util.List; - -import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Param; -import org.apache.ibatis.annotations.Update; -import org.yzbdl.lanius.orchestrate.common.dto.task.TaskInstanceQueryDTO; -import org.yzbdl.lanius.orchestrate.common.dto.task.TaskInstanceResourceDTO; -import org.yzbdl.lanius.orchestrate.common.entity.task.TaskInstance; -import org.yzbdl.lanius.orchestrate.common.vo.task.ScheduleTaskInstanceVO; -import org.yzbdl.lanius.orchestrate.common.vo.task.TaskInstanceVO; - -import com.baomidou.mybatisplus.annotation.InterceptorIgnore; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; - -/** - * 任务实例Mapper - * - * @author jinchunzhao@yzbdl.ac.cn - * @date 2022-04-11 9:05 - */ -@Mapper -public interface TaskInstanceMapper extends BaseMapper { - - /** - * 分页查询任务实例列表 - * - * @param page - * 分页信息 - * @param instanceQueryDTO - * 查询条件 - * @param pageSize - * 每页条数 - * @param startIndex - * 起始索引 - * @return - * 结果信息 - */ - IPage queryPage(@Param("page") Page page, - @Param("instanceQueryDTO") TaskInstanceQueryDTO instanceQueryDTO,@Param("startIndex") long startIndex,@Param("pageSize") long pageSize); - - /** - * 获取调度总览之任务实例 - * - * @return - * 结果信息 - */ - List getSchedulerViewStatistics(); - - /** - * 获取任务实例信息,忽略租户 - * - * @param taskInstanceId - * 任务实例ID - * @return - * 任务实例 - */ - @InterceptorIgnore(tenantLine = "on") - TaskInstance getByIdIgnoreTenantId(@Param("taskInstanceId") Long taskInstanceId); - - /** - * 判断是否存在运行的任务示例 - * @param taskResourceId 任务资源id - * @return 任务实例 - */ - TaskInstance getRunningTaskInstance(@Param("taskResourceId") Long taskResourceId); - - /** - * 获取一条运行中的实例,根据任务编排ID - * - * @param runStateList - * 运行状态 - * @param taskPlanId - * 任务编排ID - * @return - * 任务实例 - */ - @InterceptorIgnore(tenantLine = "on") - TaskInstance getOneInstanceForRunIgnoreTenantId(@Param("runStateList") List runStateList, - @Param("taskPlanId") Long taskPlanId); - - /** - * 根据id更新实例,忽略租户ID - * - * @param taskInstance - * 实例 - * @return - * 影响条数 - */ - @InterceptorIgnore(tenantLine = "on") - @Update(" update lo_task_instance set status = #{status},end_time = #{endTime} where id = #{id}") - int updateByIdIgnoreTenantId(TaskInstance taskInstance); - - /** - * 获取任务实例资源信息 - * - * @param taskInstanceId - * 任务实例ID - * @return - * 任务实例资源信息 - */ - @InterceptorIgnore(tenantLine = "on") - TaskInstanceResourceDTO getTaskInstanceResourceIgnoreTenantId(@Param("taskInstanceId") Long taskInstanceId); -} diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/task/mapper/TaskPlanGroupMapper.java b/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/task/mapper/TaskPlanGroupMapper.java deleted file mode 100644 index fbd35f0..0000000 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/task/mapper/TaskPlanGroupMapper.java +++ /dev/null @@ -1,49 +0,0 @@ -/* Copyright (c) 2022 渝州大数据实验室 - * - * Lanius is licensed under Mulan PSL v2. - * You can use this software according to the terms and conditions of the Mulan PSL v2. - * You may obtain a copy of Mulan PSL v2 at: - * - * http://license.coscl.org.cn/MulanPSL2 - * - * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. - * See the Mulan PSL v2 for more details. - */ -package org.yzbdl.lanius.orchestrate.adapter.mysql.task.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Param; -import org.yzbdl.lanius.orchestrate.common.entity.task.TaskPlanGroup; -import org.yzbdl.lanius.orchestrate.common.vo.task.TaskPlanGroupVO; - -import java.util.List; - -/** - * 任务编排分组mapper - * - * @author jinchunzhao@yzbdl.ac.cn - * @date 2022-04-07 16:03 - */ -@Mapper -public interface TaskPlanGroupMapper extends BaseMapper { - - - /** - * 分组树形结构并统计任务编排数量 - * - * @return - * 结果信息 - */ - List treeList(); - - /** - * 根据id获取所有的上级 - * - * @param id - * 分组ID - * @return - * 上级 - */ - List getParentsById(@Param("id") Long id); -} diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/task/mapper/TaskPlanMapper.java b/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/task/mapper/TaskPlanMapper.java deleted file mode 100644 index 1ccee8f..0000000 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/task/mapper/TaskPlanMapper.java +++ /dev/null @@ -1,92 +0,0 @@ -/* Copyright (c) 2022 渝州大数据实验室 - * - * Lanius is licensed under Mulan PSL v2. - * You can use this software according to the terms and conditions of the Mulan PSL v2. - * You may obtain a copy of Mulan PSL v2 at: - * - * http://license.coscl.org.cn/MulanPSL2 - * - * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. - * See the Mulan PSL v2 for more details. - */ -package org.yzbdl.lanius.orchestrate.adapter.mysql.task.mapper; - -import com.baomidou.mybatisplus.annotation.InterceptorIgnore; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Param; -import org.yzbdl.lanius.orchestrate.common.dto.task.TaskPlanQueryDTO; -import org.yzbdl.lanius.orchestrate.common.dto.task.TaskPlanResourceDTO; -import org.yzbdl.lanius.orchestrate.common.entity.task.TaskPlan; -import org.yzbdl.lanius.orchestrate.common.vo.task.ScheduleTaskPlanVO; -import org.yzbdl.lanius.orchestrate.common.vo.task.TaskPlanVO; - -import java.util.List; - -/** - * 任务编排mapper - * - * @author jinchunzhao@yzbdl.ac.cn - * @date 2022-04-07 10:03 - */ -@Mapper -public interface TaskPlanMapper extends BaseMapper { - - /** - * 分页查询任务编排列表 - * - * @param page 分页信息 - * @param taskPlanQueryDto 查询参数 - * @return 结果信息 - */ - IPage queryPage(@Param("page") Page page, @Param("taskPlanQueryDto") TaskPlanQueryDTO taskPlanQueryDto); - - /** - * 获取任务编排及对应的分组信息 - * - * @param taskPlanId - * 任务编排ID - * @return - * 结果信息 - */ - TaskPlanVO getOneAndGroup(@Param("taskPlanId") Long taskPlanId); - - /** - * 根据任务ID获取任务资源、配置信息 - *

- * 任务调度专用接口,忽略租户 - *

- * - * @param taskPlanId - * 任务编排ID - * @return - * 数据信息 - */ - @InterceptorIgnore(tenantLine = "on") - TaskPlanResourceDTO getTaskPlanAndResourceInfoIgnoreTenantId(@Param("taskPlanId") Long taskPlanId); - - /** - * 获取调度总览之任务编排 - *

- * 任务调度专用接口,忽略租户 - *

- * - * @return - * 结果信息 - */ - List getSchedulerViewStatistics(); - - /** - * 获取所有的任务编排数据 - *

- * 整个系统的数据 - *

- * - * @return - * 结果信息 - */ - @InterceptorIgnore(tenantLine = "on") - List getAllListIgnoreTenantId(); -} diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/task/mapper/TaskStepLogMapper.java b/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/task/mapper/TaskStepLogMapper.java deleted file mode 100644 index db52d81..0000000 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/task/mapper/TaskStepLogMapper.java +++ /dev/null @@ -1,41 +0,0 @@ -/* Copyright (c) 2022 渝州大数据实验室 - * - * Lanius is licensed under Mulan PSL v2. - * You can use this software according to the terms and conditions of the Mulan PSL v2. - * You may obtain a copy of Mulan PSL v2 at: - * - * http://license.coscl.org.cn/MulanPSL2 - * - * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. - * See the Mulan PSL v2 for more details. - */ -package org.yzbdl.lanius.orchestrate.adapter.mysql.task.mapper; - -import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Param; -import org.yzbdl.lanius.orchestrate.common.entity.task.TaskStepLog; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import org.yzbdl.lanius.orchestrate.common.vo.task.TaskStepLogVO; - -import java.util.List; - -/** - * 任务步骤日志mapper - * - * @author jinchunzhao@yzbdl.ac.cn - * @date 2022-04-19 14:18 - */ -@Mapper -public interface TaskStepLogMapper extends BaseMapper { - - /** - * 获取步骤度量 - * - * @param taskInstanceId - * 任务实例ID - * @return - * 结果数据 - */ - List getStepLogByTaskInstanceId(@Param("taskInstanceId") Long taskInstanceId); -} diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/resources/mapper/resource/ServerMapper.xml b/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/resources/mapper/resource/ServerMapper.xml deleted file mode 100644 index 510fd28..0000000 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/resources/mapper/resource/ServerMapper.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - update lo_server - - status = #{item.status} - - where id = #{item.id} - - - - \ No newline at end of file diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/resources/mapper/resource/TaskResourceConfigMapper.xml b/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/resources/mapper/resource/TaskResourceConfigMapper.xml deleted file mode 100644 index 1b0b858..0000000 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/resources/mapper/resource/TaskResourceConfigMapper.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - update lo_task_resource_config - - status = #{item.status} - - where id = #{item.id} - - - - \ No newline at end of file diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/resources/mapper/resource/TaskResourceMapper.xml b/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/resources/mapper/resource/TaskResourceMapper.xml deleted file mode 100644 index 365d6a5..0000000 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/resources/mapper/resource/TaskResourceMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter/pom.xml b/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter/pom.xml deleted file mode 100644 index 50df3f6..0000000 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter/pom.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - org.yzbdl.lanius - lanius-orchestrate-server - 1.0-SNAPSHOT - ../../../pom.xml - - - org.yzbdl.lanius - lanius-orchestrate-db-adapter - 0.0.1-SNAPSHOT - lanius-orchestrate-db-adapter - orchestrate适配接口模块 - - 4.0.0 - - - - org.yzbdl.lanius - lanius-orchestrate-common - ${lanius.module.common.version} - - - - \ No newline at end of file diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter/src/main/java/org/yzbdl/lanius/orchestrate/db/adapter/resource/ServerDbAdapter.java b/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter/src/main/java/org/yzbdl/lanius/orchestrate/db/adapter/resource/ServerDbAdapter.java deleted file mode 100644 index 4388004..0000000 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter/src/main/java/org/yzbdl/lanius/orchestrate/db/adapter/resource/ServerDbAdapter.java +++ /dev/null @@ -1,61 +0,0 @@ -/* Copyright (c) 2022 渝州大数据实验室 - * - * Lanius is licensed under Mulan PSL v2. - * You can use this software according to the terms and conditions of the Mulan PSL v2. - * You may obtain a copy of Mulan PSL v2 at: - * - * http://license.coscl.org.cn/MulanPSL2 - * - * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. - * See the Mulan PSL v2 for more details. - */ -package org.yzbdl.lanius.orchestrate.db.adapter.resource; - -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.extension.service.IService; -import org.yzbdl.lanius.orchestrate.common.dto.resource.StatusStatisticDto; -import org.yzbdl.lanius.orchestrate.common.entity.resource.ServerEntity; - -import java.util.List; - -/** - * 服务节点信息数据库适配接口 - * - * @author hujian@yzbdl.ac.cn - * @since 2022-08-16 17:01 - */ -public interface ServerDbAdapter extends IService { - - /** - * 状态统计接口 - * @return 状态统计 - */ - List getStatusGroupCount(); - - /** - * 获取所有服务器数据不区分主租户 - * @return list务器数据 - */ - List getAllServer(); - - /** - * 更新服务器信息 - * @param list list务器数据 - */ - void batchUpdate(List list); - - /** - * 根据id获取服务器信息 - * @param id 服务器id - * @return 服务器信息 - */ - ServerEntity getServerInfoById(Long id); - - /** - * 查询数据是否存在 - * @param wrapper 筛选条件 - * @return 返回结果 - */ - Boolean exists(LambdaQueryWrapper wrapper); - -} diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter/src/main/java/org/yzbdl/lanius/orchestrate/db/adapter/resource/ServerProgramDbAdapter.java b/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter/src/main/java/org/yzbdl/lanius/orchestrate/db/adapter/resource/ServerProgramDbAdapter.java deleted file mode 100644 index 2df0b01..0000000 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter/src/main/java/org/yzbdl/lanius/orchestrate/db/adapter/resource/ServerProgramDbAdapter.java +++ /dev/null @@ -1,69 +0,0 @@ -/* Copyright (c) 2022 渝州大数据实验室 - * - * Lanius is licensed under Mulan PSL v2. - * You can use this software according to the terms and conditions of the Mulan PSL v2. - * You may obtain a copy of Mulan PSL v2 at: - * - * http://license.coscl.org.cn/MulanPSL2 - * - * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. - * See the Mulan PSL v2 for more details. - */ -package org.yzbdl.lanius.orchestrate.db.adapter.resource; - -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.extension.service.IService; -import org.yzbdl.lanius.orchestrate.common.dto.resource.ServerProgramAndServerDto; -import org.yzbdl.lanius.orchestrate.common.dto.resource.ServerProgramInfoDTO; -import org.yzbdl.lanius.orchestrate.common.dto.resource.StatusStatisticDto; -import org.yzbdl.lanius.orchestrate.common.entity.resource.ServerProgramEntity; - -import java.util.List; - -/** - * 数据节点数据适配接口 - * - * @author hujian@yzbdl.ac.cn - * @since 2022-08-16 17:20 - */ -public interface ServerProgramDbAdapter extends IService { - - /** - * 获取服务节点详细信息,(包含关联的节点信息) - *

- * 任务调度专用接口,忽略租户 - *

- * - * @param programId - * 服务节点ID - * @return - * 数据 - */ - ServerProgramInfoDTO getServerProgramInfoByIdIgnoreTenantId(Long programId); - - - /** - * 获取服务节点和服务器信息数据 - * @return 节点和服务器数据 - */ - List getAllServerProgramAndServerInfo(); - - /** - * 状态统计接口 - * @return 状态统计 - */ - List getStatusGroupCount(); - - /** - * 批量更新服务节点状态 - * @param list list服务节点 - */ - void batchUpdate(List list); - - /** - * 查询数据是否存在 - * @param wrapper 筛选条件 - * @return 返回结果 - */ - Boolean exists(LambdaQueryWrapper wrapper); -} diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter/src/main/java/org/yzbdl/lanius/orchestrate/db/adapter/resource/TaskResourceConfigDbAdapter.java b/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter/src/main/java/org/yzbdl/lanius/orchestrate/db/adapter/resource/TaskResourceConfigDbAdapter.java deleted file mode 100644 index 0a1093d..0000000 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter/src/main/java/org/yzbdl/lanius/orchestrate/db/adapter/resource/TaskResourceConfigDbAdapter.java +++ /dev/null @@ -1,55 +0,0 @@ -/* Copyright (c) 2022 渝州大数据实验室 - * - * Lanius is licensed under Mulan PSL v2. - * You can use this software according to the terms and conditions of the Mulan PSL v2. - * You may obtain a copy of Mulan PSL v2 at: - * - * http://license.coscl.org.cn/MulanPSL2 - * - * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. - * See the Mulan PSL v2 for more details. - */ -package org.yzbdl.lanius.orchestrate.db.adapter.resource; - -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.extension.service.IService; -import org.yzbdl.lanius.orchestrate.common.dto.resource.StatusStatisticDto; -import org.yzbdl.lanius.orchestrate.common.entity.resource.TaskResourceConfigEntity; - -import java.util.List; - -/** - * 任务资源配置数据适配接口 - * - * @author hujian@yzbdl.ac.cn - * @since 2022-08-16 17:50 - */ -public interface TaskResourceConfigDbAdapter extends IService { - - /** - * 获取所有任务资源配置不区分主租户 - * @return list任务资源配置 - */ - List getAllTaskResource(); - - /** - * 状态统计接口 - * @return 状态统计 - */ - List getStatusGroupCount(); - - /** - * 批量更新任务资源配置状态 - * @param list list配置数据 - */ - void batchUpdate(List list); - - /** - * 查询数据是否存在 - * @param wrapper 筛选条件 - * @return 返回结果 - */ - Boolean exists(LambdaQueryWrapper wrapper); - -} - diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter/src/main/java/org/yzbdl/lanius/orchestrate/db/adapter/resource/TaskResourceDbAdapter.java b/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter/src/main/java/org/yzbdl/lanius/orchestrate/db/adapter/resource/TaskResourceDbAdapter.java deleted file mode 100644 index 05541b5..0000000 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter/src/main/java/org/yzbdl/lanius/orchestrate/db/adapter/resource/TaskResourceDbAdapter.java +++ /dev/null @@ -1,52 +0,0 @@ -/* Copyright (c) 2022 渝州大数据实验室 - * - * Lanius is licensed under Mulan PSL v2. - * You can use this software according to the terms and conditions of the Mulan PSL v2. - * You may obtain a copy of Mulan PSL v2 at: - * - * http://license.coscl.org.cn/MulanPSL2 - * - * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. - * See the Mulan PSL v2 for more details. - */ -package org.yzbdl.lanius.orchestrate.db.adapter.resource; - -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.extension.service.IService; -import org.yzbdl.lanius.orchestrate.common.dto.resource.TaskResourceGroupCountDto; -import org.yzbdl.lanius.orchestrate.common.dto.resource.TaskResourceTypeStatisticDto; -import org.yzbdl.lanius.orchestrate.common.entity.resource.TaskResourceEntity; - -import java.util.List; - -/** - * 任务资源数据适配接口 - * - * @author hujian@yzbdl.ac.cn - * @since 2022-08-16 18:00 - */ -public interface TaskResourceDbAdapter extends IService { - - /** - * 获取不同资源分组计数 - * - * @return 分组计数值 - */ - List getResourceCount(); - - /** - * 状态统计接口 - * - * @return 状态统计 - */ - List getStatusGroupCount(); - - /** - * 查询数据是否存在 - * @param wrapper 筛选条件 - * @return 返回结果 - */ - Boolean exists(LambdaQueryWrapper wrapper); - -} - diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter/src/main/java/org/yzbdl/lanius/orchestrate/db/adapter/resource/TaskResourceGroupDbAdapter.java b/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter/src/main/java/org/yzbdl/lanius/orchestrate/db/adapter/resource/TaskResourceGroupDbAdapter.java deleted file mode 100644 index 0e925b4..0000000 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter/src/main/java/org/yzbdl/lanius/orchestrate/db/adapter/resource/TaskResourceGroupDbAdapter.java +++ /dev/null @@ -1,42 +0,0 @@ -/* Copyright (c) 2022 渝州大数据实验室 - * - * Lanius is licensed under Mulan PSL v2. - * You can use this software according to the terms and conditions of the Mulan PSL v2. - * You may obtain a copy of Mulan PSL v2 at: - * - * http://license.coscl.org.cn/MulanPSL2 - * - * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. - * See the Mulan PSL v2 for more details. - */ -package org.yzbdl.lanius.orchestrate.db.adapter.resource; - -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.extension.service.IService; -import org.yzbdl.lanius.orchestrate.common.entity.resource.TaskResourceGroupEntity; - -import java.util.List; - -/** - * 任务资源组数据适配接口 - * - * @author hujian@yzbdl.ac.cn - * @date 2022-08-16 17:54 - */ -public interface TaskResourceGroupDbAdapter extends IService { - - /** - * 根据id获取所有父类数据 - * @param id id - * @return 所有父级 - */ - List getParentsById(Long id); - - /** - * 查询数据是否存在 - * @param wrapper 筛选条件 - * @return 返回结果 - */ - Boolean exists(LambdaQueryWrapper wrapper); - -} \ No newline at end of file diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter/src/main/java/org/yzbdl/lanius/orchestrate/db/adapter/system/MenuDbAdapter.java b/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter/src/main/java/org/yzbdl/lanius/orchestrate/db/adapter/system/MenuDbAdapter.java deleted file mode 100644 index e8b008d..0000000 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter/src/main/java/org/yzbdl/lanius/orchestrate/db/adapter/system/MenuDbAdapter.java +++ /dev/null @@ -1,25 +0,0 @@ -/* Copyright (c) 2022 渝州大数据实验室 - * - * Lanius is licensed under Mulan PSL v2. - * You can use this software according to the terms and conditions of the Mulan PSL v2. - * You may obtain a copy of Mulan PSL v2 at: - * - * http://license.coscl.org.cn/MulanPSL2 - * - * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. - * See the Mulan PSL v2 for more details. - */ -package org.yzbdl.lanius.orchestrate.db.adapter.system; - -import com.baomidou.mybatisplus.extension.service.IService; -import org.yzbdl.lanius.orchestrate.common.entity.system.MenuEntity; - -/** - * 菜单数据适配接口 - * - * @author hujian@yzbdl.ac.cn - * @date 2022-08-16 16:01 - */ -public interface MenuDbAdapter extends IService { - -} diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter/src/main/java/org/yzbdl/lanius/orchestrate/db/adapter/system/OrgDbAdapter.java b/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter/src/main/java/org/yzbdl/lanius/orchestrate/db/adapter/system/OrgDbAdapter.java deleted file mode 100644 index 685b25f..0000000 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter/src/main/java/org/yzbdl/lanius/orchestrate/db/adapter/system/OrgDbAdapter.java +++ /dev/null @@ -1,43 +0,0 @@ -/* Copyright (c) 2022 渝州大数据实验室 - * - * Lanius is licensed under Mulan PSL v2. - * You can use this software according to the terms and conditions of the Mulan PSL v2. - * You may obtain a copy of Mulan PSL v2 at: - * - * http://license.coscl.org.cn/MulanPSL2 - * - * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. - * See the Mulan PSL v2 for more details. - */ -package org.yzbdl.lanius.orchestrate.db.adapter.system; - -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.extension.service.IService; -import org.yzbdl.lanius.orchestrate.common.entity.system.OrgEntity; - -import java.util.List; - -/** - * 组织数据适配接口 - * - * @author hujian@yzbdl.ac.cn - * @date 2022-08-16 16:01 - */ -public interface OrgDbAdapter extends IService { - - - /** - * 查看用户关联的组织 - * 改组织未冻结 - * @param userId 用户id - * @return 组织列表 - */ - List queryOrgByUserId(Long userId); - - /** - * 查询数据是否存在 - * @param wrapper 筛选条件 - * @return 返回结果 - */ - Boolean exists(LambdaQueryWrapper wrapper); -} diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter/src/main/java/org/yzbdl/lanius/orchestrate/db/adapter/system/PermissionDbAdapter.java b/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter/src/main/java/org/yzbdl/lanius/orchestrate/db/adapter/system/PermissionDbAdapter.java deleted file mode 100644 index a296817..0000000 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter/src/main/java/org/yzbdl/lanius/orchestrate/db/adapter/system/PermissionDbAdapter.java +++ /dev/null @@ -1,42 +0,0 @@ -/* Copyright (c) 2022 渝州大数据实验室 - * - * Lanius is licensed under Mulan PSL v2. - * You can use this software according to the terms and conditions of the Mulan PSL v2. - * You may obtain a copy of Mulan PSL v2 at: - * - * http://license.coscl.org.cn/MulanPSL2 - * - * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. - * See the Mulan PSL v2 for more details. - */ -package org.yzbdl.lanius.orchestrate.db.adapter.system; - -import com.baomidou.mybatisplus.extension.service.IService; -import org.yzbdl.lanius.orchestrate.common.entity.system.PermissionEntity; -import org.yzbdl.lanius.orchestrate.common.vo.system.PermissionMenuUrlVo; - -import java.util.List; - -/** - * 权限数据适配接口 - * - * @author hujian@yzbdl.ac.cn - * @date 2022-08-16 16:01 - */ -public interface PermissionDbAdapter extends IService { - - - /** - * 根据用户查询权限 - * @param userId 用户id - * @return 权限列表 - */ - List queryPermissionsByUserId(Long userId); - - - /** - * 查询权限列表 - * @return - */ - List listPermissionsWithMenuUrl(); -} diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter/src/main/java/org/yzbdl/lanius/orchestrate/db/adapter/system/RoleDbAdapter.java b/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter/src/main/java/org/yzbdl/lanius/orchestrate/db/adapter/system/RoleDbAdapter.java deleted file mode 100644 index 4bab16f..0000000 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter/src/main/java/org/yzbdl/lanius/orchestrate/db/adapter/system/RoleDbAdapter.java +++ /dev/null @@ -1,58 +0,0 @@ -/* Copyright (c) 2022 渝州大数据实验室 - * - * Lanius is licensed under Mulan PSL v2. - * You can use this software according to the terms and conditions of the Mulan PSL v2. - * You may obtain a copy of Mulan PSL v2 at: - * - * http://license.coscl.org.cn/MulanPSL2 - * - * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. - * See the Mulan PSL v2 for more details. - */ -package org.yzbdl.lanius.orchestrate.db.adapter.system; - -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.extension.service.IService; -import org.yzbdl.lanius.orchestrate.common.entity.system.RoleEntity; -import org.yzbdl.lanius.orchestrate.common.vo.system.RoleVo; - -import java.util.List; - -/** - * 角色数据适配接口 - * - * @author hujian@yzbdl.ac.cn - * @date 2022-08-16 16:01 - */ -public interface RoleDbAdapter extends IService { - - /** - * 查询数据是否存在 - * @param wrapper 筛选条件 - * @return 返回结果 - */ - Boolean exists(LambdaQueryWrapper wrapper); - - /** - * 根据ID删除数据 - * @param id id - * @return 返回结果 - */ - int deleteById(Long id); - - /** - * 统计角色数据 - * @param wrapper 查询条件 - * @return 返回数据 - */ - int countRoleVo(LambdaQueryWrapper wrapper); - - /** - * 查询符合条件的角色集合 - * @param skip 页码 - * @param pageSize 每页条数 - * @param wrapper 查询条件 - * @return 返回数据 - */ - List queryRoleVo(Long skip, Long pageSize, LambdaQueryWrapper wrapper); -} diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter/src/main/java/org/yzbdl/lanius/orchestrate/db/adapter/system/RolePermissionDbAdapter.java b/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter/src/main/java/org/yzbdl/lanius/orchestrate/db/adapter/system/RolePermissionDbAdapter.java deleted file mode 100644 index b14dbb1..0000000 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter/src/main/java/org/yzbdl/lanius/orchestrate/db/adapter/system/RolePermissionDbAdapter.java +++ /dev/null @@ -1,34 +0,0 @@ -/* Copyright (c) 2022 渝州大数据实验室 - * - * Lanius is licensed under Mulan PSL v2. - * You can use this software according to the terms and conditions of the Mulan PSL v2. - * You may obtain a copy of Mulan PSL v2 at: - * - * http://license.coscl.org.cn/MulanPSL2 - * - * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. - * See the Mulan PSL v2 for more details. - */ -package org.yzbdl.lanius.orchestrate.db.adapter.system; - -import com.baomidou.mybatisplus.extension.service.IService; -import org.yzbdl.lanius.orchestrate.common.entity.system.RolePermissionEntity; - -import java.util.List; - -/** - * 角色权限关联数据适配接口 - * - * @author hujian@yzbdl.ac.cn - * @date 2022-08-16 16:01 - */ -public interface RolePermissionDbAdapter extends IService { - - /** - * 角色权限批量插入接口 - * - * @param rolePermissionEntityList 数据集合 - * @return 插入数据条数 - */ - int insertBatch(List rolePermissionEntityList); -} diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter/src/main/java/org/yzbdl/lanius/orchestrate/db/adapter/system/UserDbAdapter.java b/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter/src/main/java/org/yzbdl/lanius/orchestrate/db/adapter/system/UserDbAdapter.java deleted file mode 100644 index 1713a7c..0000000 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter/src/main/java/org/yzbdl/lanius/orchestrate/db/adapter/system/UserDbAdapter.java +++ /dev/null @@ -1,91 +0,0 @@ -/* Copyright (c) 2022 渝州大数据实验室 - * - * Lanius is licensed under Mulan PSL v2. - * You can use this software according to the terms and conditions of the Mulan PSL v2. - * You may obtain a copy of Mulan PSL v2 at: - * - * http://license.coscl.org.cn/MulanPSL2 - * - * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. - * See the Mulan PSL v2 for more details. - */ -package org.yzbdl.lanius.orchestrate.db.adapter.system; - -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.baomidou.mybatisplus.extension.service.IService; -import org.apache.ibatis.annotations.Param; -import org.yzbdl.lanius.orchestrate.common.dto.system.SimpleUserVO; -import org.yzbdl.lanius.orchestrate.common.entity.system.UserEntity; -import org.yzbdl.lanius.orchestrate.common.vo.system.AccountVO; -import org.yzbdl.lanius.orchestrate.common.vo.system.UserVo; - -import java.util.List; - -/** - * 用户数据适配接口 - * - * @author hujian@yzbdl.ac.cn - * @date 2022-08-16 16:01 - */ -public interface UserDbAdapter extends IService { - - /** - * 根据组织获取用户 - * - * @param orgId 组织id - * @param pageSize 每页条数 - * @param skip 页码 - * @param wrapper mybatis-plus条件 - * @return 用户视图列表 - */ - List queryUserVoByOrgId(Long orgId, Long skip, Long pageSize, LambdaQueryWrapper wrapper); - - /** - * 根据组织id统计用户 - * - * @param orgId 组织id - * @param wrapper 筛选条件 - * @return 统计条数 - */ - int countUserVoByOrgId(Long orgId, LambdaQueryWrapper wrapper); - - /** - * 根据组织id查询用户列表 - * - * @param orgId 组织id - * @param page 分页 - * @param wrapper mybatis-plus条件 - * @return 用户列表 - */ - Page queryUserByOrgId(Long orgId, IPage page, LambdaQueryWrapper wrapper); - - /** - * 查询第一个用户,用来判断存不存在 - * 没有使用数据库自带的exist,减少数据库语法依赖 - * - * @param orgId 组织id - * @return userid - */ - Long getFirstUserIdByOrgId(Long orgId); - - /** - * 管理员查询用户接口 - * - * @param skip 跳过页数 - * @param pageSize 页面大小 - * @param wrapper 查询条件 - * @return 账号列表 - */ - List queryAccountVO(@Param("skip") Long skip, @Param("pageSize") Long pageSize, @Param("ew") LambdaQueryWrapper wrapper); - - /** - * 获取不在该组织的用户 - * @param orgId 组织id - * @param likeUserName 模糊查询用户名称 - * @return 用户列表 - */ - List listUsersNotInOrg(Long orgId, String likeUserName); - -} diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter/src/main/java/org/yzbdl/lanius/orchestrate/db/adapter/system/UserLogDbAdapter.java b/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter/src/main/java/org/yzbdl/lanius/orchestrate/db/adapter/system/UserLogDbAdapter.java deleted file mode 100644 index 85ac266..0000000 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter/src/main/java/org/yzbdl/lanius/orchestrate/db/adapter/system/UserLogDbAdapter.java +++ /dev/null @@ -1,38 +0,0 @@ -/* Copyright (c) 2022 渝州大数据实验室 - * - * Lanius is licensed under Mulan PSL v2. - * You can use this software according to the terms and conditions of the Mulan PSL v2. - * You may obtain a copy of Mulan PSL v2 at: - * - * http://license.coscl.org.cn/MulanPSL2 - * - * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. - * See the Mulan PSL v2 for more details. - */ -package org.yzbdl.lanius.orchestrate.db.adapter.system; - -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.baomidou.mybatisplus.extension.service.IService; -import org.yzbdl.lanius.orchestrate.common.entity.system.UserLogEntity; -import org.yzbdl.lanius.orchestrate.common.vo.system.UserLogVo; - -/** - * 用户日志数据适配接口 - * - * @author hujian@yzbdl.ac.cn - * @date 2022-08-16 16:01 - */ -public interface UserLogDbAdapter extends IService { - /** - * 分页查询用户日志 - * - * @param nickName 用户昵称 - * @param wrapper 筛选条件 - * @param page 分页对象 - * @return 数据集合 - */ - Page queryUserLogByNickName(String nickName, - LambdaQueryWrapper wrapper, IPage page); -} diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter/src/main/java/org/yzbdl/lanius/orchestrate/db/adapter/system/UserOrgDbAdapter.java b/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter/src/main/java/org/yzbdl/lanius/orchestrate/db/adapter/system/UserOrgDbAdapter.java deleted file mode 100644 index d406494..0000000 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter/src/main/java/org/yzbdl/lanius/orchestrate/db/adapter/system/UserOrgDbAdapter.java +++ /dev/null @@ -1,39 +0,0 @@ -/* Copyright (c) 2022 渝州大数据实验室 - * - * Lanius is licensed under Mulan PSL v2. - * You can use this software according to the terms and conditions of the Mulan PSL v2. - * You may obtain a copy of Mulan PSL v2 at: - * - * http://license.coscl.org.cn/MulanPSL2 - * - * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. - * See the Mulan PSL v2 for more details. - */ -package org.yzbdl.lanius.orchestrate.db.adapter.system; - -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.extension.service.IService; -import org.yzbdl.lanius.orchestrate.common.entity.system.UserOrgEntity; - -/** - * 用户角色关联数据适配接口 - * - * @author hujian@yzbdl.ac.cn - * @date 2022-08-16 16:01 - */ -public interface UserOrgDbAdapter extends IService { - - /** - * 查询数据是否存在 - * @param wrapper 筛选条件 - * @return 返回结果 - */ - Boolean exists(LambdaQueryWrapper wrapper); - - /** - * 插入用户组织数据 - * @param entity 实体 - * @return 返回结果 - */ - int insert(UserOrgEntity entity); -} diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter/src/main/java/org/yzbdl/lanius/orchestrate/db/adapter/system/UserRoleDbAdapter.java b/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter/src/main/java/org/yzbdl/lanius/orchestrate/db/adapter/system/UserRoleDbAdapter.java deleted file mode 100644 index 35b5b83..0000000 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter/src/main/java/org/yzbdl/lanius/orchestrate/db/adapter/system/UserRoleDbAdapter.java +++ /dev/null @@ -1,34 +0,0 @@ -/* Copyright (c) 2022 渝州大数据实验室 - * - * Lanius is licensed under Mulan PSL v2. - * You can use this software according to the terms and conditions of the Mulan PSL v2. - * You may obtain a copy of Mulan PSL v2 at: - * - * http://license.coscl.org.cn/MulanPSL2 - * - * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. - * See the Mulan PSL v2 for more details. - */ -package org.yzbdl.lanius.orchestrate.db.adapter.system; - -import com.baomidou.mybatisplus.extension.service.IService; -import org.yzbdl.lanius.orchestrate.common.entity.system.UserRoleEntity; - -import java.util.List; - -/** - * 用户角色关联数据适配接口 - * - * @author hujian@yzbdl.ac.cn - * @date 2022-08-16 16:01 - */ -public interface UserRoleDbAdapter extends IService { - - /** - * 批量插入用户角色关联数据 - * - * @param userRoleEntityList 数据集合 - * @return 返回结果 - */ - int insertBatch(List userRoleEntityList); -} diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter/src/main/java/org/yzbdl/lanius/orchestrate/db/adapter/task/TaskInstanceDbAdapter.java b/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter/src/main/java/org/yzbdl/lanius/orchestrate/db/adapter/task/TaskInstanceDbAdapter.java deleted file mode 100644 index b189029..0000000 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter/src/main/java/org/yzbdl/lanius/orchestrate/db/adapter/task/TaskInstanceDbAdapter.java +++ /dev/null @@ -1,106 +0,0 @@ -/* Copyright (c) 2022 渝州大数据实验室 - * - * Lanius is licensed under Mulan PSL v2. - * You can use this software according to the terms and conditions of the Mulan PSL v2. - * You may obtain a copy of Mulan PSL v2 at: - * - * http://license.coscl.org.cn/MulanPSL2 - * - * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. - * See the Mulan PSL v2 for more details. - */ -package org.yzbdl.lanius.orchestrate.db.adapter.task; - -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.baomidou.mybatisplus.extension.service.IService; -import org.yzbdl.lanius.orchestrate.common.dto.task.TaskInstanceQueryDTO; -import org.yzbdl.lanius.orchestrate.common.dto.task.TaskInstanceResourceDTO; -import org.yzbdl.lanius.orchestrate.common.entity.task.TaskInstance; -import org.yzbdl.lanius.orchestrate.common.vo.task.ScheduleTaskInstanceVO; -import org.yzbdl.lanius.orchestrate.common.vo.task.TaskInstanceVO; - -import java.util.List; - -/** - * 任务实例数据适配接口 - * - * @author hujian@yzbdl.ac.cn - * @date 2022-08-16 16:01 - */ -public interface TaskInstanceDbAdapter extends IService { - - /** - * 分页查询任务实例列表 - * - * @param page - * 分页信息 - * @param instanceQueryDTO - * 查询条件 - * @param pageSize - * 每页条数 - * @param startIndex - * 起始索引 - * @return - * 结果信息 - */ - IPage queryPage(Page page, - TaskInstanceQueryDTO instanceQueryDTO, long startIndex, long pageSize); - - /** - * 获取调度总览之任务实例 - * - * @return - * 结果信息 - */ - List getSchedulerViewStatistics(); - - /** - * 获取任务实例信息,忽略租户 - * - * @param taskInstanceId - * 任务实例ID - * @return - * 任务实例 - */ - TaskInstance getByIdIgnoreTenantId(Long taskInstanceId); - - /** - * 判断是否存在运行的任务示例 - * @param taskResourceId 任务资源id - * @return 任务实例 - */ - TaskInstance getRunningTaskInstance(Long taskResourceId); - - /** - * 获取一条运行中的实例,根据任务编排ID - * - * @param runStateList - * 运行状态 - * @param taskPlanId - * 任务编排ID - * @return - * 任务实例 - */ - TaskInstance getOneInstanceForRunIgnoreTenantId(List runStateList, Long taskPlanId); - - /** - * 根据id更新实例,忽略租户ID - * - * @param taskInstance - * 实例 - * @return - * 影响条数 - */ - int updateByIdIgnoreTenantId(TaskInstance taskInstance); - - /** - * 获取任务实例资源信息 - * - * @param taskInstanceId - * 任务实例ID - * @return - * 任务实例资源信息 - */ - TaskInstanceResourceDTO getTaskInstanceResourceIgnoreTenantId(Long taskInstanceId); -} diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter/src/main/java/org/yzbdl/lanius/orchestrate/db/adapter/task/TaskPlanDbAdapter.java b/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter/src/main/java/org/yzbdl/lanius/orchestrate/db/adapter/task/TaskPlanDbAdapter.java deleted file mode 100644 index c250b51..0000000 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter/src/main/java/org/yzbdl/lanius/orchestrate/db/adapter/task/TaskPlanDbAdapter.java +++ /dev/null @@ -1,95 +0,0 @@ -/* Copyright (c) 2022 渝州大数据实验室 - * - * Lanius is licensed under Mulan PSL v2. - * You can use this software according to the terms and conditions of the Mulan PSL v2. - * You may obtain a copy of Mulan PSL v2 at: - * - * http://license.coscl.org.cn/MulanPSL2 - * - * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. - * See the Mulan PSL v2 for more details. - */ -package org.yzbdl.lanius.orchestrate.db.adapter.task; - -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.baomidou.mybatisplus.extension.service.IService; -import org.yzbdl.lanius.orchestrate.common.dto.task.TaskPlanQueryDTO; -import org.yzbdl.lanius.orchestrate.common.dto.task.TaskPlanResourceDTO; -import org.yzbdl.lanius.orchestrate.common.entity.task.TaskPlan; -import org.yzbdl.lanius.orchestrate.common.vo.task.ScheduleTaskPlanVO; -import org.yzbdl.lanius.orchestrate.common.vo.task.TaskPlanVO; - -import java.util.List; - -/** - * 任务编排数据适配接口 - * - * @author hujian@yzbdl.ac.cn - * @date 2022-08-16 16:01 - */ -public interface TaskPlanDbAdapter extends IService { - - /** - * 分页查询任务编排列表 - * - * @param page 分页信息 - * @param taskPlanQueryDto 查询参数 - * @return 结果信息 - */ - IPage queryPage( - Page page, TaskPlanQueryDTO taskPlanQueryDto); - - /** - * 获取任务编排及对应的分组信息 - * - * @param taskPlanId - * 任务编排ID - * @return - * 结果信息 - */ - TaskPlanVO getOneAndGroup(Long taskPlanId); - - /** - * 根据任务ID获取任务资源、配置信息 - *

- * 任务调度专用接口,忽略租户 - *

- * - * @param taskPlanId - * 任务编排ID - * @return - * 数据信息 - */ - TaskPlanResourceDTO getTaskPlanAndResourceInfoIgnoreTenantId(Long taskPlanId); - - /** - * 获取调度总览之任务编排 - *

- * 任务调度专用接口,忽略租户 - *

- * - * @return - * 结果信息 - */ - List getSchedulerViewStatistics(); - - /** - * 获取所有的任务编排数据 - *

- * 整个系统的数据 - *

- * - * @return - * 结果信息 - */ - List getAllListIgnoreTenantId(); - - /** - * 查询数据是否存在 - * @param wrapper 筛选条件 - * @return 返回结果 - */ - Boolean exists(LambdaQueryWrapper wrapper); -} diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter/src/main/java/org/yzbdl/lanius/orchestrate/db/adapter/task/TaskPlanGroupDbAdapter.java b/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter/src/main/java/org/yzbdl/lanius/orchestrate/db/adapter/task/TaskPlanGroupDbAdapter.java deleted file mode 100644 index 67d520c..0000000 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter/src/main/java/org/yzbdl/lanius/orchestrate/db/adapter/task/TaskPlanGroupDbAdapter.java +++ /dev/null @@ -1,46 +0,0 @@ -/* Copyright (c) 2022 渝州大数据实验室 - * - * Lanius is licensed under Mulan PSL v2. - * You can use this software according to the terms and conditions of the Mulan PSL v2. - * You may obtain a copy of Mulan PSL v2 at: - * - * http://license.coscl.org.cn/MulanPSL2 - * - * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. - * See the Mulan PSL v2 for more details. - */ -package org.yzbdl.lanius.orchestrate.db.adapter.task; - -import com.baomidou.mybatisplus.extension.service.IService; -import org.yzbdl.lanius.orchestrate.common.entity.task.TaskPlanGroup; -import org.yzbdl.lanius.orchestrate.common.vo.task.TaskPlanGroupVO; - -import java.util.List; - -/** - * 任务编排分组数据适配接口 - * - * @author hujian@yzbdl.ac.cn - * @date 2022-08-16 16:01 - */ -public interface TaskPlanGroupDbAdapter extends IService { - - - /** - * 分组树形结构并统计任务编排数量 - * - * @return - * 结果信息 - */ - List treeList(); - - /** - * 根据id获取所有的上级 - * - * @param id - * 分组ID - * @return - * 上级 - */ - List getParentsById(Long id); -} diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter/src/main/java/org/yzbdl/lanius/orchestrate/db/adapter/task/TaskStepLogDbAdapter.java b/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter/src/main/java/org/yzbdl/lanius/orchestrate/db/adapter/task/TaskStepLogDbAdapter.java deleted file mode 100644 index bd1af6e..0000000 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter/src/main/java/org/yzbdl/lanius/orchestrate/db/adapter/task/TaskStepLogDbAdapter.java +++ /dev/null @@ -1,37 +0,0 @@ -/* Copyright (c) 2022 渝州大数据实验室 - * - * Lanius is licensed under Mulan PSL v2. - * You can use this software according to the terms and conditions of the Mulan PSL v2. - * You may obtain a copy of Mulan PSL v2 at: - * - * http://license.coscl.org.cn/MulanPSL2 - * - * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. - * See the Mulan PSL v2 for more details. - */ -package org.yzbdl.lanius.orchestrate.db.adapter.task; - -import com.baomidou.mybatisplus.extension.service.IService; -import org.yzbdl.lanius.orchestrate.common.entity.task.TaskStepLog; -import org.yzbdl.lanius.orchestrate.common.vo.task.TaskStepLogVO; - -import java.util.List; - -/** - * 任务步骤日志数据适配接口 - * - * @author hujian@yzbdl.ac.cn - * @date 2022-08-16 16:01 - */ -public interface TaskStepLogDbAdapter extends IService { - - /** - * 获取步骤度量 - * - * @param taskInstanceId - * 任务实例ID - * @return - * 结果数据 - */ - List getStepLogByTaskInstanceId(Long taskInstanceId); -} diff --git a/lanius-orchestrate-server/modules/lanius-orchestrate-common/pom.xml b/lanius-orchestrate-server/modules/lanius-orchestrate-common/pom.xml index 4459052..7119cb2 100644 --- a/lanius-orchestrate-server/modules/lanius-orchestrate-common/pom.xml +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-common/pom.xml @@ -115,5 +115,18 @@ commons-collections4 ${org.apache.commons.collections4} + + + mysql + mysql-connector-java + runtime + + + + dm.jdbc + dm + 8 + runtime + \ No newline at end of file diff --git a/lanius-orchestrate-server/modules/lanius-orchestrate-resource/src/main/java/org/yzbdl/lanius/orchestrate/resource/controller/ServerController.java b/lanius-orchestrate-server/modules/lanius-orchestrate-resource/src/main/java/org/yzbdl/lanius/orchestrate/resource/controller/ServerController.java index b21b342..0eb012d 100644 --- a/lanius-orchestrate-server/modules/lanius-orchestrate-resource/src/main/java/org/yzbdl/lanius/orchestrate/resource/controller/ServerController.java +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-resource/src/main/java/org/yzbdl/lanius/orchestrate/resource/controller/ServerController.java @@ -26,7 +26,6 @@ import org.yzbdl.lanius.orchestrate.common.dto.resource.ServerPageDto; import org.yzbdl.lanius.orchestrate.common.entity.resource.ServerEntity; import org.yzbdl.lanius.orchestrate.common.result.ResultObj; import org.yzbdl.lanius.orchestrate.common.utils.ExceptionUtil; -import org.yzbdl.lanius.orchestrate.db.adapter.resource.ServerDbAdapter; import org.yzbdl.lanius.orchestrate.serv.service.resource.ServerService; import org.yzbdl.lanius.orchestrate.serv.utils.SshUtils; @@ -68,7 +67,7 @@ public class ServerController { @CheckPermission("resource::server::edit") @ApiOperation(value = "逻辑删除服务器") @DeleteMapping("/{id}") - public ResultObj delete(@PathVariable @OprId(server = ServerDbAdapter.class) Long id) { + public ResultObj delete(@PathVariable @OprId(server = ServerService.class) Long id) { return ResultObj.success(serverService.deleteServer(id)); } diff --git a/lanius-orchestrate-server/modules/lanius-orchestrate-resource/src/main/java/org/yzbdl/lanius/orchestrate/resource/controller/ServerProgramController.java b/lanius-orchestrate-server/modules/lanius-orchestrate-resource/src/main/java/org/yzbdl/lanius/orchestrate/resource/controller/ServerProgramController.java index afa5cd8..ee77caf 100644 --- a/lanius-orchestrate-server/modules/lanius-orchestrate-resource/src/main/java/org/yzbdl/lanius/orchestrate/resource/controller/ServerProgramController.java +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-resource/src/main/java/org/yzbdl/lanius/orchestrate/resource/controller/ServerProgramController.java @@ -27,7 +27,6 @@ import org.yzbdl.lanius.orchestrate.common.dto.resource.ServerProgramPageDto; import org.yzbdl.lanius.orchestrate.common.entity.resource.ServerProgramEntity; import org.yzbdl.lanius.orchestrate.common.result.ResultObj; import org.yzbdl.lanius.orchestrate.common.utils.ExceptionUtil; -import org.yzbdl.lanius.orchestrate.db.adapter.resource.ServerProgramDbAdapter; import org.yzbdl.lanius.orchestrate.serv.service.resource.ServerProgramService; import java.util.Objects; @@ -68,7 +67,7 @@ public class ServerProgramController { @CheckPermission("resource::serverProgram::edit") @ApiOperation(value = "逻辑删除服务节点") @DeleteMapping("/{id}") - public ResultObj delete(@PathVariable @OprId(server = ServerProgramDbAdapter.class) Long id) { + public ResultObj delete(@PathVariable @OprId(server = ServerProgramService.class) Long id) { return ResultObj.success(serverProgramService.deleteServerProgram(id)); } diff --git a/lanius-orchestrate-server/modules/lanius-orchestrate-resource/src/main/java/org/yzbdl/lanius/orchestrate/resource/controller/TaskResourceConfigController.java b/lanius-orchestrate-server/modules/lanius-orchestrate-resource/src/main/java/org/yzbdl/lanius/orchestrate/resource/controller/TaskResourceConfigController.java index da539ca..0290b98 100644 --- a/lanius-orchestrate-server/modules/lanius-orchestrate-resource/src/main/java/org/yzbdl/lanius/orchestrate/resource/controller/TaskResourceConfigController.java +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-resource/src/main/java/org/yzbdl/lanius/orchestrate/resource/controller/TaskResourceConfigController.java @@ -27,7 +27,6 @@ import org.yzbdl.lanius.orchestrate.common.entity.resource.TaskResourceConfigEnt import org.yzbdl.lanius.orchestrate.common.enums.DataBaseTypeEnum; import org.yzbdl.lanius.orchestrate.common.result.ResultObj; import org.yzbdl.lanius.orchestrate.common.utils.ExceptionUtil; -import org.yzbdl.lanius.orchestrate.db.adapter.resource.TaskResourceConfigDbAdapter; import org.yzbdl.lanius.orchestrate.serv.dataBase.DynamicDataBase; import org.yzbdl.lanius.orchestrate.serv.service.resource.TaskResourceConfigService; @@ -68,7 +67,7 @@ public class TaskResourceConfigController { @CheckPermission("resource::taskResourceConfig::edit") @ApiOperation(value = "逻辑删除任务资源配置") @DeleteMapping("/{id}") - public ResultObj delete(@PathVariable @OprId(server = TaskResourceConfigDbAdapter.class) Long id) { + public ResultObj delete(@PathVariable @OprId(server = TaskResourceConfigService.class) Long id) { return ResultObj.success(taskResourceConfigService.deleteTaskResourceConfig(id)); } diff --git a/lanius-orchestrate-server/modules/lanius-orchestrate-resource/src/main/java/org/yzbdl/lanius/orchestrate/resource/controller/TaskResourceController.java b/lanius-orchestrate-server/modules/lanius-orchestrate-resource/src/main/java/org/yzbdl/lanius/orchestrate/resource/controller/TaskResourceController.java index 4fb7a5d..c2395b6 100644 --- a/lanius-orchestrate-server/modules/lanius-orchestrate-resource/src/main/java/org/yzbdl/lanius/orchestrate/resource/controller/TaskResourceController.java +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-resource/src/main/java/org/yzbdl/lanius/orchestrate/resource/controller/TaskResourceController.java @@ -27,7 +27,6 @@ import org.yzbdl.lanius.orchestrate.common.dto.resource.TaskResourceDto; import org.yzbdl.lanius.orchestrate.common.dto.resource.TaskResourcePageDto; import org.yzbdl.lanius.orchestrate.common.entity.resource.TaskResourceEntity; import org.yzbdl.lanius.orchestrate.common.result.ResultObj; -import org.yzbdl.lanius.orchestrate.db.adapter.resource.TaskResourceDbAdapter; import org.yzbdl.lanius.orchestrate.serv.service.resource.TaskResourceService; import java.util.List; @@ -68,7 +67,7 @@ public class TaskResourceController { @CheckPermission("resource::taskResource::edit") @ApiOperation(value = "逻辑删除任务资源") @DeleteMapping("/{id}") - public ResultObj delete(@PathVariable @OprId(server = TaskResourceDbAdapter.class) Long id) { + public ResultObj delete(@PathVariable @OprId(server = TaskResourceService.class) Long id) { return ResultObj.success(taskResourceService.deleteTaskResource(id)); } diff --git a/lanius-orchestrate-server/modules/lanius-orchestrate-resource/src/main/java/org/yzbdl/lanius/orchestrate/resource/controller/TaskResourceGroupController.java b/lanius-orchestrate-server/modules/lanius-orchestrate-resource/src/main/java/org/yzbdl/lanius/orchestrate/resource/controller/TaskResourceGroupController.java index 5c00a78..e358f22 100644 --- a/lanius-orchestrate-server/modules/lanius-orchestrate-resource/src/main/java/org/yzbdl/lanius/orchestrate/resource/controller/TaskResourceGroupController.java +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-resource/src/main/java/org/yzbdl/lanius/orchestrate/resource/controller/TaskResourceGroupController.java @@ -18,7 +18,6 @@ import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import org.yzbdl.lanius.orchestrate.common.dto.resource.TaskResourceTreeDto; import org.yzbdl.lanius.orchestrate.common.entity.resource.TaskResourceGroupEntity; -import org.yzbdl.lanius.orchestrate.db.adapter.resource.TaskResourceGroupDbAdapter; import org.yzbdl.lanius.orchestrate.serv.service.resource.TaskResourceGroupService; import org.yzbdl.lanius.orchestrate.serv.service.resource.TaskResourceService; import org.yzbdl.lanius.orchestrate.common.annotation.auth.CheckPermission; @@ -92,7 +91,7 @@ public class TaskResourceGroupController { @CheckPermission("resource::taskResource::edit") @ApiOperation(value = "逻辑删除任务资源分组") @DeleteMapping("/{id}") - public ResultObj delete(@PathVariable @OprId(server = TaskResourceGroupDbAdapter.class) Long id) { + public ResultObj delete(@PathVariable @OprId(server = TaskResourceGroupService.class) Long id) { return ResultObj.success(taskResourceGroupService.deleteTaskResourceGroup(id)); } @@ -105,7 +104,7 @@ public class TaskResourceGroupController { @CheckPermission("resource::taskResource::edit") @ApiOperation(value = "逻辑删除任务资源分组") @DeleteMapping("/deleteByChain/{id}") - public ResultObj deleteByChain(@PathVariable @OprId(server = TaskResourceGroupDbAdapter.class) Long id) { + public ResultObj deleteByChain(@PathVariable @OprId(server = TaskResourceGroupService.class) Long id) { DeleteExploreDto deleteExploreDto = new DeleteCheckChain().addChain(!taskResourceService.isExistsTaskResource(id), "请清除当前目录下的内容!") .addChain(!taskResourceGroupService.isExistChildrenTaskResourceGroup(id), diff --git a/lanius-orchestrate-server/modules/lanius-orchestrate-serv/pom.xml b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/pom.xml index 70200cf..a12640c 100644 --- a/lanius-orchestrate-server/modules/lanius-orchestrate-serv/pom.xml +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/pom.xml @@ -24,19 +24,6 @@ lanius-orchestrate-common ${lanius.module.common.version} - - - org.yzbdl.lanius - lanius-orchestrate-db-adapter - ${lanius.module.db.adapter.version} - - - - org.yzbdl.lanius - lanius-orchestrate-db-adapter-mysql - ${lanius.module.db.adapter.mysql.version} - runtime - org.projectlombok diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/resource/mapper/ServerMapper.java b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/mapper/resource/ServerMapper.java similarity index 79% rename from lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/resource/mapper/ServerMapper.java rename to lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/mapper/resource/ServerMapper.java index c53b8b8..0492f85 100644 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/resource/mapper/ServerMapper.java +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/mapper/resource/ServerMapper.java @@ -9,12 +9,12 @@ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. * See the Mulan PSL v2 for more details. */ -package org.yzbdl.lanius.orchestrate.adapter.dm.resource.mapper; +package org.yzbdl.lanius.orchestrate.serv.mapper.resource; import com.baomidou.mybatisplus.annotation.InterceptorIgnore; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Select; +import org.apache.ibatis.annotations.Param; import org.yzbdl.lanius.orchestrate.common.dto.resource.StatusStatisticDto; import org.yzbdl.lanius.orchestrate.common.entity.resource.ServerEntity; @@ -33,7 +33,6 @@ public interface ServerMapper extends BaseMapper { * 状态统计接口 * @return 状态统计 */ - @Select("select count(*) as count, status from lo_server where deleted = 0 group by status") List getStatusGroupCount(); /** @@ -41,7 +40,6 @@ public interface ServerMapper extends BaseMapper { * @return list务器数据 */ @InterceptorIgnore(tenantLine = "on") - @Select("select * from lo_server where deleted = 0") List getAllServer(); /** @@ -49,7 +47,7 @@ public interface ServerMapper extends BaseMapper { * @param list list务器数据 */ @InterceptorIgnore(tenantLine = "on") - void batchUpdate(List list); + void batchUpdate(@Param("list") List list); /** * 根据id获取服务器信息 @@ -57,7 +55,6 @@ public interface ServerMapper extends BaseMapper { * @return 服务器信息 */ @InterceptorIgnore(tenantLine = "on") - @Select("select * from lo_server where id = #{id}") - ServerEntity getServerInfoById(Long id); + ServerEntity getServerInfoById(@Param("id") Long id); } diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/resource/mapper/ServerProgramMapper.java b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/mapper/resource/ServerProgramMapper.java similarity index 91% rename from lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/resource/mapper/ServerProgramMapper.java rename to lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/mapper/resource/ServerProgramMapper.java index fb59434..6099308 100644 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/resource/mapper/ServerProgramMapper.java +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/mapper/resource/ServerProgramMapper.java @@ -9,13 +9,12 @@ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. * See the Mulan PSL v2 for more details. */ -package org.yzbdl.lanius.orchestrate.adapter.dm.resource.mapper; +package org.yzbdl.lanius.orchestrate.serv.mapper.resource; import com.baomidou.mybatisplus.annotation.InterceptorIgnore; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; -import org.apache.ibatis.annotations.Select; import org.yzbdl.lanius.orchestrate.common.dto.resource.ServerProgramAndServerDto; import org.yzbdl.lanius.orchestrate.common.dto.resource.ServerProgramInfoDTO; import org.yzbdl.lanius.orchestrate.common.dto.resource.StatusStatisticDto; @@ -58,7 +57,6 @@ public interface ServerProgramMapper extends BaseMapper { * 状态统计接口 * @return 状态统计 */ - @Select("select count(*) as count, status from lo_server_program where deleted = 0 group by status") List getStatusGroupCount(); /** diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/resource/mapper/TaskResourceConfigMapper.java b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/mapper/resource/TaskResourceConfigMapper.java similarity index 84% rename from lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/resource/mapper/TaskResourceConfigMapper.java rename to lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/mapper/resource/TaskResourceConfigMapper.java index ef4938a..463e304 100644 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/resource/mapper/TaskResourceConfigMapper.java +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/mapper/resource/TaskResourceConfigMapper.java @@ -9,12 +9,11 @@ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. * See the Mulan PSL v2 for more details. */ -package org.yzbdl.lanius.orchestrate.adapter.dm.resource.mapper; +package org.yzbdl.lanius.orchestrate.serv.mapper.resource; import com.baomidou.mybatisplus.annotation.InterceptorIgnore; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Select; import org.yzbdl.lanius.orchestrate.common.dto.resource.StatusStatisticDto; import org.yzbdl.lanius.orchestrate.common.entity.resource.TaskResourceConfigEntity; @@ -34,14 +33,12 @@ public interface TaskResourceConfigMapper extends BaseMapper getAllTaskResource(); /** * 状态统计接口 * @return 状态统计 */ - @Select("select count(*) as count, status from lo_task_resource_config where deleted = 0 group by status") List getStatusGroupCount(); /** diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/resource/mapper/TaskResourceGroupMapper.java b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/mapper/resource/TaskResourceGroupMapper.java similarity index 94% rename from lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/resource/mapper/TaskResourceGroupMapper.java rename to lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/mapper/resource/TaskResourceGroupMapper.java index 74130b2..1ac44f1 100644 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/resource/mapper/TaskResourceGroupMapper.java +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/mapper/resource/TaskResourceGroupMapper.java @@ -9,7 +9,7 @@ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. * See the Mulan PSL v2 for more details. */ -package org.yzbdl.lanius.orchestrate.adapter.dm.resource.mapper; +package org.yzbdl.lanius.orchestrate.serv.mapper.resource; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/resource/mapper/TaskResourceMapper.java b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/mapper/resource/TaskResourceMapper.java similarity index 80% rename from lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/resource/mapper/TaskResourceMapper.java rename to lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/mapper/resource/TaskResourceMapper.java index fbd7197..f9c1464 100644 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/resource/mapper/TaskResourceMapper.java +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/mapper/resource/TaskResourceMapper.java @@ -9,11 +9,10 @@ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. * See the Mulan PSL v2 for more details. */ -package org.yzbdl.lanius.orchestrate.adapter.dm.resource.mapper; +package org.yzbdl.lanius.orchestrate.serv.mapper.resource; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Select; import org.yzbdl.lanius.orchestrate.common.dto.resource.TaskResourceGroupCountDto; import org.yzbdl.lanius.orchestrate.common.dto.resource.TaskResourceTypeStatisticDto; import org.yzbdl.lanius.orchestrate.common.entity.resource.TaskResourceEntity; @@ -33,14 +32,12 @@ public interface TaskResourceMapper extends BaseMapper { * 获取不同资源分组计数 * @return 分组计数值 */ - @Select("select group_id, count(*) as count from lo_task_resource where deleted = 0 group by group_id;") List getResourceCount(); /** * 状态统计接口 * @return 状态统计 */ - @Select("select count(*) as count, resource_type from lo_task_resource where deleted = 0 group by resource_type") List getStatusGroupCount(); } diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/system/mapper/ManagerMapper.java b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/mapper/system/ManagerMapper.java similarity index 93% rename from lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/system/mapper/ManagerMapper.java rename to lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/mapper/system/ManagerMapper.java index fab80f5..e74ccad 100644 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/system/mapper/ManagerMapper.java +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/mapper/system/ManagerMapper.java @@ -9,7 +9,7 @@ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. * See the Mulan PSL v2 for more details. */ -package org.yzbdl.lanius.orchestrate.adapter.dm.system.mapper; +package org.yzbdl.lanius.orchestrate.serv.mapper.system; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/system/mapper/MenuMapper.java b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/mapper/system/MenuMapper.java similarity index 78% rename from lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/system/mapper/MenuMapper.java rename to lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/mapper/system/MenuMapper.java index 537c400..68e8fae 100644 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/system/mapper/MenuMapper.java +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/mapper/system/MenuMapper.java @@ -9,7 +9,7 @@ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. * See the Mulan PSL v2 for more details. */ -package org.yzbdl.lanius.orchestrate.adapter.dm.system.mapper; +package org.yzbdl.lanius.orchestrate.serv.mapper.system; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; @@ -23,10 +23,5 @@ import org.yzbdl.lanius.orchestrate.common.entity.system.MenuEntity; */ @Mapper public interface MenuMapper extends BaseMapper { - /** - * 根据权限id获取菜单 - * @param permissionIds 权限id - * @return 菜单列表 - */ - //List queryMenusByPermissionIds(List permissionIds); + } diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/system/mapper/OrgMapper.java b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/mapper/system/OrgMapper.java similarity index 94% rename from lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/system/mapper/OrgMapper.java rename to lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/mapper/system/OrgMapper.java index abce448..3b84a22 100644 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/system/mapper/OrgMapper.java +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/mapper/system/OrgMapper.java @@ -9,7 +9,7 @@ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. * See the Mulan PSL v2 for more details. */ -package org.yzbdl.lanius.orchestrate.adapter.dm.system.mapper; +package org.yzbdl.lanius.orchestrate.serv.mapper.system; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/system/mapper/PermissionMapper.java b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/mapper/system/PermissionMapper.java similarity index 92% rename from lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/system/mapper/PermissionMapper.java rename to lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/mapper/system/PermissionMapper.java index 180e3e8..ffdc5d7 100644 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/system/mapper/PermissionMapper.java +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/mapper/system/PermissionMapper.java @@ -9,7 +9,7 @@ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. * See the Mulan PSL v2 for more details. */ -package org.yzbdl.lanius.orchestrate.adapter.mysql.system.mapper; +package org.yzbdl.lanius.orchestrate.serv.mapper.system; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; @@ -38,8 +38,8 @@ public interface PermissionMapper extends BaseMapper { /** - * - * @return + * 查询权限菜单 + * @return 数据集合 */ List listPermissionsWithMenuUrl(); } diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/system/mapper/RoleMapper.java b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/mapper/system/RoleMapper.java similarity index 80% rename from lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/system/mapper/RoleMapper.java rename to lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/mapper/system/RoleMapper.java index 65695c9..dde1f8e 100644 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/system/mapper/RoleMapper.java +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/mapper/system/RoleMapper.java @@ -9,7 +9,7 @@ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. * See the Mulan PSL v2 for more details. */ -package org.yzbdl.lanius.orchestrate.adapter.mysql.system.mapper; +package org.yzbdl.lanius.orchestrate.serv.mapper.system; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; @@ -29,10 +29,19 @@ import java.util.List; @Mapper public interface RoleMapper extends BaseMapper { - - //public List getRolesByMenuId(Long menuId); - + /** + * 查询符合条件的数据条数 + * @param wapper 筛选条件 + * @return 数据条数 + */ int countRoleVo(@Param("ew") LambdaQueryWrapper wapper); + /** + * 查询角色集合 + * @param skip 跳过页数 + * @param pageSize 每页条数 + * @param wapper 筛选条件 + * @return 数据集合 + */ List queryRoleVo(@Param("skip") Long skip, @Param("pageSize") Long pageSize, @Param("ew") LambdaQueryWrapper wapper); } diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/system/mapper/RolePermissionMapper.java b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/mapper/system/RolePermissionMapper.java similarity index 85% rename from lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/system/mapper/RolePermissionMapper.java rename to lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/mapper/system/RolePermissionMapper.java index 8b6365b..3fe9409 100644 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/system/mapper/RolePermissionMapper.java +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/mapper/system/RolePermissionMapper.java @@ -9,7 +9,7 @@ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. * See the Mulan PSL v2 for more details. */ -package org.yzbdl.lanius.orchestrate.adapter.dm.system.mapper; +package org.yzbdl.lanius.orchestrate.serv.mapper.system; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.yzbdl.lanius.orchestrate.common.entity.system.RolePermissionEntity; @@ -24,5 +24,10 @@ import java.util.List; */ public interface RolePermissionMapper extends BaseMapper { + /** + * 批量插入数据 + * @param rolePermissionEntityList 数据集合 + * @return 返回数据 + */ int insertBatch(List rolePermissionEntityList); } diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/system/mapper/UserLogMapper.java b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/mapper/system/UserLogMapper.java similarity index 86% rename from lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/system/mapper/UserLogMapper.java rename to lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/mapper/system/UserLogMapper.java index 9052c30..341a936 100644 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/system/mapper/UserLogMapper.java +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/mapper/system/UserLogMapper.java @@ -9,7 +9,7 @@ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. * See the Mulan PSL v2 for more details. */ -package org.yzbdl.lanius.orchestrate.adapter.dm.system.mapper; +package org.yzbdl.lanius.orchestrate.serv.mapper.system; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; @@ -28,6 +28,13 @@ import org.yzbdl.lanius.orchestrate.common.vo.system.UserLogVo; */ @Mapper public interface UserLogMapper extends BaseMapper { + /** + * 查询用户日志信息 + * @param nickName 用户昵称 + * @param wapper 筛选条件 + * @param page 分页信息 + * @return 返回数据 + */ Page queryUserLogByNickName( @Param("nickName") String nickName, @Param("ew") LambdaQueryWrapper wapper, diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/system/mapper/UserMapper.java b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/mapper/system/UserMapper.java similarity index 97% rename from lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/system/mapper/UserMapper.java rename to lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/mapper/system/UserMapper.java index 418c84e..fd36a5b 100644 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/java/org/yzbdl/lanius/orchestrate/adapter/mysql/system/mapper/UserMapper.java +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/mapper/system/UserMapper.java @@ -9,7 +9,7 @@ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. * See the Mulan PSL v2 for more details. */ -package org.yzbdl.lanius.orchestrate.adapter.mysql.system.mapper; +package org.yzbdl.lanius.orchestrate.serv.mapper.system; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/system/mapper/UserOrgMapper.java b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/mapper/system/UserOrgMapper.java similarity index 93% rename from lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/system/mapper/UserOrgMapper.java rename to lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/mapper/system/UserOrgMapper.java index b1bbd96..154ac5c 100644 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/system/mapper/UserOrgMapper.java +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/mapper/system/UserOrgMapper.java @@ -9,7 +9,7 @@ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. * See the Mulan PSL v2 for more details. */ -package org.yzbdl.lanius.orchestrate.adapter.dm.system.mapper; +package org.yzbdl.lanius.orchestrate.serv.mapper.system; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/system/mapper/UserRoleMapper.java b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/mapper/system/UserRoleMapper.java similarity index 85% rename from lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/system/mapper/UserRoleMapper.java rename to lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/mapper/system/UserRoleMapper.java index 1eb403c..46a106c 100644 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/system/mapper/UserRoleMapper.java +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/mapper/system/UserRoleMapper.java @@ -9,7 +9,7 @@ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. * See the Mulan PSL v2 for more details. */ -package org.yzbdl.lanius.orchestrate.adapter.dm.system.mapper; +package org.yzbdl.lanius.orchestrate.serv.mapper.system; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; @@ -25,6 +25,10 @@ import java.util.List; */ @Mapper public interface UserRoleMapper extends BaseMapper { - + /** + * 批量插入数据 + * @param userRoleEntityList 数据集合 + * @return 返回数据 + */ int insertBatch(List userRoleEntityList); } diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/task/mapper/TaskInstanceMapper.java b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/mapper/task/TaskInstanceMapper.java similarity index 94% rename from lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/task/mapper/TaskInstanceMapper.java rename to lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/mapper/task/TaskInstanceMapper.java index c3b4d53..69706d4 100644 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/task/mapper/TaskInstanceMapper.java +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/mapper/task/TaskInstanceMapper.java @@ -9,13 +9,12 @@ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. * See the Mulan PSL v2 for more details. */ -package org.yzbdl.lanius.orchestrate.adapter.dm.task.mapper; +package org.yzbdl.lanius.orchestrate.serv.mapper.task; import java.util.List; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; -import org.apache.ibatis.annotations.Update; import org.yzbdl.lanius.orchestrate.common.dto.task.TaskInstanceQueryDTO; import org.yzbdl.lanius.orchestrate.common.dto.task.TaskInstanceResourceDTO; import org.yzbdl.lanius.orchestrate.common.entity.task.TaskInstance; @@ -102,7 +101,6 @@ public interface TaskInstanceMapper extends BaseMapper { * 影响条数 */ @InterceptorIgnore(tenantLine = "on") - @Update(" update lo_task_instance set status = #{status},end_time = #{endTime} where id = #{id}") int updateByIdIgnoreTenantId(TaskInstance taskInstance); /** diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/task/mapper/TaskPlanGroupMapper.java b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/mapper/task/TaskPlanGroupMapper.java similarity index 95% rename from lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/task/mapper/TaskPlanGroupMapper.java rename to lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/mapper/task/TaskPlanGroupMapper.java index 9b162e1..ae0b8d7 100644 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/task/mapper/TaskPlanGroupMapper.java +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/mapper/task/TaskPlanGroupMapper.java @@ -9,7 +9,7 @@ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. * See the Mulan PSL v2 for more details. */ -package org.yzbdl.lanius.orchestrate.adapter.dm.task.mapper; +package org.yzbdl.lanius.orchestrate.serv.mapper.task; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/task/mapper/TaskPlanMapper.java b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/mapper/task/TaskPlanMapper.java similarity index 97% rename from lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/task/mapper/TaskPlanMapper.java rename to lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/mapper/task/TaskPlanMapper.java index 6968d0e..4247f98 100644 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/task/mapper/TaskPlanMapper.java +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/mapper/task/TaskPlanMapper.java @@ -9,7 +9,7 @@ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. * See the Mulan PSL v2 for more details. */ -package org.yzbdl.lanius.orchestrate.adapter.dm.task.mapper; +package org.yzbdl.lanius.orchestrate.serv.mapper.task; import com.baomidou.mybatisplus.annotation.InterceptorIgnore; import com.baomidou.mybatisplus.core.mapper.BaseMapper; diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/task/mapper/TaskStepLogMapper.java b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/mapper/task/TaskStepLogMapper.java similarity index 95% rename from lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/task/mapper/TaskStepLogMapper.java rename to lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/mapper/task/TaskStepLogMapper.java index 75cd178..303e0d0 100644 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/task/mapper/TaskStepLogMapper.java +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/mapper/task/TaskStepLogMapper.java @@ -9,7 +9,7 @@ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. * See the Mulan PSL v2 for more details. */ -package org.yzbdl.lanius.orchestrate.adapter.dm.task.mapper; +package org.yzbdl.lanius.orchestrate.serv.mapper.task; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; diff --git a/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/quartz/handler/category/impl/KettleExecutorHandler.java b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/quartz/handler/category/impl/KettleExecutorHandler.java index 1e480e1..db9a632 100644 --- a/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/quartz/handler/category/impl/KettleExecutorHandler.java +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/quartz/handler/category/impl/KettleExecutorHandler.java @@ -43,7 +43,6 @@ import org.yzbdl.lanius.orchestrate.common.utils.MessageUtil; import org.yzbdl.lanius.orchestrate.common.vo.task.TaskStepLogVO; import org.yzbdl.lanius.orchestrate.common.vo.task.schedule.TaskMonitorThreadVO; import org.yzbdl.lanius.orchestrate.common.xml.XMLHandler; -import org.yzbdl.lanius.orchestrate.db.adapter.task.TaskStepLogDbAdapter; import org.yzbdl.lanius.orchestrate.serv.constant.*; import org.yzbdl.lanius.orchestrate.serv.constant.schedule.kettle.KettleConstant; import org.yzbdl.lanius.orchestrate.serv.constant.schedule.kettle.KettleXmlConstant; @@ -53,6 +52,7 @@ import org.yzbdl.lanius.orchestrate.serv.quartz.handler.resourcetype.ResourceTyp import org.yzbdl.lanius.orchestrate.serv.quartz.handler.resourcetype.ResourceTypeInvokerHandler; import org.yzbdl.lanius.orchestrate.serv.service.resource.ServerProgramService; import org.yzbdl.lanius.orchestrate.serv.service.task.TaskInstanceService; +import org.yzbdl.lanius.orchestrate.serv.service.task.TaskStepLogService; import org.yzbdl.lanius.orchestrate.serv.utils.*; import java.io.IOException; @@ -86,7 +86,7 @@ public class KettleExecutorHandler implements ProgramCategoryExecutorInvokerHand private TaskInstanceService taskInstanceService; @Autowired - private TaskStepLogDbAdapter taskStepLogDbAdapter; + private TaskStepLogService taskStepLogService; @Autowired private ServerProgramService serverProgramService; @@ -1154,7 +1154,7 @@ public class KettleExecutorHandler implements ProgramCategoryExecutorInvokerHand * @param taskStepLogs 任务步骤日志实体参数 */ private void saveTaskStepLog(List taskStepLogs) { - taskStepLogDbAdapter.saveBatch(transTaskStepLog(taskStepLogs)); + taskStepLogService.saveBatch(transTaskStepLog(taskStepLogs)); } /** diff --git a/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/quartz/resource/ResourceScheduledTask.java b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/quartz/resource/ResourceScheduledTask.java index 9201e4c..cfeafaf 100644 --- a/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/quartz/resource/ResourceScheduledTask.java +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/quartz/resource/ResourceScheduledTask.java @@ -25,11 +25,11 @@ import org.yzbdl.lanius.orchestrate.common.entity.resource.ServerProgramEntity; import org.yzbdl.lanius.orchestrate.common.entity.resource.TaskResourceConfigEntity; import org.yzbdl.lanius.orchestrate.common.enums.ResourceDataStatusEnum; import org.yzbdl.lanius.orchestrate.common.enums.ServerProgramStatusEnum; -import org.yzbdl.lanius.orchestrate.db.adapter.resource.ServerDbAdapter; -import org.yzbdl.lanius.orchestrate.db.adapter.resource.ServerProgramDbAdapter; -import org.yzbdl.lanius.orchestrate.db.adapter.resource.TaskResourceConfigDbAdapter; import org.yzbdl.lanius.orchestrate.serv.constant.TaskResourceConstant; import org.yzbdl.lanius.orchestrate.serv.dataBase.DynamicDataBase; +import org.yzbdl.lanius.orchestrate.serv.mapper.resource.ServerMapper; +import org.yzbdl.lanius.orchestrate.serv.mapper.resource.ServerProgramMapper; +import org.yzbdl.lanius.orchestrate.serv.mapper.resource.TaskResourceConfigMapper; import org.yzbdl.lanius.orchestrate.serv.service.resource.ServerProgramService; import org.yzbdl.lanius.orchestrate.serv.utils.SshUtils; @@ -49,13 +49,13 @@ public class ResourceScheduledTask { private static final Logger logger = LoggerFactory.getLogger(ResourceScheduledTask.class); - private final ServerDbAdapter serverDbAdapter; + private final ServerMapper serverMapper; - private final TaskResourceConfigDbAdapter taskResourceConfigDbAdapter; + private final TaskResourceConfigMapper taskResourceConfigMapper; private final ServerProgramService serverProgramService; - private final ServerProgramDbAdapter serverProgramDbAdapter; + private final ServerProgramMapper serverProgramMapper; /** * 服务器状态检测定时任务 @@ -63,7 +63,7 @@ public class ResourceScheduledTask { @Scheduled(cron = "${cron.resource.server}") public void serverScheduledTask() { logger.info("定时任务检测主机配置状态!"); - List all = serverDbAdapter.getAllServer(); + List all = serverMapper.getAllServer(); List checkedList = new ArrayList<>(); all.forEach(server -> { boolean isConnected = SshUtils.serverTestConnection(server.getServerIp(), server.getServerPort(), @@ -74,7 +74,7 @@ public class ResourceScheduledTask { } }); if (!CollectionUtils.isEmpty(checkedList)) { - serverDbAdapter.batchUpdate(checkedList); + serverMapper.batchUpdate(checkedList); } } @@ -84,7 +84,7 @@ public class ResourceScheduledTask { @Scheduled(cron = "${cron.resource.taskResourceConfig}") public void taskResourceConfigScheduledTask() { logger.info("定时任务检测资源配置状态!"); - List all = taskResourceConfigDbAdapter.getAllTaskResource(); + List all = taskResourceConfigMapper.getAllTaskResource(); List checkedList = new ArrayList<>(); all.forEach(config -> { Boolean isConnected = DynamicDataBase.testConnection(config.getConnectUrl(), config.getConnectAccount(), @@ -97,7 +97,7 @@ public class ResourceScheduledTask { } }); if (!CollectionUtils.isEmpty(checkedList)) { - taskResourceConfigDbAdapter.batchUpdate(checkedList); + taskResourceConfigMapper.batchUpdate(checkedList); } } @@ -107,7 +107,7 @@ public class ResourceScheduledTask { @Scheduled(cron = "${cron.resource.serverProgram}") public void serverProgramScheduledTask() { logger.info("定时任务检测服务节点状态!"); - List all = serverProgramDbAdapter.getAllServerProgramAndServerInfo(); + List all = serverProgramMapper.getAllServerProgramAndServerInfo(); List checkedServerProgramList = new ArrayList<>(); List checkedServerList = new ArrayList<>(); all.forEach(serverProgram -> { @@ -141,11 +141,11 @@ public class ResourceScheduledTask { }); // 更新服务节点数据 if (!CollectionUtils.isEmpty(checkedServerProgramList)) { - serverProgramDbAdapter.batchUpdate(checkedServerProgramList); + serverProgramMapper.batchUpdate(checkedServerProgramList); } // 更新服务器器状态 if (!CollectionUtils.isEmpty(checkedServerList)) { - serverDbAdapter.batchUpdate(checkedServerList); + serverMapper.batchUpdate(checkedServerList); } } diff --git a/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/quartz/taskplan/TaskPlanQuartzTaskJob.java b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/quartz/taskplan/TaskPlanQuartzTaskJob.java index 2451f31..507e680 100644 --- a/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/quartz/taskplan/TaskPlanQuartzTaskJob.java +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/quartz/taskplan/TaskPlanQuartzTaskJob.java @@ -26,7 +26,6 @@ import org.yzbdl.lanius.orchestrate.common.entity.task.TaskInstance; import org.yzbdl.lanius.orchestrate.common.enums.ResourceDataStatusEnum; import org.yzbdl.lanius.orchestrate.common.enums.TaskInstanceStatusEnum; import org.yzbdl.lanius.orchestrate.common.enums.TaskStatusEnum; -import org.yzbdl.lanius.orchestrate.db.adapter.task.TaskInstanceDbAdapter; import org.yzbdl.lanius.orchestrate.serv.constant.EtlRequestConstant; import org.yzbdl.lanius.orchestrate.serv.constant.TaskPlanSchedulerConstant; import org.yzbdl.lanius.orchestrate.serv.quartz.config.BaseTaskJob; @@ -58,9 +57,6 @@ public class TaskPlanQuartzTaskJob implements BaseTaskJob { @Autowired private ThreadPoolExecutor executor; - @Autowired - private TaskInstanceDbAdapter taskInstanceDbAdapter; - @Autowired private TaskInstanceService taskInstanceService; @@ -243,7 +239,7 @@ public class TaskPlanQuartzTaskJob implements BaseTaskJob { taskInstance.setOrgId(taskPlanResourceDTO.getOrgId()); taskInstance.setLogLevel(taskPlanResourceDTO.getLogLevel()); - taskInstanceDbAdapter.save(taskInstance); + taskInstanceService.save(taskInstance); String currentDate = DateUtil.format(new Date(), DateUtil.DATE_FORMAT_SECOND); String msg = String.format("%s - 开始执行任务调度!\r\n", currentDate); @@ -281,7 +277,7 @@ public class TaskPlanQuartzTaskJob implements BaseTaskJob { taskInstance.setTaskInfo(JSONUtil.toJsonStr(map)); taskInstance.setTaskResourceId(taskResourceId); taskInstance.setOrgId(orgId); - taskInstanceDbAdapter.save(taskInstance); + taskInstanceService.save(taskInstance); return taskInstance.getId(); } diff --git a/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/resource/ServerProgramService.java b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/resource/ServerProgramService.java index 0d66f52..108ba2f 100644 --- a/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/resource/ServerProgramService.java +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/resource/ServerProgramService.java @@ -12,6 +12,7 @@ package org.yzbdl.lanius.orchestrate.serv.service.resource; import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; import org.yzbdl.lanius.orchestrate.common.dto.resource.ServerProgramDto; import org.yzbdl.lanius.orchestrate.common.dto.resource.ServerProgramInfoDTO; import org.yzbdl.lanius.orchestrate.common.dto.resource.ServerProgramPageDto; @@ -23,7 +24,7 @@ import org.yzbdl.lanius.orchestrate.common.entity.resource.ServerProgramEntity; * @author zhuhongji@yzbdl.ac.cn * @since 2022-04-08 15:35 */ -public interface ServerProgramService { +public interface ServerProgramService extends IService { /** * 增加服务节点 diff --git a/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/resource/ServerService.java b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/resource/ServerService.java index ed1a8df..e6a8cdb 100644 --- a/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/resource/ServerService.java +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/resource/ServerService.java @@ -12,6 +12,7 @@ package org.yzbdl.lanius.orchestrate.serv.service.resource; import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; import org.yzbdl.lanius.orchestrate.common.dto.resource.ServerPageDto; import org.yzbdl.lanius.orchestrate.common.entity.resource.ServerEntity; @@ -21,7 +22,7 @@ import org.yzbdl.lanius.orchestrate.common.entity.resource.ServerEntity; * @author zhuhongji@yzbdl.ac.cn * @since 2022-03-29 14:46 */ -public interface ServerService { +public interface ServerService extends IService { /** * 增加服务器 diff --git a/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/resource/TaskResourceConfigService.java b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/resource/TaskResourceConfigService.java index 913a2cd..a5850e9 100644 --- a/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/resource/TaskResourceConfigService.java +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/resource/TaskResourceConfigService.java @@ -12,6 +12,7 @@ package org.yzbdl.lanius.orchestrate.serv.service.resource; import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; import org.yzbdl.lanius.orchestrate.common.dto.resource.TaskResourceConfigPageDto; import org.yzbdl.lanius.orchestrate.common.entity.resource.TaskResourceConfigEntity; @@ -21,7 +22,7 @@ import org.yzbdl.lanius.orchestrate.common.entity.resource.TaskResourceConfigEnt * @author zhuhongji@yzbdl.ac.cn * @since 2022-04-08 16:14 */ -public interface TaskResourceConfigService { +public interface TaskResourceConfigService extends IService { /** * 增加任务资源配置 diff --git a/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/resource/TaskResourceGroupService.java b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/resource/TaskResourceGroupService.java index 27c3c6c..713b10a 100644 --- a/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/resource/TaskResourceGroupService.java +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/resource/TaskResourceGroupService.java @@ -11,6 +11,7 @@ */ package org.yzbdl.lanius.orchestrate.serv.service.resource; +import com.baomidou.mybatisplus.extension.service.IService; import org.yzbdl.lanius.orchestrate.common.dto.resource.TaskResourceTreeDto; import org.yzbdl.lanius.orchestrate.common.entity.resource.TaskResourceGroupEntity; @@ -22,7 +23,7 @@ import java.util.List; * @author zhuhongji@yzbdl.ac.cn * @date 2022-04-11 11:29 */ -public interface TaskResourceGroupService { +public interface TaskResourceGroupService extends IService { /** * 构建任务资源树结构 diff --git a/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/resource/TaskResourceService.java b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/resource/TaskResourceService.java index 33e6def..80c2f87 100644 --- a/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/resource/TaskResourceService.java +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/resource/TaskResourceService.java @@ -12,6 +12,7 @@ package org.yzbdl.lanius.orchestrate.serv.service.resource; import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; import org.yzbdl.lanius.orchestrate.common.dto.resource.ExternalDirectoryTreeDto; import org.yzbdl.lanius.orchestrate.common.dto.resource.ExternalFileDto; import org.yzbdl.lanius.orchestrate.common.dto.resource.TaskResourceDto; @@ -26,7 +27,7 @@ import java.util.List; * @author zhuhongji@yzbdl.ac.cn * @since 2022-04-08 16:49 */ -public interface TaskResourceService { +public interface TaskResourceService extends IService { /** * 增加任务资源 diff --git a/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/resource/impl/ResourceStatisticServiceImpl.java b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/resource/impl/ResourceStatisticServiceImpl.java index 4d6b5de..76a8924 100644 --- a/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/resource/impl/ResourceStatisticServiceImpl.java +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/resource/impl/ResourceStatisticServiceImpl.java @@ -19,10 +19,10 @@ import org.yzbdl.lanius.orchestrate.common.dto.resource.TaskResourceTypeStatisti import org.yzbdl.lanius.orchestrate.common.enums.ResourceDataStatusEnum; import org.yzbdl.lanius.orchestrate.common.enums.ResourceTypeEnum; import org.yzbdl.lanius.orchestrate.common.enums.ServerProgramStatusEnum; -import org.yzbdl.lanius.orchestrate.db.adapter.resource.ServerDbAdapter; -import org.yzbdl.lanius.orchestrate.db.adapter.resource.ServerProgramDbAdapter; -import org.yzbdl.lanius.orchestrate.db.adapter.resource.TaskResourceConfigDbAdapter; -import org.yzbdl.lanius.orchestrate.db.adapter.resource.TaskResourceDbAdapter; +import org.yzbdl.lanius.orchestrate.serv.mapper.resource.ServerMapper; +import org.yzbdl.lanius.orchestrate.serv.mapper.resource.ServerProgramMapper; +import org.yzbdl.lanius.orchestrate.serv.mapper.resource.TaskResourceConfigMapper; +import org.yzbdl.lanius.orchestrate.serv.mapper.resource.TaskResourceMapper; import org.yzbdl.lanius.orchestrate.serv.service.resource.ResourceStatisticService; import java.util.List; @@ -38,13 +38,13 @@ import java.util.stream.Collectors; @AllArgsConstructor public class ResourceStatisticServiceImpl implements ResourceStatisticService { - private final ServerDbAdapter serverDbAdapter; + private final ServerMapper serverMapper; - private final ServerProgramDbAdapter serverProgramDbAdapter; + private final ServerProgramMapper serverProgramMapper; - private final TaskResourceConfigDbAdapter taskResourceConfigDbAdapter; + private final TaskResourceConfigMapper taskResourceConfigMapper; - private final TaskResourceDbAdapter taskResourceDbAdapter; + private final TaskResourceMapper taskResourceMapper; @Override public ResourceStatisticDto getStatusStatistic() { @@ -59,14 +59,14 @@ public class ResourceStatisticServiceImpl implements ResourceStatisticService { Long ktrCount; // 主机 - List serverStatusGroupCount = serverDbAdapter.getStatusGroupCount(); + List serverStatusGroupCount = serverMapper.getStatusGroupCount(); // 主机链接正常数 serverNormalCount = this.getStatusCount(serverStatusGroupCount, ResourceDataStatusEnum.NORMAL.getCode()); // 主机链接异常数 serverAbnormalCount = this.getStatusCount(serverStatusGroupCount, ResourceDataStatusEnum.ABNORMAL.getCode()); // 服务节点 - List serverProgramStatusGroupCount = serverProgramDbAdapter.getStatusGroupCount(); + List serverProgramStatusGroupCount = serverProgramMapper.getStatusGroupCount(); // 服务节点进行中数量 serverProgramStoppedCount = this.getStatusCount(serverProgramStatusGroupCount, ServerProgramStatusEnum.STOPPED.getCode()); // 服务节点已停止数量 @@ -75,14 +75,14 @@ public class ResourceStatisticServiceImpl implements ResourceStatisticService { serverProgramAbnormalCount = this.getStatusCount(serverProgramStatusGroupCount, ServerProgramStatusEnum.ABNORMAL.getCode()); // 资源库 - List taskConfigStatusGroupCount = taskResourceConfigDbAdapter.getStatusGroupCount(); + List taskConfigStatusGroupCount = taskResourceConfigMapper.getStatusGroupCount(); // 资源库链接正常数量 resourceConfigNormalCount = this.getStatusCount(taskConfigStatusGroupCount, ResourceDataStatusEnum.NORMAL.getCode()); // 资源库链接异常数量 resourceConfigAbnormalCount = this.getStatusCount(taskConfigStatusGroupCount, ResourceDataStatusEnum.ABNORMAL.getCode()); // 任务资源 - List taskResourceCount = taskResourceDbAdapter.getStatusGroupCount(); + List taskResourceCount = taskResourceMapper.getStatusGroupCount(); Map taskResourceCountCountMap = taskResourceCount.stream() .collect(Collectors.toMap(TaskResourceTypeStatisticDto::getResourceType, TaskResourceTypeStatisticDto::getCount)); // 任务资源作业数量 diff --git a/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/resource/impl/ServerProgramServiceImpl.java b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/resource/impl/ServerProgramServiceImpl.java index 9581a71..0ea7ced 100644 --- a/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/resource/impl/ServerProgramServiceImpl.java +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/resource/impl/ServerProgramServiceImpl.java @@ -17,6 +17,7 @@ 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.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.apache.xerces.impl.dv.util.Base64; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -39,10 +40,10 @@ import org.yzbdl.lanius.orchestrate.common.enums.ServerProgramStatusEnum; import org.yzbdl.lanius.orchestrate.common.exception.runtime.BusinessException; import org.yzbdl.lanius.orchestrate.common.utils.ExceptionUtil; import org.yzbdl.lanius.orchestrate.common.utils.SpecialCharacterUtil; -import org.yzbdl.lanius.orchestrate.db.adapter.resource.ServerDbAdapter; -import org.yzbdl.lanius.orchestrate.db.adapter.resource.ServerProgramDbAdapter; -import org.yzbdl.lanius.orchestrate.db.adapter.task.TaskPlanDbAdapter; import org.yzbdl.lanius.orchestrate.serv.constant.TaskResourceConstant; +import org.yzbdl.lanius.orchestrate.serv.mapper.resource.ServerMapper; +import org.yzbdl.lanius.orchestrate.serv.mapper.resource.ServerProgramMapper; +import org.yzbdl.lanius.orchestrate.serv.mapper.task.TaskPlanMapper; import org.yzbdl.lanius.orchestrate.serv.service.resource.ServerProgramService; import org.yzbdl.lanius.orchestrate.serv.utils.SshUtils; @@ -56,16 +57,13 @@ import java.util.stream.Collectors; * @since 2022-04-08 15:35 */ @Service -public class ServerProgramServiceImpl implements ServerProgramService { +public class ServerProgramServiceImpl extends ServiceImpl implements ServerProgramService { @Autowired - private ServerDbAdapter serverDbAdapter; + ServerMapper serverMapper; @Autowired - private TaskPlanDbAdapter taskPlanDbAdapter; - - @Autowired - private ServerProgramDbAdapter serverProgramDbAdapter; + TaskPlanMapper taskPlanMapper; @Autowired @Qualifier("shortConnectTimeRestTemplate") @@ -79,13 +77,13 @@ public class ServerProgramServiceImpl implements ServerProgramService { LambdaQueryWrapper queryWrapper = new QueryWrapper().lambda() .eq(ServerProgramEntity::getProgramName, serverProgramDto.getProgramName()) .eq(ServerProgramEntity::getDeleted, false); - ExceptionUtil.checkParam(!serverProgramDbAdapter.exists(queryWrapper), "已存在同样的节点名称,请重新输入!"); + ExceptionUtil.checkParam(!this.baseMapper.exists(queryWrapper), "已存在同样的节点名称,请重新输入!"); LambdaQueryWrapper query = new QueryWrapper().lambda() .eq(ServerProgramEntity::getServerId, serverProgramDto.getServerId()) .eq(ServerProgramEntity::getProgramPort, serverProgramDto.getProgramPort()) .like(ServerProgramEntity::getAuthConfig, "\"username\":\"" + serverProgramDto.getUserName() + "\"") .eq(ServerProgramEntity::getDeleted, false); - ExceptionUtil.checkParam(!serverProgramDbAdapter.exists(query), + ExceptionUtil.checkParam(!this.baseMapper.exists(query), "已存在服务节点所在主机、主机端口、用户名三项同时相同的服务节点,请重新输入!"); // 判断服务节点是否存在 this.checkServerExists(serverProgramDto.getServerId()); @@ -96,12 +94,12 @@ public class ServerProgramServiceImpl implements ServerProgramService { ServerProgramEntity entity = new ServerProgramEntity(); BeanUtils.copyProperties(serverProgramDto, entity); this.setServerProgramAuthConfig(serverProgramDto, entity); - return serverProgramDbAdapter.save(entity); + return this.save(entity); } @Override public Boolean deleteServerProgram(Long id) { - ServerProgramEntity getOne = serverProgramDbAdapter.getById(id); + ServerProgramEntity getOne = this.getById(id); if (Objects.isNull(getOne)) { throw new BusinessException("未查询到当前数据!"); } @@ -110,15 +108,15 @@ public class ServerProgramServiceImpl implements ServerProgramService { } LambdaQueryWrapper queryWrapper = new QueryWrapper().lambda() .eq(TaskPlan::getServerProgramId, id); - if (taskPlanDbAdapter.exists(queryWrapper)) { + if (taskPlanMapper.exists(queryWrapper)) { throw new BusinessException("该任务资源已被任务编排,无法删除!"); } - return serverProgramDbAdapter.updateById(ServerProgramEntity.builder().id(id).deleted(true).build()); + return this.updateById(ServerProgramEntity.builder().id(id).deleted(true).build()); } @Override public ServerProgramEntity getServerProgram(Long id) { - return serverProgramDbAdapter.getById(id); + return this.getById(id); } @Override @@ -137,12 +135,12 @@ public class ServerProgramServiceImpl implements ServerProgramService { serverProgramPageDto.getStatus()) // 创建时间降序排序 .orderByDesc(ServerProgramEntity::getCreateTime).orderByDesc(ServerProgramEntity::getId); - Page pageList = serverProgramDbAdapter.page(pageParam, queryWrapper); + Page pageList = this.page(pageParam, queryWrapper); // 2. 获取对应服务器信息 List ipIds = pageList.getRecords().stream().map(ServerProgramEntity::getServerId).distinct() .collect(Collectors.toList()); List serverEntities = - !CollectionUtils.isEmpty(ipIds) ? serverDbAdapter.listByIds(ipIds) : new ArrayList<>(); + !CollectionUtils.isEmpty(ipIds) ? serverMapper.selectBatchIds(ipIds) : new ArrayList<>(); Map serverEntityMap = serverEntities.stream().collect(Collectors.toMap(ServerEntity::getId, Function.identity(), (o1, o2) -> o1)); // 3. 信息拷贝填充 @@ -157,26 +155,26 @@ public class ServerProgramServiceImpl implements ServerProgramService { .ne(ServerProgramEntity::getId, serverProgramDto.getId()) .eq(ServerProgramEntity::getProgramName, serverProgramDto.getProgramName()) .eq(ServerProgramEntity::getDeleted, false); - ExceptionUtil.checkParam(!serverProgramDbAdapter.exists(queryWrapper), "已存在同样的节点名称,请重新输入!"); + ExceptionUtil.checkParam(!this.baseMapper.exists(queryWrapper), "已存在同样的节点名称,请重新输入!"); LambdaQueryWrapper query = new QueryWrapper().lambda() .ne(ServerProgramEntity::getId, serverProgramDto.getId()) .eq(ServerProgramEntity::getServerId, serverProgramDto.getServerId()) .eq(ServerProgramEntity::getProgramPort, serverProgramDto.getProgramPort()) .like(ServerProgramEntity::getAuthConfig, "\"username\":\"" + serverProgramDto.getUserName() + "\"") .eq(ServerProgramEntity::getDeleted, false); - ExceptionUtil.checkParam(!serverProgramDbAdapter.exists(query), + ExceptionUtil.checkParam(!this.baseMapper.exists(query), "已存在服务节点所在主机、主机端口、用户名三项同时相同的服务节点,请重新输入!"); // 判断服务节点是否存在 this.checkServerExists(serverProgramDto.getServerId()); ServerProgramEntity entity = new ServerProgramEntity(); BeanUtils.copyProperties(serverProgramDto, entity); this.setServerProgramAuthConfig(serverProgramDto, entity); - return serverProgramDbAdapter.updateById(entity); + return this.updateById(entity); } @Override public ServerProgramInfoDTO getServerProgramInfoByIdIgnoreTenantId(Long programId) { - return serverProgramDbAdapter.getServerProgramInfoByIdIgnoreTenantId(programId); + return this.baseMapper.getServerProgramInfoByIdIgnoreTenantId(programId); } @Override @@ -205,7 +203,7 @@ public class ServerProgramServiceImpl implements ServerProgramService { // 连接超时情况下,默认没启用服务 logger.error("服务节点连接超时!", exception); String command = "ss -apnl | grep " + port; - ServerEntity serverEntity = serverDbAdapter.getServerInfoById(serverId); + ServerEntity serverEntity = serverMapper.getServerInfoById(serverId); if (Objects.nonNull(serverEntity)) { String shell = SshUtils.executeCommand(serverEntity.getServerIp(), serverEntity.getServerPort(), serverEntity.getAccountName(), serverEntity.getPassword(), command); @@ -232,7 +230,7 @@ public class ServerProgramServiceImpl implements ServerProgramService { LambdaQueryWrapper serverWrapper = new QueryWrapper().lambda() .eq(ServerEntity::getId, serverId) .eq(ServerEntity::getDeleted, false); - ExceptionUtil.checkParam(serverDbAdapter.exists(serverWrapper), "所选主机已被删除请重新选择!"); + ExceptionUtil.checkParam(serverMapper.exists(serverWrapper), "所选主机已被删除请重新选择!"); } } diff --git a/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/resource/impl/ServerServiceImpl.java b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/resource/impl/ServerServiceImpl.java index eaff7c9..e5c4c60 100644 --- a/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/resource/impl/ServerServiceImpl.java +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/resource/impl/ServerServiceImpl.java @@ -15,6 +15,7 @@ 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.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.AllArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; @@ -25,8 +26,8 @@ import org.yzbdl.lanius.orchestrate.common.enums.ResourceDataStatusEnum; import org.yzbdl.lanius.orchestrate.common.exception.runtime.BusinessException; import org.yzbdl.lanius.orchestrate.common.utils.ExceptionUtil; import org.yzbdl.lanius.orchestrate.common.utils.SpecialCharacterUtil; -import org.yzbdl.lanius.orchestrate.db.adapter.resource.ServerDbAdapter; -import org.yzbdl.lanius.orchestrate.db.adapter.resource.ServerProgramDbAdapter; +import org.yzbdl.lanius.orchestrate.serv.mapper.resource.ServerMapper; +import org.yzbdl.lanius.orchestrate.serv.mapper.resource.ServerProgramMapper; import org.yzbdl.lanius.orchestrate.serv.service.resource.ServerService; import java.util.Objects; @@ -37,30 +38,28 @@ import java.util.Objects; */ @Service @AllArgsConstructor -public class ServerServiceImpl implements ServerService { +public class ServerServiceImpl extends ServiceImpl implements ServerService { - private final ServerDbAdapter serverDbAdapter; - - private final ServerProgramDbAdapter serverProgramDbAdapter; + private final ServerProgramMapper serverProgramMapper; @Override public Boolean addServer(ServerEntity serverEntity) { LambdaQueryWrapper queryWrapper = new QueryWrapper().lambda() .eq(ServerEntity::getServerName, serverEntity.getServerName()) .eq(ServerEntity::getDeleted, false); - ExceptionUtil.checkParam(!serverDbAdapter.exists(queryWrapper), "已存在同样的主机名称,请重新输入!"); + ExceptionUtil.checkParam(!this.baseMapper.exists(queryWrapper), "已存在同样的主机名称,请重新输入!"); LambdaQueryWrapper queryIpWrapper = new QueryWrapper().lambda() .eq(ServerEntity::getServerIp, serverEntity.getServerIp()) .eq(ServerEntity::getServerPort, serverEntity.getServerPort()) .eq(ServerEntity::getAccountName, serverEntity.getAccountName()) .eq(ServerEntity::getDeleted, false); - ExceptionUtil.checkParam(!serverDbAdapter.exists(queryIpWrapper), + ExceptionUtil.checkParam(!this.baseMapper.exists(queryIpWrapper), "已存在IP地址、主机端口、用户名三项同时相同的主机信息,请重新输入!"); if(Objects.isNull(serverEntity.getStatus())){ serverEntity.setStatus(ResourceDataStatusEnum.NORMAL.getCode()); } serverEntity.setDeleted(false); - return serverDbAdapter.save(serverEntity); + return this.save(serverEntity); } @Override @@ -68,15 +67,15 @@ public class ServerServiceImpl implements ServerService { LambdaQueryWrapper queryWrapper = new QueryWrapper().lambda() .eq(ServerProgramEntity::getServerId, id) .eq(ServerProgramEntity::getDeleted, false); - if(serverProgramDbAdapter.exists(queryWrapper)){ + if(serverProgramMapper.exists(queryWrapper)){ throw new BusinessException("主机配置了服务节点,请到服务节点管理模块,将该主机下的服务节点全部删除后,再来进行主机删除操作!"); } - return serverDbAdapter.updateById(ServerEntity.builder().id(id).deleted(true).build()); + return this.updateById(ServerEntity.builder().id(id).deleted(true).build()); } @Override public ServerEntity getServer(Long id) { - return serverDbAdapter.getById(id); + return this.getById(id); } @Override @@ -91,7 +90,7 @@ public class ServerServiceImpl implements ServerService { .eq(ServerEntity::getDeleted, false) .orderByDesc(ServerEntity::getCreateTime) .orderByDesc(ServerEntity::getId); - return serverDbAdapter.page(pageParam, queryWrapper); + return this.page(pageParam, queryWrapper); } @Override @@ -101,16 +100,16 @@ public class ServerServiceImpl implements ServerService { .ne(ServerEntity::getId, serverEntity.getId()) .eq(ServerEntity::getServerName, serverEntity.getServerName()) .eq(ServerEntity::getDeleted, false); - ExceptionUtil.checkParam(!serverDbAdapter.exists(queryWrapper), "已存在同样的主机名称,请重新输入!"); + ExceptionUtil.checkParam(!this.baseMapper.exists(queryWrapper), "已存在同样的主机名称,请重新输入!"); LambdaQueryWrapper queryIpWrapper = new QueryWrapper().lambda() .ne(ServerEntity::getId, serverEntity.getId()) .eq(ServerEntity::getServerIp, serverEntity.getServerIp()) .eq(ServerEntity::getServerPort, serverEntity.getServerPort()) .eq(ServerEntity::getAccountName, serverEntity.getAccountName()) .eq(ServerEntity::getDeleted, false); - ExceptionUtil.checkParam(!serverDbAdapter.exists(queryIpWrapper), + ExceptionUtil.checkParam(!this.baseMapper.exists(queryIpWrapper), "已存在IP地址、主机端口、用户名三项同时相同的主机信息,请重新输入!"); - return serverDbAdapter.updateById(serverEntity); + return this.updateById(serverEntity); } } diff --git a/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/resource/impl/TaskResourceConfigServiceImpl.java b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/resource/impl/TaskResourceConfigServiceImpl.java index 36afb8e..59d7243 100644 --- a/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/resource/impl/TaskResourceConfigServiceImpl.java +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/resource/impl/TaskResourceConfigServiceImpl.java @@ -15,6 +15,7 @@ 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.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.AllArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; @@ -25,8 +26,8 @@ import org.yzbdl.lanius.orchestrate.common.enums.ResourceDataStatusEnum; import org.yzbdl.lanius.orchestrate.common.exception.runtime.BusinessException; import org.yzbdl.lanius.orchestrate.common.utils.ExceptionUtil; import org.yzbdl.lanius.orchestrate.common.utils.SpecialCharacterUtil; -import org.yzbdl.lanius.orchestrate.db.adapter.resource.TaskResourceConfigDbAdapter; -import org.yzbdl.lanius.orchestrate.db.adapter.resource.TaskResourceDbAdapter; +import org.yzbdl.lanius.orchestrate.serv.mapper.resource.TaskResourceConfigMapper; +import org.yzbdl.lanius.orchestrate.serv.mapper.resource.TaskResourceMapper; import org.yzbdl.lanius.orchestrate.serv.service.resource.TaskResourceConfigService; import org.yzbdl.lanius.orchestrate.serv.service.resource.TaskResourceService; import org.yzbdl.lanius.orchestrate.serv.utils.JdbcUtil; @@ -39,11 +40,9 @@ import java.util.Objects; */ @Service @AllArgsConstructor -public class TaskResourceConfigServiceImpl implements TaskResourceConfigService { +public class TaskResourceConfigServiceImpl extends ServiceImpl implements TaskResourceConfigService { - private final TaskResourceConfigDbAdapter taskResourceConfigDbAdapter; - - private final TaskResourceDbAdapter taskResourceDbAdapter; + private final TaskResourceMapper taskResourceMapper; private final TaskResourceService taskResourceService; @@ -53,18 +52,18 @@ public class TaskResourceConfigServiceImpl implements TaskResourceConfigService LambdaQueryWrapper queryWrapper = new QueryWrapper().lambda() .eq(TaskResourceConfigEntity::getConnectName, taskResourceConfigEntity.getConnectName()) .eq(TaskResourceConfigEntity::getDeleted, false); - ExceptionUtil.checkParam(!taskResourceConfigDbAdapter.exists(queryWrapper), "已存在同样的资源库名称,请重新输入!"); + ExceptionUtil.checkParam(!this.baseMapper.exists(queryWrapper), "已存在同样的资源库名称,请重新输入!"); LambdaQueryWrapper query = new QueryWrapper().lambda() .eq(TaskResourceConfigEntity::getConnectUrl, taskResourceConfigEntity.getConnectUrl()) .eq(TaskResourceConfigEntity::getConnectAccount, taskResourceConfigEntity.getConnectAccount()) .eq(TaskResourceConfigEntity::getDeleted, false); - ExceptionUtil.checkParam(!taskResourceConfigDbAdapter.exists(query), + ExceptionUtil.checkParam(!this.baseMapper.exists(query), "已存在链接地址、连接用户两项同时相同的资源配置,请重新输入!"); if(Objects.isNull(taskResourceConfigEntity.getStatus())){ taskResourceConfigEntity.setStatus(ResourceDataStatusEnum.NORMAL.getCode()); } taskResourceConfigEntity.setDeleted(false); - return taskResourceConfigDbAdapter.save(taskResourceConfigEntity); + return this.save(taskResourceConfigEntity); } @Override @@ -72,15 +71,15 @@ public class TaskResourceConfigServiceImpl implements TaskResourceConfigService LambdaQueryWrapper queryWrapper = new QueryWrapper().lambda() .eq(TaskResourceEntity::getResourceConfigId, id) .eq(TaskResourceEntity::getDeleted, false); - if(taskResourceDbAdapter.exists(queryWrapper)){ + if(taskResourceMapper.exists(queryWrapper)){ throw new BusinessException("该资源库中数据已被任务调用!"); } - return taskResourceConfigDbAdapter.updateById(TaskResourceConfigEntity.builder().id(id).deleted(true).build()); + return this.updateById(TaskResourceConfigEntity.builder().id(id).deleted(true).build()); } @Override public TaskResourceConfigEntity getTaskResourceConfig(Long id) { - return taskResourceConfigDbAdapter.getById(id); + return this.getById(id); } @Override @@ -97,7 +96,7 @@ public class TaskResourceConfigServiceImpl implements TaskResourceConfigService .eq(Objects.nonNull(taskResourceConfigPageDto.getStatus()), TaskResourceConfigEntity::getStatus, taskResourceConfigPageDto.getStatus()) .orderByDesc(TaskResourceConfigEntity::getCreateTime).orderByDesc(TaskResourceConfigEntity::getId); - return taskResourceConfigDbAdapter.page(pageParam, queryWrapper); + return this.page(pageParam, queryWrapper); } @Override @@ -108,22 +107,22 @@ public class TaskResourceConfigServiceImpl implements TaskResourceConfigService .ne(TaskResourceConfigEntity::getId, taskResourceConfigEntity.getId()) .eq(TaskResourceConfigEntity::getConnectName, taskResourceConfigEntity.getConnectName()) .eq(TaskResourceConfigEntity::getDeleted, false); - ExceptionUtil.checkParam(!taskResourceConfigDbAdapter.exists(queryWrapper), "已存在同样的资源库名称,请重新输入!"); + ExceptionUtil.checkParam(!this.baseMapper.exists(queryWrapper), "已存在同样的资源库名称,请重新输入!"); LambdaQueryWrapper query = new QueryWrapper().lambda() .ne(TaskResourceConfigEntity::getId, taskResourceConfigEntity.getId()) .eq(TaskResourceConfigEntity::getConnectUrl, taskResourceConfigEntity.getConnectUrl()) .eq(TaskResourceConfigEntity::getConnectAccount, taskResourceConfigEntity.getConnectAccount()) .eq(TaskResourceConfigEntity::getDeleted, false); - ExceptionUtil.checkParam(!taskResourceConfigDbAdapter.exists(query), + ExceptionUtil.checkParam(!this.baseMapper.exists(query), "已存在链接地址、连接用户两项同时相同的资源配置,请重新输入!"); // 更新任务资源相关数据 - TaskResourceConfigEntity oldEntity = taskResourceConfigDbAdapter.getById(taskResourceConfigEntity.getId()); + TaskResourceConfigEntity oldEntity = this.getById(taskResourceConfigEntity.getId()); if(StringUtils.hasLength(taskResourceConfigEntity.getConnectUrl()) && !taskResourceConfigEntity.getConnectUrl().equals(oldEntity.getConnectUrl())){ taskResourceService.batchUpdateResourceContent(taskResourceConfigEntity.getId(), JdbcUtil.getDbName(JdbcUtil.parseJdbcUrl(taskResourceConfigEntity.getConnectUrl()))); } - return taskResourceConfigDbAdapter.updateById(taskResourceConfigEntity); + return this.updateById(taskResourceConfigEntity); } } diff --git a/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/resource/impl/TaskResourceGroupServiceImpl.java b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/resource/impl/TaskResourceGroupServiceImpl.java index 34ebe69..af9fea9 100644 --- a/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/resource/impl/TaskResourceGroupServiceImpl.java +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/resource/impl/TaskResourceGroupServiceImpl.java @@ -13,6 +13,7 @@ package org.yzbdl.lanius.orchestrate.serv.service.resource.impl; 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 lombok.AllArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; @@ -24,8 +25,8 @@ import org.yzbdl.lanius.orchestrate.common.entity.resource.TaskResourceEntity; import org.yzbdl.lanius.orchestrate.common.entity.resource.TaskResourceGroupEntity; import org.yzbdl.lanius.orchestrate.common.exception.runtime.BusinessException; import org.yzbdl.lanius.orchestrate.common.utils.ExceptionUtil; -import org.yzbdl.lanius.orchestrate.db.adapter.resource.TaskResourceDbAdapter; -import org.yzbdl.lanius.orchestrate.db.adapter.resource.TaskResourceGroupDbAdapter; +import org.yzbdl.lanius.orchestrate.serv.mapper.resource.TaskResourceGroupMapper; +import org.yzbdl.lanius.orchestrate.serv.mapper.resource.TaskResourceMapper; import org.yzbdl.lanius.orchestrate.serv.service.resource.TaskResourceGroupService; import java.util.*; @@ -37,20 +38,18 @@ import java.util.stream.Collectors; */ @Service @AllArgsConstructor -public class TaskResourceGroupServiceImpl implements TaskResourceGroupService { +public class TaskResourceGroupServiceImpl extends ServiceImpl implements TaskResourceGroupService { - private final TaskResourceGroupDbAdapter taskResourceGroupDbAdapter; - - private final TaskResourceDbAdapter taskResourceDbAdapter; + private final TaskResourceMapper taskResourceMapper; @Override public List buildResourceTree(){ // 获取原始数据 LambdaQueryWrapper queryWrapper = new QueryWrapper().lambda() .eq(TaskResourceGroupEntity::getDeleted, false); - List groupList = taskResourceGroupDbAdapter.list(queryWrapper); + List groupList = this.list(queryWrapper); // 获取分组数量信息 - List resourceCounts = taskResourceDbAdapter.getResourceCount(); + List resourceCounts = taskResourceMapper.getResourceCount(); Map countMap = resourceCounts.stream().collect(Collectors .toMap(TaskResourceGroupCountDto::getGroupId, TaskResourceGroupCountDto::getCount)); @@ -85,17 +84,17 @@ public class TaskResourceGroupServiceImpl implements TaskResourceGroupService { LambdaQueryWrapper queryWrapper = new QueryWrapper().lambda() .eq(TaskResourceGroupEntity::getGroupName, taskResourceGroupEntity.getGroupName()) .eq(TaskResourceGroupEntity::getDeleted, false); - ExceptionUtil.checkParam(!taskResourceGroupDbAdapter.exists(queryWrapper), "已存在同样的分组节点名,请重新输入!"); + ExceptionUtil.checkParam(!this.baseMapper.exists(queryWrapper), "已存在同样的分组节点名,请重新输入!"); // 层级判断 Long pid = taskResourceGroupEntity.getPid(); if (Objects.nonNull(pid)){ - List parents = taskResourceGroupDbAdapter.getParentsById(pid); + List parents = this.baseMapper.getParentsById(pid); if (!CollectionUtils.isEmpty(parents) && parents.size() > 4){ throw new BusinessException("分组最多5层!"); } } taskResourceGroupEntity.setDeleted(false); - return taskResourceGroupDbAdapter.save(taskResourceGroupEntity); + return this.save(taskResourceGroupEntity); } @Override @@ -106,8 +105,8 @@ public class TaskResourceGroupServiceImpl implements TaskResourceGroupService { .ne(TaskResourceGroupEntity::getId, taskResourceGroupEntity.getId()) .eq(TaskResourceGroupEntity::getGroupName, taskResourceGroupEntity.getGroupName()) .eq(TaskResourceGroupEntity::getDeleted, false); - ExceptionUtil.checkParam(!taskResourceGroupDbAdapter.exists(queryWrapper), "已存在同样的分组节点名,请重新输入!"); - return taskResourceGroupDbAdapter.updateById(taskResourceGroupEntity); + ExceptionUtil.checkParam(!this.baseMapper.exists(queryWrapper), "已存在同样的分组节点名,请重新输入!"); + return this.updateById(taskResourceGroupEntity); } @Override @@ -116,18 +115,18 @@ public class TaskResourceGroupServiceImpl implements TaskResourceGroupService { .eq(TaskResourceEntity::getGroupId, id) .eq(TaskResourceEntity::getDeleted, false); // 判断当前目录是否存在内容 - ExceptionUtil.checkParam(!taskResourceDbAdapter.exists(queryWrapper), "请删除当前目录下的任务资源!"); + ExceptionUtil.checkParam(!taskResourceMapper.exists(queryWrapper), "请删除当前目录下的任务资源!"); LambdaQueryWrapper groupQueryWrapper = new QueryWrapper().lambda() .eq(TaskResourceGroupEntity::getPid, id) .eq(TaskResourceGroupEntity::getDeleted, false); // 判断当前目录是否存在子目录 - ExceptionUtil.checkParam(!taskResourceGroupDbAdapter.exists(groupQueryWrapper), "请删除当前目录下的子目录!"); - return taskResourceGroupDbAdapter.updateById(TaskResourceGroupEntity.builder().id(id).deleted(true).build()); + ExceptionUtil.checkParam(!this.baseMapper.exists(groupQueryWrapper), "请删除当前目录下的子目录!"); + return this.updateById(TaskResourceGroupEntity.builder().id(id).deleted(true).build()); } @Override public Boolean directlyDeleteTaskResourceGroup(Long id){ - return taskResourceGroupDbAdapter.updateById(TaskResourceGroupEntity.builder().id(id).deleted(true).build()); + return this.updateById(TaskResourceGroupEntity.builder().id(id).deleted(true).build()); } @Override @@ -136,12 +135,12 @@ public class TaskResourceGroupServiceImpl implements TaskResourceGroupService { .eq(TaskResourceGroupEntity::getPid, id) .eq(TaskResourceGroupEntity::getDeleted, false); // 判断当前目录是否存在子目录 - return taskResourceGroupDbAdapter.exists(groupQueryWrapper); + return this.baseMapper.exists(groupQueryWrapper); } @Override public TaskResourceGroupEntity getTaskResourceGroup(Long id) { - return taskResourceGroupDbAdapter.getById(id); + return this.getById(id); } @Override @@ -151,7 +150,7 @@ public class TaskResourceGroupServiceImpl implements TaskResourceGroupService { LambdaQueryWrapper queryWrapper = new QueryWrapper().lambda() .like(TaskResourceGroupEntity::getGroupName, groupName) .eq(TaskResourceGroupEntity::getDeleted, false); - return taskResourceGroupDbAdapter.list(queryWrapper); + return this.list(queryWrapper); } @Override @@ -159,10 +158,10 @@ public class TaskResourceGroupServiceImpl implements TaskResourceGroupService { LambdaQueryWrapper queryWrapper = new QueryWrapper().lambda() .eq(TaskResourceGroupEntity::getDeleted, false); - List groupList = taskResourceGroupDbAdapter.list(queryWrapper); + List groupList = this.list(queryWrapper); // 获取分组数量信息 - List resourceCounts = taskResourceDbAdapter.getResourceCount(); + List resourceCounts = taskResourceMapper.getResourceCount(); Map countMap = resourceCounts.stream().collect(Collectors .toMap(TaskResourceGroupCountDto::getGroupId, TaskResourceGroupCountDto::getCount)); diff --git a/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/resource/impl/TaskResourceServiceImpl.java b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/resource/impl/TaskResourceServiceImpl.java index 241e359..30b05aa 100644 --- a/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/resource/impl/TaskResourceServiceImpl.java +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/resource/impl/TaskResourceServiceImpl.java @@ -20,6 +20,7 @@ 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.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.AllArgsConstructor; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -37,10 +38,10 @@ import org.yzbdl.lanius.orchestrate.common.enums.ResourceTypeEnum; import org.yzbdl.lanius.orchestrate.common.exception.runtime.BusinessException; import org.yzbdl.lanius.orchestrate.common.utils.ExceptionUtil; import org.yzbdl.lanius.orchestrate.common.utils.SpecialCharacterUtil; -import org.yzbdl.lanius.orchestrate.db.adapter.resource.TaskResourceConfigDbAdapter; -import org.yzbdl.lanius.orchestrate.db.adapter.resource.TaskResourceDbAdapter; -import org.yzbdl.lanius.orchestrate.db.adapter.task.TaskPlanDbAdapter; import org.yzbdl.lanius.orchestrate.serv.dataBase.DynamicDataBase; +import org.yzbdl.lanius.orchestrate.serv.mapper.resource.TaskResourceConfigMapper; +import org.yzbdl.lanius.orchestrate.serv.mapper.resource.TaskResourceMapper; +import org.yzbdl.lanius.orchestrate.serv.mapper.task.TaskPlanMapper; import org.yzbdl.lanius.orchestrate.serv.service.resource.TaskResourceService; import org.yzbdl.lanius.orchestrate.serv.utils.JdbcUtil; import org.yzbdl.lanius.orchestrate.serv.utils.TreeUtil; @@ -57,15 +58,13 @@ import static org.yzbdl.lanius.orchestrate.serv.constant.TaskResourceConstant.*; */ @Service @AllArgsConstructor -public class TaskResourceServiceImpl implements TaskResourceService { +public class TaskResourceServiceImpl extends ServiceImpl implements TaskResourceService { private static final Logger logger = LoggerFactory.getLogger(TaskResourceServiceImpl.class); - private final TaskResourceConfigDbAdapter taskResourceConfigDbAdapter; + private final TaskResourceConfigMapper taskResourceConfigMapper; - private final TaskPlanDbAdapter taskPlanDbAdapter; - - private final TaskResourceDbAdapter taskResourceDbAdapter; + private final TaskPlanMapper taskPlanMapper; @Override public Boolean addTaskResource(TaskResourceDto taskResourceDto) { @@ -74,7 +73,7 @@ public class TaskResourceServiceImpl implements TaskResourceService { LambdaQueryWrapper queryWrapper = new QueryWrapper().lambda() .eq(TaskResourceEntity::getResourceName, taskResourceDto.getResourceName()) .eq(TaskResourceEntity::getDeleted, false); - ExceptionUtil.checkParam(!taskResourceDbAdapter.exists(queryWrapper), "已存在同样的资源名称,请重新输入!"); + ExceptionUtil.checkParam(!this.baseMapper.exists(queryWrapper), "已存在同样的资源名称,请重新输入!"); // 检测资源库是否存在 this.checkResourceConfigExists(taskResourceDto.getResourceConfigId()); // Dto数据拷贝 @@ -83,7 +82,7 @@ public class TaskResourceServiceImpl implements TaskResourceService { taskResourceEntity.setDeleted(false); // 写入资源配置数据 this.setResourceContent(taskResourceDto, taskResourceEntity); - return taskResourceDbAdapter.save(taskResourceEntity); + return this.save(taskResourceEntity); } /** @@ -96,7 +95,7 @@ public class TaskResourceServiceImpl implements TaskResourceService { LambdaQueryWrapper resourceConfigWrapper = new QueryWrapper().lambda() .eq(TaskResourceConfigEntity::getId, taskResourceConfigId) .eq(TaskResourceConfigEntity::getDeleted, false); - ExceptionUtil.checkParam(taskResourceConfigDbAdapter.exists(resourceConfigWrapper), "所选资源配置已删除请重新选择!"); + ExceptionUtil.checkParam(taskResourceConfigMapper.exists(resourceConfigWrapper), "所选资源配置已删除请重新选择!"); } } @@ -104,15 +103,15 @@ public class TaskResourceServiceImpl implements TaskResourceService { public Boolean deleteTaskResource(Long id) { LambdaQueryWrapper queryWrapper = new QueryWrapper().lambda() .eq(TaskPlan::getTaskResourceId, id); - if (taskPlanDbAdapter.exists(queryWrapper)) { + if (taskPlanMapper.exists(queryWrapper)) { throw new BusinessException("该任务资源已被调用,无法删除!"); } - return taskResourceDbAdapter.updateById(TaskResourceEntity.builder().id(id).deleted(true).build()); + return this.updateById(TaskResourceEntity.builder().id(id).deleted(true).build()); } @Override public TaskResourceEntity getTaskResource(Long id) { - return taskResourceDbAdapter.getById(id); + return this.getById(id); } @Override @@ -136,12 +135,12 @@ public class TaskResourceServiceImpl implements TaskResourceService { // 创建时间降序排序 .orderByDesc(TaskResourceEntity::getCreateTime) .orderByDesc(TaskResourceEntity::getId); - Page pageList = taskResourceDbAdapter.page(pageParam, queryWrapper); + Page pageList = this.page(pageParam, queryWrapper); // 2. 获取配置信息 List ids = pageList.getRecords().stream().map(TaskResourceEntity::getResourceConfigId).distinct() .collect(Collectors.toList()); List taskEntities = - !CollectionUtils.isEmpty(ids) ? taskResourceConfigDbAdapter.listByIds(ids) : new ArrayList<>(); + !CollectionUtils.isEmpty(ids) ? taskResourceConfigMapper.selectBatchIds(ids) : new ArrayList<>(); // 3. 转换为配置Map信息 Map configMap = taskEntities.stream() .collect(Collectors.toMap(TaskResourceConfigEntity::getId, Function.identity(), (o1, o2) -> o1)); @@ -155,7 +154,7 @@ public class TaskResourceServiceImpl implements TaskResourceService { .eq(TaskResourceEntity::getGroupId, id) .eq(TaskResourceEntity::getDeleted, false); // 判断当前目录是否存在内容 - return taskResourceDbAdapter.exists(queryWrapper); + return this.baseMapper.exists(queryWrapper); } @Override @@ -167,7 +166,7 @@ public class TaskResourceServiceImpl implements TaskResourceService { .ne(TaskResourceEntity::getId, taskResourceDto.getId()) .eq(TaskResourceEntity::getResourceName, taskResourceDto.getResourceName()) .eq(TaskResourceEntity::getDeleted, false); - ExceptionUtil.checkParam(!taskResourceDbAdapter.exists(queryWrapper), "已存在同样的资源名称,请重新输入!"); + ExceptionUtil.checkParam(!this.baseMapper.exists(queryWrapper), "已存在同样的资源名称,请重新输入!"); // 检测资源库是否存在 this.checkResourceConfigExists(taskResourceDto.getResourceConfigId()); // Dto数据拷贝 @@ -175,7 +174,7 @@ public class TaskResourceServiceImpl implements TaskResourceService { BeanUtils.copyProperties(taskResourceDto, taskResourceEntity); // 写入资源配置数据 this.setResourceContent(taskResourceDto, taskResourceEntity); - return taskResourceDbAdapter.updateById(taskResourceEntity); + return this.updateById(taskResourceEntity); } /** @@ -207,7 +206,7 @@ public class TaskResourceServiceImpl implements TaskResourceService { public void batchUpdateResourceContent(Long resourceConfigId, String repoName) { LambdaQueryWrapper queryWrapper = new QueryWrapper().lambda() .eq(TaskResourceEntity::getResourceConfigId, resourceConfigId); - List list = taskResourceDbAdapter.list(queryWrapper); + List list = this.list(queryWrapper); if (!CollectionUtils.isEmpty(list)) { List updateList = list.stream().map(entity -> { Map contentMap = JSONUtil.toBean(JSONUtil.parse(entity.getResourceContent()), new TypeReference<>() { @@ -218,7 +217,7 @@ public class TaskResourceServiceImpl implements TaskResourceService { .resourceContent(JSONUtil.toJsonStr(contentMap)) .build(); }).collect(Collectors.toList()); - taskResourceDbAdapter.updateBatchById(updateList); + this.updateBatchById(updateList); } } @@ -230,7 +229,7 @@ public class TaskResourceServiceImpl implements TaskResourceService { */ private void setResourceContent(TaskResourceDto taskResourceDto, TaskResourceEntity taskResourceEntity) { Map resourceContent = new HashMap<>(4); - TaskResourceConfigEntity taskResourceConfigEntity = taskResourceConfigDbAdapter.getById(taskResourceDto.getResourceConfigId()); + TaskResourceConfigEntity taskResourceConfigEntity = taskResourceConfigMapper.selectById(taskResourceDto.getResourceConfigId()); ExceptionUtil.checkParam(Objects.nonNull(taskResourceConfigEntity), "未查询到对应数据库信息!"); // 构建资源库Json数据 resourceContent.put(CONFIG_CONTENT_REPO_NAME, JdbcUtil.getDbName(JdbcUtil.parseJdbcUrl(taskResourceConfigEntity.getConnectUrl()))); @@ -246,7 +245,7 @@ public class TaskResourceServiceImpl implements TaskResourceService { queryWrapper.eq(TaskResourceEntity::getGroupId, resourceGroupId); queryWrapper.eq(TaskResourceEntity::getDeleted, Boolean.FALSE); queryWrapper.select(TaskResourceEntity::getId, TaskResourceEntity::getGroupId, TaskResourceEntity::getResourceName); - return taskResourceDbAdapter.list(queryWrapper); + return this.list(queryWrapper); } @Override @@ -349,7 +348,7 @@ public class TaskResourceServiceImpl implements TaskResourceService { * @return 资源连接信息 */ private DruidDataSource getDataSource(Long resourceConfigId) { - TaskResourceConfigEntity taskResourceConfigEntity = taskResourceConfigDbAdapter.getById(resourceConfigId); + TaskResourceConfigEntity taskResourceConfigEntity = taskResourceConfigMapper.selectById(resourceConfigId); ExceptionUtil.checkParam(Objects.nonNull(taskResourceConfigEntity), "未找到对应数据库资源!"); DataBaseInfo dataBaseInfo = DataBaseInfo.builder() .url(taskResourceConfigEntity.getConnectUrl()) diff --git a/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/system/ManagerAuthService.java b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/system/ManagerAuthService.java index a2c7b9b..e29c513 100644 --- a/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/system/ManagerAuthService.java +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/system/ManagerAuthService.java @@ -11,7 +11,9 @@ */ package org.yzbdl.lanius.orchestrate.serv.service.system; +import com.baomidou.mybatisplus.extension.service.IService; import org.springframework.security.core.userdetails.UserDetailsService; +import org.yzbdl.lanius.orchestrate.common.entity.system.ManagerEntity; import org.yzbdl.lanius.orchestrate.common.vo.system.ManagerTokenVo; /** @@ -20,7 +22,7 @@ import org.yzbdl.lanius.orchestrate.common.vo.system.ManagerTokenVo; * @author chenjunhao@yzbdl.ac.cn * @date 2022-04-21 14:58 */ -public interface ManagerAuthService extends UserDetailsService { +public interface ManagerAuthService extends IService, UserDetailsService { /** * 用户登录 * @param username 用户名 diff --git a/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/system/ManagerService.java b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/system/ManagerService.java index da7d928..12f74b1 100644 --- a/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/system/ManagerService.java +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/system/ManagerService.java @@ -12,6 +12,7 @@ package org.yzbdl.lanius.orchestrate.serv.service.system; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; import org.yzbdl.lanius.orchestrate.common.dto.system.ManagerInsertParamDto; import org.yzbdl.lanius.orchestrate.common.dto.system.ManagerListDto; import org.yzbdl.lanius.orchestrate.common.entity.system.ManagerEntity; @@ -22,28 +23,7 @@ import org.yzbdl.lanius.orchestrate.common.entity.system.ManagerEntity; * @author chenjunhao@yzbdl.ac.cn * @date 2022-04-08 10:59 */ -public interface ManagerService { - - /** - * 根据ID查找数据 - * @param id id - * @return 返回结果 - */ - ManagerEntity getById(Long id); - - /** - * 返回数据条数 - * @return 返回数据 - */ - long count(); - - /** - * 根据ID删除数据 - * @param id id - * @return 返回数据 - */ - boolean removeById(String id); - +public interface ManagerService extends IService { /** * 新增管理员 diff --git a/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/system/MenuService.java b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/system/MenuService.java index 06c1c6a..6887f6b 100644 --- a/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/system/MenuService.java +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/system/MenuService.java @@ -11,12 +11,15 @@ */ package org.yzbdl.lanius.orchestrate.serv.service.system; +import com.baomidou.mybatisplus.extension.service.IService; +import org.yzbdl.lanius.orchestrate.common.entity.system.MenuEntity; + /** * 菜单服务接口 * * @author chenjunhao@yzbdl.ac.cn * @date 2022-04-08 17:31 */ -public interface MenuService { +public interface MenuService extends IService { } diff --git a/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/system/OrgService.java b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/system/OrgService.java index 9ad85ee..d78e2ca 100644 --- a/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/system/OrgService.java +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/system/OrgService.java @@ -25,7 +25,7 @@ import java.util.List; * @author chenjunhao@yzbdl.ac.cn * @date 2022-04-08 13:29 */ -public interface OrgService { +public interface OrgService extends IService { /** * 根据用户id查询组织 @@ -103,18 +103,11 @@ public interface OrgService { */ boolean updateOrg(OrgEntity orgEntity); - /** - * 通过id获取实体 - * @param id id - * @return 实体对象 - */ - OrgEntity getById(Long id); - /** * 移除组织 * @param id 组织id * @return 是否正确 */ - Boolean removeById(Long id); + Boolean removeCascade(Long id); } diff --git a/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/system/PermissionService.java b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/system/PermissionService.java index 5ec5bca..1209cd1 100644 --- a/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/system/PermissionService.java +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/system/PermissionService.java @@ -11,6 +11,7 @@ */ package org.yzbdl.lanius.orchestrate.serv.service.system; +import com.baomidou.mybatisplus.extension.service.IService; import org.yzbdl.lanius.orchestrate.common.entity.system.PermissionEntity; import org.yzbdl.lanius.orchestrate.common.vo.system.PermissionMenuUrlVo; @@ -22,7 +23,7 @@ import java.util.List; * @author chenjunhao@yzbdl.ac.cn * @date 2022-04-11 09:21 */ -public interface PermissionService { +public interface PermissionService extends IService { /** * 根据权用户id和组织id查询权限 * @param userId 用户id diff --git a/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/system/RoleService.java b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/system/RoleService.java index 2a44303..08f230f 100644 --- a/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/system/RoleService.java +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/system/RoleService.java @@ -12,6 +12,7 @@ package org.yzbdl.lanius.orchestrate.serv.service.system; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; import org.yzbdl.lanius.orchestrate.common.dto.system.RoleInsertParamDto; import org.yzbdl.lanius.orchestrate.common.dto.system.RoleListDto; import org.yzbdl.lanius.orchestrate.common.entity.system.RoleEntity; @@ -25,20 +26,7 @@ import java.util.List; * @author chenjunhao@yzbdl.ac.cn * @date 2022-04-07 16:47 */ -public interface RoleService { - - /** - * 根据ID查询数据 - * @param id id - * @return 返回数据 - */ - RoleEntity getById(String id); - - /** - * 查询所有数据集合 - * @return 返回数据 - */ - List list(); +public interface RoleService extends IService { /** * 根据角色id保存权限 diff --git a/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/system/UserAuthService.java b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/system/UserAuthService.java index 03d4de3..b1117d6 100644 --- a/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/system/UserAuthService.java +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/system/UserAuthService.java @@ -11,6 +11,7 @@ */ package org.yzbdl.lanius.orchestrate.serv.service.system; +import com.baomidou.mybatisplus.extension.service.IService; import org.springframework.security.core.userdetails.UserDetailsService; import org.yzbdl.lanius.orchestrate.common.entity.system.UserEntity; import org.yzbdl.lanius.orchestrate.common.vo.system.UserTokenVo; @@ -21,7 +22,7 @@ import org.yzbdl.lanius.orchestrate.common.vo.system.UserTokenVo; * @author chenjunhao@yzbdl.ac.cn * @date 2022-04-21 11:00 */ -public interface UserAuthService extends UserDetailsService { +public interface UserAuthService extends IService, UserDetailsService { /** * 用户登录 diff --git a/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/system/UserLogService.java b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/system/UserLogService.java index 25a722b..94f1ddc 100644 --- a/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/system/UserLogService.java +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/system/UserLogService.java @@ -13,6 +13,7 @@ package org.yzbdl.lanius.orchestrate.serv.service.system; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; import org.yzbdl.lanius.orchestrate.common.dto.system.UserLogQueryDto; import org.yzbdl.lanius.orchestrate.common.entity.system.UserLogEntity; import org.yzbdl.lanius.orchestrate.common.vo.system.UserLogVo; @@ -25,14 +26,7 @@ import java.util.List; * @author chenjunhao@yzbdl.ac.cn * @date 2022-04-13 15:32 */ -public interface UserLogService { - - /** - * 保存用户操作日志 - * @param userLogEntity 实体 - * @return 返回数据 - */ - boolean save(UserLogEntity userLogEntity); +public interface UserLogService extends IService { /** * 获取日志事件 diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter/src/main/java/org/yzbdl/lanius/orchestrate/db/adapter/system/ManagerDbAdapter.java b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/system/UserOrgService.java similarity index 72% rename from lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter/src/main/java/org/yzbdl/lanius/orchestrate/db/adapter/system/ManagerDbAdapter.java rename to lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/system/UserOrgService.java index bae587f..1d6e088 100644 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter/src/main/java/org/yzbdl/lanius/orchestrate/db/adapter/system/ManagerDbAdapter.java +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/system/UserOrgService.java @@ -9,16 +9,17 @@ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. * See the Mulan PSL v2 for more details. */ -package org.yzbdl.lanius.orchestrate.db.adapter.system; +package org.yzbdl.lanius.orchestrate.serv.service.system; import com.baomidou.mybatisplus.extension.service.IService; -import org.yzbdl.lanius.orchestrate.common.entity.system.ManagerEntity; +import org.yzbdl.lanius.orchestrate.common.entity.system.UserOrgEntity; /** - * 管理员数据适配接口 + * 用户组织映射 * * @author hujian@yzbdl.ac.cn - * @date 2022-08-16 16:01 + * @date 2022-09-13 14:04 */ -public interface ManagerDbAdapter extends IService { +public interface UserOrgService extends IService { + } diff --git a/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/system/UserService.java b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/system/UserService.java index 3c31c1f..870ffcd 100644 --- a/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/system/UserService.java +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/system/UserService.java @@ -12,6 +12,7 @@ package org.yzbdl.lanius.orchestrate.serv.service.system; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; import org.yzbdl.lanius.orchestrate.common.dto.system.*; import org.yzbdl.lanius.orchestrate.common.entity.system.UserEntity; import org.yzbdl.lanius.orchestrate.common.vo.system.AccountVO; @@ -26,7 +27,7 @@ import java.util.List; * @author chenjunhao@yzbdl.ac.cn * @date 2022-04-07 14:14 */ -public interface UserService { +public interface UserService extends IService { /** * 添加账户 @@ -42,14 +43,6 @@ public interface UserService { */ Page listUserPage(UserListDTO userListDto, Page page); -// /** -// * 用户管理员查询用户 -// * @param managerUserQueryDto 管理员查询条件 -// * @param page 分页 -// * @return 用户列表 -// */ -// Page listUserPage(ManagerUserQueryDto managerUserQueryDto, Page page); - /** * 该组织是否存在用户 * @param orgId 组织id @@ -65,16 +58,6 @@ public interface UserService { */ boolean updateUser(UserOrgUpdateParamDTO userOrgUpdateParamDTO, Long id); -// /** -// * 给组织添加用户 -// * 普通用户添加不需要组织参数,这个地方仅仅是给管理员服务的 -// * @param userInsertParamDto 组织对象 -// * @param orgId 组织Id -// * @param orgChief 是否是组织负责人(目前超级管理员创建的用户都是组织领袖) -// * @return 用户实体 -// */ -// UserEntity insertUser(UserInsertParamDTO userInsertParamDto, Long orgId, boolean orgChief); - /** * 保存用户角色 * @param roleIds 角色id列表 @@ -135,13 +118,6 @@ public interface UserService { */ Page listAccountPage(UserListDTO userListDto, Page page); - /** - * 通过id获取对象 - * @param id 用户id - * @return 用户实体对象 - */ - UserEntity getById(Long id); - /** * 将用户移除组织 diff --git a/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/system/impl/ManagerAuthServiceImpl.java b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/system/impl/ManagerAuthServiceImpl.java index 587bbff..7fde610 100644 --- a/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/system/impl/ManagerAuthServiceImpl.java +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/system/impl/ManagerAuthServiceImpl.java @@ -14,7 +14,7 @@ package org.yzbdl.lanius.orchestrate.serv.service.system.impl; import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; -import org.springframework.beans.factory.annotation.Autowired; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.stereotype.Service; @@ -27,7 +27,7 @@ import org.yzbdl.lanius.orchestrate.common.jwt.JwtHelper; import org.yzbdl.lanius.orchestrate.common.jwt.TokenDto; import org.yzbdl.lanius.orchestrate.common.utils.BcryptEncoderUtil; import org.yzbdl.lanius.orchestrate.common.vo.system.ManagerTokenVo; -import org.yzbdl.lanius.orchestrate.db.adapter.system.ManagerDbAdapter; +import org.yzbdl.lanius.orchestrate.serv.mapper.system.ManagerMapper; import org.yzbdl.lanius.orchestrate.serv.service.system.ManagerAuthService; import java.util.Map; @@ -41,10 +41,7 @@ import java.util.Optional; */ @Service @Transactional -public class ManagerAuthServiceImpl implements ManagerAuthService { - - @Autowired - private ManagerDbAdapter managerDbAdapter; +public class ManagerAuthServiceImpl extends ServiceImpl implements ManagerAuthService { /** * 通过用户名找到用户实体 @@ -104,7 +101,7 @@ public class ManagerAuthServiceImpl implements ManagerAuthService { * @return 管理员实体 */ private ManagerEntity getUserByUserName(String userName) { - return managerDbAdapter.getOne( + return this.getOne( new LambdaQueryWrapper() .eq(ManagerEntity::getUsername,userName) ); @@ -133,11 +130,11 @@ public class ManagerAuthServiceImpl implements ManagerAuthService { */ @Override public Boolean updatePassword(Long userId, String newPassword, String oldPassword){ - ManagerEntity managerEntity = managerDbAdapter.getById(userId); + ManagerEntity managerEntity = this.getById(userId); if(!BcryptEncoderUtil.match(oldPassword, managerEntity.getPassword())){ throw new NoPermissionException("您的原始密码错误!"); } - return managerDbAdapter.update(new LambdaUpdateWrapper() + return this.update(new LambdaUpdateWrapper() .eq(ManagerEntity::getId,userId).set(ManagerEntity::getPassword, BcryptEncoderUtil.encode(newPassword)) ); } @@ -147,7 +144,7 @@ public class ManagerAuthServiceImpl implements ManagerAuthService { try{ Map claims = JwtHelper.getManagerClaimMapFromToken(rfToken); PayLoadClaimDto payLoadClaimDto = JSONUtil.toBean(JSONUtil.toJsonStr(claims),PayLoadClaimDto.class); - return getUserTokenMap(managerDbAdapter.getById(payLoadClaimDto.getUserId())); + return getUserTokenMap(this.getById(payLoadClaimDto.getUserId())); }catch (Exception e){ throw new BusinessException("认证失效!"); } diff --git a/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/system/impl/ManagerServiceImpl.java b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/system/impl/ManagerServiceImpl.java index 9637d85..c27120f 100644 --- a/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/system/impl/ManagerServiceImpl.java +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/system/impl/ManagerServiceImpl.java @@ -14,15 +14,15 @@ package org.yzbdl.lanius.orchestrate.serv.service.system.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.yzbdl.lanius.orchestrate.common.dto.system.ManagerInsertParamDto; import org.yzbdl.lanius.orchestrate.common.dto.system.ManagerListDto; import org.yzbdl.lanius.orchestrate.common.entity.system.ManagerEntity; import org.yzbdl.lanius.orchestrate.common.exception.runtime.BusinessException; import org.yzbdl.lanius.orchestrate.common.utils.BcryptEncoderUtil; -import org.yzbdl.lanius.orchestrate.db.adapter.system.ManagerDbAdapter; +import org.yzbdl.lanius.orchestrate.serv.mapper.system.ManagerMapper; import org.yzbdl.lanius.orchestrate.serv.service.system.ManagerService; import java.time.LocalDateTime; @@ -34,40 +34,8 @@ import java.time.LocalDateTime; * @date 2022-04-08 11:00 */ @Service -public class ManagerServiceImpl implements ManagerService { +public class ManagerServiceImpl extends ServiceImpl implements ManagerService { - @Autowired - private ManagerDbAdapter managerDbAdapter; - - - /** - * 根据ID查找数据 - * @param id id - * @return 返回结果 - */ - @Override - public ManagerEntity getById(Long id) { - return managerDbAdapter.getById(id); - } - - /** - * 返回数据条数 - * @return 返回数据 - */ - @Override - public long count() { - return managerDbAdapter.count(); - } - - /** - * 根据ID删除数据 - * @param id id - * @return 返回数据 - */ - @Override - public boolean removeById(String id) { - return managerDbAdapter.removeById(id); - } /** * 通过名称获取人员信息 @@ -75,7 +43,7 @@ public class ManagerServiceImpl implements ManagerService { * @return 管理员实体 */ private ManagerEntity getUserByUserName(String userName) { - return managerDbAdapter.getOne(new LambdaQueryWrapper() + return this.getOne(new LambdaQueryWrapper() .eq(ManagerEntity::getUsername,userName) ); } @@ -89,7 +57,7 @@ public class ManagerServiceImpl implements ManagerService { */ @Override public Page listManagerPage(ManagerListDto managerListDto, Page page){ - return managerDbAdapter.page( + return this.page( page, new QueryWrapper().lambda() .like(StringUtils.isNotEmpty(managerListDto.getUserName()),ManagerEntity::getUsername,managerListDto.getUserName()) @@ -112,7 +80,7 @@ public class ManagerServiceImpl implements ManagerService { .createTime(LocalDateTime.now()) .password(BcryptEncoderUtil.encode(managerInsertParamDto.getPassword())) .build(); - return managerDbAdapter.save(managerEntity); + return this.save(managerEntity); } diff --git a/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/system/impl/MenuServiceImpl.java b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/system/impl/MenuServiceImpl.java index e74055c..673f886 100644 --- a/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/system/impl/MenuServiceImpl.java +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/system/impl/MenuServiceImpl.java @@ -11,7 +11,10 @@ */ package org.yzbdl.lanius.orchestrate.serv.service.system.impl; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.stereotype.Service; +import org.yzbdl.lanius.orchestrate.common.entity.system.MenuEntity; +import org.yzbdl.lanius.orchestrate.serv.mapper.system.MenuMapper; import org.yzbdl.lanius.orchestrate.serv.service.system.MenuService; /** @@ -21,6 +24,6 @@ import org.yzbdl.lanius.orchestrate.serv.service.system.MenuService; * @date 2022-04-08 17:32 */ @Service -public class MenuServiceImpl implements MenuService { +public class MenuServiceImpl extends ServiceImpl implements MenuService { } diff --git a/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/system/impl/OrgServiceImpl.java b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/system/impl/OrgServiceImpl.java index e9b39ef..328adb4 100644 --- a/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/system/impl/OrgServiceImpl.java +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/system/impl/OrgServiceImpl.java @@ -15,6 +15,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -25,8 +26,8 @@ import org.yzbdl.lanius.orchestrate.common.entity.system.OrgEntity; import org.yzbdl.lanius.orchestrate.common.entity.system.UserOrgEntity; import org.yzbdl.lanius.orchestrate.common.exception.runtime.BusinessException; import org.yzbdl.lanius.orchestrate.common.utils.MessageUtil; -import org.yzbdl.lanius.orchestrate.db.adapter.system.OrgDbAdapter; -import org.yzbdl.lanius.orchestrate.db.adapter.system.UserOrgDbAdapter; +import org.yzbdl.lanius.orchestrate.serv.mapper.system.OrgMapper; +import org.yzbdl.lanius.orchestrate.serv.mapper.system.UserOrgMapper; import org.yzbdl.lanius.orchestrate.serv.service.system.OrgService; import org.yzbdl.lanius.orchestrate.serv.utils.CurrentUserUtil; @@ -39,13 +40,11 @@ import java.util.List; * @date 2022-04-08 13:31 */ @Service -public class OrgServiceImpl implements OrgService { +public class OrgServiceImpl extends ServiceImpl implements OrgService { - @Autowired - private OrgDbAdapter orgDbAdapter; @Autowired - private UserOrgDbAdapter userOrgDbAdapter; + UserOrgMapper userOrgMapper; @@ -57,7 +56,7 @@ public class OrgServiceImpl implements OrgService { */ @Override public List queryOrgByUserId(Long userId) { - return orgDbAdapter.queryOrgByUserId(userId); + return this.baseMapper.queryOrgByUserId(userId); } /** @@ -69,7 +68,7 @@ public class OrgServiceImpl implements OrgService { */ @Override public Page listOrgPage(OrgQueryDTO orgQueryDto, Page page) { - return orgDbAdapter.page(page, new LambdaQueryWrapper() + return this.page(page, new LambdaQueryWrapper() .like( orgQueryDto.getOrgName() != null, OrgEntity::getOrgName, @@ -90,7 +89,7 @@ public class OrgServiceImpl implements OrgService { if (StringUtils.isNoneEmpty(orgName)) { queryWrapper.lambda().like(OrgEntity::getOrgName, orgName); } - return orgDbAdapter.list(queryWrapper); + return this.list(queryWrapper); } /** @@ -101,7 +100,7 @@ public class OrgServiceImpl implements OrgService { */ @Override public boolean isCurrentUserBelongToOrg(Long orgId) { - return userOrgDbAdapter.exists( + return userOrgMapper.exists( new LambdaQueryWrapper() .eq(UserOrgEntity::getOrgId, orgId) .eq(UserOrgEntity::getUserId, CurrentUserUtil.getCurrentUserId()) @@ -116,7 +115,7 @@ public class OrgServiceImpl implements OrgService { */ @Override public boolean isUserInOrg(Long userId, Long orgId) { - return userOrgDbAdapter.exists( + return userOrgMapper.exists( new LambdaQueryWrapper() .eq(UserOrgEntity::getOrgId, orgId) .eq(UserOrgEntity::getUserId, userId) @@ -132,7 +131,7 @@ public class OrgServiceImpl implements OrgService { */ @Override public boolean changeOrgFrozen(Boolean frozen, Long orgId) { - return orgDbAdapter.update(new LambdaUpdateWrapper() + return this.update(new LambdaUpdateWrapper() .eq(IdFieldEntity::getId, orgId).set(OrgEntity::getFrozen, frozen) .last("limit 1") ); @@ -148,7 +147,7 @@ public class OrgServiceImpl implements OrgService { */ @Override public int addUserIntoOrg(Long userId, Long orgId, boolean chief) { - return userOrgDbAdapter.insert(UserOrgEntity.builder() + return userOrgMapper.insert(UserOrgEntity.builder() .userId(userId) .orgId(orgId) .orgChief(chief) @@ -165,7 +164,7 @@ public class OrgServiceImpl implements OrgService { @Override public int insertOrgRelateUser(OrgParamDto orgParamDto) { OrgEntity orgEntity = OrgEntity.builder().orgName(orgParamDto.getOrgName()).frozen(false).build(); - orgDbAdapter.save(orgEntity); + this.save(orgEntity); return addUserIntoOrg(orgParamDto.getUserId(), orgEntity.getId(), true); } @@ -179,7 +178,7 @@ public class OrgServiceImpl implements OrgService { public boolean existOrg(String orgName) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(OrgEntity::getOrgName, orgName); - return orgDbAdapter.exists(queryWrapper); + return this.baseMapper.exists(queryWrapper); } /** @@ -192,20 +191,10 @@ public class OrgServiceImpl implements OrgService { public boolean updateOrg(OrgEntity orgEntity) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(OrgEntity::getOrgName, orgEntity.getOrgName()).ne(IdFieldEntity::getId, orgEntity.getOrgName()); - if (orgDbAdapter.exists(queryWrapper)) { + if (this.baseMapper.exists(queryWrapper)) { throw new BusinessException(MessageUtil.get("system.org.same_org_name")); } - return orgDbAdapter.updateById(orgEntity); - } - - /** - * 通过id获取实体 - * @param id id - * @return 实体对象 - */ - @Override - public OrgEntity getById(Long id){ - return orgDbAdapter.getById(id); + return this.updateById(orgEntity); } /** @@ -214,11 +203,11 @@ public class OrgServiceImpl implements OrgService { * @return 是否正确 */ @Override - public Boolean removeById(Long id){ - orgDbAdapter.removeById(id); + public Boolean removeCascade(Long id){ + this.baseMapper.deleteById(id); LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(UserOrgEntity::getOrgId,id); - return userOrgDbAdapter.remove(queryWrapper); + return userOrgMapper.delete(queryWrapper) > 0; } } diff --git a/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/system/impl/PermissionServiceImpl.java b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/system/impl/PermissionServiceImpl.java index 27be656..d4819e2 100644 --- a/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/system/impl/PermissionServiceImpl.java +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/system/impl/PermissionServiceImpl.java @@ -12,11 +12,11 @@ package org.yzbdl.lanius.orchestrate.serv.service.system.impl; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import org.springframework.beans.factory.annotation.Autowired; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.stereotype.Service; import org.yzbdl.lanius.orchestrate.common.entity.system.PermissionEntity; import org.yzbdl.lanius.orchestrate.common.vo.system.PermissionMenuUrlVo; -import org.yzbdl.lanius.orchestrate.db.adapter.system.PermissionDbAdapter; +import org.yzbdl.lanius.orchestrate.serv.mapper.system.PermissionMapper; import org.yzbdl.lanius.orchestrate.serv.service.system.PermissionService; import java.util.List; @@ -28,10 +28,7 @@ import java.util.List; * @date 2022-04-11 09:22 */ @Service -public class PermissionServiceImpl implements PermissionService { - - @Autowired - private PermissionDbAdapter permissionDbAdapter; +public class PermissionServiceImpl extends ServiceImpl implements PermissionService { /** * 根据权用户id和组织id查询权限 @@ -40,7 +37,7 @@ public class PermissionServiceImpl implements PermissionService { */ @Override public List queryPermissionsByUserId(Long userId){ - return permissionDbAdapter.queryPermissionsByUserId(userId); + return this.baseMapper.queryPermissionsByUserId(userId); }; /** @@ -50,14 +47,14 @@ public class PermissionServiceImpl implements PermissionService { */ @Override public List listPermissionByMenuId(Long menuId){ - return permissionDbAdapter.list(new QueryWrapper() + return this.list(new QueryWrapper() .lambda().eq(PermissionEntity::getMenuId,menuId)); }; @Override public List listPermissionsWithMenuUrl(){ - return permissionDbAdapter.listPermissionsWithMenuUrl(); + return this.baseMapper.listPermissionsWithMenuUrl(); } diff --git a/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/system/impl/RoleServiceImpl.java b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/system/impl/RoleServiceImpl.java index f914f9e..c55f344 100644 --- a/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/system/impl/RoleServiceImpl.java +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/system/impl/RoleServiceImpl.java @@ -16,6 +16,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -29,8 +30,8 @@ import org.yzbdl.lanius.orchestrate.common.exception.runtime.BusinessException; import org.yzbdl.lanius.orchestrate.common.utils.MessageUtil; import org.yzbdl.lanius.orchestrate.common.utils.SpecialCharacterUtil; import org.yzbdl.lanius.orchestrate.common.vo.system.RoleVo; -import org.yzbdl.lanius.orchestrate.db.adapter.system.RoleDbAdapter; -import org.yzbdl.lanius.orchestrate.db.adapter.system.RolePermissionDbAdapter; +import org.yzbdl.lanius.orchestrate.serv.mapper.system.RoleMapper; +import org.yzbdl.lanius.orchestrate.serv.mapper.system.RolePermissionMapper; import org.yzbdl.lanius.orchestrate.serv.service.system.RoleService; import java.util.List; @@ -44,32 +45,10 @@ import java.util.stream.Collectors; */ @Service @Transactional -public class RoleServiceImpl implements RoleService { +public class RoleServiceImpl extends ServiceImpl implements RoleService { @Autowired - private RoleDbAdapter roleDbAdapter; - - @Autowired - private RolePermissionDbAdapter rolePermissionDbAdapter; - - /** - * 根据ID查询数据 - * @param id id - * @return 返回数据 - */ - @Override - public RoleEntity getById(String id) { - return roleDbAdapter.getById(id); - } - - /** - * 查询所有数据集合 - * @return 返回数据 - */ - @Override - public List list() { - return roleDbAdapter.list(); - } + RolePermissionMapper rolePermissionMapper; /** * 保存角色 @@ -79,11 +58,11 @@ public class RoleServiceImpl implements RoleService { @Override public int saveRole(RoleInsertParamDto roleInsertParamDto){ LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper().eq(RoleEntity::getRoleName,roleInsertParamDto.getRoleName()); - if(roleDbAdapter.exists(queryWrapper)){ + if(this.baseMapper.exists(queryWrapper)){ throw new BusinessException(MessageUtil.get("system.role.same_role_name")); } RoleEntity roleEntity = RoleEntity.builder().roleName(roleInsertParamDto.getRoleName()).build(); - roleDbAdapter.save(roleEntity); + this.save(roleEntity); return savePermissionIdsByRoleId(roleEntity.getId(),roleInsertParamDto.getPermissionIds()); } @@ -96,10 +75,10 @@ public class RoleServiceImpl implements RoleService { @Override public boolean updateRole(RoleEntity roleEntity){ LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper().eq(RoleEntity::getRoleName,roleEntity.getRoleName()).ne(IdFieldEntity::getId,roleEntity.getId()); - if(roleDbAdapter.exists(queryWrapper)){ + if(this.baseMapper.exists(queryWrapper)){ throw new BusinessException(MessageUtil.get("system.role.same_role_name")); } - return roleDbAdapter.updateById(roleEntity); + return this.updateById(roleEntity); } /** @@ -113,7 +92,7 @@ public class RoleServiceImpl implements RoleService { if(permissionIds==null){ return 0; } - rolePermissionDbAdapter.remove(new LambdaQueryWrapper() + rolePermissionMapper.delete(new LambdaQueryWrapper() .eq(RolePermissionEntity::getRoleId,roleId) ); if(!permissionIds.isEmpty()){ @@ -121,7 +100,7 @@ public class RoleServiceImpl implements RoleService { .permissionId(permissionId) .roleId(roleId) .build()).collect(Collectors.toList()); - return rolePermissionDbAdapter.insertBatch(rolePermissionEntityList); + return rolePermissionMapper.insertBatch(rolePermissionEntityList); } return 0; } @@ -140,13 +119,13 @@ public class RoleServiceImpl implements RoleService { RoleEntity::getRoleName, SpecialCharacterUtil.escapeStr(roleListDto.getRoleName()) ); - List roles = roleDbAdapter.queryRoleVo( + List roles = this.baseMapper.queryRoleVo( (page.getCurrent()-1)*page.getSize(), page.getSize(), queryWrapper ); page.setRecords(roles); - page.setTotal(roleDbAdapter.countRoleVo(ObjectUtil.clone(queryWrapper))); + page.setTotal(this.baseMapper.countRoleVo(ObjectUtil.clone(queryWrapper))); return page; } @@ -157,9 +136,9 @@ public class RoleServiceImpl implements RoleService { */ @Override public int deleteRoleById(Long roleId){ - rolePermissionDbAdapter.remove(new LambdaUpdateWrapper() + rolePermissionMapper.delete(new LambdaUpdateWrapper() .eq(RolePermissionEntity::getRoleId,roleId) ); - return roleDbAdapter.deleteById(roleId); + return this.baseMapper.deleteById(roleId); } } diff --git a/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/system/impl/UserAuthServiceImpl.java b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/system/impl/UserAuthServiceImpl.java index 94e314a..c2aa04b 100644 --- a/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/system/impl/UserAuthServiceImpl.java +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/system/impl/UserAuthServiceImpl.java @@ -14,6 +14,7 @@ package org.yzbdl.lanius.orchestrate.serv.service.system.impl; import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UsernameNotFoundException; @@ -31,9 +32,9 @@ import org.yzbdl.lanius.orchestrate.common.jwt.TokenDto; import org.yzbdl.lanius.orchestrate.common.utils.BcryptEncoderUtil; import org.yzbdl.lanius.orchestrate.common.utils.MessageUtil; import org.yzbdl.lanius.orchestrate.common.vo.system.UserTokenVo; -import org.yzbdl.lanius.orchestrate.db.adapter.system.OrgDbAdapter; -import org.yzbdl.lanius.orchestrate.db.adapter.system.UserDbAdapter; -import org.yzbdl.lanius.orchestrate.db.adapter.system.UserOrgDbAdapter; +import org.yzbdl.lanius.orchestrate.serv.mapper.system.OrgMapper; +import org.yzbdl.lanius.orchestrate.serv.mapper.system.UserMapper; +import org.yzbdl.lanius.orchestrate.serv.mapper.system.UserOrgMapper; import org.yzbdl.lanius.orchestrate.serv.service.system.UserAuthService; import org.yzbdl.lanius.orchestrate.serv.utils.CurrentUserUtil; @@ -49,16 +50,13 @@ import java.util.Optional; */ @Service @Transactional -public class UserAuthServiceImpl implements UserAuthService { +public class UserAuthServiceImpl extends ServiceImpl implements UserAuthService { @Autowired - private UserDbAdapter userDbAdapter; + OrgMapper orgMapper; @Autowired - private OrgDbAdapter orgDbAdapter; - - @Autowired - private UserOrgDbAdapter userOrgDbAdapter; + UserOrgMapper userOrgMapper; /** * 根据用户名获取用户 @@ -94,7 +92,7 @@ public class UserAuthServiceImpl implements UserAuthService { */ @Override public UserEntity getUserByUserName(String userName){ - return userDbAdapter.getOne(new LambdaQueryWrapper() + return this.getOne(new LambdaQueryWrapper() .eq(UserEntity::getUsername,userName) .eq(UserEntity::getDeleted,false) ); @@ -112,7 +110,7 @@ public class UserAuthServiceImpl implements UserAuthService { if(!userEntity.isEnabled()){ throw new NoPermissionException(MessageUtil.get("system.user.disable")); } - List orgEntities= orgDbAdapter.queryOrgByUserId(userEntity.getId()); + List orgEntities= orgMapper.queryOrgByUserId(userEntity.getId()); if(orgEntities.size()>0){ Long orgId = orgEntities.get(0).getId(); return getUserTokenMap(userEntity,orgId); @@ -144,7 +142,7 @@ public class UserAuthServiceImpl implements UserAuthService { * @return 布尔值 */ private boolean isOrgChief(UserEntity userEntity,Long orgId){ - UserOrgEntity userOrgEntity= userOrgDbAdapter.getOne(new LambdaQueryWrapper() + UserOrgEntity userOrgEntity= userOrgMapper.selectOne(new LambdaQueryWrapper() .eq(UserOrgEntity::getUserId,userEntity.getId()) .eq(UserOrgEntity::getOrgId,orgId) ); @@ -177,7 +175,7 @@ public class UserAuthServiceImpl implements UserAuthService { */ @Override public UserTokenVo refreshTokenByOrgId(Long orgId){ - UserEntity userEntity = userDbAdapter.getById(CurrentUserUtil.getCurrentUserId()); + UserEntity userEntity = this.getById(CurrentUserUtil.getCurrentUserId()); return getUserTokenMap(userEntity,orgId); } @@ -190,12 +188,12 @@ public class UserAuthServiceImpl implements UserAuthService { */ @Override public Boolean updatePassword(Long userId, String newPassword, String oldPassword){ - UserEntity userEntity = userDbAdapter.getById(userId); + UserEntity userEntity = this.getById(userId); BCryptPasswordEncoder encoder = new BCryptPasswordEncoder(); if(!encoder.matches(oldPassword, userEntity.getPassword())){ throw new NoPermissionException(MessageUtil.get("system.user.wrong_old_password")); } - return userDbAdapter.update(new LambdaUpdateWrapper() + return this.update(new LambdaUpdateWrapper() .eq(UserEntity::getId,userId).set(UserEntity::getPassword, BcryptEncoderUtil.encode(newPassword)) ); } @@ -205,7 +203,7 @@ public class UserAuthServiceImpl implements UserAuthService { try{ Map claims = JwtHelper.getNormalClaimMapFromToken(rfToken); PayLoadClaimDto payLoadClaimDto = JSONUtil.toBean(JSONUtil.toJsonStr(claims),PayLoadClaimDto.class); - return getUserTokenMap(userDbAdapter.getById(payLoadClaimDto.getUserId()),payLoadClaimDto.getOrgId()); + return getUserTokenMap(this.getById(payLoadClaimDto.getUserId()),payLoadClaimDto.getOrgId()); }catch (Exception e){ throw new BusinessException(MessageUtil.get("system.user.refresh_token_fail")); } diff --git a/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/system/impl/UserLogServiceImpl.java b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/system/impl/UserLogServiceImpl.java index 59ac15f..bc8f71b 100644 --- a/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/system/impl/UserLogServiceImpl.java +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/system/impl/UserLogServiceImpl.java @@ -14,15 +14,15 @@ package org.yzbdl.lanius.orchestrate.serv.service.system.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.yzbdl.lanius.orchestrate.common.constant.UserOprEventConstant; import org.yzbdl.lanius.orchestrate.common.dto.system.UserLogQueryDto; import org.yzbdl.lanius.orchestrate.common.entity.system.UserLogEntity; import org.yzbdl.lanius.orchestrate.common.utils.SpecialCharacterUtil; import org.yzbdl.lanius.orchestrate.common.vo.system.UserLogVo; -import org.yzbdl.lanius.orchestrate.db.adapter.system.UserLogDbAdapter; +import org.yzbdl.lanius.orchestrate.serv.mapper.system.UserLogMapper; import org.yzbdl.lanius.orchestrate.serv.service.system.UserLogService; import java.lang.reflect.Field; @@ -36,21 +36,7 @@ import java.util.List; * @date 2022-04-13 15:33 */ @Service -public class UserLogServiceImpl implements UserLogService { - - @Autowired - private UserLogDbAdapter userLogDbAdapter; - - - /** - * 保存用户操作日志 - * @param userLogEntity 实体 - * @return 返回数据 - */ - @Override - public boolean save(UserLogEntity userLogEntity) { - return userLogDbAdapter.save(userLogEntity); - } +public class UserLogServiceImpl extends ServiceImpl implements UserLogService { /** * 获取日志事件 @@ -84,7 +70,7 @@ public class UserLogServiceImpl implements UserLogService { .gt(userLogQueryDto.getBeginTime()!=null,UserLogEntity::getCreateTime,userLogQueryDto.getBeginTime()) .lt(userLogQueryDto.getEndTime()!=null,UserLogEntity::getCreateTime,userLogQueryDto.getEndTime()); - return userLogDbAdapter.queryUserLogByNickName( + return this.baseMapper.queryUserLogByNickName( SpecialCharacterUtil.escapeStr(userLogQueryDto.getNickName()), queryWrapper, page diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/system/impl/MenuDbAdapterImpl.java b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/system/impl/UserOrgServiceImpl.java similarity index 61% rename from lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/system/impl/MenuDbAdapterImpl.java rename to lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/system/impl/UserOrgServiceImpl.java index 136ee66..1a1bed6 100644 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/java/org/yzbdl/lanius/orchestrate/adapter/dm/system/impl/MenuDbAdapterImpl.java +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/system/impl/UserOrgServiceImpl.java @@ -9,21 +9,22 @@ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. * See the Mulan PSL v2 for more details. */ -package org.yzbdl.lanius.orchestrate.adapter.dm.system.impl; +package org.yzbdl.lanius.orchestrate.serv.service.system.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.stereotype.Service; -import org.yzbdl.lanius.orchestrate.adapter.dm.system.mapper.MenuMapper; -import org.yzbdl.lanius.orchestrate.common.entity.system.MenuEntity; -import org.yzbdl.lanius.orchestrate.db.adapter.system.MenuDbAdapter; +import org.yzbdl.lanius.orchestrate.common.entity.system.UserOrgEntity; +import org.yzbdl.lanius.orchestrate.serv.mapper.system.UserOrgMapper; +import org.yzbdl.lanius.orchestrate.serv.service.system.UserOrgService; /** - * 菜单数据适配接口实现类 + * 用户组织映射 * * @author hujian@yzbdl.ac.cn - * @date 2022-08-17 10:41 + * @date 2022-09-13 14:04 */ @Service -public class MenuDbAdapterImpl extends ServiceImpl implements MenuDbAdapter { +public class UserOrgServiceImpl extends ServiceImpl implements UserOrgService { + } diff --git a/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/system/impl/UserServiceImpl.java b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/system/impl/UserServiceImpl.java index 96feb98..dbfb75c 100644 --- a/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/system/impl/UserServiceImpl.java +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/system/impl/UserServiceImpl.java @@ -16,6 +16,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.RandomStringUtils; import org.apache.commons.lang3.StringUtils; @@ -34,9 +35,11 @@ import org.yzbdl.lanius.orchestrate.common.utils.SpecialCharacterUtil; import org.yzbdl.lanius.orchestrate.common.vo.system.AccountVO; import org.yzbdl.lanius.orchestrate.common.vo.system.NickNameVo; import org.yzbdl.lanius.orchestrate.common.vo.system.UserVo; -import org.yzbdl.lanius.orchestrate.db.adapter.system.UserDbAdapter; -import org.yzbdl.lanius.orchestrate.db.adapter.system.UserOrgDbAdapter; -import org.yzbdl.lanius.orchestrate.db.adapter.system.UserRoleDbAdapter; +import org.yzbdl.lanius.orchestrate.serv.mapper.system.OrgMapper; +import org.yzbdl.lanius.orchestrate.serv.mapper.system.UserMapper; +import org.yzbdl.lanius.orchestrate.serv.mapper.system.UserOrgMapper; +import org.yzbdl.lanius.orchestrate.serv.mapper.system.UserRoleMapper; +import org.yzbdl.lanius.orchestrate.serv.service.system.UserOrgService; import org.yzbdl.lanius.orchestrate.serv.service.system.UserService; import org.yzbdl.lanius.orchestrate.serv.utils.CurrentUserUtil; @@ -45,8 +48,6 @@ import java.util.List; import java.util.Optional; import java.util.stream.Collectors; -import static com.baomidou.mybatisplus.core.toolkit.Wrappers.update; - /** * 用户服务实现 * @@ -56,20 +57,20 @@ import static com.baomidou.mybatisplus.core.toolkit.Wrappers.update; @Slf4j @Service @Transactional -public class UserServiceImpl implements UserService { +public class UserServiceImpl extends ServiceImpl implements UserService { + @Autowired - private UserDbAdapter userDbAdapter; - @Autowired - private UserOrgDbAdapter userOrgDbAdapter; + UserOrgMapper userOrgMapper; + @Autowired - private UserRoleDbAdapter userRoleDbAdapter; + UserOrgService orgService; + @Autowired + UserRoleMapper userRoleMapper; - @Override - public UserEntity getById(Long id){ - return userDbAdapter.getById(id); - } + @Autowired + OrgMapper orgMapper; /** * 用户列表 @@ -82,14 +83,14 @@ public class UserServiceImpl implements UserService { LambdaQueryWrapper queryWrapper = new QueryWrapper().lambda() .like(StringUtils.isNotEmpty(userListDto.getNickName()), UserEntity::getNickName, SpecialCharacterUtil.escapeStr(userListDto.getNickName())) .like(StringUtils.isNotEmpty(userListDto.getUserName()), UserEntity::getUsername, SpecialCharacterUtil.escapeStr(userListDto.getUserName())); - List userVos = userDbAdapter.queryUserVoByOrgId( + List userVos = this.baseMapper.queryUserVoByOrgId( CurrentUserUtil.getCurrentUserOrgId(), (page.getCurrent() - 1) * page.getSize(), page.getSize(), queryWrapper); - page.setTotal(userDbAdapter.count(queryWrapper)); + page.setTotal(this.baseMapper.selectCount(queryWrapper)); page.setRecords(userVos); - page.setTotal(userDbAdapter.countUserVoByOrgId(CurrentUserUtil.getCurrentUserOrgId(), queryWrapper)); + page.setTotal(this.baseMapper.countUserVoByOrgId(CurrentUserUtil.getCurrentUserOrgId(), queryWrapper)); return page; } @@ -109,8 +110,8 @@ public class UserServiceImpl implements UserService { userListDto.getNickName()) .like(StringUtils.isNotEmpty(userListDto.getUserName()), UserEntity::getUsername, userListDto.getUserName()); - List orgUsers = userDbAdapter.queryAccountVO((page.getCurrent() - 1) * page.getSize(), page.getSize(), queryWrapper); - page.setTotal(userDbAdapter.count(ObjectUtil.clone(queryWrapper))); + List orgUsers = this.baseMapper.queryAccountVO((page.getCurrent() - 1) * page.getSize(), page.getSize(), queryWrapper); + page.setTotal(this.baseMapper.selectCount(ObjectUtil.clone(queryWrapper))); page.setRecords(orgUsers); return page; } @@ -122,7 +123,7 @@ public class UserServiceImpl implements UserService { */ @Override public boolean isExistUserByOrgId(Long orgId){ - return Optional.ofNullable(userDbAdapter.getFirstUserIdByOrgId(orgId)).isPresent(); + return Optional.ofNullable(this.baseMapper.getFirstUserIdByOrgId(orgId)).isPresent(); } /** @@ -136,7 +137,7 @@ public class UserServiceImpl implements UserService { roleIds = null==roleIds?new ArrayList<>():roleIds; QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.lambda().eq(UserRoleEntity::getUserId,userId); - userRoleDbAdapter.remove(queryWrapper); + userRoleMapper.delete(queryWrapper); if(roleIds.size()==0){ return 0; } @@ -147,7 +148,7 @@ public class UserServiceImpl implements UserService { .roleId(m) .build() ).collect(Collectors.toList()); - return userRoleDbAdapter.insertBatch(userRoleEntities); + return userRoleMapper.insertBatch(userRoleEntities); } /** @@ -168,7 +169,7 @@ public class UserServiceImpl implements UserService { .status(UserStatusEnum.NORMAL.getCode()) .deleted(false) .build(); - userDbAdapter.save(userEntity); + this.save(userEntity); return userEntity; } @@ -202,7 +203,7 @@ public class UserServiceImpl implements UserService { updateWrapper .set(userOrgUpdateParamDTO.getNickName() != null, UserEntity::getNickName, userOrgUpdateParamDTO.getNickName()) .eq(IdFieldEntity::getId, id); - userDbAdapter.update(updateWrapper); + this.update(updateWrapper); if (userOrgUpdateParamDTO.getUserOrgRelations() != null) { saveUserOrg(userOrgUpdateParamDTO.getUserOrgRelations(), id); } @@ -212,10 +213,10 @@ public class UserServiceImpl implements UserService { private void saveUserOrg(List userOrgDtoList, Long userId) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(UserOrgEntity::getUserId, userId); - userOrgDbAdapter.remove(queryWrapper); + userOrgMapper.delete(queryWrapper); if (!userOrgDtoList.isEmpty()) { List userOrgEntities = userOrgDtoList.stream().map(userOrgDTO -> userOrgDTO.toUserOrgEntity(userId)).collect(Collectors.toList()); - userOrgDbAdapter.saveBatch(userOrgEntities); + orgService.saveBatch(userOrgEntities); } } @@ -225,7 +226,7 @@ public class UserServiceImpl implements UserService { * @return 用户实体 */ private UserEntity getUserByUserName(String userName) { - return userDbAdapter.getOne( + return this.getOne( new LambdaQueryWrapper() .eq(UserEntity::getUsername, userName) .eq(UserEntity::getDeleted,false) @@ -241,7 +242,7 @@ public class UserServiceImpl implements UserService { @Override public String resetPassword(Long userId){ String newPassword = RandomStringUtils.randomAlphanumeric(6)+"_1Az"; - userDbAdapter.update(new LambdaUpdateWrapper() + this.update(new LambdaUpdateWrapper() .eq(UserEntity::getId,userId) .set(UserEntity::getPassword, BcryptEncoderUtil.encode(newPassword)) ); @@ -256,7 +257,7 @@ public class UserServiceImpl implements UserService { */ @Override public Boolean setUserState(int status, Long userId){ - return userDbAdapter.update( + return this.update( new LambdaUpdateWrapper() .eq(UserEntity::getId,userId) .set(UserEntity::getStatus,status) @@ -271,7 +272,7 @@ public class UserServiceImpl implements UserService { @Override public List listNickNamesByIds(List ids){ return ids!=null&&!ids.isEmpty()? - userDbAdapter.list( + this.list( new LambdaQueryWrapper() .in(IdFieldEntity::getId,ids) .select(IdFieldEntity::getId,UserEntity::getNickName) @@ -290,7 +291,7 @@ public class UserServiceImpl implements UserService { public boolean deleteUserById(Long id) { LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); updateWrapper.eq(IdFieldEntity::getId, id).set(UserEntity::getDeleted, true); - return userDbAdapter.update(updateWrapper); + return this.update(updateWrapper); } /** @@ -300,7 +301,7 @@ public class UserServiceImpl implements UserService { */ @Override public List listUserByUserName(String userName){ - return userDbAdapter.list(new LambdaQueryWrapper().like(UserEntity::getUsername,userName)); + return this.list(new LambdaQueryWrapper().like(UserEntity::getUsername,userName)); } @@ -311,7 +312,7 @@ public class UserServiceImpl implements UserService { */ @Override public boolean isExistUserById(Long userId){ - return userDbAdapter.getById(userId)!=null; + return this.getById(userId)!=null; } /** @@ -324,12 +325,12 @@ public class UserServiceImpl implements UserService { public boolean removeFromOrg(Long id, Long orgId){ LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(UserOrgEntity::getUserId,id).eq(UserOrgEntity::getOrgId,orgId); - return userOrgDbAdapter.remove(queryWrapper); + return userOrgMapper.delete(queryWrapper) > 0; } @Override public List listUsersNotInOrg(Long orgId, String likeUserName){ - return userDbAdapter.listUsersNotInOrg(orgId,likeUserName); + return this.baseMapper.listUsersNotInOrg(orgId,likeUserName); } @@ -338,7 +339,7 @@ public class UserServiceImpl implements UserService { if(null!=memberInsertParamDTO.getUserId()){ LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(UserOrgEntity::getUserId,memberInsertParamDTO.getUserId()).eq(UserOrgEntity::getOrgId,CurrentUserUtil.getCurrentUserOrgId()); - if(userOrgDbAdapter.exists(queryWrapper)){ + if(userOrgMapper.exists(queryWrapper)){ log.warn("用户已存在该组织关联,可能是因为过滤非组织成员失败获取前端参数问题,该问题不影响当前系统,建议检查!"); }else{ UserOrgEntity userOrgEntity = UserOrgEntity.builder() @@ -346,7 +347,7 @@ public class UserServiceImpl implements UserService { .userId(memberInsertParamDTO.getUserId()) .orgChief(false) .build(); - userOrgDbAdapter.save(userOrgEntity); + userOrgMapper.insert(userOrgEntity); } saveUserRoles(memberInsertParamDTO.getRoleIds(),memberInsertParamDTO.getUserId()); } diff --git a/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/task/TaskInstanceService.java b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/task/TaskInstanceService.java index 386d088..cd852c5 100644 --- a/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/task/TaskInstanceService.java +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/task/TaskInstanceService.java @@ -13,6 +13,7 @@ package org.yzbdl.lanius.orchestrate.serv.service.task; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; import org.yzbdl.lanius.orchestrate.common.dto.task.IncrLogQueryDTO; import org.yzbdl.lanius.orchestrate.common.dto.task.TaskInstanceQueryDTO; import org.yzbdl.lanius.orchestrate.common.dto.task.TaskInstanceResourceDTO; @@ -30,7 +31,7 @@ import java.util.List; * @author jinchunzhao@yzbdl.ac.cn * @date 2022-04-11 9:03 */ -public interface TaskInstanceService { +public interface TaskInstanceService extends IService { /** * 分页查询任务实例列表 diff --git a/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/task/TaskPlanGroupService.java b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/task/TaskPlanGroupService.java index 67cc0a1..379cb88 100644 --- a/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/task/TaskPlanGroupService.java +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/task/TaskPlanGroupService.java @@ -11,6 +11,7 @@ */ package org.yzbdl.lanius.orchestrate.serv.service.task; +import com.baomidou.mybatisplus.extension.service.IService; import org.yzbdl.lanius.orchestrate.common.entity.task.TaskPlanGroup; import org.yzbdl.lanius.orchestrate.common.vo.task.TaskPlanGroupVO; @@ -22,7 +23,7 @@ import java.util.List; * @author jinchunzhao@yzbdl.ac.cn * @date 2022-04-07 16:01 */ -public interface TaskPlanGroupService { +public interface TaskPlanGroupService extends IService { /** * 新增任务编排分组 diff --git a/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/task/TaskPlanService.java b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/task/TaskPlanService.java index 2eb0949..6273e58 100644 --- a/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/task/TaskPlanService.java +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/task/TaskPlanService.java @@ -13,6 +13,7 @@ package org.yzbdl.lanius.orchestrate.serv.service.task; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; import org.yzbdl.lanius.orchestrate.common.dto.task.TaskPlanQueryDTO; import org.yzbdl.lanius.orchestrate.common.dto.task.TaskPlanResourceDTO; import org.yzbdl.lanius.orchestrate.common.entity.resource.ServerProgramEntity; @@ -31,7 +32,7 @@ import java.util.List; * @version 1.0 * @date 2022-04-07 10:00 */ -public interface TaskPlanService { +public interface TaskPlanService extends IService { /** * 分页查询任务编排列表 diff --git a/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/task/TaskStepLogService.java b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/task/TaskStepLogService.java index 638cbb7..823f5ac 100644 --- a/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/task/TaskStepLogService.java +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/task/TaskStepLogService.java @@ -11,6 +11,8 @@ */ package org.yzbdl.lanius.orchestrate.serv.service.task; +import com.baomidou.mybatisplus.extension.service.IService; +import org.yzbdl.lanius.orchestrate.common.entity.task.TaskStepLog; import org.yzbdl.lanius.orchestrate.common.vo.task.TaskStepLogVO; import java.util.List; @@ -21,7 +23,7 @@ import java.util.List; * @author jinchunzhao@yzbdl.ac.cn * @date 2022-04-19 14:16 */ -public interface TaskStepLogService { +public interface TaskStepLogService extends IService { /** diff --git a/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/task/impl/TaskInstanceServiceImpl.java b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/task/impl/TaskInstanceServiceImpl.java index d6d8f97..413a235 100644 --- a/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/task/impl/TaskInstanceServiceImpl.java +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/task/impl/TaskInstanceServiceImpl.java @@ -14,6 +14,7 @@ package org.yzbdl.lanius.orchestrate.serv.service.task.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -31,9 +32,9 @@ import org.yzbdl.lanius.orchestrate.common.utils.SpecialCharacterUtil; import org.yzbdl.lanius.orchestrate.common.vo.task.IncrLogVO; import org.yzbdl.lanius.orchestrate.common.vo.task.ScheduleTaskInstanceVO; import org.yzbdl.lanius.orchestrate.common.vo.task.TaskInstanceVO; -import org.yzbdl.lanius.orchestrate.db.adapter.resource.ServerProgramDbAdapter; -import org.yzbdl.lanius.orchestrate.db.adapter.task.TaskInstanceDbAdapter; -import org.yzbdl.lanius.orchestrate.db.adapter.task.TaskPlanDbAdapter; +import org.yzbdl.lanius.orchestrate.serv.mapper.resource.ServerProgramMapper; +import org.yzbdl.lanius.orchestrate.serv.mapper.task.TaskInstanceMapper; +import org.yzbdl.lanius.orchestrate.serv.mapper.task.TaskPlanMapper; import org.yzbdl.lanius.orchestrate.serv.quartz.handler.category.ProgramCategoryExecutorFactory; import org.yzbdl.lanius.orchestrate.serv.quartz.handler.category.ProgramCategoryExecutorInvokerHandler; import org.yzbdl.lanius.orchestrate.serv.service.task.TaskInstanceService; @@ -62,16 +63,14 @@ import java.util.stream.Collectors; */ @Slf4j @Service -public class TaskInstanceServiceImpl implements TaskInstanceService { +public class TaskInstanceServiceImpl extends ServiceImpl + implements TaskInstanceService { @Autowired - private ServerProgramDbAdapter serverProgramDbAdapter; + private ServerProgramMapper serverProgramMapper; @Autowired - private TaskPlanDbAdapter taskPlanDbAdapter; - - @Autowired - private TaskInstanceDbAdapter taskInstanceDbAdapter; + private TaskPlanMapper taskPlanMapper; @Autowired private ThreadPoolExecutor executor; @@ -81,7 +80,7 @@ public class TaskInstanceServiceImpl implements TaskInstanceService { instanceQueryDTO.setKeyword(SpecialCharacterUtil.escapeStr(instanceQueryDTO.getKeyword())); long startIndex = page.getCurrent() * page.getSize() - page.getSize(); long pageSize = page.getSize(); - IPage iPage = taskInstanceDbAdapter.queryPage(page, instanceQueryDTO, startIndex, pageSize); + IPage iPage = this.baseMapper.queryPage(page, instanceQueryDTO, startIndex, pageSize); List records = iPage.getRecords(); if (CollectionUtils.isEmpty(records)) { return iPage; @@ -99,14 +98,14 @@ public class TaskInstanceServiceImpl implements TaskInstanceService { public Boolean checkInstanceForRun(Long taskPlanId) { List runStateList = CommonUtil.getRunTaskInstanceStatus(); - TaskInstance instance = taskInstanceDbAdapter.getOneInstanceForRunIgnoreTenantId(runStateList, taskPlanId); + TaskInstance instance = this.baseMapper.getOneInstanceForRunIgnoreTenantId(runStateList, taskPlanId); return Objects.nonNull(instance); } @Override public List getSchedulerViewStatistics() { - List schedulerViewStatistics = taskInstanceDbAdapter.getSchedulerViewStatistics(); + List schedulerViewStatistics = this.baseMapper.getSchedulerViewStatistics(); // 获取系统数据库中所有的状态code信息 List status = schedulerViewStatistics.stream().map(ScheduleTaskInstanceVO::getStatus).distinct() .collect(Collectors.toList()); @@ -133,18 +132,18 @@ public class TaskInstanceServiceImpl implements TaskInstanceService { @Override public TaskInstance getByIdIgnoreTenantId(Long taskInstanceId) { - return taskInstanceDbAdapter.getByIdIgnoreTenantId(taskInstanceId); + return this.baseMapper.getByIdIgnoreTenantId(taskInstanceId); } @Override public TaskInstanceResourceDTO getTaskInstanceResourceIgnoreTenantId(Long taskInstanceId) { - return taskInstanceDbAdapter.getTaskInstanceResourceIgnoreTenantId(taskInstanceId); + return this.baseMapper.getTaskInstanceResourceIgnoreTenantId(taskInstanceId); } @Override public String getTransImageById(Long taskInstanceId, Long serverProgramId) { ServerProgramInfoDTO serverProgramEntity = - serverProgramDbAdapter.getServerProgramInfoByIdIgnoreTenantId(serverProgramId); + serverProgramMapper.getServerProgramInfoByIdIgnoreTenantId(serverProgramId); ProgramCategoryExecutorInvokerHandler handler = ProgramCategoryExecutorFactory.getHandler(serverProgramEntity.getCategory().toString()); if (Objects.isNull(handler)) { @@ -167,7 +166,7 @@ public class TaskInstanceServiceImpl implements TaskInstanceService { // 页码(文件的指针位置) Long seek = (page <= 0) ? 0 : page; - TaskPlan taskPlan = taskPlanDbAdapter.getById(taskPlanId); + TaskPlan taskPlan = taskPlanMapper.selectById(taskPlanId); Long orgId = taskPlan.getOrgId(); Long groupId = taskPlan.getGroupId(); String logAbsolutePath = TaskInstanceLogUtil.getLogAbsolutePath(orgId, groupId, taskPlanId, taskInstanceId); @@ -183,7 +182,7 @@ public class TaskInstanceServiceImpl implements TaskInstanceService { @Override public int updateByIdIgnoreTenantId(TaskInstance taskInstance) { - return taskInstanceDbAdapter.updateByIdIgnoreTenantId(taskInstance); + return this.baseMapper.updateByIdIgnoreTenantId(taskInstance); } @Override @@ -191,7 +190,7 @@ public class TaskInstanceServiceImpl implements TaskInstanceService { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(TaskInstance::getTaskPlanId, taskPlanId); - taskInstanceDbAdapter.remove(queryWrapper); + this.remove(queryWrapper); // 异步执行删除文件操作 CompletableFuture.runAsync(() -> { diff --git a/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/task/impl/TaskPlanGroupServiceImpl.java b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/task/impl/TaskPlanGroupServiceImpl.java index 59bb6c2..86dcae6 100644 --- a/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/task/impl/TaskPlanGroupServiceImpl.java +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/task/impl/TaskPlanGroupServiceImpl.java @@ -14,6 +14,7 @@ package org.yzbdl.lanius.orchestrate.serv.service.task.impl; import cn.hutool.json.JSONArray; import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -24,8 +25,8 @@ import org.yzbdl.lanius.orchestrate.common.entity.task.TaskPlanGroup; import org.yzbdl.lanius.orchestrate.common.exception.runtime.BusinessException; import org.yzbdl.lanius.orchestrate.common.utils.MessageUtil; import org.yzbdl.lanius.orchestrate.common.vo.task.TaskPlanGroupVO; -import org.yzbdl.lanius.orchestrate.db.adapter.task.TaskPlanDbAdapter; -import org.yzbdl.lanius.orchestrate.db.adapter.task.TaskPlanGroupDbAdapter; +import org.yzbdl.lanius.orchestrate.serv.mapper.task.TaskPlanGroupMapper; +import org.yzbdl.lanius.orchestrate.serv.mapper.task.TaskPlanMapper; import org.yzbdl.lanius.orchestrate.serv.service.task.TaskPlanGroupService; import java.util.List; @@ -40,13 +41,11 @@ import java.util.stream.Collectors; */ @Service @Slf4j -public class TaskPlanGroupServiceImpl implements TaskPlanGroupService { +public class TaskPlanGroupServiceImpl extends ServiceImpl + implements TaskPlanGroupService { @Autowired - private TaskPlanGroupDbAdapter taskPlanGroupDbAdapter; - - @Autowired - private TaskPlanDbAdapter taskPlanDbAdapter; + private TaskPlanMapper taskPlanMapper; @Override public Boolean saveEntity(TaskPlanGroup taskPlanGroup) { @@ -55,20 +54,20 @@ public class TaskPlanGroupServiceImpl implements TaskPlanGroupService { // 校验待修改的分组名称在库中是否存在重复的 LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(TaskPlanGroup::getGroupName, taskPlanGroup.getGroupName()); - TaskPlanGroup planGroup = taskPlanGroupDbAdapter.getOne(queryWrapper); + TaskPlanGroup planGroup = this.getOne(queryWrapper); if (Objects.nonNull(planGroup)) { throw new BusinessException(MessageUtil.get("task.group.name_exist")); } Long pid = taskPlanGroup.getPid(); if (Objects.nonNull(pid)){ - List parents = taskPlanGroupDbAdapter.getParentsById(pid); + List parents = this.baseMapper.getParentsById(pid); if (CollectionUtils.isNotEmpty(parents) && parents.size() > 4){ throw new BusinessException(MessageUtil.get("task.group.level_max_num")); } } - boolean save = taskPlanGroupDbAdapter.save(taskPlanGroup); + boolean save = this.save(taskPlanGroup); if (save) { return save; } @@ -85,11 +84,11 @@ public class TaskPlanGroupServiceImpl implements TaskPlanGroupService { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(TaskPlanGroup::getGroupName, taskPlanGroup.getGroupName()); queryWrapper.ne(TaskPlanGroup::getId, taskPlanGroup.getId()); - TaskPlanGroup planGroup = taskPlanGroupDbAdapter.getOne(queryWrapper); + TaskPlanGroup planGroup = this.getOne(queryWrapper); if (Objects.nonNull(planGroup)) { throw new BusinessException(MessageUtil.get("task.group.name_exist")); } - boolean update = taskPlanGroupDbAdapter.updateById(taskPlanGroup); + boolean update = this.updateById(taskPlanGroup); if (update) { return update; } @@ -116,11 +115,11 @@ public class TaskPlanGroupServiceImpl implements TaskPlanGroupService { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.in(TaskPlanGroup::getGroupName, groupNames); queryWrapper.notIn(TaskPlanGroup::getId, groupIds); - List planGroupList = taskPlanGroupDbAdapter.list(queryWrapper); + List planGroupList = this.list(queryWrapper); if (CollectionUtils.isNotEmpty(planGroupList)) { throw new BusinessException(MessageUtil.get("task.group.name_exist")); } - boolean batchUpdate = taskPlanGroupDbAdapter.updateBatchById(groupList, groupList.size()); + boolean batchUpdate = this.updateBatchById(groupList, groupList.size()); if (batchUpdate) { return batchUpdate; } @@ -134,7 +133,7 @@ public class TaskPlanGroupServiceImpl implements TaskPlanGroupService { LambdaQueryWrapper taskPlanGroupQueryWrapper = new LambdaQueryWrapper<>(); taskPlanGroupQueryWrapper.eq(TaskPlanGroup::getPid, id); taskPlanGroupQueryWrapper.last("LIMIT 1"); - TaskPlanGroup planGroup = taskPlanGroupDbAdapter.getOne(taskPlanGroupQueryWrapper); + TaskPlanGroup planGroup = this.getOne(taskPlanGroupQueryWrapper); if (Objects.nonNull(planGroup)) { throw new BusinessException(MessageUtil.get("task.group.delete_child_exist")); } @@ -143,12 +142,12 @@ public class TaskPlanGroupServiceImpl implements TaskPlanGroupService { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(TaskPlan::getGroupId, id); queryWrapper.last("LIMIT 1"); - TaskPlan taskPlan = taskPlanDbAdapter.getOne(queryWrapper); + TaskPlan taskPlan = taskPlanMapper.selectOne(queryWrapper); if (Objects.nonNull(taskPlan)) { throw new BusinessException(MessageUtil.get("task.group.delete_task_exist")); } - boolean remove = taskPlanGroupDbAdapter.removeById(id); + boolean remove = this.removeById(id); if (remove) { return remove; } @@ -157,7 +156,7 @@ public class TaskPlanGroupServiceImpl implements TaskPlanGroupService { @Override public List treeList() { - List list = taskPlanGroupDbAdapter.treeList(); + List list = this.baseMapper.treeList(); // 增加了根节点,需要特殊处理 // 计算所有分组的资源总数 @@ -183,7 +182,7 @@ public class TaskPlanGroupServiceImpl implements TaskPlanGroupService { @Override public List queryTaskGroupTreeForTaskPlan() { - List list = taskPlanGroupDbAdapter.list(); + List list = this.list(); JSONArray jsonArray = JSONUtil.parseArray(JSONUtil.toJsonStr(list)); List groupVOList = JSONUtil.toList(jsonArray,TaskPlanGroupVO.class); @@ -200,7 +199,7 @@ public class TaskPlanGroupServiceImpl implements TaskPlanGroupService { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(TaskPlanGroup::getGroupName, taskPlanGroup.getGroupName()); queryWrapper.ne(TaskPlanGroup::getId, taskPlanGroup.getId()); - TaskPlanGroup planGroup = taskPlanGroupDbAdapter.getOne(queryWrapper); + TaskPlanGroup planGroup = this.getOne(queryWrapper); if (Objects.isNull(planGroup)) { return Boolean.FALSE; } else { diff --git a/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/task/impl/TaskPlanServiceImpl.java b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/task/impl/TaskPlanServiceImpl.java index dc7a5d3..6a3ffc4 100644 --- a/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/task/impl/TaskPlanServiceImpl.java +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/task/impl/TaskPlanServiceImpl.java @@ -17,6 +17,7 @@ import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.google.common.collect.Maps; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; @@ -42,14 +43,14 @@ import org.yzbdl.lanius.orchestrate.common.vo.task.ScheduleTaskPlanVO; import org.yzbdl.lanius.orchestrate.common.vo.task.TaskPlanVO; import org.yzbdl.lanius.orchestrate.common.vo.task.schedule.AddTaskPlanJobVO; import org.yzbdl.lanius.orchestrate.common.vo.task.schedule.UpdateTaskPlanJobStatusVO; -import org.yzbdl.lanius.orchestrate.db.adapter.resource.ServerProgramDbAdapter; -import org.yzbdl.lanius.orchestrate.db.adapter.task.TaskPlanDbAdapter; -import org.yzbdl.lanius.orchestrate.db.adapter.task.TaskPlanGroupDbAdapter; import org.yzbdl.lanius.orchestrate.serv.constant.TaskJsonConfigConstant; import org.yzbdl.lanius.orchestrate.serv.constant.TaskPlanSchedulerConstant; +import org.yzbdl.lanius.orchestrate.serv.mapper.task.TaskPlanMapper; import org.yzbdl.lanius.orchestrate.serv.quartz.config.QuartzJobManager; import org.yzbdl.lanius.orchestrate.serv.quartz.taskplan.TaskPlanQuartzTaskJob; +import org.yzbdl.lanius.orchestrate.serv.service.resource.ServerProgramService; import org.yzbdl.lanius.orchestrate.serv.service.task.TaskInstanceService; +import org.yzbdl.lanius.orchestrate.serv.service.task.TaskPlanGroupService; import org.yzbdl.lanius.orchestrate.serv.service.task.TaskPlanService; import org.yzbdl.lanius.orchestrate.serv.utils.CommonUtil; import org.yzbdl.lanius.orchestrate.serv.utils.TaskScheduleJobUtil; @@ -70,7 +71,7 @@ import java.util.stream.Collectors; */ @Service @Slf4j -public class TaskPlanServiceImpl implements TaskPlanService { +public class TaskPlanServiceImpl extends ServiceImpl implements TaskPlanService { @Autowired private TaskInstanceService taskInstanceService; @@ -79,18 +80,15 @@ public class TaskPlanServiceImpl implements TaskPlanService { private QuartzJobManager quartzJobManager; @Autowired - private ServerProgramDbAdapter serverProgramDbAdapter; + private ServerProgramService serverProgramService; @Autowired - private TaskPlanGroupDbAdapter taskPlanGroupDbAdapter; - - @Autowired - private TaskPlanDbAdapter taskPlanDbAdapter; + private TaskPlanGroupService taskPlanGroupService; @Override public IPage queryPage(Page page, TaskPlanQueryDTO taskPlanQueryDto) { taskPlanQueryDto.setKeyword(SpecialCharacterUtil.escapeStr(taskPlanQueryDto.getKeyword())); - IPage iPage = taskPlanDbAdapter.queryPage(page, taskPlanQueryDto); + IPage iPage = this.baseMapper.queryPage(page, taskPlanQueryDto); List records = iPage.getRecords(); for (TaskPlanVO taskPlanVO : records) { String taskCron = taskPlanVO.getTaskCron(); @@ -109,7 +107,7 @@ public class TaskPlanServiceImpl implements TaskPlanService { taskPlan.setId(null); // 校验是否存在同名的任务编排名称 checkTaskPlaExist(taskPlan); - boolean save = taskPlanDbAdapter.save(taskPlan); + boolean save = this.save(taskPlan); if (save) { // 添加JOB this.addTaskJob(this.buildAddTaskPlanJobVO(taskPlan)); @@ -123,7 +121,7 @@ public class TaskPlanServiceImpl implements TaskPlanService { if (Objects.isNull(taskPlan.getId())) { throw new BusinessException(MessageUtil.get("task.update.id_not_empty")); } - TaskPlan tempTaskPlan = taskPlanDbAdapter.getById(taskPlan.getId()); + TaskPlan tempTaskPlan = this.getById(taskPlan.getId()); Integer sysStatus = tempTaskPlan.getStatus(); if (Objects.equals(sysStatus, TaskStatusEnum.ENABLED.getCode())) { throw new BusinessException(MessageUtil.get("task.update.status_enable_msg")); @@ -132,7 +130,7 @@ public class TaskPlanServiceImpl implements TaskPlanService { validTaskJsonConfig(taskPlan.getJsonConfig()); // 校验是否存在同名的任务编排名称 checkTaskPlaExist(taskPlan); - boolean update = taskPlanDbAdapter.updateById(taskPlan); + boolean update = this.updateById(taskPlan); if (update) { Integer status = taskPlan.getStatus(); // 校验待禁用的任务编排是否存在正在运行中的任务实例 @@ -143,7 +141,7 @@ public class TaskPlanServiceImpl implements TaskPlanService { throw new BusinessException(MessageUtil.get("task.status_executing_task_not_disable")); } } - TaskPlan plan = taskPlanDbAdapter.getById(taskPlan.getId()); + TaskPlan plan = this.getById(taskPlan.getId()); taskPlan.setOrgId(plan.getOrgId()); // 更新JOB频率、参数 this.updateTaskJobCronAndParam(this.buildAddTaskPlanJobVO(taskPlan), status); @@ -157,14 +155,14 @@ public class TaskPlanServiceImpl implements TaskPlanService { public Boolean deleteEntity(Long id) throws Exception { // 校验待删除的任务编排是否在启用状态 - TaskPlan taskPlan = taskPlanDbAdapter.getById(id); + TaskPlan taskPlan = this.getById(id); if (Objects.isNull(taskPlan)) { throw new BusinessException(MessageUtil.get("task.not_exist")); } if (Objects.equals(taskPlan.getStatus(), TaskStatusEnum.ENABLED.getCode())) { throw new BusinessException(MessageUtil.get("task.delete.status_check_msg")); } - boolean remove = taskPlanDbAdapter.removeById(id); + boolean remove = this.removeById(id); if (remove) { taskInstanceService.deletedByTaskPlanId(taskPlan.getOrgId(), taskPlan.getGroupId(), id); // 删除JOB @@ -179,7 +177,7 @@ public class TaskPlanServiceImpl implements TaskPlanService { @Override public Boolean updateTaskStatus(Long taskId, Integer status) { - TaskPlan sysTaskPlan = taskPlanDbAdapter.getById(taskId); + TaskPlan sysTaskPlan = this.getById(taskId); if (Objects.isNull(sysTaskPlan)) { throw new BusinessException(MessageUtil.get("task.not_exist")); } @@ -199,7 +197,7 @@ public class TaskPlanServiceImpl implements TaskPlanService { TaskPlan taskPlan = new TaskPlan(); taskPlan.setId(taskId); taskPlan.setStatus(status); - boolean update = taskPlanDbAdapter.updateById(taskPlan); + boolean update = this.updateById(taskPlan); if (update) { // 更新JOB状态 String jobGroupName = TaskScheduleJobUtil.buildJobGroupName(sysTaskPlan.getOrgId()); @@ -211,7 +209,7 @@ public class TaskPlanServiceImpl implements TaskPlanService { @Override public void executeNow(Long taskId) { - TaskPlanResourceDTO taskPlanResourceDTO = taskPlanDbAdapter.getTaskPlanAndResourceInfoIgnoreTenantId(taskId); + TaskPlanResourceDTO taskPlanResourceDTO = this.baseMapper.getTaskPlanAndResourceInfoIgnoreTenantId(taskId); if (Objects.isNull(taskPlanResourceDTO)) { throw new BusinessException(MessageUtil.get("task.not_exist")); } @@ -276,7 +274,7 @@ public class TaskPlanServiceImpl implements TaskPlanService { throw new BusinessException(MessageUtil.get("task.cron_error")); } Long taskPlanId = addTaskPlanJobVO.getTaskPlanId(); - TaskPlan taskPlan = taskPlanDbAdapter.getById(taskPlanId); + TaskPlan taskPlan = this.getById(taskPlanId); // 构建JOB分组名称 String jobGroupName = TaskScheduleJobUtil.buildJobGroupName(taskPlan.getOrgId()); try { @@ -374,18 +372,18 @@ public class TaskPlanServiceImpl implements TaskPlanService { ServerProgramEntity::getStatus); // 不晓得为什么要在这里指定逻辑删除 queryWrapper.eq(ServerProgramEntity::getDeleted, Boolean.FALSE); - return serverProgramDbAdapter.list(queryWrapper); + return serverProgramService.list(queryWrapper); } @Override public TaskPlanResourceDTO getTaskPlanAndResourceInfoIgnoreTenantId(Long taskPlanId) { - return taskPlanDbAdapter.getTaskPlanAndResourceInfoIgnoreTenantId(taskPlanId); + return this.baseMapper.getTaskPlanAndResourceInfoIgnoreTenantId(taskPlanId); } @Override public List getSchedulerViewStatistics() { - List schedulerViewStatistics = taskPlanDbAdapter.getSchedulerViewStatistics(); + List schedulerViewStatistics = this.baseMapper.getSchedulerViewStatistics(); // 获取系统数据库中所有的状态code信息 List status = schedulerViewStatistics.stream().map(ScheduleTaskPlanVO::getStatus).distinct().collect(Collectors.toList()); @@ -413,7 +411,7 @@ public class TaskPlanServiceImpl implements TaskPlanService { @Override public List getAllListIgnoreTenantId() { - return taskPlanDbAdapter.getAllListIgnoreTenantId(); + return this.baseMapper.getAllListIgnoreTenantId(); } /** @@ -475,7 +473,7 @@ public class TaskPlanServiceImpl implements TaskPlanService { String jobGroupName = TaskScheduleJobUtil.buildJobGroupName(taskPlan.getOrgId()); // 禁用状态时暂定执行任务 boolean isPause = Objects.equals(taskPlan.getStatus(), TaskStatusEnum.DISABLED.getCode()); - TaskPlanGroup planGroup = taskPlanGroupDbAdapter.getById(taskPlan.getGroupId()); + TaskPlanGroup planGroup = taskPlanGroupService.getById(taskPlan.getGroupId()); // 构建实体 return AddTaskPlanJobVO.builder().taskPlanId(taskPlan.getId()).cron(taskPlan.getTaskCron()).async(false) .isPause(isPause).nodeId(taskPlan.getServerProgramId()).jobGroupName(jobGroupName) @@ -532,7 +530,7 @@ public class TaskPlanServiceImpl implements TaskPlanService { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(TaskPlan::getTaskName, taskPlan.getTaskName()); queryWrapper.ne(Objects.nonNull(taskPlan.getId()), TaskPlan::getId, taskPlan.getId()); - TaskPlan sysTaskPlan = taskPlanDbAdapter.getOne(queryWrapper); + TaskPlan sysTaskPlan = this.getOne(queryWrapper); // 校验是否存在同名的任务编排名称 if (Objects.nonNull(sysTaskPlan)) { throw new BusinessException(MessageUtil.get("task.plan.name_exist")); diff --git a/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/task/impl/TaskStepLogServiceImpl.java b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/task/impl/TaskStepLogServiceImpl.java index 8746f5d..0e50169 100644 --- a/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/task/impl/TaskStepLogServiceImpl.java +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/task/impl/TaskStepLogServiceImpl.java @@ -11,11 +11,12 @@ */ package org.yzbdl.lanius.orchestrate.serv.service.task.impl; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.yzbdl.lanius.orchestrate.common.entity.task.TaskStepLog; import org.yzbdl.lanius.orchestrate.common.vo.task.TaskStepLogVO; -import org.yzbdl.lanius.orchestrate.db.adapter.task.TaskStepLogDbAdapter; +import org.yzbdl.lanius.orchestrate.serv.mapper.task.TaskStepLogMapper; import org.yzbdl.lanius.orchestrate.serv.service.task.TaskStepLogService; import java.util.List; @@ -28,13 +29,10 @@ import java.util.List; */ @Service @Slf4j -public class TaskStepLogServiceImpl implements TaskStepLogService { - - @Autowired - private TaskStepLogDbAdapter taskStepLogDbAdapter; +public class TaskStepLogServiceImpl extends ServiceImpl implements TaskStepLogService { @Override public List getStepLogByTaskInstanceId(Long taskInstanceId) { - return taskStepLogDbAdapter.getStepLogByTaskInstanceId(taskInstanceId); + return this.baseMapper.getStepLogByTaskInstanceId(taskInstanceId); } } diff --git a/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/resources/mapper/dm/resource/ServerMapper.xml b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/resources/mapper/dm/resource/ServerMapper.xml new file mode 100644 index 0000000..b17c940 --- /dev/null +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/resources/mapper/dm/resource/ServerMapper.xml @@ -0,0 +1,27 @@ + + + + + + + update lo_server + + status = #{item.status} + + where id = #{item.id} + + + + + + + + + + \ No newline at end of file diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/resources/mapper/resource/ServerProgramMapper.xml b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/resources/mapper/dm/resource/ServerProgramMapper.xml similarity index 89% rename from lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/resources/mapper/resource/ServerProgramMapper.xml rename to lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/resources/mapper/dm/resource/ServerProgramMapper.xml index 62b60cb..e7ab0cc 100644 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/resources/mapper/resource/ServerProgramMapper.xml +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/resources/mapper/dm/resource/ServerProgramMapper.xml @@ -1,6 +1,6 @@ - + @@ -58,4 +58,8 @@ where id = #{item.id} + + \ No newline at end of file diff --git a/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/resources/mapper/dm/resource/TaskResourceConfigMapper.xml b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/resources/mapper/dm/resource/TaskResourceConfigMapper.xml new file mode 100644 index 0000000..25da12a --- /dev/null +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/resources/mapper/dm/resource/TaskResourceConfigMapper.xml @@ -0,0 +1,23 @@ + + + + + + + update lo_task_resource_config + + status = #{item.status} + + where id = #{item.id} + + + + + + + + \ No newline at end of file diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/resources/mapper/resource/TaskResourceGroupMapper.xml b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/resources/mapper/dm/resource/TaskResourceGroupMapper.xml similarity index 77% rename from lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/resources/mapper/resource/TaskResourceGroupMapper.xml rename to lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/resources/mapper/dm/resource/TaskResourceGroupMapper.xml index 418b109..f62260a 100644 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/resources/mapper/resource/TaskResourceGroupMapper.xml +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/resources/mapper/dm/resource/TaskResourceGroupMapper.xml @@ -1,6 +1,6 @@ - + + select group_id, count(*) as count from lo_task_resource where deleted = 0 group by group_id + + + + \ No newline at end of file diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/resources/mapper/system/MenuMapper.xml b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/resources/mapper/dm/system/MenuMapper.xml similarity index 61% rename from lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/resources/mapper/system/MenuMapper.xml rename to lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/resources/mapper/dm/system/MenuMapper.xml index e1f9052..f7249f0 100644 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/resources/mapper/system/MenuMapper.xml +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/resources/mapper/dm/system/MenuMapper.xml @@ -1,5 +1,5 @@ - + \ No newline at end of file diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/resources/mapper/system/OrgMapper.xml b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/resources/mapper/dm/system/OrgMapper.xml similarity index 86% rename from lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/resources/mapper/system/OrgMapper.xml rename to lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/resources/mapper/dm/system/OrgMapper.xml index dc8df8d..f759bed 100644 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/resources/mapper/system/OrgMapper.xml +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/resources/mapper/dm/system/OrgMapper.xml @@ -1,6 +1,6 @@ - + diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/resources/mapper/system/PermissionMapper.xml b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/resources/mapper/dm/system/PermissionMapper.xml similarity index 92% rename from lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/resources/mapper/system/PermissionMapper.xml rename to lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/resources/mapper/dm/system/PermissionMapper.xml index 0d71595..03fccd0 100644 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/resources/mapper/system/PermissionMapper.xml +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/resources/mapper/dm/system/PermissionMapper.xml @@ -1,6 +1,6 @@ - + select ul.id, diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/resources/mapper/system/UserMapper.xml b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/resources/mapper/dm/system/UserMapper.xml similarity index 98% rename from lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/resources/mapper/system/UserMapper.xml rename to lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/resources/mapper/dm/system/UserMapper.xml index 1ca976c..53a5706 100644 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/resources/mapper/system/UserMapper.xml +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/resources/mapper/dm/system/UserMapper.xml @@ -1,6 +1,6 @@ - + diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/resources/mapper/system/UserRoleMapper.xml b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/resources/mapper/dm/system/UserRoleMapper.xml similarity index 80% rename from lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/resources/mapper/system/UserRoleMapper.xml rename to lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/resources/mapper/dm/system/UserRoleMapper.xml index 4aff9db..1d54407 100644 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/resources/mapper/system/UserRoleMapper.xml +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/resources/mapper/dm/system/UserRoleMapper.xml @@ -1,6 +1,6 @@ - + insert into lo_user_role (id,user_id,role_id) values diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/resources/mapper/task/TaskInstanceMapper.xml b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/resources/mapper/dm/task/TaskInstanceMapper.xml similarity index 96% rename from lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/resources/mapper/task/TaskInstanceMapper.xml rename to lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/resources/mapper/dm/task/TaskInstanceMapper.xml index 19bc8cb..bb2a0ed 100644 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/resources/mapper/task/TaskInstanceMapper.xml +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/resources/mapper/dm/task/TaskInstanceMapper.xml @@ -1,6 +1,6 @@ - + @@ -128,4 +128,7 @@ WHERE i.id = #{taskInstanceId} + + update lo_task_instance set status = #{status},end_time = #{endTime} where id = #{id} + \ No newline at end of file diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/resources/mapper/task/TaskPlanGroupMapper.xml b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/resources/mapper/dm/task/TaskPlanGroupMapper.xml similarity index 90% rename from lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/resources/mapper/task/TaskPlanGroupMapper.xml rename to lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/resources/mapper/dm/task/TaskPlanGroupMapper.xml index a724445..712d56a 100644 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/resources/mapper/task/TaskPlanGroupMapper.xml +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/resources/mapper/dm/task/TaskPlanGroupMapper.xml @@ -1,6 +1,6 @@ - + diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/resources/mapper/task/TaskPlanMapper.xml b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/resources/mapper/dm/task/TaskPlanMapper.xml similarity index 98% rename from lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/resources/mapper/task/TaskPlanMapper.xml rename to lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/resources/mapper/dm/task/TaskPlanMapper.xml index fc4bfb4..aeb4366 100644 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/resources/mapper/task/TaskPlanMapper.xml +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/resources/mapper/dm/task/TaskPlanMapper.xml @@ -1,6 +1,6 @@ - + diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/resources/mapper/task/TaskStepLogMapper.xml b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/resources/mapper/dm/task/TaskStepLogMapper.xml similarity index 90% rename from lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/resources/mapper/task/TaskStepLogMapper.xml rename to lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/resources/mapper/dm/task/TaskStepLogMapper.xml index aa2e62f..c5d65fa 100644 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-dm/src/main/resources/mapper/task/TaskStepLogMapper.xml +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/resources/mapper/dm/task/TaskStepLogMapper.xml @@ -1,6 +1,6 @@ - + diff --git a/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/resources/mapper/mysql/resource/ServerMapper.xml b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/resources/mapper/mysql/resource/ServerMapper.xml new file mode 100644 index 0000000..15c6b69 --- /dev/null +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/resources/mapper/mysql/resource/ServerMapper.xml @@ -0,0 +1,30 @@ + + + + + + + update lo_server + + status = #{item.status} + + where id = #{item.id} + + + + + + + + + + + + + \ No newline at end of file diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/resources/mapper/resource/ServerProgramMapper.xml b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/resources/mapper/mysql/resource/ServerProgramMapper.xml similarity index 89% rename from lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/resources/mapper/resource/ServerProgramMapper.xml rename to lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/resources/mapper/mysql/resource/ServerProgramMapper.xml index b58a388..6b217cd 100644 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/resources/mapper/resource/ServerProgramMapper.xml +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/resources/mapper/mysql/resource/ServerProgramMapper.xml @@ -1,6 +1,6 @@ - + @@ -58,4 +58,8 @@ where id = #{item.id} + + \ No newline at end of file diff --git a/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/resources/mapper/mysql/resource/TaskResourceConfigMapper.xml b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/resources/mapper/mysql/resource/TaskResourceConfigMapper.xml new file mode 100644 index 0000000..1b50fc5 --- /dev/null +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/resources/mapper/mysql/resource/TaskResourceConfigMapper.xml @@ -0,0 +1,23 @@ + + + + + + + update lo_task_resource_config + + status = #{item.status} + + where id = #{item.id} + + + + + + + + \ No newline at end of file diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/resources/mapper/resource/TaskResourceGroupMapper.xml b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/resources/mapper/mysql/resource/TaskResourceGroupMapper.xml similarity index 86% rename from lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/resources/mapper/resource/TaskResourceGroupMapper.xml rename to lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/resources/mapper/mysql/resource/TaskResourceGroupMapper.xml index 35ac2c5..c0fb763 100644 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/resources/mapper/resource/TaskResourceGroupMapper.xml +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/resources/mapper/mysql/resource/TaskResourceGroupMapper.xml @@ -1,6 +1,6 @@ - + + select group_id, count(*) as count from lo_task_resource where deleted = false group by group_id + + + + \ No newline at end of file diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/resources/mapper/system/MenuMapper.xml b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/resources/mapper/mysql/system/MenuMapper.xml similarity index 60% rename from lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/resources/mapper/system/MenuMapper.xml rename to lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/resources/mapper/mysql/system/MenuMapper.xml index 60c3010..f7249f0 100644 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/resources/mapper/system/MenuMapper.xml +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/resources/mapper/mysql/system/MenuMapper.xml @@ -1,5 +1,5 @@ - + \ No newline at end of file diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/resources/mapper/system/OrgMapper.xml b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/resources/mapper/mysql/system/OrgMapper.xml similarity index 86% rename from lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/resources/mapper/system/OrgMapper.xml rename to lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/resources/mapper/mysql/system/OrgMapper.xml index 0e6fcc8..8f7c7bd 100644 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/resources/mapper/system/OrgMapper.xml +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/resources/mapper/mysql/system/OrgMapper.xml @@ -1,6 +1,6 @@ - + diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/resources/mapper/system/PermissionMapper.xml b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/resources/mapper/mysql/system/PermissionMapper.xml similarity index 92% rename from lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/resources/mapper/system/PermissionMapper.xml rename to lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/resources/mapper/mysql/system/PermissionMapper.xml index 8bad3a0..03fccd0 100644 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/resources/mapper/system/PermissionMapper.xml +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/resources/mapper/mysql/system/PermissionMapper.xml @@ -1,6 +1,6 @@ - + select ul.id, diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/resources/mapper/system/UserMapper.xml b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/resources/mapper/mysql/system/UserMapper.xml similarity index 98% rename from lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/resources/mapper/system/UserMapper.xml rename to lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/resources/mapper/mysql/system/UserMapper.xml index 8f2f960..fad795e 100644 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/resources/mapper/system/UserMapper.xml +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/resources/mapper/mysql/system/UserMapper.xml @@ -1,6 +1,6 @@ - + diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/resources/mapper/system/UserRoleMapper.xml b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/resources/mapper/mysql/system/UserRoleMapper.xml similarity index 80% rename from lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/resources/mapper/system/UserRoleMapper.xml rename to lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/resources/mapper/mysql/system/UserRoleMapper.xml index dc323fb..1d54407 100644 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/resources/mapper/system/UserRoleMapper.xml +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/resources/mapper/mysql/system/UserRoleMapper.xml @@ -1,6 +1,6 @@ - + insert into lo_user_role (id,user_id,role_id) values diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/resources/mapper/task/TaskInstanceMapper.xml b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/resources/mapper/mysql/task/TaskInstanceMapper.xml similarity index 96% rename from lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/resources/mapper/task/TaskInstanceMapper.xml rename to lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/resources/mapper/mysql/task/TaskInstanceMapper.xml index 7d1bf01..54f62f0 100644 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/resources/mapper/task/TaskInstanceMapper.xml +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/resources/mapper/mysql/task/TaskInstanceMapper.xml @@ -1,6 +1,6 @@ - + @@ -128,4 +128,8 @@ WHERE i.id = #{taskInstanceId} + + update lo_task_instance set status = #{status},end_time = #{endTime} where id = #{id} + + \ No newline at end of file diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/resources/mapper/task/TaskPlanGroupMapper.xml b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/resources/mapper/mysql/task/TaskPlanGroupMapper.xml similarity index 92% rename from lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/resources/mapper/task/TaskPlanGroupMapper.xml rename to lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/resources/mapper/mysql/task/TaskPlanGroupMapper.xml index b420efe..7b69a15 100644 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/resources/mapper/task/TaskPlanGroupMapper.xml +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/resources/mapper/mysql/task/TaskPlanGroupMapper.xml @@ -1,6 +1,6 @@ - + diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/resources/mapper/task/TaskPlanMapper.xml b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/resources/mapper/mysql/task/TaskPlanMapper.xml similarity index 98% rename from lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/resources/mapper/task/TaskPlanMapper.xml rename to lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/resources/mapper/mysql/task/TaskPlanMapper.xml index ae70f85..26f2e67 100644 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/resources/mapper/task/TaskPlanMapper.xml +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/resources/mapper/mysql/task/TaskPlanMapper.xml @@ -1,6 +1,6 @@ - + diff --git a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/resources/mapper/task/TaskStepLogMapper.xml b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/resources/mapper/mysql/task/TaskStepLogMapper.xml similarity index 90% rename from lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/resources/mapper/task/TaskStepLogMapper.xml rename to lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/resources/mapper/mysql/task/TaskStepLogMapper.xml index 3b32111..c5d65fa 100644 --- a/lanius-orchestrate-server/modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql/src/main/resources/mapper/task/TaskStepLogMapper.xml +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/resources/mapper/mysql/task/TaskStepLogMapper.xml @@ -1,6 +1,6 @@ - + diff --git a/lanius-orchestrate-server/modules/lanius-orchestrate-system/src/main/java/org/yzbdl/lanius/orchestrate/system/controller/ManagerAccountController.java b/lanius-orchestrate-server/modules/lanius-orchestrate-system/src/main/java/org/yzbdl/lanius/orchestrate/system/controller/ManagerAccountController.java index 924f8bf..610044a 100644 --- a/lanius-orchestrate-server/modules/lanius-orchestrate-system/src/main/java/org/yzbdl/lanius/orchestrate/system/controller/ManagerAccountController.java +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-system/src/main/java/org/yzbdl/lanius/orchestrate/system/controller/ManagerAccountController.java @@ -13,8 +13,6 @@ import org.yzbdl.lanius.orchestrate.common.dto.system.UserOrgUpdateParamDTO; import org.yzbdl.lanius.orchestrate.common.dto.system.UserStatusDTO; import org.yzbdl.lanius.orchestrate.common.result.ResultObj; import org.yzbdl.lanius.orchestrate.common.vo.system.AccountVO; -import org.yzbdl.lanius.orchestrate.common.vo.system.UserVo; -import org.yzbdl.lanius.orchestrate.db.adapter.system.UserDbAdapter; import org.yzbdl.lanius.orchestrate.serv.service.system.UserService; import javax.validation.constraints.NotNull; @@ -68,13 +66,13 @@ public class ManagerAccountController { @ApiOperation(value = "设置用户状态", notes = "") @RequestMapping(value = "/{userId}/status", method = RequestMethod.POST) - public ResultObj changeStatus(@PathVariable("userId") @OprId(server = UserDbAdapter.class) Long userId, @RequestBody @Validated UserStatusDTO userStatusDto) { + public ResultObj changeStatus(@PathVariable("userId") @OprId(server = UserService.class) Long userId, @RequestBody @Validated UserStatusDTO userStatusDto) { return ResultObj.success(userService.setUserState(userStatusDto.getStatus(), userId)); } @ApiOperation(value = "重置用户密码", notes = "") @RequestMapping(value = "/{userId}/password", method = RequestMethod.POST) - public ResultObj resetPassword(@PathVariable("userId") @OprId(server = UserDbAdapter.class) Long userId) { + public ResultObj resetPassword(@PathVariable("userId") @OprId(server = UserService.class) Long userId) { return ResultObj.success(userService.resetPassword(userId)); } diff --git a/lanius-orchestrate-server/modules/lanius-orchestrate-system/src/main/java/org/yzbdl/lanius/orchestrate/system/controller/ManagerOrgController.java b/lanius-orchestrate-server/modules/lanius-orchestrate-system/src/main/java/org/yzbdl/lanius/orchestrate/system/controller/ManagerOrgController.java index b0770c5..e80d3e3 100644 --- a/lanius-orchestrate-server/modules/lanius-orchestrate-system/src/main/java/org/yzbdl/lanius/orchestrate/system/controller/ManagerOrgController.java +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-system/src/main/java/org/yzbdl/lanius/orchestrate/system/controller/ManagerOrgController.java @@ -17,7 +17,6 @@ import org.yzbdl.lanius.orchestrate.common.entity.system.OrgEntity; import org.yzbdl.lanius.orchestrate.common.result.ResultObj; import org.yzbdl.lanius.orchestrate.common.utils.MessageUtil; import org.yzbdl.lanius.orchestrate.common.vo.system.OrgParamDTO; -import org.yzbdl.lanius.orchestrate.db.adapter.system.OrgDbAdapter; import org.yzbdl.lanius.orchestrate.serv.service.system.OrgService; import java.util.List; @@ -36,8 +35,6 @@ public class ManagerOrgController { @Autowired OrgService orgService; - @Autowired - OrgDbAdapter orgDbAdapter; @ApiOperation(value = "分页查看组织", notes = "") @RequestMapping(value = "/query", method = RequestMethod.POST) @@ -61,7 +58,7 @@ public class ManagerOrgController { if (orgService.existOrg(orgParamDto.getOrgName())) { return ResultObj.error(MessageUtil.get("system.org.same_org_name")); } - orgDbAdapter.save(orgParamDto.toOrgEntity()); + orgService.save(orgParamDto.toOrgEntity()); return ResultObj.success(); } @@ -76,7 +73,7 @@ public class ManagerOrgController { @ApiOperation(value = "删除组织", notes = "") @RequestMapping(value = "/{id}", method = RequestMethod.DELETE) public ResultObj deleteOrgById(@PathVariable("id") Long id) { - return orgService.removeById(id) ? ResultObj.success("成功!") : ResultObj.error(MessageUtil.get("system.org.delete_org_error")); + return orgService.removeCascade(id) ? ResultObj.success("成功!") : ResultObj.error(MessageUtil.get("system.org.delete_org_error")); } @ApiOperation(value = "冻结组织", notes = "") diff --git a/lanius-orchestrate-server/modules/lanius-orchestrate-system/src/main/java/org/yzbdl/lanius/orchestrate/system/controller/RoleController.java b/lanius-orchestrate-server/modules/lanius-orchestrate-system/src/main/java/org/yzbdl/lanius/orchestrate/system/controller/RoleController.java index 92b06a8..10938e0 100644 --- a/lanius-orchestrate-server/modules/lanius-orchestrate-system/src/main/java/org/yzbdl/lanius/orchestrate/system/controller/RoleController.java +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-system/src/main/java/org/yzbdl/lanius/orchestrate/system/controller/RoleController.java @@ -9,7 +9,6 @@ import org.springframework.web.bind.annotation.*; import org.yzbdl.lanius.orchestrate.common.dto.system.RoleInsertParamDto; import org.yzbdl.lanius.orchestrate.common.dto.system.RoleListDto; import org.yzbdl.lanius.orchestrate.common.dto.system.RoleUpdateParamDto; -import org.yzbdl.lanius.orchestrate.db.adapter.system.RoleDbAdapter; import org.yzbdl.lanius.orchestrate.serv.service.system.RoleService; import org.yzbdl.lanius.orchestrate.common.annotation.auth.CheckPermission; import org.yzbdl.lanius.orchestrate.common.annotation.log.OprId; @@ -50,7 +49,7 @@ public class RoleController { @RequestMapping(value = "{roleId}", method = RequestMethod.POST) public ResultObj updateById( @RequestBody @Validated RoleUpdateParamDto roleUpdateParamDto, - @PathVariable("roleId") @OprId(server = RoleDbAdapter.class) Long roleId + @PathVariable("roleId") @OprId(server = RoleService.class) Long roleId ){ return ResultObj.success(roleService.updateRole(roleUpdateParamDto.coverToRoleEntity(roleId))); } @@ -66,7 +65,7 @@ public class RoleController { @CheckPermission("system::role::edit") @ApiOperation(value="保存角色权限", notes="") @RequestMapping(value = "/{roleId}/permission", method = RequestMethod.POST) - public ResultObj saveRolePermission(@RequestBody List permissionIds, @PathVariable @OprId(server = RoleDbAdapter.class) Long roleId){ + public ResultObj saveRolePermission(@RequestBody List permissionIds, @PathVariable @OprId(server = RoleService.class) Long roleId){ return ResultObj.success(roleService.savePermissionIdsByRoleId(roleId,permissionIds)); } @@ -89,7 +88,7 @@ public class RoleController { @ApiOperation(value="删除角色", notes="") @RequestMapping(value = "/{roleId}", method = RequestMethod.DELETE) @OprLog(value = UserOprEventConstant.SYSTEM_ROLE_DELETE,msg="删除角色${roleName},id是${id}") - public ResultObj deleteById(@PathVariable("roleId") @OprId(server = RoleDbAdapter.class) Long roleId){ + public ResultObj deleteById(@PathVariable("roleId") @OprId(server = RoleService.class) Long roleId){ DeleteExploreDto deleteExploreDto = new DeleteCheckChain() .addChain(() -> roleService.deleteRoleById(roleId)) .process(); diff --git a/lanius-orchestrate-server/modules/lanius-orchestrate-system/src/main/java/org/yzbdl/lanius/orchestrate/system/controller/UserController.java b/lanius-orchestrate-server/modules/lanius-orchestrate-system/src/main/java/org/yzbdl/lanius/orchestrate/system/controller/UserController.java index e0f2d3c..5ddc2ba 100644 --- a/lanius-orchestrate-server/modules/lanius-orchestrate-system/src/main/java/org/yzbdl/lanius/orchestrate/system/controller/UserController.java +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-system/src/main/java/org/yzbdl/lanius/orchestrate/system/controller/UserController.java @@ -19,7 +19,6 @@ import org.yzbdl.lanius.orchestrate.common.result.ResultObj; import org.yzbdl.lanius.orchestrate.common.utils.MessageUtil; import org.yzbdl.lanius.orchestrate.common.vo.system.UserTokenVo; import org.yzbdl.lanius.orchestrate.common.vo.system.UserVo; -import org.yzbdl.lanius.orchestrate.db.adapter.system.UserDbAdapter; import org.yzbdl.lanius.orchestrate.serv.service.system.OrgService; import org.yzbdl.lanius.orchestrate.serv.service.system.UserAuthService; import org.yzbdl.lanius.orchestrate.serv.service.system.UserService; @@ -44,8 +43,6 @@ public class UserController { UserAuthService userAuthService; @Autowired OrgService orgService; - @Autowired - private UserDbAdapter userDbAdapter; @Value("${verify-code.skip}") boolean verifyCodeSkip; @@ -79,7 +76,7 @@ public class UserController { @RequestMapping(value = "/{userId}/roles", method = RequestMethod.POST) public ResultObj saveUserRole( @RequestBody List roleIds, - @PathVariable(value = "userId") @OprId(server = UserDbAdapter.class) Long userId + @PathVariable(value = "userId") @OprId(server = UserService.class) Long userId ) { return ResultObj.success(userService.saveUserRoles(roleIds, userId)); } @@ -88,7 +85,7 @@ public class UserController { @ApiOperation(value = "根据id获取用户", notes = "") @RequestMapping(value = "/{userId}", method = RequestMethod.GET) public ResultObj getById(@PathVariable(value = "userId") Long userId) { - return ResultObj.success(userDbAdapter.getById(userId)); + return ResultObj.success(userService.getById(userId)); } @CheckPermission("system::user::query") @@ -105,7 +102,7 @@ public class UserController { @CheckPermission("system::user::delete") @ApiOperation(value = "将用户移除当前组织", notes = "") @RequestMapping(value = "/{userId}", method = RequestMethod.DELETE) - public ResultObj removeById(@PathVariable("userId") @OprId(server = UserDbAdapter.class) Long userId) { + public ResultObj removeById(@PathVariable("userId") @OprId(server = UserService.class) Long userId) { return ResultObj.success(userService.removeFromOrg(userId, CurrentUserUtil.getCurrentUserOrgId())); } diff --git a/lanius-orchestrate-server/modules/lanius-orchestrate-task/src/main/java/org/yzbdl/lanius/orchestrate/task/controller/TaskPlanController.java b/lanius-orchestrate-server/modules/lanius-orchestrate-task/src/main/java/org/yzbdl/lanius/orchestrate/task/controller/TaskPlanController.java index acd63d6..ce27891 100644 --- a/lanius-orchestrate-server/modules/lanius-orchestrate-task/src/main/java/org/yzbdl/lanius/orchestrate/task/controller/TaskPlanController.java +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-task/src/main/java/org/yzbdl/lanius/orchestrate/task/controller/TaskPlanController.java @@ -20,7 +20,6 @@ import org.yzbdl.lanius.orchestrate.common.entity.task.TaskPlan; import org.yzbdl.lanius.orchestrate.common.result.ResultObj; import org.yzbdl.lanius.orchestrate.common.vo.task.TaskPlanGroupVO; import org.yzbdl.lanius.orchestrate.common.vo.task.TaskPlanVO; -import org.yzbdl.lanius.orchestrate.db.adapter.task.TaskPlanDbAdapter; import org.yzbdl.lanius.orchestrate.serv.service.resource.TaskResourceGroupService; import org.yzbdl.lanius.orchestrate.serv.service.resource.TaskResourceService; import org.yzbdl.lanius.orchestrate.serv.service.task.TaskPlanGroupService; @@ -124,7 +123,7 @@ public class TaskPlanController extends BaseController { @DeleteMapping(value = "/taskPlan/{id}") @ApiOperation(value = "根据ID删除任务", notes = "根据ID删除任务") @ResponseBody - public ResultObj deleteEntity(@PathVariable(value = "id", required = true) @OprId(server = TaskPlanDbAdapter.class) Long id) throws Exception{ + public ResultObj deleteEntity(@PathVariable(value = "id", required = true) @OprId(server = TaskPlanService.class) Long id) throws Exception{ return ResultObj.success(taskPlanService.deleteEntity(id)); } @@ -143,7 +142,7 @@ public class TaskPlanController extends BaseController { @PutMapping(value = "/taskStatus/{taskId}/{status}") @ApiOperation(value = "更新任务状态", notes = "更新任务状态") @ResponseBody - public ResultObj updateTaskStatus(@PathVariable(value = "taskId") @OprId(server = TaskPlanDbAdapter.class) Long taskId, + public ResultObj updateTaskStatus(@PathVariable(value = "taskId") @OprId(server = TaskPlanService.class) Long taskId, @PathVariable(value = "status") Integer status) { return ResultObj.success(taskPlanService.updateTaskStatus(taskId, status)); } @@ -161,7 +160,7 @@ public class TaskPlanController extends BaseController { @GetMapping(value = "/executeNow/{taskId}") @ApiOperation(value = "手动执行一次任务", notes = "手动执行一次任务") @ResponseBody - public ResultObj executeNow(@PathVariable(value = "taskId") @OprId(server = TaskPlanDbAdapter.class) Long taskId) { + public ResultObj executeNow(@PathVariable(value = "taskId") @OprId(server = TaskPlanService.class) Long taskId) { taskPlanService.executeNow(taskId); return ResultObj.success(); } diff --git a/lanius-orchestrate-server/modules/lanius-orchestrate-task/src/main/java/org/yzbdl/lanius/orchestrate/task/controller/TaskPlanGroupController.java b/lanius-orchestrate-server/modules/lanius-orchestrate-task/src/main/java/org/yzbdl/lanius/orchestrate/task/controller/TaskPlanGroupController.java index 3975a93..95d7bae 100644 --- a/lanius-orchestrate-server/modules/lanius-orchestrate-task/src/main/java/org/yzbdl/lanius/orchestrate/task/controller/TaskPlanGroupController.java +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-task/src/main/java/org/yzbdl/lanius/orchestrate/task/controller/TaskPlanGroupController.java @@ -16,7 +16,6 @@ import org.yzbdl.lanius.orchestrate.common.exception.runtime.BusinessException; import org.yzbdl.lanius.orchestrate.common.result.ResultObj; import org.yzbdl.lanius.orchestrate.common.utils.MessageUtil; import org.yzbdl.lanius.orchestrate.common.vo.task.TaskPlanGroupVO; -import org.yzbdl.lanius.orchestrate.db.adapter.task.TaskPlanGroupDbAdapter; import org.yzbdl.lanius.orchestrate.serv.service.task.TaskPlanGroupService; import java.util.List; @@ -136,7 +135,7 @@ public class TaskPlanGroupController extends BaseController { @DeleteMapping(value = "/taskPlanGroup/{id}") @ApiOperation(value = "根据ID删除分组", notes = "根据ID删除分组") @ResponseBody - public ResultObj deleteEntity(@PathVariable(value = "id", required = true) @OprId(server = TaskPlanGroupDbAdapter.class) Long id) { + public ResultObj deleteEntity(@PathVariable(value = "id", required = true) @OprId(server = TaskPlanGroupService.class) Long id) { return ResultObj.success(taskPlanGroupService.deleteEntity(id)); } diff --git a/lanius-orchestrate-server/pom.xml b/lanius-orchestrate-server/pom.xml index c5764bc..1d40c20 100644 --- a/lanius-orchestrate-server/pom.xml +++ b/lanius-orchestrate-server/pom.xml @@ -18,9 +18,6 @@ modules/lanius-orchestrate-common - modules/lanius-db-adapter/lanius-orchestrate-db-adapter - modules/lanius-db-adapter/lanius-orchestrate-db-adapter-mysql - modules/lanius-orchestrate-serv modules/lanius-orchestrate-system modules/lanius-orchestrate-resource @@ -40,9 +37,6 @@ 0.0.1-SNAPSHOT 0.0.1-SNAPSHOT 0.0.1-SNAPSHOT - 0.0.1-SNAPSHOT - 0.0.1-SNAPSHOT - 0.0.1-SNAPSHOT 1.9.7 2.0.2 5.5.1 -- Gitee From 8e1ed2f8f5cceda2824921d5258bd698df5ec9cb Mon Sep 17 00:00:00 2001 From: "hujian@yzbdl.ac.cn" Date: Wed, 14 Sep 2022 13:33:28 +0800 Subject: [PATCH 04/55] =?UTF-8?q?1=E3=80=81=E6=9B=B4=E6=96=B0Build.md?= =?UTF-8?q?=E5=92=8CDevelopment.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/Build.md | 28 ++++----------- docs/Development.md | 33 +++--------------- docs/img/build/fast/dm-db-yml.png | Bin 6801 -> 9146 bytes docs/img/build/fast/dm-yml.png | Bin 0 -> 28882 bytes docs/img/build/fast/mysql-yml.png | Bin 0 -> 25535 bytes docs/img/build/fast/orchestrate-resource.png | Bin 0 -> 32461 bytes docs/img/develop/dm-db-yml.png | Bin 19399 -> 95554 bytes docs/img/develop/project-module.png | Bin 53046 -> 33974 bytes .../modules/lanius-orchestrate-common/pom.xml | 13 ------- 9 files changed, 12 insertions(+), 62 deletions(-) create mode 100644 docs/img/build/fast/dm-yml.png create mode 100644 docs/img/build/fast/mysql-yml.png create mode 100644 docs/img/build/fast/orchestrate-resource.png diff --git a/docs/Build.md b/docs/Build.md index 5a76f7e..859e3b0 100644 --- a/docs/Build.md +++ b/docs/Build.md @@ -64,31 +64,17 @@ mvn install:install-file -Dfile=D:\tool\dm\DmJdbcDriver18.jar -DgroupId=dm.jdbc ``` -### 1.2.5 在lanius-orchestrate-serv模块的pom.xml中切换数据库适配模块依赖 -![serv-pom.png](img/build/fast/serv-pom.png) +### 1.2.5 在lanius-orchestrate模块的resource下提供了默认的yml配置文件 +![orchestrate-resource.png](img/build/fast/orchestrate-resource.png) #### 1.2.5.1 Mysql -![mysql-adapter.png](img/build/fast/mysql-adapter.png) -``` - - org.yzbdl.lanius - lanius-orchestrate-db-adapter-mysql - ${lanius.module.db.adapter.mysql.version} - runtime - -``` +![mysql-yml.png](img/build/fast/mysql-yml.png) + #### 1.2.5.2 达梦 -![dm-adapter.png](img/build/fast/dm-adapter.png) -``` - - org.yzbdl.lanius - lanius-orchestrate-db-adapter-dm - ${lanius.module.db.adapter.dm.version} - runtime - -``` +![dm-yml.png](img/build/fast/dm-yml.png) + ### 1.2.6 执行打包编译脚本,路径如下 ![server-complie-package.png](img/build/fast/server-complie-package.png) @@ -130,7 +116,7 @@ spring: spring: datasource: driver-class-name: dm.jdbc.driver.DmDriver - url: jdbc:dm://localhost:5236/LANIUS_ORCH + url: jdbc:dm://localhost:5236?schema=LANIUS username: SYSDBA password: 123456789 ``` diff --git a/docs/Development.md b/docs/Development.md index b6da4a2..12acb73 100644 --- a/docs/Development.md +++ b/docs/Development.md @@ -53,38 +53,15 @@ mvn install:install-file -Dfile=D:\tool\dm\DmJdbcDriver18.jar -DgroupId=dm.jdbc ![dm-yml.png](img/develop/dm-yml.png) ![dm-db-yml.png](img/develop/dm-db-yml.png) -### 1.3.6 在lanius-orchestrate-common模块的pom.xml中切换数据库适配模块依赖 -#### 1.3.6.1 使用Mysql数据库 -![mysql-adapter-pom.png](img/develop/mysql-adapter-pom.png) -``` - - org.yzbdl.lanius - lanius-orchestrate-db-adapter-mysql - ${lanius.module.db.adapter.mysql.version} - runtime - -``` -#### 1.3.6.2 使用达梦数据库 -![dm-adapter-pom.png](img/develop/dm-adapter-pom.png) -``` - - org.yzbdl.lanius - lanius-orchestrate-db-adapter-dm - ${lanius.module.db.adapter.dm.version} - runtime - -``` -#### 1.3.6.3 刷新Maven模块依赖 -![maven-refresh.png](img/develop/maven-refresh.png) -### 1.3.7 在父级pom.xml输入命令mvn clean install 或者 idea操作 install +### 1.3.6 在父级pom.xml输入命令mvn clean install 或者 idea操作 install ![parent-clean-install.png](img/develop/parent-clean-install.png) -### 1.3.8 启动程序 -#### 1.3.8.1 使用Mysql数据库 +### 1.3.7 启动程序 +#### 1.3.7.1 使用Mysql数据库 ![application-dev-active.png](img/develop/application-dev-active.png) -#### 1.3.8.2 使用达梦数据库 +#### 1.3.7.2 使用达梦数据库 ![application-dm-active.png](img/develop/application-dm-active.png) -#### 1.3.8.3 启动后端程序 +#### 1.3.7.3 启动后端程序 ![start-program.png](img/develop/start-program.png) ## 1.4 前端工程(VUE) diff --git a/docs/img/build/fast/dm-db-yml.png b/docs/img/build/fast/dm-db-yml.png index 4b665e58cec7b64c1e505bd9f119feefa287a521..c3f842d8c4e569af7328d131bf8458ad086a2460 100644 GIT binary patch literal 9146 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 literal 6801 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 UZnF{~n>)wI!1Q{J-n}RP1%R1kMgRZ+ diff --git a/docs/img/build/fast/dm-yml.png b/docs/img/build/fast/dm-yml.png new file mode 100644 index 0000000000000000000000000000000000000000..3aee11abb791ecdb25fb4948e26b4364d4e22d9a GIT binary patch literal 28882 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 CHZPU{ literal 0 HcmV?d00001 diff --git a/docs/img/build/fast/mysql-yml.png b/docs/img/build/fast/mysql-yml.png new file mode 100644 index 0000000000000000000000000000000000000000..dc7905d931589985d2a05a6e4f4b0181ae5de733 GIT binary patch literal 25535 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

s6kkj9tN$IvgL+_ifBSen_URYvwcD%8PK{ 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 z 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 literal 19399 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 ${org.apache.commons.collections4} - - - mysql - mysql-connector-java - runtime - - - - dm.jdbc - dm - 8 - runtime - \ No newline at end of file -- Gitee From 2220e44af9153aadf2ba1265b4da50cfdbf44ed0 Mon Sep 17 00:00:00 2001 From: "zhuhongji@yabdl.ac.cn" Date: Fri, 16 Sep 2022 09:46:42 +0800 Subject: [PATCH 05/55] =?UTF-8?q?feat(all):=E6=B7=BB=E5=8A=A0=E8=B5=84?= =?UTF-8?q?=E6=BA=90=E9=85=8D=E7=BD=AEDTO?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../resource/DatabaseConfigurationDTO.java | 48 ++++++++ .../dto/resource/TaskResourceConfigDTO.java | 106 ++++++++++++++++++ .../common/enums/DataBaseTypeEnum.java | 23 +++- .../serv/utils/ValidationUtils.java | 38 +++++++ 4 files changed, 212 insertions(+), 3 deletions(-) create mode 100644 lanius-orchestrate-server/modules/lanius-orchestrate-common/src/main/java/org/yzbdl/lanius/orchestrate/common/dto/resource/DatabaseConfigurationDTO.java create mode 100644 lanius-orchestrate-server/modules/lanius-orchestrate-common/src/main/java/org/yzbdl/lanius/orchestrate/common/dto/resource/TaskResourceConfigDTO.java create mode 100644 lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/utils/ValidationUtils.java diff --git a/lanius-orchestrate-server/modules/lanius-orchestrate-common/src/main/java/org/yzbdl/lanius/orchestrate/common/dto/resource/DatabaseConfigurationDTO.java b/lanius-orchestrate-server/modules/lanius-orchestrate-common/src/main/java/org/yzbdl/lanius/orchestrate/common/dto/resource/DatabaseConfigurationDTO.java new file mode 100644 index 0000000..5cbd3e0 --- /dev/null +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-common/src/main/java/org/yzbdl/lanius/orchestrate/common/dto/resource/DatabaseConfigurationDTO.java @@ -0,0 +1,48 @@ +package org.yzbdl.lanius.orchestrate.common.dto.resource; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.Max; +import javax.validation.constraints.Min; +import javax.validation.constraints.NotBlank; +import java.util.Map; + +/** + * 数据库链接配置 + * + @author zhuhongji@yzbdl.ac.cn + * @date 2022-09-14 9:48 + */ +@Data +public class DatabaseConfigurationDTO { + + /** + * 数据库IP + */ + @ApiModelProperty(value = "数据库ip") + @NotBlank(message = "数据库ip不能为空!") + private String ip; + + /** + * 数据库端口 + */ + @ApiModelProperty(value = "数据库端口") + @Min(value = 1, message = "数据库端口请输入1-65535的正整数!") + @Max(value = 65535, message = "数据库端口请输入1-65535的正整数!") + private Integer port; + + /** + * 数据库名称 + */ + @ApiModelProperty(value = "数据库名称") + @NotBlank(message = "数据库名称不能为空!") + private String dbName; + + /** + * 数据库参数 + */ + @ApiModelProperty(value = "数据库参数") + private Map params; + +} diff --git a/lanius-orchestrate-server/modules/lanius-orchestrate-common/src/main/java/org/yzbdl/lanius/orchestrate/common/dto/resource/TaskResourceConfigDTO.java b/lanius-orchestrate-server/modules/lanius-orchestrate-common/src/main/java/org/yzbdl/lanius/orchestrate/common/dto/resource/TaskResourceConfigDTO.java new file mode 100644 index 0000000..f57e627 --- /dev/null +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-common/src/main/java/org/yzbdl/lanius/orchestrate/common/dto/resource/TaskResourceConfigDTO.java @@ -0,0 +1,106 @@ +package org.yzbdl.lanius.orchestrate.common.dto.resource; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.yzbdl.lanius.orchestrate.common.annotation.log.OprLabel; +import org.yzbdl.lanius.orchestrate.common.enums.DataBaseTypeEnum; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; +import java.time.LocalDateTime; + +/** + * 资源配置DTO + * + @author zhuhongji@yzbdl.ac.cn + * @date 2022-09-14 9:39 + */ +@Data +public class TaskResourceConfigDTO { + + /** + * 关联组织id + */ + @JsonSerialize(using = ToStringSerializer.class) + private Long orgId; + + /** + * 连接名 + */ + @OprLabel + @ApiModelProperty(value = "连接名") + @NotEmpty(message = "连接名不能为空!") + @Size(max = 64, message = "连接名不能超出64位字符!") + private String connectName; + + /** + * 链接配置 + */ + @NotBlank(message = "链接配置不能为空!") + @ApiModelProperty(value = "链接配置") + private String connectUrl; + + /** + * 链接地址 + */ + @ApiModelProperty(value = "链接地址") + private String parsedConnectUrl; + + /** + * 链接账号 + */ + @NotEmpty(message = "链接账号不能为空!") + @ApiModelProperty(value = "链接账号") + private String connectAccount; + + /** + * 链接密码 + */ + @NotEmpty(message = "链接密码不能为空!") + @ApiModelProperty(value = "链接密码") + private String connectPassword; + + /** + * 备注 + */ + @ApiModelProperty(value = "备注") + private String remark; + + /** + * 数据库类型 1 mysql + * @see DataBaseTypeEnum + */ + @NotNull(message = "数据库类型不能为空!") + @ApiModelProperty(value = "数据库类型") + private Integer connectCategory; + + /** + * 是否被删除 + */ + @ApiModelProperty(value = "是否被删除") + private Boolean deleted; + + /** + * 状态 1 - 正常,0 - 异常 + */ + @ApiModelProperty(value = "状态 1 - 正常,0 - 异常") + private Integer status; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "创建时间") + private LocalDateTime createTime; + + /** + * 创建人 + */ + @ApiModelProperty(value = "创建人") + @JsonSerialize(using = ToStringSerializer.class) + private Long createId; + +} diff --git a/lanius-orchestrate-server/modules/lanius-orchestrate-common/src/main/java/org/yzbdl/lanius/orchestrate/common/enums/DataBaseTypeEnum.java b/lanius-orchestrate-server/modules/lanius-orchestrate-common/src/main/java/org/yzbdl/lanius/orchestrate/common/enums/DataBaseTypeEnum.java index 821dc55..4f661b6 100644 --- a/lanius-orchestrate-server/modules/lanius-orchestrate-common/src/main/java/org/yzbdl/lanius/orchestrate/common/enums/DataBaseTypeEnum.java +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-common/src/main/java/org/yzbdl/lanius/orchestrate/common/enums/DataBaseTypeEnum.java @@ -14,6 +14,9 @@ package org.yzbdl.lanius.orchestrate.common.enums; import lombok.AllArgsConstructor; import lombok.Getter; +import java.util.Optional; +import java.util.stream.Stream; + /** * 资源数据库类型枚举 * @@ -27,9 +30,10 @@ public enum DataBaseTypeEnum { /** * 资源数据库类型枚举 */ - MYSQL(1, "mysql", "jdbc:mysql://"), ORACLE(2, "oracle", ""), MYSQL8(3, "mysql8", ""), SQLSERVER(4, "MSSQL", ""), - SQLSERVERNATIVE(5, "MSSQLNATIVE", ""), POSTGRESQL(6, "postgresql", ""), KINGBASEES8(7, "kingbase8", ""), - KINGBASEES(8, "kingbase", ""); + MYSQL(1, "mysql", "jdbc:mysql://"), ORACLE(2, "oracle", ""), + MYSQL8(3, "mysql8", ""), SQLSERVER(4, "MSSQL", ""), + SQLSERVERNATIVE(5, "MSSQLNATIVE", ""), POSTGRESQL(6, "postgresql", ""), + KINGBASEES8(7, "kingbase8", ""), KINGBASEES(8, "kingbase", ""); Integer code; @@ -37,4 +41,17 @@ public enum DataBaseTypeEnum { String urlPrefix; + /** + * 通过标识获取枚举信息 + * @param code 数据库标识 + * @return 数据库基础信息 + */ + public static DataBaseTypeEnum findDataBaseByType(Integer code) { + return Optional.ofNullable(code) + .flatMap(param -> Stream.of(DataBaseTypeEnum.values()) + .filter(w -> w.getCode().equals(param)) + .findFirst()) + .orElse(null); + } + } diff --git a/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/utils/ValidationUtils.java b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/utils/ValidationUtils.java new file mode 100644 index 0000000..bd68d68 --- /dev/null +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/utils/ValidationUtils.java @@ -0,0 +1,38 @@ +package org.yzbdl.lanius.orchestrate.serv.utils; + +import org.yzbdl.lanius.orchestrate.common.exception.runtime.BusinessException; + +import javax.validation.ConstraintViolation; +import javax.validation.Validation; +import javax.validation.Validator; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * @author zhuhongji@yzbdl.ac.cn + * @date 2022-09-14 14:45 + */ +public class ValidationUtils { + + private static final Validator validator; + + static { + validator = Validation.buildDefaultValidatorFactory().getValidator(); + } + + /** + * 校验数据 + * @param object 校验对象 + * @param groups 校验的组 + * @throws IllegalArgumentException 异常抛出 + */ + public static void validateEntity(Object object, Class... groups) throws IllegalArgumentException { + Set> constraintViolations = validator.validate(object, groups); + if (!constraintViolations.isEmpty()) { + String msg = constraintViolations.stream().map(ConstraintViolation::getMessage) + .collect(Collectors.joining("||")); + throw new BusinessException(msg); + } + } + +} -- Gitee From 62c2cbab4eb494d052a98ebbf8efee56fbaa0aa2 Mon Sep 17 00:00:00 2001 From: "zhuhongji@yabdl.ac.cn" Date: Fri, 16 Sep 2022 16:25:26 +0800 Subject: [PATCH 06/55] =?UTF-8?q?feat(all):=E6=9B=B4=E6=96=B0=E8=B5=84?= =?UTF-8?q?=E6=BA=90=E5=BA=93=E9=93=BE=E6=8E=A5=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/resource/TaskResourceConfigDTO.java | 6 ++ .../TaskResourceConfigController.java | 62 ++++++++---------- .../DynamicDatabase.java} | 62 ++++++++++++++++-- .../category/impl/KettleExecutorHandler.java | 5 +- .../resource/ResourceScheduledTask.java | 6 +- .../resource/TaskResourceConfigService.java | 14 +++- .../impl/TaskResourceConfigServiceImpl.java | 65 +++++++++++++++---- .../impl/TaskResourceServiceImpl.java | 13 ++-- 8 files changed, 171 insertions(+), 62 deletions(-) rename lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/{dataBase/DynamicDataBase.java => database/DynamicDatabase.java} (52%) diff --git a/lanius-orchestrate-server/modules/lanius-orchestrate-common/src/main/java/org/yzbdl/lanius/orchestrate/common/dto/resource/TaskResourceConfigDTO.java b/lanius-orchestrate-server/modules/lanius-orchestrate-common/src/main/java/org/yzbdl/lanius/orchestrate/common/dto/resource/TaskResourceConfigDTO.java index f57e627..8b047ae 100644 --- a/lanius-orchestrate-server/modules/lanius-orchestrate-common/src/main/java/org/yzbdl/lanius/orchestrate/common/dto/resource/TaskResourceConfigDTO.java +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-common/src/main/java/org/yzbdl/lanius/orchestrate/common/dto/resource/TaskResourceConfigDTO.java @@ -22,6 +22,12 @@ import java.time.LocalDateTime; @Data public class TaskResourceConfigDTO { + /** + * id + */ + @JsonSerialize(using = ToStringSerializer.class) + private Long id; + /** * 关联组织id */ diff --git a/lanius-orchestrate-server/modules/lanius-orchestrate-resource/src/main/java/org/yzbdl/lanius/orchestrate/resource/controller/TaskResourceConfigController.java b/lanius-orchestrate-server/modules/lanius-orchestrate-resource/src/main/java/org/yzbdl/lanius/orchestrate/resource/controller/TaskResourceConfigController.java index 0290b98..a598d35 100644 --- a/lanius-orchestrate-server/modules/lanius-orchestrate-resource/src/main/java/org/yzbdl/lanius/orchestrate/resource/controller/TaskResourceConfigController.java +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-resource/src/main/java/org/yzbdl/lanius/orchestrate/resource/controller/TaskResourceConfigController.java @@ -15,19 +15,16 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.AllArgsConstructor; -import org.springframework.util.StringUtils; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import org.yzbdl.lanius.orchestrate.common.annotation.auth.CheckPermission; import org.yzbdl.lanius.orchestrate.common.annotation.log.OprId; import org.yzbdl.lanius.orchestrate.common.annotation.log.OprLog; import org.yzbdl.lanius.orchestrate.common.constant.UserOprEventConstant; +import org.yzbdl.lanius.orchestrate.common.dto.resource.TaskResourceConfigDTO; import org.yzbdl.lanius.orchestrate.common.dto.resource.TaskResourceConfigPageDto; import org.yzbdl.lanius.orchestrate.common.entity.resource.TaskResourceConfigEntity; -import org.yzbdl.lanius.orchestrate.common.enums.DataBaseTypeEnum; import org.yzbdl.lanius.orchestrate.common.result.ResultObj; -import org.yzbdl.lanius.orchestrate.common.utils.ExceptionUtil; -import org.yzbdl.lanius.orchestrate.serv.dataBase.DynamicDataBase; import org.yzbdl.lanius.orchestrate.serv.service.resource.TaskResourceConfigService; /** @@ -46,15 +43,15 @@ public class TaskResourceConfigController { /** * 添加任务资源配置数据 - * @param taskResourceConfigEntity 待添加任务资源配置数据 + * @param taskResourceConfigDTO 待添加任务资源配置数据 * @return true|false */ @OprLog(value = UserOprEventConstant.TASK_RESOURCE_CONFIG_ADD,msg="添加${connectName}任务资源配置数据") @CheckPermission("resource::taskResourceConfig::edit") @ApiOperation(value = "添加任务资源配置") @PostMapping() - public ResultObj add(@RequestBody @Validated TaskResourceConfigEntity taskResourceConfigEntity) { - taskResourceConfigService.addTaskResourceConfig(taskResourceConfigEntity); + public ResultObj add(@RequestBody @Validated TaskResourceConfigDTO taskResourceConfigDTO) { + taskResourceConfigService.addTaskResourceConfig(taskResourceConfigDTO); return ResultObj.success(); } @@ -83,19 +80,19 @@ public class TaskResourceConfigController { return ResultObj.success(taskResourceConfigService.getTaskResourceConfig(id)); } - /** - * 分页查询任务资源配置数据 - * @param taskResourceConfigPageDto taskResourceConfigPageDto 分页参数 - * @return 分页数据 - */ - @CheckPermission("resource::taskResourceConfig::query") - @ApiOperation(value = "分页查看任务资源配置") - @PostMapping("query") - public ResultObj> pageTaskResourceConfig( - @RequestParam(defaultValue = "1") Integer page, @RequestParam(defaultValue = "20") Integer size, - @RequestBody TaskResourceConfigPageDto taskResourceConfigPageDto) { - return ResultObj.success(taskResourceConfigService.pageTaskResourceConfig(page, size, taskResourceConfigPageDto)); - } + /** + * 分页查询任务资源配置数据 + * @param taskResourceConfigPageDto taskResourceConfigPageDto 分页参数 + * @return 分页数据 + */ + @CheckPermission("resource::taskResourceConfig::query") + @ApiOperation(value = "分页查看任务资源配置") + @PostMapping("query") + public ResultObj> pageTaskResourceConfig( + @RequestParam(defaultValue = "1") Integer page, @RequestParam(defaultValue = "20") Integer size, + @RequestBody TaskResourceConfigPageDto taskResourceConfigPageDto) { + return ResultObj.success(taskResourceConfigService.pageTaskResourceConfig(page, size, taskResourceConfigPageDto)); + } /** * 更新任务资源配置数据 @@ -110,20 +107,13 @@ public class TaskResourceConfigController { return ResultObj.success(taskResourceConfigService.updateTaskResourceConfig(taskResourceConfigEntity)); } - /** - * 测试数据库连接性 - */ - @CheckPermission("resource::taskResourceConfig::query") - @ApiOperation(value = "测试数据库连接性") - @PostMapping("/testConnection") - public ResultObj testConnection(@RequestBody TaskResourceConfigEntity taskResourceConfigEntity) { - ExceptionUtil.checkParam(StringUtils.hasLength(taskResourceConfigEntity.getConnectUrl()) - && StringUtils.hasLength(taskResourceConfigEntity.getConnectAccount()) - && StringUtils.hasLength(taskResourceConfigEntity.getConnectPassword()), "请确保数据库链接、账户名、密码完全输入!"); - ExceptionUtil.checkParam( - taskResourceConfigEntity.getConnectUrl().startsWith(DataBaseTypeEnum.MYSQL.getUrlPrefix()), - "请确保数据库链接地址输入正确!"); - return ResultObj.success(DynamicDataBase.testConnection(taskResourceConfigEntity.getConnectUrl(), - taskResourceConfigEntity.getConnectAccount(), taskResourceConfigEntity.getConnectPassword())); - } + /** + * 测试数据库连接性 + */ + @CheckPermission("resource::taskResourceConfig::query") + @ApiOperation(value = "测试数据库连接性") + @PostMapping("/testConnection") + public ResultObj testConnection(@RequestBody TaskResourceConfigDTO taskResourceConfigDTO) { + return ResultObj.success(taskResourceConfigService.testConnection(taskResourceConfigDTO)); + } } diff --git a/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/dataBase/DynamicDataBase.java b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/database/DynamicDatabase.java similarity index 52% rename from lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/dataBase/DynamicDataBase.java rename to lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/database/DynamicDatabase.java index 00d4ebc..55d8351 100644 --- a/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/dataBase/DynamicDataBase.java +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/database/DynamicDatabase.java @@ -9,14 +9,22 @@ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. * See the Mulan PSL v2 for more details. */ -package org.yzbdl.lanius.orchestrate.serv.dataBase; +package org.yzbdl.lanius.orchestrate.serv.database; import cn.hutool.db.ds.simple.SimpleDataSource; +import cn.hutool.json.JSONUtil; import com.alibaba.druid.pool.DruidDataSource; +import lombok.extern.slf4j.Slf4j; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.util.StringUtils; import org.yzbdl.lanius.orchestrate.common.base.dto.DataBaseInfo; +import org.yzbdl.lanius.orchestrate.common.dto.resource.DatabaseConfigurationDTO; +import org.yzbdl.lanius.orchestrate.common.entity.resource.TaskResourceConfigEntity; +import org.yzbdl.lanius.orchestrate.common.enums.DataBaseTypeEnum; +import org.yzbdl.lanius.orchestrate.common.exception.runtime.BusinessException; +import java.util.Map; import java.util.Objects; /** @@ -25,10 +33,10 @@ import java.util.Objects; * @author zhuhongji@yzbdl.ac.cn * @date 2022-04-13 16:22 */ -public class DynamicDataBase { - - private static final Logger logger = LoggerFactory.getLogger(DynamicDataBase.class); +@Slf4j +public class DynamicDatabase { + private static final Logger logger = LoggerFactory.getLogger(DynamicDatabase.class); /** * 通过Druid获取数据库连接对象 @@ -79,4 +87,50 @@ public class DynamicDataBase { } } + /** + * 获取数据库地址 + * @param url 地址 + * @param map 参数集合 + * @return 数据库链接地址 + */ + public static String getDbUrl(String url, Map map) { + if (map != null && !map.isEmpty()) { + StringBuilder sb = new StringBuilder(); + for (Map.Entry entry : map.entrySet()) { + if (StringUtils.hasLength(sb.toString())) { + sb.append("&"); + } else { + sb.append("?"); + } + sb.append(entry.getKey()).append("=").append(entry.getValue()); + } + url += sb.toString(); + } + return url; + } + + /** + * + * @param connectUrlConfig 数据库配置 + * @param connectCategory 数据库类型 + * @return url + */ + public static String getDbUrlByEntity(String connectUrlConfig, Integer connectCategory){ + DatabaseConfigurationDTO databaseConfigurationDTO; + try{ + databaseConfigurationDTO = JSONUtil.toBean(connectUrlConfig, DatabaseConfigurationDTO.class); + } catch (Exception e){ + log.error("[解析资源库数据失败!],[资源库Json配置解析异常],[请清除资源库数据重新填写资源库数据!]"); + throw new BusinessException("资源库链接配置不正确,请重新编辑修改!"); + } + DataBaseTypeEnum dataBaseByType = DataBaseTypeEnum.findDataBaseByType(connectCategory); + if(Objects.nonNull(dataBaseByType)){ + String url = dataBaseByType.getUrlPrefix() + databaseConfigurationDTO.getIp() + ":" + + databaseConfigurationDTO.getPort() + "/" + + databaseConfigurationDTO.getDbName(); + return getDbUrl(url, databaseConfigurationDTO.getParams()); + } + return null; + } + } diff --git a/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/quartz/handler/category/impl/KettleExecutorHandler.java b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/quartz/handler/category/impl/KettleExecutorHandler.java index db9a632..33bc7ea 100644 --- a/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/quartz/handler/category/impl/KettleExecutorHandler.java +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/quartz/handler/category/impl/KettleExecutorHandler.java @@ -46,6 +46,7 @@ import org.yzbdl.lanius.orchestrate.common.xml.XMLHandler; import org.yzbdl.lanius.orchestrate.serv.constant.*; import org.yzbdl.lanius.orchestrate.serv.constant.schedule.kettle.KettleConstant; import org.yzbdl.lanius.orchestrate.serv.constant.schedule.kettle.KettleXmlConstant; +import org.yzbdl.lanius.orchestrate.serv.database.DynamicDatabase; import org.yzbdl.lanius.orchestrate.serv.quartz.handler.category.ProgramCategoryExecutorFactory; import org.yzbdl.lanius.orchestrate.serv.quartz.handler.category.ProgramCategoryExecutorInvokerHandler; import org.yzbdl.lanius.orchestrate.serv.quartz.handler.resourcetype.ResourceTypeFactory; @@ -541,7 +542,9 @@ public class KettleExecutorHandler implements ProgramCategoryExecutorInvokerHand // 连接名 repConfigJsonMap.put(EtlRequestConstant.HEADER_DB_CONN_NAME, resourceConfigEntity.getConnectName()); // 地址 - String connectUrl = resourceConfigEntity.getConnectUrl(); + // 地址 + String connectUrl = DynamicDatabase.getDbUrlByEntity(resourceConfigEntity.getConnectUrl(), + resourceConfigEntity.getConnectCategory()); URI uri = JdbcUtil.parseJdbcUrl(connectUrl); // ip repConfigJsonMap.put(EtlRequestConstant.HEADER_DB_CONN_HOST, uri.getHost()); diff --git a/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/quartz/resource/ResourceScheduledTask.java b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/quartz/resource/ResourceScheduledTask.java index cfeafaf..cda4f60 100644 --- a/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/quartz/resource/ResourceScheduledTask.java +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/quartz/resource/ResourceScheduledTask.java @@ -26,7 +26,7 @@ import org.yzbdl.lanius.orchestrate.common.entity.resource.TaskResourceConfigEnt import org.yzbdl.lanius.orchestrate.common.enums.ResourceDataStatusEnum; import org.yzbdl.lanius.orchestrate.common.enums.ServerProgramStatusEnum; import org.yzbdl.lanius.orchestrate.serv.constant.TaskResourceConstant; -import org.yzbdl.lanius.orchestrate.serv.dataBase.DynamicDataBase; +import org.yzbdl.lanius.orchestrate.serv.database.DynamicDatabase; import org.yzbdl.lanius.orchestrate.serv.mapper.resource.ServerMapper; import org.yzbdl.lanius.orchestrate.serv.mapper.resource.ServerProgramMapper; import org.yzbdl.lanius.orchestrate.serv.mapper.resource.TaskResourceConfigMapper; @@ -87,7 +87,9 @@ public class ResourceScheduledTask { List all = taskResourceConfigMapper.getAllTaskResource(); List checkedList = new ArrayList<>(); all.forEach(config -> { - Boolean isConnected = DynamicDataBase.testConnection(config.getConnectUrl(), config.getConnectAccount(), + String dbUrl = DynamicDatabase.getDbUrlByEntity(config.getConnectUrl(), + config.getConnectCategory()); + Boolean isConnected = DynamicDatabase.testConnection(dbUrl, config.getConnectAccount(), config.getConnectPassword()); Integer status = isConnected ? ResourceDataStatusEnum.NORMAL.getCode() : ResourceDataStatusEnum.ABNORMAL.getCode(); diff --git a/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/resource/TaskResourceConfigService.java b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/resource/TaskResourceConfigService.java index a5850e9..85473b4 100644 --- a/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/resource/TaskResourceConfigService.java +++ b/lanius-orchestrate-server/modules/lanius-orchestrate-serv/src/main/java/org/yzbdl/lanius/orchestrate/serv/service/resource/TaskResourceConfigService.java @@ -13,6 +13,7 @@ package org.yzbdl.lanius.orchestrate.serv.service.resource; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; +import org.yzbdl.lanius.orchestrate.common.dto.resource.TaskResourceConfigDTO; import org.yzbdl.lanius.orchestrate.common.dto.resource.TaskResourceConfigPageDto; import org.yzbdl.lanius.orchestrate.common.entity.resource.TaskResourceConfigEntity; @@ -26,10 +27,10 @@ public interface TaskResourceConfigService extends IService pageTaskResourceConfig(Integer page, Integer size, TaskResourceConfigPageDto taskResourceConfigPageDto); + IPage pageTaskResourceConfig(Integer page, Integer size, TaskResourceConfigPageDto taskResourceConfigPageDto); /** * 更新任务资源配置参数 @@ -61,4 +62,11 @@ public interface TaskResourceConfigService extends IService implements TaskResourceConfigService { private final TaskResourceMapper taskResourceMapper; @@ -47,22 +55,24 @@ public class TaskResourceConfigServiceImpl extends ServiceImpl queryWrapper = new QueryWrapper().lambda() - .eq(TaskResourceConfigEntity::getConnectName, taskResourceConfigEntity.getConnectName()) + .eq(TaskResourceConfigEntity::getConnectName, taskResourceConfigDTO.getConnectName()) .eq(TaskResourceConfigEntity::getDeleted, false); ExceptionUtil.checkParam(!this.baseMapper.exists(queryWrapper), "已存在同样的资源库名称,请重新输入!"); LambdaQueryWrapper query = new QueryWrapper().lambda() - .eq(TaskResourceConfigEntity::getConnectUrl, taskResourceConfigEntity.getConnectUrl()) - .eq(TaskResourceConfigEntity::getConnectAccount, taskResourceConfigEntity.getConnectAccount()) + .eq(TaskResourceConfigEntity::getConnectUrl, taskResourceConfigDTO.getConnectUrl()) + .eq(TaskResourceConfigEntity::getConnectAccount, taskResourceConfigDTO.getConnectAccount()) .eq(TaskResourceConfigEntity::getDeleted, false); ExceptionUtil.checkParam(!this.baseMapper.exists(query), - "已存在链接地址、连接用户两项同时相同的资源配置,请重新输入!"); - if(Objects.isNull(taskResourceConfigEntity.getStatus())){ - taskResourceConfigEntity.setStatus(ResourceDataStatusEnum.NORMAL.getCode()); + "已存在链接配置、连接用户两项同时相同的资源配置,请重新输入!"); + if(Objects.isNull(taskResourceConfigDTO.getStatus())){ + taskResourceConfigDTO.setStatus(ResourceDataStatusEnum.NORMAL.getCode()); } - taskResourceConfigEntity.setDeleted(false); + taskResourceConfigDTO.setDeleted(false); + TaskResourceConfigEntity taskResourceConfigEntity = new TaskResourceConfigEntity(); + BeanUtils.copyProperties(taskResourceConfigDTO, taskResourceConfigEntity); return this.save(taskResourceConfigEntity); } @@ -83,7 +93,7 @@ public class TaskResourceConfigServiceImpl extends ServiceImpl pageTaskResourceConfig(Integer page, Integer size, + public IPage pageTaskResourceConfig(Integer page, Integer size, TaskResourceConfigPageDto taskResourceConfigPageDto) { Page pageParam = new Page<>(page, size); LambdaQueryWrapper queryWrapper = @@ -96,7 +106,16 @@ public class TaskResourceConfigServiceImpl extends ServiceImpl { + TaskResourceConfigDTO taskResourceConfigDTO = new TaskResourceConfigDTO(); + BeanUtils.copyProperties(taskResourceConfigEntity, taskResourceConfigDTO); + // 转换url链接 + String dbUrl = DynamicDatabase.getDbUrlByEntity(taskResourceConfigEntity.getConnectUrl(), + taskResourceConfigEntity.getConnectCategory()); + taskResourceConfigDTO.setParsedConnectUrl(dbUrl); + return taskResourceConfigDTO; + }); } @Override @@ -114,15 +133,37 @@ public class TaskResourceConfigServiceImpl extends ServiceImpl resourceContent = new HashMap<>(4); TaskResourceConfigEntity taskResourceConfigEntity = taskResourceConfigMapper.selectById(taskResourceDto.getResourceConfigId()); ExceptionUtil.checkParam(Objects.nonNull(taskResourceConfigEntity), "未查询到对应数据库信息!"); + DatabaseConfigurationDTO databaseConfigurationDTO = JSONUtil.toBean(taskResourceConfigEntity.getConnectUrl(), + DatabaseConfigurationDTO.class); // 构建资源库Json数据 - resourceContent.put(CONFIG_CONTENT_REPO_NAME, JdbcUtil.getDbName(JdbcUtil.parseJdbcUrl(taskResourceConfigEntity.getConnectUrl()))); + resourceContent.put(CONFIG_CONTENT_REPO_NAME, databaseConfigurationDTO.getDbName()); resourceContent.put(CONFIG_CONTENT_REPO_ACCOUNT, taskResourceDto.getResourceAccountName()); resourceContent.put(CONFIG_CONTENT_REPO_PASSWORD, taskResourceDto.getResourcePassword()); resourceContent.put(CONFIG_CONTENT_REPO_ENTRANCE, taskResourceDto.getResourcePath()); @@ -350,11 +352,14 @@ public class TaskResourceServiceImpl extends ServiceImpl Date: Fri, 16 Sep 2022 16:33:49 +0800 Subject: [PATCH 07/55] =?UTF-8?q?update(=E8=B5=84=E6=BA=90=E5=BA=93)?= =?UTF-8?q?=EF=BC=9A=E4=BC=98=E5=8C=96=E6=95=B0=E6=8D=AE=E5=BA=93=E4=BF=A1?= =?UTF-8?q?=E6=81=AF=E5=A1=AB=E5=86=99=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/services/common/tool.ts | 11 + .../src/services/task-schedule/repository.ts | 63 ++++++ .../components/allocation-details.vue | 28 ++- .../components/drawer/allocation-drawer.vue | 205 +++++++++++++++--- .../components/drawer/allocation-editor.vue | 191 ++++++++++++++-- 5 files changed, 435 insertions(+), 63 deletions(-) create mode 100644 lanius-orchestrate-client/src/services/task-schedule/repository.ts diff --git a/lanius-orchestrate-client/src/services/common/tool.ts b/lanius-orchestrate-client/src/services/common/tool.ts index 6ecdfd7..32dba5c 100644 --- a/lanius-orchestrate-client/src/services/common/tool.ts +++ b/lanius-orchestrate-client/src/services/common/tool.ts @@ -61,4 +61,15 @@ const checkIpV4 = (ip: string): Boolean => { return false; }; +interface IHash { + [index: string]: T; +} + +interface IKeyValue { + key: TKey; + value: TValue; +} + export { createGuid, checkPassword, checkIpV4 }; + +export type { IHash, IKeyValue }; diff --git a/lanius-orchestrate-client/src/services/task-schedule/repository.ts b/lanius-orchestrate-client/src/services/task-schedule/repository.ts new file mode 100644 index 0000000..1eba572 --- /dev/null +++ b/lanius-orchestrate-client/src/services/task-schedule/repository.ts @@ -0,0 +1,63 @@ +/* Copyright (c) 2022 渝州大数据实验室 + * + * Lanius is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * + * http://license.coscl.org.cn/MulanPSL2 + * + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + */ + +/* + * @description: 资源库的相关业务逻辑 + * @fileName: repository.ts + * @author: zoujunjie@yzbdl.ac.cn + * @date: 2022-09-15 + */ + +import { IHash, IKeyValue } from "../common/tool"; + +class ConnectUrl { + ip: string = ""; + port: number | string = ""; + dbName: string = ""; + params: IHash = {}; + + constructor(stringValue: string = "") { + if (stringValue) { + let jsonValue = JSON.parse(stringValue) as ConnectUrl; + this.ip = jsonValue?.ip; + this.port = jsonValue?.port; + this.dbName = jsonValue?.dbName; + this.params = jsonValue?.params; + } + } + + public toString(): string { + return JSON.stringify(this); + } + + public setParams(list: IKeyValue[]): void { + this.params = {}; + list?.forEach((item: IKeyValue) => { + this.params[item.key] = item.value; + }); + } + + public getParamsList(): IKeyValue[] { + let list: IKeyValue[] = []; + for (const key in this.params) { + if (Object.prototype.hasOwnProperty.call(this.params, key)) { + list.push({ + key: key, + value: this.params[key], + }); + } + } + return list; + } +} + +export { ConnectUrl }; diff --git a/lanius-orchestrate-client/src/views/TaskSchedule/AllocationResources/components/allocation-details.vue b/lanius-orchestrate-client/src/views/TaskSchedule/AllocationResources/components/allocation-details.vue index d0111a2..3627496 100644 --- a/lanius-orchestrate-client/src/views/TaskSchedule/AllocationResources/components/allocation-details.vue +++ b/lanius-orchestrate-client/src/views/TaskSchedule/AllocationResources/components/allocation-details.vue @@ -18,6 +18,7 @@